帮助:模板

https://zh.wikipedia.org/wiki/Help:%E6%A8%A1%E6%9D%BF

Template:NoteTA
Template:Wikipedia how to
Template:Wiki markup
**模板**（Template:Lang-en）是维基百科的系统中的一项功能，类似于计算机语言中的子程序。本文提供在MediaWiki创建模板的技术指南；维基百科使用MediaWiki并对模板有一定的规范。另外也可参考：

* 模板扩展语法：Help:解析器函数
* 模板分类：Category:維基百科模板和Wikipedia:模板消息
* 模板名字空间的帮助信息：Wikipedia:Template名字空间
* 模板索引：Template:Fullurl2

## 什么是模板，为什么要用模板

您在条目的上方看到各种各样的条条框框，比如“本条目需要清理”、“本条目应避免有陈列杂项、琐碎资料的部分。”等。有时候条目右侧也能看到一个灰色的框，里面写着有关这个条目的基本信息，比如一位艺人的“生日”、“出生地”、“国籍”等。条目最下方有时候也会见到一个大方框，里面陈列着和这个条目相关的内容（称为“导航模板”，比如这个）。这些都是“模板”。模板的形式还有很多很多，有的是直接镶嵌在条目正文里面的，有的虽然看不到但是却依然影响到条目显示的内容（比如字词转换模板）。但是如果你翻翻这些条目的源代码，就会发现这些模板都长成类似“`{{模板名字|模板参数}}`”这样子，用一对双大括号将模板的内容扩起来。

为什么有这些麻烦的东西？有时候，一段内容会在多个条目中反复出现，这时候如果一遍一遍复制那些内容，一遍遍粘贴到各个条目里面，简直会累死人，而且大段大段的看起来也很烦人；而且，万一日后内容有变动，又要进到各个条目里面把这些内容一个个全改一遍，这会产生大量的重复劳动。模板就是为了这样的目的：只需要给重复的部分放到一个模板裡、起个名字，以后需要用到这些内容的时候直接调用模板就行了。需要更改内容的时候，也只需要在模板里改动，那些调用了模板的条目也会随着模板自动变更，十分方便。

所有的模板都会放在一个叫“Template”的名字空间，即“模板名字空间”，标题名稱是“`Template:模板名字`”、“`模板:模板名字`”这样。在写作条目时，只需要在合适的位置放上“`{{模板名字}}`”，模板就会在合适的地方显示出来了。有时候对于同一个模板，雖然显示的内容稍有差异，但大体的框架是一致的，这个时候就会用到“模板参数”，即“`{{模板名字|模板参数}}`”的形式，具体的用法请见下文。

需要注意的一点是，维基百科的系统——MediaWiki本身并不会自动为条目挂上模板。因此，当看到条目里面显示了“本条目需要补充更多来源”等文字时，是其他维基人人工将模板挂上去。在模板所述问题修正之后，可以自行将模板从源代码中删除，这段提示文字將自动消失。

## 调用模板

调用模板就是把模板内容嵌入到调用方页面。

在Template命名空间里的页面才是模板，所以模板都由**Template:**开头，在中文维基，以**模板:**开头同样有效。调用时必须使用**模板标签**，即{{Template:模板名}}的形式，“Template:”可以在无歧义的情况下省略。如Template:tc是一个模板，内容为“in”。如果把`Template:Tl`加入某个页面，则Template:Tl的内容会在此頁面显示，即Template:Tc。

如果“Template:模板名”不存在，`{{模板名}}`的作用就与`[[Template:模板名]]`相同，提供一个连接到不存在页面的链接：Template:模板名。

模板可以被重定向。例如Template:请求来源被重定向到Template:Fact，所以{{请求来源}}效果等同于{{fact}}。有时移动模板并建立重定向后，原调用重定向的页面可能会出错，只要过一段时间（几小时）等服务器刷新缓存即可。

### 设定参数

在模板名后可用管道符（即竖线）追加参数（这种做法称为**传参**）。参数有编号参数和命名参数两种。在模板的说明文档里一般会列出该模板的所有参数。

例如，`{{fact|1=维基百科的编者大部分是男性|time=2024-01-26}}`得到「Template:Fact」。

“维基百科的编者大部分是男性”的参数名为`1`。“2024-01-26”的参数名为`time`。参数名为数字就是**编号参数**，否则就是**命名参数**。

