MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针。
如果在编辑的过程中遇到了什么问题,可以去讨论板提问。
为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证。
MCBBS Wiki GitHub群组已上线!
您可以在回声洞中发表吐槽!
服务器状态监控。点击进入
本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>
帮助:模板:修订间差异
(→概述) 标签:移动版编辑 移动版网页编辑 |
小 (// Edit via Wikiplus) |
||
(未显示5个用户的23个中间版本) | |||
第1行: | 第1行: | ||
{{info|本页面引自[https://zh.moegirl.org/Help:模板 萌娘百科],最初来自[https://zh.wikipedia.org/wiki/Help:%E6%A8%A1%E6%9D%BF 中文维基],遵循CC BY SA 3.0协议,但后来有较大更改}} |
|||
{{施工中|2d|本土化}} |
|||
{{info|本页面引自https://zch.moegirl.org/wiki/Help:模板}} |
|||
{{帮助文档难度/困难}} |
{{帮助文档难度/困难}} |
||
{{浮动帮助菜单}} |
{{浮动帮助菜单}} |
||
{{FromOther|site=中文维基百科|originURL=https://zh.wikipedia.org/wiki/Help:%E6%A8%A1%E6%9D%BF|origin=|copyright=cc|lsubtype=by-sa|lver=3.0|contribURL=https://zh.wikipedia.org/w/index.php?title=Help:%E6%A8%A1%E6%9D%BF&action=history}} |
|||
'''模板'''在维基系统(MediaWiki)中是一个可以加入另一个页面的页面。这一加入过程叫做嵌入,就好像计算机语言中的子程序。 |
'''模板'''在维基系统(MediaWiki)中是一个可以加入另一个页面的页面。这一加入过程叫做嵌入,就好像计算机语言中的子程序。 |
||
本文提供维基百科模板的使用手册和指南<!--,另外, |
本文提供维基百科模板的使用手册和指南。<!--,另外, |
||
*模板简介在[[帮助:模板入门]]; |
*模板简介在[[帮助:模板入门]]; |
||
*模板分类在[[:分类:页面模板]]; |
*模板分类在[[:分类:页面模板]]; |
||
*模板名字空间的帮助信息在[[ |
*模板名字空间的帮助信息在[[帮助:名字空间#“模板”名字空间|帮助:名字空间]];--> |
||
==概述== |
==概述== |
||
'''模板名字空间'''是以“'''Template:'''”开头的名字空间,这个前缀是跨语言的,也就是说<code>模板:</code>和<code>Template:</code>是等价的。 |
'''模板名字空间'''是以“'''Template:'''”开头的名字空间,这个前缀是跨语言的,也就是说<code>模板:</code>和<code>Template:</code>这两个前缀是等价的。 |
||
在此名字空间的页面 |
在此名字空间的页面称为'''模板''',此页面的内容是用来通过嵌入技术加入到其他页面中,从而创建复杂的文档。 |
||
将名为“Template:模板名”的模板加入页面中的语法是<code><nowiki>{{模板名}}</nowiki></code>,这个叫做'''模板标签'''。 |
将名为“Template:模板名”的模板加入页面中的语法是<code><nowiki>{{模板名}}</nowiki></code>,这个叫做'''模板标签'''。 |
||
第28行: | 第25行: | ||
如果一个页面不是以“Template:”开头,则不属于模板,但也可以使用模板标签。 |
如果一个页面不是以“Template:”开头,则不属于模板,但也可以使用模板标签。 |
||
:例如<code><nowiki>{{帮助: |
:例如<code><nowiki>{{帮助:名字空间}}</nowiki></code>会将[[帮助:名字空间]]中的内容加入到该页来。 |
||
这样一来,'''所有页面都可以当作是模板'''。但是,使用在模板名字空间的页面(即真正的模板)有以下独特的好处: |
这样一来,'''所有页面都可以当作是模板'''。但是,使用在模板名字空间的页面(即真正的模板)有以下独特的好处: |
||
#所有被页面使用的模板都在页面编辑页显示出来。 |
# 所有被页面使用的模板都在页面编辑页显示出来。 |
||
#当模板改变时,所有使用模板页面的服务器缓存(相对于浏览器缓存)自动被清空;而位于其他名字空间的页面,服务器缓存往往要手工清空。 |
# 当模板改变时,所有使用模板页面的服务器缓存(相对于浏览器缓存)自动被清空;而位于其他名字空间的页面,服务器缓存往往要手工清空。 |
||
而模板名字空间以外的页面一般在如下情况下作为模板使用: |
而模板名字空间以外的页面一般在如下情况下作为模板使用: |
||
#引用维基百科名字空间的界面消息。 |
# 引用维基百科名字空间的界面消息。 |
||
#将长页面(这里假设名字就叫做<code>长页面</code>)拆分为较短页面时,可以将短页面命名为<code>长页面/第一部分</code>、<code>长页面/第二部分</code>等,然后使用<code><nowiki>{{/第一部分}}<br/>{{/第二部分}}</nowiki></code>来拼成长页面。 |
# 将长页面(这里假设名字就叫做<code>长页面</code>)拆分为较短页面时,可以将短页面命名为<code>长页面/第一部分</code>、<code>长页面/第二部分</code>等,然后使用<code><nowiki>{{/第一部分}}<br/>{{/第二部分}}</nowiki></code>来拼成长页面。 |
||
---- |
---- |
||
一个模板可以调用另一个模板,它也可以调用它自己(递归调用),但'''只有一层自我调用有效'''。 |
一个模板可以调用另一个模板,它也可以调用它自己(递归调用),但'''只有一层自我调用有效'''。 |
||
第92行: | 第89行: | ||
现在假设我们创建了一个名为'''姓名'''的模板,即<code><nowiki>[[Template:姓名]]</nowiki></code>,内容为: |
现在假设我们创建了一个名为'''姓名'''的模板,即<code><nowiki>[[Template:姓名]]</nowiki></code>,内容为: |
||
我是<nowiki>{{{姓}}}{{{名}}}。</nowiki> |
我是<nowiki>{{{姓}}}{{{名}}}。</nowiki> |
||
如果用<code><nowiki>{{姓名}}</nowiki></code>调用这个模板,不写任何参数,我们会得到: |
|||
如果用<code><nowi |
|||
我是<nowiki>{{{姓}}}{{{名}}}。</nowiki> |
|||
如果用<code><nowiki>{{姓名|姓=张|名=飞}}</nowiki></code>调用,我们会得到: |
|||
我是张飞。 |
|||
---- |
|||
'''例2:含有编号参数的模板''' |
|||
再来一个例子,说明一下匿名参数的定义和调用。我们还是先要定义一个带参数的模板,例如模板<code><nowiki>[[Template:数数]]</nowiki></code>,内容是: |
|||
一二三<nowiki>{{{1|四五六}}}</nowiki>七八九 |
|||
调用<code><nowiki>{{数数|六五四}}</nowiki></code>的结果是: |
|||
一二三六五四七八九 |
|||
如果传递一个空值,<code><nowiki>{{数数|}}</nowiki></code>的结果是: |
|||
一二三七八九 |
|||
如果省略了匿名参数,即调用默认值,<code><nowiki>{{数数}}</nowiki></code>的结果是: |
|||
一二三四五六七八九 |
|||
===参数值的限制=== |
|||
*如果参数值中含有等号(<code>=</code>),调用模板时则必须使用参数名,即使参数名只是一个编号也要使用。 |
|||
*如果参数值中含有两个连续的右大括号(<code><nowiki>}}</nowiki></code>),调用参数时必须将其放入nowiki标记中,例如<code><nowiki><nowiki>}}</nowiki></nowiki></code>。 |
|||
*如果参数值中含有竖线(<code><nowiki>|</nowiki></code>),调用参数时必须将其放入nowiki标记中,例如<code><nowiki><nowiki>|</nowiki></nowiki></code>。 |
|||
*参数值可以很长。 |
|||
*参数值中可以包含一对双方括号,用于链接一个条目,但不能含有半个右双方括号,然后再接半个左双方括号。模板参数内的方括号必须配对。 |
|||
例如<code><nowiki>[[Template:数数]]</nowiki></code>中的内容是: |
|||
<nowiki>[[一二{{{1}}}六七]]</nowiki> |
|||
则调用<code><nowiki>{{数数|三]]四[[五}}</nowiki></code>并不视为调用了模板: |
|||
<nowiki>{{数数|三]]四[[五}}</nowiki> |
|||
===命名参数还是匿名参数?=== |
|||
====匿名参数的优点==== |
|||
#调用模板时不需要参数名和等号,从而节约打字和存储空间。 |
|||
#数字看起来很直观,也可以被不懂中文的人理解。 |
|||
====命名参数的优点==== |
|||
*参数的顺序可以变化,模板的参数可以任意添加和修改,而不会对调用模板的页面产生致命影响。<s>然而一部分强迫症编辑者仍然会努力去统一模板的命名参数的顺序,以至于被认为浪费服务器空间和被怀疑刷编辑数。</s> |
|||
*参数的意义容易理解。 |
|||
*匿名参数不可以直接使用HTML元素属性。 |
|||
*模板的同一次使用中,允许对同一个变量进行多次赋值,但是最后一个值会被使用 |
|||
**有些special techniques会利用这点 |
|||
**但这意味着至少要有一个命名参数 |
|||
====命名参数和匿名参数混合使用==== |
|||
命名参数和匿名参数可以混合使用,此时所有的未命名参数根据位置被编号,命名参数不被编号。 |
|||
'''例3:''' |
|||
模板<code><nowiki>[[Template:又数数]]</nowiki></code>的内容是 |
|||
<nowiki>{{{1}}}、{{{2}}}、{{{3}}}</nowiki> |
|||
<code><nowiki>{{又数数|3=1|2|1=3|4|5|6|7}}</nowiki></code>的结果是 |
|||
3、4、5 |
|||
想想为什么? |
|||
{{Hide |
|||
|标题=原因 |
|||
|内容=这是一个两种参数混用的情况。 |
|||
首先忽略命名参数,五个匿名参数从1到5分别分配到了2、4、5、6、7。 |
|||
之前说过,匿名参数可以视作名字为数字的命名参数。因此整个模板调用可以视为<code><nowiki>{{又数数|3=1|1=2|1=3|2=4|3=5|4=6|5=7}}</nowiki></code>。 |
|||
这里有一个问题:当同一个参数被赋值两次怎么办?MediaWiki的解析器会保留最后一次的赋值,也就是最终结果为1=3,2=4,3=5,4=6,5=7。 |
|||
然后在模板内容中调用了名为“1”、“2”、“3”的三个参数。因此得到如上结果。}} |
|||
'''实际情况中请不要使用上述例子中的写法,无论是将参数名命名为数字,还是多次赋值,都是十分不安全的行为,因为这样可读性极差且容易出错。''' |
|||
===未赋值并且没有默认值的参数=== |
|||
例如:模板<code><nowiki>[[Template:再数数]]</nowiki></code>的内容是 |
|||
<nowiki>一-{{{1}}}-三-{{{2}}}-五</nowiki> |
|||
调用<code><nowiki>{{再数数||}}</nowiki></code>的结果是 |
|||
一--三--五 |
|||
调用<code><nowiki>{{再数数|二|}}</nowiki></code>的结果是 |
|||
一-二-三--五 |
|||
调用<code><nowiki>{{再数数||二}}</nowiki></code>的结果是 |
|||
一--三-二-五 |
|||
调用<code><nowiki>{{再数数|二|{{{1}}}}}</nowiki></code>的结果是 |
|||
一-二-三-<nowiki>{{{1}}}</nowiki>-五 |
|||
调用<code><nowiki>{{再数数|{{{1}}}|四}}</nowiki></code>的结果是 |
|||
<nowiki>一-{{{1}}}-三-四-五</nowiki> |
|||
调用<code><nowiki>{{再数数|{{{1}}}|{{{2}}}}}</nowiki></code>的结果是 |
|||
<nowiki>一-{{{1}}}-三-{{{2}}}-五</nowiki> |
|||
===参数赋值中包含参数=== |
|||
如果一个参数未赋值,则在三个大括号中的参数名在模板调用是不起参数的作用。如果要它其作用,一定要赋值。 |
|||
'''例4:''' |
|||
模板<code><nowiki>[[Template:数数1]]</nowiki></code>的内容是 |
|||
<nowiki>{{再数数|二}}</nowiki> |
|||
调用<code><nowiki>{{数数1|四}}</nowiki></code>的结果是: |
|||
一-二-三-<nowiki>{{{2}}}</nowiki>-五 |
|||
模板<code><nowiki>[[Template:数数2]]</nowiki></code>的内容是 |
|||
<nowiki>{{再数数|二|{{{1}}}}}</nowiki> |
|||
调用<code><nowiki>{{数数2|四}}</nowiki></code>的结果是: |
|||
一-二-三-四-五 |
|||
模板<code><nowiki>[[Template:数数3]]</nowiki></code>的内容是 |
|||
<nowiki>{{再数数|二|2={{{1}}}}}</nowiki> |
|||
调用<code><nowiki>{{数数3|四}}</nowiki></code>的结果是: |
|||
一-二-三-四-五 |
|||
最简单的参数迭代办法就是在模板中用同样的参数名。 |
|||
'''例5:''' |
|||
模板<code><nowiki>[[Template:姓名国籍]]</nowiki></code>中使用 |
|||
<nowiki>{{姓名|姓={{{姓}}}|名={{{名}}}}}{{{国籍}}}人。</nowiki> |
|||
'''进一步的讨论''' |
|||
像<code><nowiki>{{再数数||四}}</nowiki></code>这样的调用将空值赋给参数1,而不是没有赋值,所以结果是 |
|||
一--三-四-五 |
|||
如果我们希望参数1不赋值,则应该将参数2用命名参数形式赋值,如 |
|||
<nowiki>{{再数数|2=四}}</nowiki> |
|||
结果则是 |
|||
一-<nowiki>{{{1}}}</nowiki>-三-四-五 |
|||
如果这样的参数值被赋给如<code><nowiki><font size></nowiki></code>这样的标记,会使编码错误,但这些错误会被系统(MediaWiki)忽略,而不产生奇怪的结果。请参看英文的例子:[http://meta.wikimedia.org/wiki/Template_talk:Fontsize 字体大小]。 |
|||
参数“02”和参数“2”是不同的。例如模板<code><nowiki>[[Template:例5]]</nowiki></code>的内容是 |
|||
<nowiki>{{{1}}}{{{2}}}{{{02}}}</nowiki> |
|||
调用<code><nowiki>{{例5|3|4|5|6}}</nowiki></code>的结果是 |
|||
<nowiki>34{{{02}}}</nowiki> |
|||
'''注意:'''维基系统名字空间的参数名是不同的,它们是<code><nowiki>$1, $2, ...</nowiki></code>,参见[http://meta.wikimedia.org/wiki/Meta-Wikimedia:MediaWiki_namespace_text 英文维基系统名字空间文本帮助]。 |
|||
==模板页== |
|||
维基系统在生成模板页面时,实际上相当于一次没有参数赋值的模板调用,因此如果参数有默认值,将被显示。例如:模板<code><nowiki>[[Template:数一数]]</nowiki></code>的内容是 |
|||
<nowiki>一二三{{{1|四五六}}}七八九</nowiki> |
|||
模板页面的内容是 |
|||
一二三四五六七八九 |
|||
===讨论页=== |
|||
模板页面同其他条目页面是不同的,它的目的不是将知识传递给读者,而仅仅是为系统定义模板。因此,其讨论页跟普通条目页面的讨论页也不同,主要有两个功能: |
|||
#解释模板的作用和相关参数(最好给出例子,调用模板的形式以及结果)。 |
|||
#普通的对模板的讨论。<!--In complicated cases, "subst:" can be very helpful in the explanation, see below. |
|||
You can use {{doctl}} for this task.--> |
|||
===跨语言链接=== |
|||
模板可以含有跨语言链接,但结果是所有调用模板的条目页面都含有了该跨语言链接,这通常是非常糟糕的事情。为了仅仅让模板本身拥有跨语言链接,而不包括使用模板的条目,我们必须使用<nowiki><noinclude></nowiki>标识。例如: |
|||
<nowiki><noinclude></nowiki> |
|||
<nowiki>[[en:Template:Europe]]</nowiki> |
|||
<nowiki>[[zh:Template:欧洲]]</nowiki> |
|||
<nowiki></noinclude> </nowiki> |
|||
'''注意:'''在模板中使用<code><nowiki><noinclude></nowiki></code>标识时要小心!不要在<code><nowiki><noinclude></nowiki></code>之前或者<code><nowiki></noinclude></nowiki></code>之后'''加空行''',否则空行将被当作模板的一部分反映在调用模板的条目中。系统会自动忽略<code><nowiki></noinclude></nowiki></code>之后的单个空行。 |
|||
'''例6:使用<nowiki><noinclude></nowiki>标识的后果''' |
|||
如果在例1中的模板<code><nowiki>[[Template:姓名]]</nowiki></code>加入跨语言链接 |
|||
<nowiki>我是{{{姓}}}{{{名}}}。</nowiki> |
|||
<nowiki><noinclude></nowiki> |
|||
<nowiki>[[en:Template:Name]]</nowiki> |
|||
<nowiki></nocinlude></nowiki> |
|||
用<code><nowiki>{{姓名国籍|姓=张|名=飞|国籍=蜀汉}}</nowiki></code>调用例5中的模板<code><nowiki>[[Template:姓名国籍]]</nowiki></code>时,结果是: |
|||
我是张飞。 |
|||
蜀汉人。 |
|||
如果希望得到的结果是: |
|||
我是张飞。蜀汉人。 |
|||
在<nowiki>[[Template:姓名]]</nowiki>加入跨语言链接应该不含有换行: |
|||
<nowiki>我是{{{姓}}}{{{名}}}。<noinclude>[[en:Template:Name]]</nocinlude></nowiki> |
|||
'''注意:'''我们推荐您用后面一种方式使用<code><nowiki><noinclude></nowiki></code>标识。 |
|||
===模板分类=== |
|||
模板也要进行分类,目的是为了更好的整理模板,以便更好的使用和管理模板。模板的分类同条目的分类相似,可以参阅有关条目分类的帮助文件。不同之处在于对于模板的分类需要使用<code><nowiki><noinclude></nowiki></code>标识,如果不加<code><nowiki><noinclude></nowiki></code>标识,则不仅模板被分类,所有使用该模板的条目也被分入同一类。 |
|||
所有模板的根目录(即分类)是[[:Category:页面模板]]。所有模板分类名最后一定要含有“模板”二字,以区别于普通条目的分类。 |
|||
'''例7:模板分类方法''' |
|||
将例1中的模板<code><nowiki>[[Template:姓名]]</nowiki></code>分为<code><nowiki>[[:Category:人物模板]]</nowiki></code>,需要加入: |
|||
<nowiki>我是{{{姓}}}{{{名}}}。<noinclude>[[Category:人物模板]]</nocinlude></nowiki> |
|||
===标识=== |
|||
'''注意:'''以下内容只限于模板中使用的情况,在其他名字空间使用的情况请参考相关帮助文挡。 |
|||
====<nowiki><noinclude></nowiki>==== |
|||
前面已经提到,<code><nowiki><noinclude></nowiki></code>标识的作用是将<code><nowiki><noinclude></nowiki></code>和<code><nowiki></noinclude></nowiki></code>之间的文本加入所在的模板页中,而不加入调用模板的条目或模板中,针对模板的说明、分类和跨语言连接都可以置于该标识之间。 |
|||
'''例8:''' |
|||
针对<code><nowiki>[[Template:网球男单世界第一]]</nowiki></code>模板的分类<code><nowiki>[[:Category:体育模板]]</nowiki></code>就可以置于<code><nowiki><noinclude></nowiki></code>和<code><nowiki></noinclude></nowiki></code>之间,而对于调用该模板条目的分类<code><nowiki>[[:Category:网球运动员]]</nowiki></code>可以置于标识之外: |
|||
<nowiki>[[Category:网球运动员]]<noinclude>[[Category:体育模板]]</noinclude></nowiki> |
|||
====<nowiki><includeonly></nowiki>==== |
|||
<code><nowiki><includeonly></nowiki></code>标识的作用跟<code><nowiki><noinclude></nowiki></code>标识的作用正好相反,是将<code><nowiki><includeonly></nowiki></code>和<code><nowiki></includeonly></nowiki></code>之间的文本'''不'''加入所在的模板页中,而加入调用模板的页面中。 |
|||
上面的'''例8'''中针对调用该模板的条目的分类<code><nowiki>[[:Category:网球运动员]]</nowiki></code>实际上应该置于<code><nowiki><includeonly></nowiki></code>和<code><nowiki></includeonly></nowiki></code>之间: |
|||
<nowiki><includeonly>[[Category:网球运动员]]</includeonly></nowiki> |
|||
这样,在<code><nowiki>[[:Category:网球运动员]]</nowiki></code>分类中就不会出现<code><nowiki>[[Template:网球男单世界第一]]</nowiki></code>模板了。 |
|||
====<nowiki><onlyinclude></nowiki>==== |
|||
<code><nowiki><onlyinclude></nowiki></code>标识与<code><nowiki><noinclude></nowiki></code>和<code><nowiki><includeonly></nowiki></code>标识均有所差别,是将<code><nowiki><onlyinclude></nowiki></code>和<code><nowiki></onlyinclude></nowiki></code>之间的文本'''加入'''所在的模板页中,其他的文本'''不'''加入。如果页面中还存在<code><nowiki><noinclude></nowiki></code>和<code><nowiki><includeonly></nowiki></code>两种标识,那么它们将会'''被忽略'''。 |
|||
====<nowiki>subst</nowiki>与<nowiki>safesubst</nowiki>==== |
|||
'''subst'''和'''safesubst'''的用法是:<code><nowiki>{{subst:模板名}}</nowiki></code>或<code><nowiki>{{safesubst:模板名}}</nowiki></code>。它的作用是'''直接'''或'''间接'''地一次性将模板内容编译成维基文档,加入到页面中去,而不是每次显示页面的时候调用有关模板。这样可以按模板当前的形式编辑条目,并使条目免受模板变化的影响,并减轻服务器负担。 |
|||
<code><nowiki>{{subst:模板名}}和{{safesubst:模板名}}</nowiki></code>只会将模板展开<b>一层</b>。如果需要彻底的展开的话,请访问[[特殊:展开模板]]进行手动展开。(该特殊页面会把所有两对大括号内的内容全部展开,包括<nowiki>{{BASEPAGENAME}}</nowiki>这类的系统变量) |
|||
{{clear}} |
|||
==作用== |
|||
如果想将同一段文本复制到两个或者多个页面,我们可以考虑使用模板,但也并不是一定要用模板。如果使用模板,要修改这段文本时,不需要针对每一个页面进行逐个修改,而只需要修改模板的内容,所有使用该模板的页面都自动被修改。 |
|||
由于有参数存在,所以模板文本并不需要完全一样。对于不同页面,我们可以赋不同值,从而生成不同的文本。模板不仅仅是使用方便,它有时候还可以起到控制页面统一格式的作用。 |
|||
模板的一般用法有: |
|||
* [[:Category:提示模板|提示模板]],例如:{{tl|不完整}}传递“不完整”的消息。 |
|||
* [[:Category:导航模板|导航模板]]和[[:Category:大家族模板|大家族模板]],用于给读者提供类似的条目,例如:{{tl|MCBBS论坛用户}}。 |
|||
* [[:Category:信息模板|信息模板]],用于同一类条目中提供统一格式的信息,例如:{{tl|PersonInfoBox}}在条目右边绘制信息框,提供用户的相关信息。 |
|||
* 使用趣味模板增加页面趣味性,如{{tl|一本道}}。 |
|||
* 便利页面的编辑,使编辑者更方便,如{{tl|ref}}。 |
|||
* 提供跨语言文本。 |
|||
* 以上几种的组合。 |
|||
==参见== |
|||
*[[mw:Help:Templates/zh|Mediawiki:帮助:模板]] |
|||
[[分类:编辑帮助]] |
|||
[[分类:引用萌娘百科的页面]] |
2023年7月26日 (三) 09:32的最新版本
模板在维基系统(MediaWiki)中是一个可以加入另一个页面的页面。这一加入过程叫做嵌入,就好像计算机语言中的子程序。
本文提供维基百科模板的使用手册和指南。
概述
模板名字空间是以“Template:”开头的名字空间,这个前缀是跨语言的,也就是说模板:
和Template:
这两个前缀是等价的。
在此名字空间的页面称为模板,此页面的内容是用来通过嵌入技术加入到其他页面中,从而创建复杂的文档。
将名为“Template:模板名”的模板加入页面中的语法是{{模板名}}
,这个叫做模板标签。
- 例如:“
一二{{三到六}}七八
”中使用了内容为“三四五六
”的模板“Template:三到六”,结果就是“一二三四五六七八”。
模板标签使得编辑页面在生成时找到并添加了模板,有时候我们还用诸如“调用”、“参考”、“包括”、“嵌入”、“使用”等词来替代“添加”或者“加入”,实际上描述的都是同一个过程。
如果“Template:模板名”不存在,{{模板名}}
的作用就与[[Template:模板名]]
类似,提供一个连接到不存在页面的链接。所以,一种创建模板的方法就是先放一个模板标签在页面里,然后点击它开始编辑模板。
如果一个页面不是以“Template:”开头,则不属于模板,但也可以使用模板标签。
- 例如
{{帮助:名字空间}}
会将帮助:名字空间中的内容加入到该页来。
这样一来,所有页面都可以当作是模板。但是,使用在模板名字空间的页面(即真正的模板)有以下独特的好处:
- 所有被页面使用的模板都在页面编辑页显示出来。
- 当模板改变时,所有使用模板页面的服务器缓存(相对于浏览器缓存)自动被清空;而位于其他名字空间的页面,服务器缓存往往要手工清空。
而模板名字空间以外的页面一般在如下情况下作为模板使用:
- 引用维基百科名字空间的界面消息。
- 将长页面(这里假设名字就叫做
长页面
)拆分为较短页面时,可以将短页面命名为长页面/第一部分
、长页面/第二部分
等,然后使用{{/第一部分}}<br/>{{/第二部分}}
来拼成长页面。
一个模板可以调用另一个模板,它也可以调用它自己(递归调用),但只有一层自我调用有效。
- 例如:
[[Template:模板1]]
的内容是“一次,{{模板1}}”
,则[[Template:模板1]]
将会被替换为:“一次,一次,{{模板1}}”。 - 如果其他条目调用该模板,所加入的文字将是“一次,{{模板1}}”。
- 但是递归调用检查并不阻止重定向。因此MediaWiki限制了最终能够展开的层数。这个数值默认为40层。
模板中的魔术字在模板被加入某页面后才被赋值。因此,如果一个模板中含有{{PAGENAME}}
,该模板被某页面调用,相应的位置显示的将是调用页面的名称,而不是被调用模板的名称。
一个页面所调用的所有模板都会在该页的编辑页面中列出,并提供相应的链接,而且:
- 只列出以“Template:”开头的真正模板(位于模板名字空间的页面),其他被调用的页面则不列出;
- 一个段落的编辑页面列出的是所有被调用的模板,包括其他段落调用的模板;
- 即使编辑旧版本的页面,这个列表也表示的是当前最新的状态;
- 如果不真正提交编辑,仅仅在预览中使用的模板不会被列出。
请注意,如果页面结尾没有换行,编辑页面中总是在结尾添加一个换行。这是MediaWiki的功能,任何页面或者章节的结尾都会有一个空行。但这个换行对模板不真正起作用,即不影响模板的效果。
例如:
{{编号演示}}{{编号演示}} {{编号演示}}
假设模板“编号演示”的内容为(行尾换行为自动添加):
编号演示
那么最终结果将会是:
编号演示编号演示 编号演示
这里第二次和第三次模板调用之间并没有出现新行(即两次换行),仅有一次换行解析出来的空格。
参数
模板可以使用参数,通过参数命名或者编号可以区分各个参数。
参数的定义和调用
在模板页面中,用三个大括号可以调用参数。
- 例如:
{{{参数名}}}
会被替换为名为参数名
的参数;或者 {{{参数名|默认值}}}
也可以达到相同效果。如果调用模板时参数名
没有赋值,则使用默认值
作为该参数的值。
模板的参数有两种:
- 命名参数,即如前文所述,参数名为规定好的名字;
- 匿名参数,参数名默认为
{{{1}}}
、{{{2}}}
等。
在调用带参数的模板的时候,语法是:
- 对于命名参数,即诸如
{{{参数1}}}
、{{{参数2}}}
形式的参数,调用时使用{{模板名|参数1=参数1的值|参数2=参数2的值}}
这样的格式; - 对于匿名参数,即诸如
{{{1}}}
、{{{2}}}
形式的参数,调用时使用{{模板名|参数1的赋值|参数2的赋值}}
。
你也可以把匿名参数直接看作名字为“1”、“2”等的参数,只是调用时不可以用等号表示而已。
注意:如果没有指定参数默认值,那默认值并非为空,而是参数名外面加上三个大括号(即使用参数的代码原文)。
- 如:
{{{参数名}}}
未指定默认值且调用时未传递参数,会被解析为原文:{{{参数名}}}
。 - 因此,如果你希望未指定的参数默认为空(这也是常用情况之一),可以写成:
{{{参数名|}}}
(注意竖线)。
例1:含有命名参数的模板
现在假设我们创建了一个名为姓名的模板,即[[Template:姓名]]
,内容为:
我是{{{姓}}}{{{名}}}。
如果用{{姓名}}
调用这个模板,不写任何参数,我们会得到:
我是{{{姓}}}{{{名}}}。
如果用{{姓名|姓=张|名=飞}}
调用,我们会得到:
我是张飞。
例2:含有编号参数的模板
再来一个例子,说明一下匿名参数的定义和调用。我们还是先要定义一个带参数的模板,例如模板[[Template:数数]]
,内容是:
一二三{{{1|四五六}}}七八九
调用{{数数|六五四}}
的结果是:
一二三六五四七八九
如果传递一个空值,{{数数|}}
的结果是:
一二三七八九
如果省略了匿名参数,即调用默认值,{{数数}}
的结果是:
一二三四五六七八九
参数值的限制
- 如果参数值中含有等号(
=
),调用模板时则必须使用参数名,即使参数名只是一个编号也要使用。 - 如果参数值中含有两个连续的右大括号(
}}
),调用参数时必须将其放入nowiki标记中,例如<nowiki>}}</nowiki>
。 - 如果参数值中含有竖线(
|
),调用参数时必须将其放入nowiki标记中,例如<nowiki>|</nowiki>
。 - 参数值可以很长。
- 参数值中可以包含一对双方括号,用于链接一个条目,但不能含有半个右双方括号,然后再接半个左双方括号。模板参数内的方括号必须配对。
例如[[Template:数数]]
中的内容是:
[[一二{{{1}}}六七]]
则调用{{数数|三]]四[[五}}
并不视为调用了模板:
{{数数|三]]四[[五}}
命名参数还是匿名参数?
匿名参数的优点
- 调用模板时不需要参数名和等号,从而节约打字和存储空间。
- 数字看起来很直观,也可以被不懂中文的人理解。
命名参数的优点
- 参数的顺序可以变化,模板的参数可以任意添加和修改,而不会对调用模板的页面产生致命影响。
然而一部分强迫症编辑者仍然会努力去统一模板的命名参数的顺序,以至于被认为浪费服务器空间和被怀疑刷编辑数。 - 参数的意义容易理解。
- 匿名参数不可以直接使用HTML元素属性。
- 模板的同一次使用中,允许对同一个变量进行多次赋值,但是最后一个值会被使用
- 有些special techniques会利用这点
- 但这意味着至少要有一个命名参数
命名参数和匿名参数混合使用
命名参数和匿名参数可以混合使用,此时所有的未命名参数根据位置被编号,命名参数不被编号。
例3:
模板[[Template:又数数]]
的内容是
{{{1}}}、{{{2}}}、{{{3}}}
{{又数数|3=1|2|1=3|4|5|6|7}}
的结果是
3、4、5
想想为什么?
原因 |
---|
这是一个两种参数混用的情况。 首先忽略命名参数,五个匿名参数从1到5分别分配到了2、4、5、6、7。 之前说过,匿名参数可以视作名字为数字的命名参数。因此整个模板调用可以视为 这里有一个问题:当同一个参数被赋值两次怎么办?MediaWiki的解析器会保留最后一次的赋值,也就是最终结果为1=3,2=4,3=5,4=6,5=7。 然后在模板内容中调用了名为“1”、“2”、“3”的三个参数。因此得到如上结果。 |
实际情况中请不要使用上述例子中的写法,无论是将参数名命名为数字,还是多次赋值,都是十分不安全的行为,因为这样可读性极差且容易出错。
未赋值并且没有默认值的参数
例如:模板[[Template:再数数]]
的内容是
一-{{{1}}}-三-{{{2}}}-五
调用{{再数数||}}
的结果是
一--三--五
调用{{再数数|二|}}
的结果是
一-二-三--五
调用{{再数数||二}}
的结果是
一--三-二-五
调用{{再数数|二|{{{1}}}}}
的结果是
一-二-三-{{{1}}}-五
调用{{再数数|{{{1}}}|四}}
的结果是
一-{{{1}}}-三-四-五
调用{{再数数|{{{1}}}|{{{2}}}}}
的结果是
一-{{{1}}}-三-{{{2}}}-五
参数赋值中包含参数
如果一个参数未赋值,则在三个大括号中的参数名在模板调用是不起参数的作用。如果要它其作用,一定要赋值。
例4:
模板[[Template:数数1]]
的内容是
{{再数数|二}}
调用{{数数1|四}}
的结果是:
一-二-三-{{{2}}}-五
模板[[Template:数数2]]
的内容是
{{再数数|二|{{{1}}}}}
调用{{数数2|四}}
的结果是:
一-二-三-四-五
模板[[Template:数数3]]
的内容是
{{再数数|二|2={{{1}}}}}
调用{{数数3|四}}
的结果是:
一-二-三-四-五
最简单的参数迭代办法就是在模板中用同样的参数名。
例5:
模板[[Template:姓名国籍]]
中使用
{{姓名|姓={{{姓}}}|名={{{名}}}}}{{{国籍}}}人。
进一步的讨论
像{{再数数||四}}
这样的调用将空值赋给参数1,而不是没有赋值,所以结果是
一--三-四-五
如果我们希望参数1不赋值,则应该将参数2用命名参数形式赋值,如
{{再数数|2=四}}
结果则是
一-{{{1}}}-三-四-五
如果这样的参数值被赋给如<font size>
这样的标记,会使编码错误,但这些错误会被系统(MediaWiki)忽略,而不产生奇怪的结果。请参看英文的例子:字体大小。
参数“02”和参数“2”是不同的。例如模板[[Template:例5]]
的内容是
{{{1}}}{{{2}}}{{{02}}}
调用{{例5|3|4|5|6}}
的结果是
34{{{02}}}
注意:维基系统名字空间的参数名是不同的,它们是$1, $2, ...
,参见英文维基系统名字空间文本帮助。
模板页
维基系统在生成模板页面时,实际上相当于一次没有参数赋值的模板调用,因此如果参数有默认值,将被显示。例如:模板[[Template:数一数]]
的内容是
一二三{{{1|四五六}}}七八九
模板页面的内容是
一二三四五六七八九
讨论页
模板页面同其他条目页面是不同的,它的目的不是将知识传递给读者,而仅仅是为系统定义模板。因此,其讨论页跟普通条目页面的讨论页也不同,主要有两个功能:
- 解释模板的作用和相关参数(最好给出例子,调用模板的形式以及结果)。
- 普通的对模板的讨论。
跨语言链接
模板可以含有跨语言链接,但结果是所有调用模板的条目页面都含有了该跨语言链接,这通常是非常糟糕的事情。为了仅仅让模板本身拥有跨语言链接,而不包括使用模板的条目,我们必须使用<noinclude>标识。例如:
<noinclude> [[en:Template:Europe]] [[zh:Template:欧洲]] </noinclude>
注意:在模板中使用<noinclude>
标识时要小心!不要在<noinclude>
之前或者</noinclude>
之后加空行,否则空行将被当作模板的一部分反映在调用模板的条目中。系统会自动忽略</noinclude>
之后的单个空行。
例6:使用<noinclude>标识的后果
如果在例1中的模板[[Template:姓名]]
加入跨语言链接
我是{{{姓}}}{{{名}}}。 <noinclude> [[en:Template:Name]] </nocinlude>
用{{姓名国籍|姓=张|名=飞|国籍=蜀汉}}
调用例5中的模板[[Template:姓名国籍]]
时,结果是:
我是张飞。 蜀汉人。
如果希望得到的结果是:
我是张飞。蜀汉人。
在[[Template:姓名]]加入跨语言链接应该不含有换行:
我是{{{姓}}}{{{名}}}。<noinclude>[[en:Template:Name]]</nocinlude>
注意:我们推荐您用后面一种方式使用<noinclude>
标识。
模板分类
模板也要进行分类,目的是为了更好的整理模板,以便更好的使用和管理模板。模板的分类同条目的分类相似,可以参阅有关条目分类的帮助文件。不同之处在于对于模板的分类需要使用<noinclude>
标识,如果不加<noinclude>
标识,则不仅模板被分类,所有使用该模板的条目也被分入同一类。
所有模板的根目录(即分类)是Category:页面模板。所有模板分类名最后一定要含有“模板”二字,以区别于普通条目的分类。
例7:模板分类方法
将例1中的模板[[Template:姓名]]
分为[[:Category:人物模板]]
,需要加入:
我是{{{姓}}}{{{名}}}。<noinclude>[[Category:人物模板]]</nocinlude>
标识
注意:以下内容只限于模板中使用的情况,在其他名字空间使用的情况请参考相关帮助文挡。
<noinclude>
前面已经提到,<noinclude>
标识的作用是将<noinclude>
和</noinclude>
之间的文本加入所在的模板页中,而不加入调用模板的条目或模板中,针对模板的说明、分类和跨语言连接都可以置于该标识之间。
例8:
针对[[Template:网球男单世界第一]]
模板的分类[[:Category:体育模板]]
就可以置于<noinclude>
和</noinclude>
之间,而对于调用该模板条目的分类[[:Category:网球运动员]]
可以置于标识之外:
[[Category:网球运动员]]<noinclude>[[Category:体育模板]]</noinclude>
<includeonly>
<includeonly>
标识的作用跟<noinclude>
标识的作用正好相反,是将<includeonly>
和</includeonly>
之间的文本不加入所在的模板页中,而加入调用模板的页面中。
上面的例8中针对调用该模板的条目的分类[[:Category:网球运动员]]
实际上应该置于<includeonly>
和</includeonly>
之间:
<includeonly>[[Category:网球运动员]]</includeonly>
这样,在[[:Category:网球运动员]]
分类中就不会出现[[Template:网球男单世界第一]]
模板了。
<onlyinclude>
<onlyinclude>
标识与<noinclude>
和<includeonly>
标识均有所差别,是将<onlyinclude>
和</onlyinclude>
之间的文本加入所在的模板页中,其他的文本不加入。如果页面中还存在<noinclude>
和<includeonly>
两种标识,那么它们将会被忽略。
subst与safesubst
subst和safesubst的用法是:{{subst:模板名}}
或{{safesubst:模板名}}
。它的作用是直接或间接地一次性将模板内容编译成维基文档,加入到页面中去,而不是每次显示页面的时候调用有关模板。这样可以按模板当前的形式编辑条目,并使条目免受模板变化的影响,并减轻服务器负担。
{{subst:模板名}}和{{safesubst:模板名}}
只会将模板展开一层。如果需要彻底的展开的话,请访问特殊:展开模板进行手动展开。(该特殊页面会把所有两对大括号内的内容全部展开,包括{{BASEPAGENAME}}这类的系统变量)
作用
如果想将同一段文本复制到两个或者多个页面,我们可以考虑使用模板,但也并不是一定要用模板。如果使用模板,要修改这段文本时,不需要针对每一个页面进行逐个修改,而只需要修改模板的内容,所有使用该模板的页面都自动被修改。
由于有参数存在,所以模板文本并不需要完全一样。对于不同页面,我们可以赋不同值,从而生成不同的文本。模板不仅仅是使用方便,它有时候还可以起到控制页面统一格式的作用。
模板的一般用法有:
- 提示模板,例如:{{不完整}}传递“不完整”的消息。
- 导航模板和大家族模板,用于给读者提供类似的条目,例如:{{MCBBS论坛用户}}。
- 信息模板,用于同一类条目中提供统一格式的信息,例如:{{PersonInfoBox}}在条目右边绘制信息框,提供用户的相关信息。
- 使用趣味模板增加页面趣味性,如{{一本道}}。
- 便利页面的编辑,使编辑者更方便,如{{ref}}。
- 提供跨语言文本。
- 以上几种的组合。