MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针

如果在编辑的过程中遇到了什么问题,可以去讨论板提问。

为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证

MCBBS Wiki GitHub群组已上线!

您可以在回声洞中发表吐槽!

服务器状态监控。点击进入

本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>

帮助:模板:修订间差异

来自MCBBS Wiki
跳到导航 跳到搜索
无编辑摘要
标签移动版编辑 移动版网页编辑
(// Edit via Wikiplus)
 
(未显示5个用户的24个中间版本)
第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>,这个叫做'''模板标签'''。

:例如:“<code>一二<nowiki>{{三到六}}</nowiki>七八</code>”中使用了内容为“<code>'''三四五六'''</code>”的模板“Template:三到六”,结果就是“一二'''三四五六'''七八”。
:例如:“<code>一二<nowiki>{{三到六}}</nowiki>七八</code>”中使用了内容为“<code>'''三四五六'''</code>”的模板“Template:三到六”,结果就是“一二'''三四五六'''七八”。


第27行: 第25行:


如果一个页面不是以“Template:”开头,则不属于模板,但也可以使用模板标签。
如果一个页面不是以“Template:”开头,则不属于模板,但也可以使用模板标签。
:例如<code><nowiki>{{帮助:模板入门}}</nowiki></code>会将[[帮助:模板入门]]中的内容加入到该页来。
:例如<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>来拼成长页面。
----
----
一个模板可以调用另一个模板,它也可以调用它自己(递归调用),但'''只有一层自我调用有效'''。
一个模板可以调用另一个模板,它也可以调用它自己(递归调用),但'''只有一层自我调用有效'''。
:例如:<code><nowiki>[[Template:模板1]]</nowiki></code>的内容是<code><nowiki>“一次,{{模板1}}”</nowiki></code>,则<code><nowiki>[[Template:模板1]]</nowiki></code>将会被替换为:<nowiki>“一次,一次,{{模板1}}”</nowiki>。
:例如:<code><nowiki>[[Template:模板1]]</nowiki></code>的内容是<code><nowiki>“一次,{{模板1}}”</nowiki></code>,则<code><nowiki>[[Template:模板1]]</nowiki></code>将会被替换为:<nowiki>“一次,一次,{{模板1}}”</nowiki>。
:如果其他条目调用该模板,所加入的文字将是<nowiki>“一次,{{模板1}}”</nowiki>。
:如果其他条目调用该模板,所加入的文字将是<nowiki>“一次,{{模板1}}”</nowiki>。
<!--:但是'''递归调用检查并不阻止重定向'''。因此MediaWiki限制了最终能够展开的层数。这个数值默认为40层。--><!-- However, with templates redirecting to the template that one would want to call recursively, one can achieve recursion without having to make copies of the whole template content, with the number of levels limited by the number of redirects. See also Repetition within a page and m:Template:List of template calls (talk, backlinks, edit).-->
:但是'''递归调用检查并不阻止重定向'''。因此MediaWiki限制了最终能够展开的层数。这个数值默认为40层。<!-- However, with templates redirecting to the template that one would want to call recursively, one can achieve recursion without having to make copies of the whole template content, with the number of levels limited by the number of redirects. See also Repetition within a page and m:Template:List of template calls (talk, backlinks, edit).-->
----
----
模板中的[[Help:魔术字|魔术字]]在模板被加入某页面后才被赋值。因此,如果一个模板中含有<code><nowiki>{{PAGENAME}}</nowiki></code>,该模板被某页面调用,相应的位置显示的将是'''调用页面的名称''',而不是被调用模板的名称。
模板中的魔术字在模板被加入某页面后才被赋值。因此,如果一个模板中含有<code><nowiki>{{PAGENAME}}</nowiki></code>,该模板被某页面调用,相应的位置显示的将是'''调用页面的名称''',而不是被调用模板的名称。


一个页面所调用的所有模板都会在该页的编辑页面中列出,并提供相应的链接,而且:
一个页面所调用的所有模板都会在该页的编辑页面中列出,并提供相应的链接,而且:
*只列出以“Template:”开头的真正模板(位于模板[[帮助:名字空间|名字空间]]的页面),其他被调用的页面则不列出;
*只列出以“Template:”开头的真正模板(位于模板名字空间的页面),其他被调用的页面则不列出;
*一个段落的编辑页面列出的是所有被调用的模板,包括其他段落调用的模板;
*一个段落的编辑页面列出的是所有被调用的模板,包括其他段落调用的模板;
*即使编辑旧版本的页面,这个列表也表示的是当前最新的状态;
*即使编辑旧版本的页面,这个列表也表示的是当前最新的状态;
第91行: 第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的最新版本

本页面引自萌娘百科,最初来自中文维基,遵循CC BY SA 3.0协议,但后来有较大更改
这篇帮助文档的难度为:困难
这篇帮助文档比较复杂,适合资深编辑者阅读。阅读这篇帮助文档前,您需要熟练掌握Wiki知识,对复杂语法有一定的了解。


模板在维基系统(MediaWiki)中是一个可以加入另一个页面的页面。这一加入过程叫做嵌入,就好像计算机语言中的子程序。

本文提供维基百科模板的使用手册和指南。

概述

模板名字空间是以“Template:”开头的名字空间,这个前缀是跨语言的,也就是说模板:Template:这两个前缀是等价的。

在此名字空间的页面称为模板,此页面的内容是用来通过嵌入技术加入到其他页面中,从而创建复杂的文档。

将名为“Template:模板名”的模板加入页面中的语法是{{模板名}},这个叫做模板标签

例如:“一二{{三到六}}七八”中使用了内容为“三四五六”的模板“Template:三到六”,结果就是“一二三四五六七八”。

模板标签使得编辑页面在生成时找到并添加了模板,有时候我们还用诸如“调用”、“参考”、“包括”、“嵌入”、“使用”等词来替代“添加”或者“加入”,实际上描述的都是同一个过程。

如果“Template:模板名”不存在,{{模板名}}的作用就与[[Template:模板名]]类似,提供一个连接到不存在页面的链接。所以,一种创建模板的方法就是先放一个模板标签在页面里,然后点击它开始编辑模板。

如果一个页面不是以“Template:”开头,则不属于模板,但也可以使用模板标签。

例如{{帮助:名字空间}}会将帮助:名字空间中的内容加入到该页来。

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

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

而模板名字空间以外的页面一般在如下情况下作为模板使用:

  1. 引用维基百科名字空间的界面消息。
  2. 将长页面(这里假设名字就叫做长页面)拆分为较短页面时,可以将短页面命名为长页面/第一部分长页面/第二部分等,然后使用{{/第一部分}}<br/>{{/第二部分}}来拼成长页面。

一个模板可以调用另一个模板,它也可以调用它自己(递归调用),但只有一层自我调用有效

例如:[[Template:模板1]]的内容是“一次,{{模板1}}”,则[[Template:模板1]]将会被替换为:“一次,一次,{{模板1}}”。
如果其他条目调用该模板,所加入的文字将是“一次,{{模板1}}”。
但是递归调用检查并不阻止重定向。因此MediaWiki限制了最终能够展开的层数。这个数值默认为40层。

模板中的魔术字在模板被加入某页面后才被赋值。因此,如果一个模板中含有{{PAGENAME}},该模板被某页面调用,相应的位置显示的将是调用页面的名称,而不是被调用模板的名称。

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

  • 只列出以“Template:”开头的真正模板(位于模板名字空间的页面),其他被调用的页面则不列出;
  • 一个段落的编辑页面列出的是所有被调用的模板,包括其他段落调用的模板;
  • 即使编辑旧版本的页面,这个列表也表示的是当前最新的状态;
  • 如果不真正提交编辑,仅仅在预览中使用的模板不会被列出。

请注意,如果页面结尾没有换行,编辑页面中总是在结尾添加一个换行。这是MediaWiki的功能,任何页面或者章节的结尾都会有一个空行。但这个换行对模板不真正起作用,即不影响模板的效果。

例如:

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

假设模板“编号演示”的内容为(行尾换行为自动添加):

编号演示

那么最终结果将会是:

编号演示编号演示 编号演示

这里第二次和第三次模板调用之间并没有出现新行(即两次换行),仅有一次换行解析出来的空格。

参数

模板可以使用参数,通过参数命名或者编号可以区分各个参数。

参数的定义和调用

在模板页面中,用三个大括号可以调用参数。

例如:{{{参数名}}}会被替换为名为参数名的参数;或者
{{{参数名|默认值}}}也可以达到相同效果。如果调用模板时参数名没有赋值,则使用默认值作为该参数的值。

模板的参数有两种:

  1. 命名参数,即如前文所述,参数名为规定好的名字;
  2. 匿名参数,参数名默认为{{{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}}}六七]] 