编号参数的参数名（1、2、3、4等）和等号可以省略。上例的效果和{{fact|维基百科的编者大部分是男性|time=2024-01-26}}是一样的。注意，以省略形式赋值的第一个编号参数的参数名是1，而不是很多编程语言习惯的0。

**要么全不省略编号参数参数名，要么全都省略，否则极易出错。**
可以理解为参数1第一次赋值为“页面分类”，然后“大洲”作为隐藏的参数1第二次赋值覆盖了第一次赋值的内容。
如此类推。
在编辑预览中会警示这种重复赋值问题。

#### 需要转义的参数

* 如果参数值中含有等号（`=`），传参时则必须使用参数名，即使是编号参数也要使用。
* 如果参数值中含有两个连续的右大括号（`}}`），调用参数时必须将其放入nowiki标记中，例如`<nowiki>}}</nowiki>`。
* 如果参数值中含有竖线（`|`），调用参数时必须将其放入nowiki标记中，例如`<nowiki>|</nowiki>`，或用`{{!}}`代替。
* 参数值中可以包含一对双方括号（即两个左方括号，两个右方括号），用于链接一个条目，或是其他名字空间的页面，但不能先写右双方括号，然后再接左双方括号。例如Template:数数1中的内容是：

```
[[一二{{{1}}}六七]]

```

Template:Tlc会造成模板调用失败，显示为：

```
-{}-{{数数1|三]]四[[五}}

```

而不是你所期望的

```
一二三四五六七

```

不過可以使用Template:Tlx（[[）及Template:Tlx（]]）來讓這個結果成真，因此：

```
-{}-
{{数数1|三{{))!}}四{{((!}}五}}

```

會變成：

```
 -{}-Template:数数1

```

### 替换引用

Main page: Help:替换引用
另见分类:应被替换引用的模板

