幫助:模板
關於模板的使用規範,請見「萌娘百科:模板規範」。 |
---|
本頁面全部或部分內容原來自中文維基百科頁面Help:模板,依 CC BY-SA 3.0 授權引入;原貢獻者可以在這裡看到。 |
模板在維基系統(MediaWiki)中是一個可以加入另一個頁面的頁面。這一加入過程叫做嵌入,就好像計算機語言中的子程序。
本文提供維基百科模板的使用手冊和指南,另外,
概述
模板名字空間是以「Template:」開頭的名字空間。在萌娘百科,這個前綴的別名還有模板:
、样板:
、樣板:
、T:
。
在此名字空間的頁面叫做模板,此頁面的內容是用來通過嵌入技術加入到其他頁面中,從而創建複雜的文檔。
將名為「Template:模板名」的模板加入頁面中的語法是{{模板名}}
,這個叫做模板標籤。
- 例如:「
一二{{三到六}}七八
」中使用了內容為「三四五六
」的模板「Template:三到六」,結果就是「一二三四五六七八」。
模板標籤使得編輯頁面在生成時找到並添加了模板,有時候我們還用諸如「調用」、「參考」、「包括」、「嵌入」、「使用」等詞來替代「添加」或者「加入」,實際上描述的都是同一個過程。
如果「Template:模板名」不存在,{{模板名}}
的作用就與[[Template:模板名]]
類似,提供一個連接到不存在頁面的鏈接。所以,一種創建模板的方法就是先放一個模板標籤在頁面里,然後點擊它開始編輯模板。
如果一個頁面不是以「Template:」開頭,則不屬於模板,但也可以使用模板標籤。
- 例如
{{幫助:模板入門}}
會將幫助:模板入門中的內容加入到該頁來。
這樣一來,所有頁面都可以當作是模板。但是,使用在模板名字空間的頁面(即真正的模板)有以下獨特的好處:
- 所有被頁面使用的模板都在頁面編輯頁顯示出來。
- 當模板改變時,所有使用模板頁面的服務器緩存(相對於瀏覽器緩存)自動被清空;而位於其他名字空間的頁面,服務器緩存往往要手工清空。
而模板名字空間以外的頁面一般在如下情況下作為模板使用:
- 引用維基百科名字空間的界面消息。
- 將長頁面(這裡假設名字就叫做
长页面
)拆分為較短頁面時,可以將短頁面命名為长页面/第一部分
、长页面/第二部分
等,然後使用{{/第一部分}}<br/>{{/第二部分}}
來拼成長頁面。
一個模板可以調用另一個模板,它也可以調用它自己(遞歸調用),但只有一層自我調用有效。
- 例如:
[[Template:模板1]]
的內容是“一次,{{模板1}}”
,則[[Template:模板1]]
將會報錯,顯示遞歸調用錯誤。 - 如果其他條目調用該模板,所加入的文字將是“一次,{{模板1}}”。
模板中的魔術字在模板被加入某頁面後才被賦值。因此,如果一個模板中含有{{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元素屬性。
命名參數和匿名參數混合使用
命名參數和匿名參數可以混合使用,此時所有的未命名參數根據位置被編號,命名參數不被編號。
例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, ...
,參見Help:名字空間和英文維基系統名字空間文本幫助。
模板頁
維基系統在生成模板頁面時,實際上相當於一次沒有參數賦值的模板調用,因此如果參數有默認值,將被顯示。例如:模板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>
標識。
模板分類
模板也要進行分類,目的是為了更好的整理模板,以便更好的使用和管理模板。模板的分類同條目的分類相似,可以參閱有關條目分類的幫助文件,如幫助:條目分類等。不同之處在於對於模板的分類需要使用<noinclude>
標識,如果不加<noinclude>
標識,則不僅模板被分類,所有使用該模板的條目也被分入同一類。
所有模板的根目錄(即分類)是Category:模板。所有模板分類名最後一定要含有「模板」二字,以區別於普通條目的分類。
例7:模板分類方法
將例1中的模板[[Template:姓名]]
分為[[:Category:人物模板]]
,需要加入:
我是{{{姓}}}{{{名}}}。<noinclude>[[Category:人物模板]]</noinclude>
標識
注意:以下內容只限於模板中使用的情況,在其他名字空間使用的情況請參考相關幫助文檔。
<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>
兩種標識,那麼它們將會被忽略。
[1]一個模板中的<onlyinclude>
標識表示在<onlyinclude>
和</onlyinclude>
之間的文本會在該模板頁面和嵌入(可理解為「調用」)該模板的頁面顯示。這是所有部分嵌入標識中最微妙的一個,因為它經常使其他部分嵌入標識(<noinclude>
和<includeonly>
)失效。如果一個頁面中至少有一對<onlyinclude></onlyinclude>
標籤,當這個頁面被嵌入時,只有<onlyinclude>
和</onlyinclude>
之間的內容會被嵌入(其他內容不會出現在嵌入該模板的頁面中)。一個頁面中可以包含多個被<onlyinclude>
和</onlyinclude>
包含的部分。這可能很有用,例如,要使一個頁面的一部分內容在另一個頁面中也顯示,只需要將那部分內容包含在<onlyinclude>
和</onlyinclude>
裡面,然後在另一個頁面嵌入該頁面即可。
在使用<noinclude>
、<includeonly>
和<onlyinclude>
時,要尤為注意換行。有時為了源代碼美觀而添加的換行,很可能是導致排版錯誤的罪魁禍首。
<includeonly>
、</includeonly>
兩端的換行;<noinclude>
、</onlyinclude>
前的換行;</noinclude>
、<onlyinclude>
後的換行。
這些換行會隨內容一同嵌入到調用模板的頁面,如果碰巧湊出兩個換行,則可能會生成一個預期外的空段落。
subst與safesubst
- 主頁面:Help:魔術字/解析器函數
subst和safesubst的用法是:{{subst:模板名}}
或{{safesubst:模板名}}
。它的作用是直接或間接地一次性將模板內容編譯成維基文檔,加入到頁面中去,而不是每次顯示頁面的時候調用有關模板。這樣可以按模板當前的形式編輯條目,並使條目免受模板變化的影響,並減輕服務器負擔。參見Help:替換引用。
作用
如果想將同一段文本複製到兩個或者多個頁面,我們可以考慮使用模板,但也並不是一定要用模板。如果使用模板,要修改這段文本時,不需要針對每一個頁面進行逐個修改,而只需要修改模板的內容,所有使用該模板的頁面都自動被修改。
由於有參數存在,所以模板文本並不需要完全一樣。對於不同頁面,我們可以賦不同值,從而生成不同的文本。模板不僅僅是使用方便,它有時候還可以起到控制頁面統一格式的作用。
模板的一般用法有:
- 提示模板,例如:Template:急需改進傳遞「急需改進」的消息。
- 導航模板和大家族模板,用於給讀者提供類似的條目,例如:Template:galgame公司。
- 信息模板和人物信息模板,用於同一類條目中提供統一格式的信息,例如:Template:人物信息在條目右邊繪製信息框,提供人物的相關信息。
- 提供跨語言文本。
- 提供合成圖片,例如:圍棋棋譜enwp:Template:Game_of_Go_Position和國際象棋棋譜和enwp:Template:Chess_position。
- 或者以上幾種的組合。
|