则调用{{数数|三]]四[[五}}并不视为调用了模板:

{{数数|三]]四[[五}}

命名参数还是匿名参数?

匿名参数的优点

  1. 调用模板时不需要参数名和等号,从而节约打字和存储空间。
  2. 数字看起来很直观,也可以被不懂中文的人理解。

命名参数的优点

  • 参数的顺序可以变化,模板的参数可以任意添加和修改,而不会对调用模板的页面产生致命影响。然而一部分强迫症编辑者仍然会努力去统一模板的命名参数的顺序,以至于被认为浪费服务器空间和被怀疑刷编辑数。
  • 参数的意义容易理解。
  • 匿名参数不可以直接使用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。

之前说过,匿名参数可以视作名字为数字的命名参数。因此整个模板调用可以视为{{又数数|3=1|1=2|1=3|2=4|3=5|4=6|5=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|四五六}}}七八九

模板页面的内容是

一二三四五六七八九

讨论页

模板页面同其他条目页面是不同的,它的目的不是将知识传递给读者,而仅仅是为系统定义模板。因此,其讨论页跟普通条目页面的讨论页也不同,主要有两个功能:

  1. 解释模板的作用和相关参数(最好给出例子,调用模板的形式以及结果)。
  2. 普通的对模板的讨论。

跨语言链接

模板可以含有跨语言链接,但结果是所有调用模板的条目页面都含有了该跨语言链接,这通常是非常糟糕的事情。为了仅仅让模板本身拥有跨语言链接,而不包括使用模板的条目,我们必须使用<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

substsafesubst的用法是:{{subst:模板名}}{{safesubst:模板名}}。它的作用是直接间接地一次性将模板内容编译成维基文档,加入到页面中去,而不是每次显示页面的时候调用有关模板。这样可以按模板当前的形式编辑条目,并使条目免受模板变化的影响,并减轻服务器负担。

{{subst:模板名}}和{{safesubst:模板名}}只会将模板展开一层。如果需要彻底的展开的话,请访问特殊:展开模板进行手动展开。(该特殊页面会把所有两对大括号内的内容全部展开,包括{{BASEPAGENAME}}这类的系统变量)

作用

如果想将同一段文本复制到两个或者多个页面,我们可以考虑使用模板,但也并不是一定要用模板。如果使用模板,要修改这段文本时,不需要针对每一个页面进行逐个修改,而只需要修改模板的内容,所有使用该模板的页面都自动被修改。

由于有参数存在,所以模板文本并不需要完全一样。对于不同页面,我们可以赋不同值,从而生成不同的文本。模板不仅仅是使用方便,它有时候还可以起到控制页面统一格式的作用。

模板的一般用法有:

参见