放置修饰符“subst:”（substitute，替代）位于模板标签的“{{”之后，模板名之前，即可替换引用。它能在调用方页面保存时，将所调模板展开，而不是每次显示页面的时候读取有关模板。这样可以按模板当前的形式编辑条目，并使条目免受模板变化的影响，并减轻服务器负担。所以对模板的替换引用不会显示在页面历史和模板的链入页面中。

例如Template:Tl和Template:Tl都是应被替换引用的模板。

## 嵌入页面

Main article: WP:嵌入包含
模板标签不仅可以调用模板，也可以调用（嵌入）其他页面，就是像模板一样把被调页面的内容加入到调用方页面。

* `{{帮助讨论:模板}}`会将帮助讨论:模板中的内容加入到该页来。
* 如果调用主命名空间的条目，为了避免和调用同名模板产生歧义，需要在条目名前加冒号。如`{{:福寿岭站}}`会将福寿岭站中的内容加入到该页来，而不是调用{{福寿岭站}}（Template:福寿岭站）。

这样一来，所有页面都可以当作是模板。但是，使用在模板名字空间的页面（即真正的模板）有以下独特的好处：

* 所有被页面使用的模板都在页面编辑页显示出来。
* 当模板改变时，所有使用模板页面的服务器缓存（相对于浏览器缓存）自动被清空；而位于其他名字空间的页面，服务器缓存往往要手工清空。

而模板名字空间以外的页面一般在如下情况下被嵌入其他页面：

* 引用维基百科名字空间的界面消息。
* 将一個长页面（可以屬于主条目名字空间，假設名字就叫做“长页面”，例子）拆分为较短页面时，可以将短页面命名为“长页面/第一部分”、“长页面/第二部分”等，然后使用`{{/第一部分}}<br />{{/第二部分}}`来拼成长页面。Wikipedia:互助客栈 (全部)就是一个好例子。

一个模板可以调用另一个模板，它也可以调用它自己，但自我调用只有一层有效。例如：Template:模板1的内容是`“一次，{{模板1}}”`，在Template:模板1中将显示：“一次，一次，{{模板1}}”，如果其他条目调用该模板，所加入的文字将是

Template:模板1

在2010年前，如果把其他模板重定向至某模板，该模板又引用重定向，且多次自我调用均为不同重定向，则该模板可以实现多次自我调用。MediaWiki后来取消此功能。如Template:Tl的结果为Template:RR。

模板中变量在调用模板的地方被赋值。因此，如果一个模板中含有`{{PAGENAME}}`，该模板被某页面调用，相应的位置显示的将是调用方的名称，而不是被调模板的名称。

一个页面所调用的所有模板都在该页编辑页面中列出，并提供相应的链接，而且：

* 一个段落的编辑页面不会列出任何模板；
* 编辑旧版本的页面，这个列表仍然是当前最新的；
* 可加入模板擴展語法#if, #ifeq, #ifexist, #ifexpr, 或 #switch；
* 如果不真正提交编辑，仅仅在预览中使用的模板不被列出。
* 如果模板名里面嵌套另一个模板，如{{{{tc}}{{CURRENTDAY}}}}，则会得到{{Template:Tc26}}；编辑页面里会显示[[Template:Template:Tc26]]。
* 模板名#后的内容会忽略。

请注意，如果页面结尾没有换行，编辑页面中总是在结尾添加一个换行，但这并不影响模板的某些效果，即这个换行不真正起作用。例如：

```
{{编号演示}}{{编号演示}}
{{编号演示}}

```

的结果是：
Template:编号演示Template:编号演示
Template:编号演示

## 创建并编辑模板

维基百科现存大量模板供编者使用，如果有现存模板可以完成您的任务，则应该调用现有模板，而不是另建新模板。

您在新建模板前，请先搜索相应的模板名称，如“Template:维基百科模板”。新建模板后，请在Wikipedia:模板消息内添加您新建的模板的信息，并请对模板进行分类。模板分类的方法请参考Category:维基百科模板以及Category talk:维基百科模板中的相关内容。

当您在模板中需要使用图标时，建议使用维基共享资源水晶风格图标库中提供的图标。

模板页面会自动调用这个模板本身，实际上相当于一次没有参数赋值的模板调用，因此如果参数有默认值，将被显示。例如：模板Template:数一数的内容是

```
一二三{{{1|四五六}}}七八九

```

模板页面的内容是

Template:数一数
### 读取参数

在模板页面中，用三个大括号可以读取参数，例如：`[[:Template:參數]]`可以读取*参数1*，如果在模板调用中参数1没有赋值，则使用*参数1的默认值*作为参数1的赋值。另见Help:默认参数

**注意：**参数默认值和参数赋空值是不同的。

#### 例1：含有命名参数的模板

例如：Template:姓名的模板，内容为：

```
我是Template:參數Template:參數。

```

如果用`Template:Tl`调用这个模板，將会看到：

Template:姓名
如果用`Template:Tl`，我们则看到：

Template:姓名
#### 例2：含有编号参数的模板

再来一个例子，说明一个编号参数的定义和调用：我们还是先要定义一个带参数的模板，例如模板Template:数数的内容是

```
一二三Template:參數七八九

```

赋值调用`Template:Tl`的结果是：

Template:数数
赋空值调用`Template:Tl`的结果是：

Template:数数
未赋值调用，就会调用默认值，`Template:Tl`的结果是：

Template:数数
### 编号参数还是命名参数？

#### 编号参数的优点

* 调用模板时参数名和等号可以省略，从而节约打字时间和存储空间。参见#设定参数。
* 阿拉伯数字是世界性的，在翻译的时候省事，也可以被不懂中文的人理解。

#### 命名参数的优点

* 参数的顺序可以变化，模板的参数可以任意添加和修改，而不会对调用模板的页面产生致命影响。
* 参数的意义容易理解。
* 当模板具有大量缺省参数时，命名参数使语法更为清晰
* 一些特殊的技巧利用这样一个特性：在一次模板调用中允许对同一个参数多次赋值，这导致最后一次赋值的内容生效；这种做法隐式保证了在本次模板调用中该参数至少被赋值一次

### 未赋值且没有默认值的参数

例如：模板Template:再数数的内容是

```
一-{{{1}}}-三-{{{2}}}-五

```

`Template:Tl`的结果是

Template:再数数
`Template:Tl`的结果是

Template:再数数
`Template:Tl`的结果是

Template:再数数
`Template:Tl`的结果是

Template:再数数
`Template:Tl`的结果是

Template:再数数
`Template:Tl`的结果是

Template:再数数
### 例4：参数赋值中包含参数

如果一个参数未赋值，则在三个大括号中的参数名在模板调用时不起参数的作用。如果要它起作用，一定要赋值。

* 模板Template:数数A的内容是

```
{{再数数|二}}

```

`Template:Tl`的结果是：
Template:数数A
* 模板Template:数数B的内容是

```
{{再数数|二|{{{1}}}}}

```

调用`Template:Tl`的结果是：
Template:数数B
* 模板Template:数数C的内容是

```
{{再数数|二|2={{{1}}}}}

```

调用`Template:Tl`的结果是：
Template:数数C

### 例5：参数迭代

當模板需要隔層叫用時（例如有一個父模板，然後建立許多子模板，子模板使用父模板的功能）要讓底層（A模板叫用B模板，B模板為A模板的底層）層使用上層參數時，則需要参数迭代。

最简单的参数迭代办法就是在模板中用同样的参数名。

例如：Template:姓名国籍

```
{{姓名|姓={{{姓}}}|名={{{名}}}}}{{{国籍}}}人。

```

我現在叫用「`{{姓名国籍|姓=王|名=小奇|国籍=火星}}`」
結果為「Template:姓名国籍」
您可能會認為，Template:姓名模板也有包含`{{{姓}}}`和`{{{名}}}`參數。

因此我們可以試著將Template:姓名国籍改成

```
{{姓名}}{{{国籍}}}人。

```

此時叫用「`{{姓名国籍|姓=王|名=小奇|国籍=火星}}`」
結果為「Template:虛擬模板」
這是因為在Template:姓名模板中，無法讀取到Template:姓名国籍中傳遞的「`|姓=王|名=小奇|国籍=火星`」參數

由于每一層模板呼叫參數都互不相關，因此要讓參數能一層一層傳遞下去，則每層都需要迭代一次參數。

#### 进一步

像`{{再数数||四}}`这样的调用将空值赋给参数1，而不是没有赋值，所以结果是

Template:再数数
如果我们希望参数1不赋值，则应该将参数2用命名参数形式赋值，如

```
Template:Tl

```

结果则是

Template:再数数
如果这样的参数值被赋给如`<font size>`这样的标记，会使编码错误，但这些错误会被系统（MediaWiki）忽略，而不产生奇怪的结果。请参看英文的例子：字体大小。

参数“02”和参数“2”是不同的，例如模板Template:例5的内容是

```
{{{1}}}{{{2}}}{{{02}}}

```

调用`Template:Tl`的结果是

Template:例5
**注意：**维基系统名字空间的参数名是不同的，它们是`$1, $2, ...`，参见Help:名字空间、Special:所有消息和MediaWiki:Blockedtext。

### 参数及模板命名

另外，如果模板名为参数，如Template:Sample2内容为{{{{{tc}}}}}，则调用{{Sample2|tc=!}}相当于{{!}}，显示为Template:Sample2。这里，{{{{{tc}}}}}解析为{{ {{{tc}}} }}而不是{{{ {{tc}} }}}。如果Template:Sample3内容为{{{ {{tc}} }}}，Template:Tl内容为in，则{{Sample3|in=11}}显示为Template:Sample3。

模板调用时，模板名可以是解析器函数。如{{{{NAMESPACE}}1}}相当于Template:Tl，结果为Template:1。

模板名可以是另一个模板。如Template:tctc内容为{{tc}}，{{{{tctc}}}}相当于{{tc}}，结果为{{{{tctc}}}}。

### 模板分类

模板也要进行分类，目的是为了更好的整理模板，以便更好的使用和管理模板。模板的分类同条目的分类相似，可以参阅有关条目分类的帮助文件，如Help:分类等，不同之处在于对于模板的分类需要使用`<noinclude>`标识，如果不加`<noinclude>`标识，则不仅模板被分类，所有使用该模板的条目也被分入同一类。

所有模板的根目录（即分类）是Category:维基百科模板，所有模板分类名最后一定要含有“模板”二字，以区别于普通条目的分类。

#### 例7：模板分类方法

将例1中的模板Template:姓名分为Category:人物模板，需要加入：

```
我是{{{姓}}}{{{名}}}。<noinclude>[[Category:人物模板]]</noinclude>

```

### 标识

**注意：**以下内容只限于模板中使用的情况，在其他名字空间使用的情况请参考相关帮助文挡。

#### <noinclude>、<includeonly>和<onlyinclude>

**注意：**在模板中使用`<noinclude>`标识时要小心！`<noinclude>`应接在模板原始码（例如结尾双大括号}}）或文字最后一列的后方，不要新起一列；也不要在`</noinclude>`之后**加空行**（虽然系统会自动忽略`</noinclude>`之后的单个空行）否则空行将被当作模板的一部分反映在调用模板的条目中。
`<noinclude>`标识的作用是将`<noinclude>`和`</noinclude>`之间的文本加入所在的模板页中，而不加入调用模板的条目或模板中，针对模板的说明、分类都可以置于该标识之间。

