帮助:模板

华佗百科,全民书写的医学百科全书!
跳转至: 导航搜索
快捷方式
H:T

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

本文提供华佗百科模板的使用手册和指南,另外可以参考,

概述

任何模板均以Template:开头,但调用时必须使用{{模板名}}的形式。如Template:tc是一个模板,内容为“in”。如果把{{tc}}加入这个页面,则{{tc}}的内容会显示,即in。

模板名字空间

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

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

将名为“Template:模板名”的模板加入页面中的语法是{{模板名}},这个叫做模板标签。例如:“一二{{三到六}}七八”中使用了内容为“三四五六”的模板Template:三到六,结果就是“一二三四五六七八”。模板标签使得编辑页面在生成时找到并添加了模板,有时候我们还用诸如“调用”、“参考”、“包括”、“嵌入”、“使用”等词来替代“添加”或者“加入”,实际上描述的都是同一个过程。

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

如果一个页面不是以“Template:”开头,则不属于模板,但也可以使用模板标签,例如{{Help:模板入门}}会将Help:模板入门中的内容加入到该页来。这样一来,所有页面都可以当作是模板。但是,使用在模板名字空间的页面(即真正的模板)有以下独特的好处:

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

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

  • 引用华佗百科名字空间的界面消息。
  • 将一个的长页面(可以属于主条目名字空间,假设名字就叫做“长页面”,拆分为较短页面时,可以将短页面命名为“长页面/第一部分”、“长页面/第二部分”等,然后使用{{/第一部分}}<br/>{{/第二部分}}来拼成长页面。Huatuo:模板消息/全部就是一个好例子。

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

在2010年前,如果把其他模板重定向至某模板,该模板又引用重定向,且多次自我调用均为不同重定向,则该模板可以实现多次自我调用。MediaWiki后来取消此功能。如{{RR|7}}的结果为RR-检查到模板循环:Template:RR7

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

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

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

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

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

的结果是:

  1. 北京
  2. 上海
  3. 北京
  4. 上海
  5. 北京
  6. 上海

使用方法

模板主要由两个大括号组成(例如:{{模板}})

参数

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

参数的定义和调用

在模板页面中,用三个大括号可以调用参数,例如:{{{参数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中的内容是:
[[一二{{{1}}}六七]]
调用{{数数1|三]]四[[五}}的结果是:
{{数数1|三]]四[[五}}

命名?还是编号?

编号参数的优点

  1. 调用模板时不需要参数名和等号,从而节约打字时间和存储空间。
  2. 阿拉伯数字是世界性的,在翻译的时候省事,也可以被不懂中文的人理解。

命名参数的优点

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

例3:命名参数和编号参数混合使用

命名参数和编号参数可以混合使用,此时的未命名参数根据位置被编号,命名参数不被编号。

模板Template:又数数的内容是

{{{1}}}、{{{2}}}、{{{3}}}

{{又数数|3=1|2|1=3|4|5|6|7}}的结果是

3、4、5

因为编号参数有顺序规则,所以3不能提前调用,会被忽略。

而模板里只有3个参数,所以从第一个接受的参数开始,只接受一共3个参数,之后的因为不存在,所以忽略。

注意:请尽量避免混合使用命名参数和编号参数,以避免混乱。

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

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

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

调用{{再数数||}}的结果是

一--三--五

调用{{再数数|二|}}的结果是

一-二-三--五

调用{{再数数||二}}的结果是

一--三-二-五

调用{{再数数|二|{{{1}}}}}的结果是

一-二-三{{1}}五

调用{{再数数|{{{1}}}|四}}的结果是

一{{1}}三-四-五

调用{{再数数|{{{1}}}|{{{2}}}}}的结果是

一{{1}}三{{2}}五

例4:参数赋值中包含参数

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

{{再数数|二}}
调用{{数数A|四}}的结果是:
一-二-三{{2}}五
{{再数数|二|{{{1}}}}}
调用{{数数B|四}}的结果是:
一-二-三-四-五
{{再数数|二|2={{{1}}}}}
调用{{数数C|四}}的结果是:
一-二-三-四-五

例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:名字空间Special:所有消息MediaWiki:Blockedtext

参数命名及模板命名

参数命名可以调用其他参数,如Template:XYZ内容为{{{{{{XYZ}}}}}},则调用{{XYZ|XYZ=SDF|SDF=789}}会把参数XYZ的值SDF作为参数名,显示参数SDF的值,即789。MediaWiki会把{{{{{{XYZ}}}}}}解析为{{{ {{{XYZ}}} }}}而不是{{ {{ {{XYZ}} }} }}(结果是{{ {{ {{{{{{XYZ}}}}}} }} }})。这里空格是敏感的。另外,调用其他参数仅可调用1层。如Template:XYZ2内容为{{{{{{{{{XYZ}}}}}}}}},则{{XYZ2|XYZ=SDF|SDF=ABC|ABC=789}}结果为789。

又如,Template:1a2b内容为{{{第一个|第一个未定}}}-{{{第二个|第二个未定}}},Template:nanb内容为{{1a2b|{{{1|第一个}}}={{{1|第一个}}}已定}},则{{nanb}}结果为第一个已定-第二个未定,{{nanb|第一个}}结果为第一个已定-第二个未定,{{nanb|第二个}}结果为第一个未定-第二个已定,{{nanb|第三个}}结果为第一个未定-第二个未定。

又如,Template:testif内容为{{{test{{{test|}}}|{{{then}}}}}},则{{testif|test=11|test11=233}}结果为Template:Testif,{{testif|test=11|then=255}}结果为Template:Testif,{{testif|then=333}}结果为Template:Testif,{{testif|test=|then=335}}结果为Template:Testif

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

模板调用时,模板名可以是解析器函数。如{{{{NAMESPACE}}1}}相当于{{help1}},结果为这是{{Help1}}的内容。。

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

可以使用参数选择模板名。如Template:Hist3内容为{{{{{2}}}x|{{{1}}}}}-{{{{{3}}}x|{{{1}}}}}-{{{{{4}}}x|{{{1}}}}},Template:1x内容为{{{1}}},Template:2x内容为{{{1}}}{{{1}}},Template:3x内容为{{{1}}}{{{1}}},则{{Hist3|4|3|2|1}}结果为444-44-4。又如Template:a2b2c2d内容为{{{{{1}}}|a{{{2}}}b{{{2}}}c{{{2}}}d}},Template:t2内容为start_{{{1}}}_middle_{{{2}}}_end,{{a2b2c2d|t2|V}}相当于{{t2|aVbVcVd}},即start_aVbVcVd_middle_{{{2}}}_end。

模板可以多次嵌套。如{{3x|{{2x|{{3x|{{1x|{{2x|{{tc}}}}}}}}}}}}结果是inininininininininininininininininininininininininininininininininininin。

subst、safesubst和msgnw

模板页

注意:因为以下内容为模板参数,故没有编辑键,点此编辑

华佗系统在生成模板页面时,实际上相当于一次没有参数赋值的模板调用,因此如果参数有默认值,将被显示。例如:模板Template:数一数的内容是

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

模板页面的内容是

一二三四五六七八九

文件页

模板页面同其他条目页面是不同的,它的目的不是将知识传递给读者,而仅仅是为系统定义模板。因此模板文件页要解释模板的作用和相关参数,最好给出例子,调用模板的形式以及结果。


跨语言链接

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

<noinclude>
[[en:Template:Europe]]
[[zh:Template:欧洲]]
</noinclude> 

注意:在模板中使用<noinclude>标识时要小心!不要在<noinclude>之前或者</noinclude>之后加空行,否则空行将被当作模板的一部分反映在调用模板的条目中。系统会自动忽略</noinclude>之后的单个空行。

例6:使用<noinclude>标识的后果

如果在例1中的模板Template:姓名加入跨语言链接

我是{{{姓}}}{{{名}}}。

<noinclude>
[[en:Template:Name]]
</noinclude>

{{姓名|姓=张|名=飞}}调用例5中的模板Template:姓名时,结果是:

我是张飞。


如果希望得到的结果是:

我是张飞。

Template:姓名加入跨语言链接应该不含有换行:

我是{{{姓}}}{{{名}}}。<NoInclude>

[[en:Template:Name]]
</NoInclude>

注意:我们推荐您使用后面一种方式使用<noinclude>标识。

如果模板不是在Template名字空间的,请干脆写:

我是{{{姓}}}{{{名}}}。<NoInclude>

[[en:Template:Name]]

不写</NoInclude>的原因是系统会在非Template的文档末尾加入空行。

模板分类

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

所有模板的根目录(即分类)是Category:华佗百科模板,所有模板分类名最后一定要含有“模板”二字,以区别于普通条目的分类。

例7:模板分类方法

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

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

可以在X月x日用<includeonly>括住上首页</nowiki></nowki>括住

标识

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

<noinclude>和<includeonly>

前面已经提到,<noinclude>标识的作用是将<noinclude></noinclude>之间的文本加入所在的模板页中,而不加入调用模板的条目或模板中,针对模板的说明、分类和跨语言连接都可以置于该标识之间。

例8:针对模板:网球男单世界第一分类:体育模板就可以置于<noinclude></noinclude>之间,而对于调用该模板条目的分类:网球运动员可以置于标识之外:

[[Category:网球运动员]]<noinclude>[[Category:体育模板]]</noinclude>

另外,<noinclude>和<includeonly>的关系如下:

<noinclude>A</noinclude>B<noinclude>C</noinclude>

等价于

A<includeonly>B</includeonly>C

<includeonly>

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

上面的例8中针对调用该模板的条目的分类Category:网球运动员实际上应该置于<includeonly></includeonly>之间:

<includeonly>[[Category:网球运动员]]</includeonly>

这样,在Category:网球运动员分类中就不会出现Template:网球男单世界第一模板了。

替换引用与preload

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

subst与preload过程中的noinclude、includeonly和IncludeOnly

以下部分行为是错误的,是旧版本软件的缺陷,并将随MediaWiki 1.17的部署被修正bugzilla:5210)。
解释与传递
模板源码
includeonly
noinclude
IncludeOnly
NoInclude include<includeonly></includeonly>only
模板显示
interpret
interpret
interpret
同noinclude
解释内层,传递外层
嵌入过程
interpret
interpret
interpret
解释内层,传递外层
subst过程
interpret
传递
interpret
成为includeonly
preload过程
interpret
传递
传递
成为includeonly
嵌套
模板源码
includeonly pair中的includeonly pair noinclude pair中的includeonly pair
模板显示
错乱[1]
嵌入过程

/
subst过程

/
preload过程
正常
/

特殊的模板引用

  • 子页面引用
    • 格式:{{/子页面}}
    • 引用过程中“子页面”的意义是引用模板的页面的子页面,而非被引用的模板的子页面。
  • 其它名字空间的模板引用
    • 格式:{{名字空间:子页面}}如{{Template talk:!}}

保留字

作用

如果想将同一段文本复制到两个或者多个页面,我们可以考虑使用模板,但也并不是一定要用模板。如果使用模板,要修改这段文本时,不需要针对每一个页面进行逐个修改,而只需要修改模板的内容,所有使用该模板的页面都自动被修改。由于有参数存在,所以模板文本并不需要完全一样,对于不同页面,我们可以赋不同值,从而生成不同的文本。模板不仅仅是使用方便,它有时候还可以起到控制页面统一格式的作用。

模板的一般用法有:

在对话中引用模板

在某些情况下,我们可能需要在对话中提及某一个模板,但是如果我们直接输入模板的代码的话,模板会自动展开,这当然不是我们想要的。一种办法是使用nowiki语法,但是更好的用法,则是使用华佗百科的内部连结模板。下面给出了一些例子。

您所输入的 您所看到的
请您不要再随意删除{{afd}}模板。
请您不要再随意删除模板。
请您不要再随意删除<nowiki>{{afd}}</nowiki>模板。
请您不要再随意删除{{afd}}模板。
请您不要再随意删除{{tl|afd}}模板。
请您不要再随意删除{{afd}}模板。
欢迎新用户可以使用{{tls|welcome}}语法,
但不要使用{{tl|welcome}}语法。
欢迎新用户可以使用{{subst:welcome}}语法,

但不要使用{{welcome}}语法。

[[:Template:nosign]]的用法如下:
{{tlx|nosign|用户留言时间|用户名}}
Template:nosign的用法如下:

{{nosign|用户留言时间|用户名}}

{{tnull|nosign|用户留言时间|用户名}}
用于补签名。
{{nosign|用户留言时间|用户名}}

用于补签名。

参见

中文

参考资料