Wikipedia:模板
模板(template)是指可被整体嵌入另外页面的公用内容。模板的名字以“template:”开头,引用模板的页面将在显示时自动调用模板中的内容。
用模板可以:
- 在多个页面中显示相同的内容片段,修改模板后所有调用页面都会随之更新
- 模板也能用来存放 html 样式代码,简化页面样式控制过程
- 通过模板技术,可以有效减轻重复内容的同步更新工作量,并便于对页面样式、内容导航进行集中控制。
概述
模板名字空间是以“Template:”开头的名字空间,这个前缀是跨语言的。
在此名字空间的页面叫做模板,此页面的内容是用来通过嵌入技术加入到其他页面中,从而创建复杂的文档。
将名为“Template:模板名”的模板加入页面中的语法是{{模板名}}
,这个叫做模板标签。例如:“一二{{三到六}}七八
”中使用了内容为“三四五六
”的模板Template:三到六,结果就是“一二三四五六七八”。模板标签使得编辑页面在生成时找到并添加了模板,有时候我们还用诸如“调用”、“参考”、“包括”、“嵌入”、“使用”等词来替代“添加”或者“加入”,实际上描述的都是同一个过程。
如果“Template:模板名”不存在,{{模板名}}
的作用就与[[Template:模板名]]
相同,提供一个连接到不存在页面的链接。所以,一种创建模板的方法就是先放一个模板标签在页面里,然后点击它开始编辑模板。
如果一个页面不是以“Template:”开头,则不属于模板,但也可以使用模板标签,例如{{Help:模板入门}}
会将Help:模板入门中的内容加入到该页来。这样一来,所有页面都可以当作是模板。但是,使用在模板名字空间的页面(即真正的模板)有以下独特的好处:
- 所有被页面使用的模板都在页面编辑页显示出来。
- 当模板改变时,所有使用模板页面的服务器缓存(相对于浏览器缓存)自动被清空;而位于其他名字空间的页面,服务器缓存往往要手工清空。
而模板名字空间以外的页面一般在如下情况下作为模板使用:
- 引用维基百科名字空间的界面消息。
- 将长页面(名字就叫做“长页面”)拆分为较短页面时,可以将短页面命名为“长页面/第一部分”、“长页面/第二部分”等,然后使用
{{/第一部分}}<br/>{{/第二部分}}
来拼成长页面。Ubuntu中文:模板消息/全部就是一个好例子。
一个模板可以调用另一个模板,它也可以调用它自己(自我调用),但只有一层自我调用有效。例如:[[Template:模板1]]的内容编辑内容是“一次,{{模板1}}”
,在[[Template:模板1]]中将显示:“一次,一次,{{模板1}}”,如果其他条目调用该模板,所加入的文字将是“一次,{{模板1}}”。
模板中变量在模板被加入某页面后才被赋值,而不是之前。因此,如果一个模板中含有{{PAGENAME}}
,该模板被某页面调用,相应的位置显示的将是调用页面的名称,而不是被调用模板的名称。
一个页面所调用的所有模板都在该页编辑页面中列出,并提供相应的链接,而且:
- 只列出以“Template:”开头的真正模板(位于模板名字空间的页面),其他被调用的页面则不列出;
- 一个段落的编辑页面列出的是所有被调用的模板,包括其他段落调用的模板;
- 编辑旧版本的页面,这个列表仍然是当前最新的;
- 可加入模板擴展語法#if, #ifeq, #ifexist, #ifexpr, 或 #switch;
- 如果不真正提交编辑,仅仅在预览中使用的模板不被列出。
请注意,如果页面结尾没有换行,编辑页面中总是在结尾添加一个换行,但这并不影响模板的某些效果,即这个换行不真正起作用。例如:
{{编号演示}}{{编号演示}} {{编号演示}}
参数
模板可以使用参数,通过参数命名或者编号可以区分各个参数。
参数的定义和调用
在模板页面中,用三个大括号可以调用参数,例如:{{{参数1|参数1的默认值}}}
可以调用参数1,如果在模板调用中参数1没有赋值,则使用参数1的默认值作为参数1的赋值。在调用带参数的模板的时候,语法是:
- 如果在模板页面中参数使用是名称形式,即诸如
{{{参数1}}}...{{{参数2}}}...
,则调用是使用{{甲模板|参数1=参数1的赋值|参数2=参数2的赋值}}
; - 如果在模板页面中参数使用是编号形式,即诸如
{{{1}}}...{{{2}}}...
,则调用是使用{{甲模板|参数1的赋值|参数2的赋值}}
。
注意:参数默认值同参数赋空值是不同的。
例1:含有命名参数的模板
我们可以创建一个名为姓名的模板,即[[Template:姓名]],内容为:
我是{{{姓}}}{{{名}}}。
如果用{{姓名}}
调用这个模板,我们会得到:
- 我是{{{姓}}}{{{名}}}。
如果用{{姓名|姓=张|名=飞}}
,我们则得到:
- 我是张飞。
例2:含有编号参数的模板
再来一个例子,说明一个编号参数的定义和调用:我们还是先要定义一个带参数的模板,例如模板[[Template:数数]]的内容是
一二三{{{1|四五六}}}七八九
赋值调用{{数数|六五四}}
的结果是:
- 一二三六五四七八九
赋空值调用{{数数|}}
的结果是:
- 一二三七八九
未赋值调用,即调用默认值,{{数数}}
的结果是:
- 一二三四五六七八九
参数值的限制
- 如果参数值中含有等号(
=
),调用模板时则必须使用参数名,即使参数名只是一个编号也要使用。 - 如果参数值中含有两个连续的右大括号(
}}
),调用参数时必须将其放入nowiki标记中,例如<nowiki>}}</nowiki>
。 - 如果参数值中含有竖线(
|
),调用参数时必须将其放入nowiki标记中,例如<nowiki>|</nowiki>
。 - 参数值可以很长,英文帮助中有一个长参数的例子:例子。
- 参数值中可以包含一对双方括号,用于链接一个条目,但不能含有半个右双方括号,然后再接半个左双方括号。例如[[Template:数数]]中的内容是:
[[一二{{{1}}}六七]]
- 调用{{数数|三]]四[[五}}的结果是:
- {{数数|三]]四[[五}}
命名?还是编号?
编号参数的优点
- 调用模板是不需要参数名和等号,从而节约打字和存储空间。
- 阿拉伯数字是世界性的,在翻译的时候省事,也可以被不懂中文的人理解。
命名参数的优点
- 参数的顺序可以变化,模板的参数可以任意添加和修改,而不会对调用模板的页面产生致命影响。
- 参数的意义容易理解。
命名参数和编号参数混合使用
命名参数和编号参数可以混合使用,此时的未命名参数根据位置被编号,命名参数不被编号。
例3:模板[[Template:又数数]]的内容是
{{{1}}}、{{{2}}}、{{{3}}}
{{又数数|3=1|2|1=3|4|5|6|7}}
的结果是
- 3、4、5
想想为什么...
未赋值并且没有默认值的参数
例如:模板[[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, ...
,参见Help:名字空间和英文维基系统名字空间文本帮助。
模板页
维基系统在生成模板页面时,实际上相当于一次没有参数赋值的模板调用,因此如果参数有默认值,将被显示。例如:模板[[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>标识。
模板分类
模板也要进行分类,目的是为了更好的整理模板,以便更好的使用和管理模板。模板的分类同条目的分类相似,可以参阅有关条目分类的帮助文件,如Help:分类等,不同之处在于对于模板的分类需要使用<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:网球男单世界第一模板了。
替换引用
Help:替换引用的用法是:{{subst:模板名}}
。它的作用是一次性将模板内容编译成维基文挡,加入到页面中去,而不是每次显示页面的时候调用有关模板。这样可以按模板当前的形式编辑条目,并使条目免受模板变化的影响,并减轻服务器负担。
作用
如果想将同一段文本复制到两个或者多个页面,我们可以考虑使用模板,但也并不是一定要用模板。如果使用模板,要修改这段文本时,不需要针对每一个页面进行逐个修改,而只需要修改模板的内容,所有使用该模板的页面都自动被修改。由于有参数存在,所以模板文本并不需要完全一样,对于不同页面,我们可以赋不同值,从而生成不同的文本。模板不仅仅是使用方便,它有时候还可以起到控制页面统一格式的作用。
模板的一般用法有:
- 模板消息,例如:Template:stub传递“小作品”的消息。
- 导航模板,用于给读者提供类似的条目,例如:Template:洲。
- 信息框模板,用于同一类条目中提供统一格式的信息,例如:Template:Infobox 网球在条目右边绘制信息框,提供网球运动员的相关信息。
- 提供跨语言文本。
- 提供合成图片,例如:围棋棋谱Template:Game of Go Position和国际象棋棋谱和Template:Chess position。
- 以上几种的组合。