`<includeonly>`标识的作用跟`<noinclude>`标识的作用正好相反，是将`<includeonly>`和`</includeonly>`之间的文本**不**加入所在的模板页中，而加入调用模板的页面中。

`<onlyinclude>`标识不常用，其作用是只有被`<onlyinclude>`和`</onlyinclude>`包含的文本才出现在调用模板的页面中，模板的其他内容不出现在调用模板的页面中。

#### Template:Anchorsubst与preload过程中的noinclude、includeonly和IncludeOnly

*以下部分行为是错误的，是**旧版本软件的缺陷**，并将**随MediaWiki 1.17的部署被修正**（bugzilla:5210）。*
解释与传递

* 测试页

嵌套

 **preload过程** | 正常

## 特殊的模板引用

* 子页面引用
	+ 格式：{{/子页面}}

Template:Hideh
帮助:模板/子页面
Template:Hidef

* 引用过程中“子页面”的意义是引用模板的页面的子页面，而非被引用的模板的子页面。

* 其它名字空间的模板引用
	+ 格式：{{名字空间:子页面}}如{{Template talk:!}}

## 一般用法

模板的一般用法有：

* 模板消息，例如：Template:stub传递“小作品”的消息。
* 导航模板，用于给读者提供类似的条目，例如：Template:洲。
* 信息框模板，用于同一类条目中提供统一格式的信息，例如：Template:Infobox 网球在条目右边绘制信息框，提供网球运动员的相关信息。
* 提供跨语言文本。
* 提供合成图片，例如：围棋棋谱Template:Game of Go Position和国际象棋棋谱和Template:Chess position。
* 以上几种的组合。

## 提及模板

在某些情况下，我们可能需要**提及某一个模板（而非调用它）**。提及模板可用nowiki标签，但是已经有热心的用户建立了专门的模板，用于提及模板。

 请您不要再随意删除<nowiki>{{afd}}</nowiki>模板。
 请您不要再随意删除{{**tl**|afd}}模板。
 欢迎新用户可以使用{{**tls**|welcome}}语法，但不要使用{{tl|welcome}}语法。
 [[:Template:nosign]]的用法如下：{{**tlx**|nosign|用户留言时间|用户名}}

## 类似语法

{{CURRENTYEAR}}、{{DISPLAYTITLE:}}等等为魔术字。魔术字可以返回关于当前页面、wiki站点或日期的信息，也可以设置数据。参见Help:魔术字#变量。

调用解析器函数的语法是{{#xxx:}}。如{{#ifeq:{{{lang}}}|zh|我使用中文|I<ins> don't</ins> use Chinese}}给出I don't use Chinese。

读取模板参数是三个大括号，形如{{{1|}}}、{{{date}}}。详见#读取参数。

## 常见问题

**我可以在多个语言维基百科中使用同一个模板吗？**

不能。如果你要这么做，只能在各个维基百科中分别创建该模板。
**开头是“Template:”，“template:”，還是“模板:”？**

都行。英文不区分大小写，中文会繁简自动转换。一定要用英文半角冒號。
**我可以使用参数吗？**

可以。请参阅此頁上方。
**一个页面中最多可以使用多少模板？**

2MB。参见Wikipedia:模板限制。
**我已经修改了模板，但为什么页面不更新呢？**

有很多原因。第一、你可能没有刷新页面。在你的浏览器里使用刷新（Refresh）功能。第二、系统可能存在缓存漏洞（bug）。一种解决方法是**编辑**使用模板的页面，然后什么也不修改就**保存**，这样你就强制该页面进行刷新了。这一操作不会在历史中留下记录。
**我可以修改模板的名字吗？**

可以。移动模板跟移动普通页面一样。模板也可以重定向。
**我可以在一个模板中使用另一个模板吗？**

可以。当然可以在一个模板的内容中调用另一个模板。但如果使用诸如{{一个模板{{另一个模板}}}}这样的语句，假设{{另一个模板}}的内容为“123”，则实际上是{{一个模板123}}。
## 参考资料

1. ↑ Error on call to Template:cite web: Parameters **url** and **title** must be specified (2015-08-02).
2. ↑ MediaWiki更新记录 (2015-08-02).

参见
--

### 中文

* Wikipedia:模板指导
* Wikipedia:Template名字空间
* Category:維基百科模板

### 英文

* 元维基上的英文模板帮助
* 元维基上的英文模板高级帮助

Template:H-f Help