標籤:

LaTeX 里如何定義 9 個參數以上的變數?

求個簡單的方法......

比如我要寫個

123456789—abcdefghi

怎麼樣讓1-9以及a-i全為變數?

謝謝!


已有的回答都非常好,我想提供一個非主流的方法。

documentclass{article}

usepackage{xparse}

ExplSyntaxOn

%% 以 STOP 為參數結束標誌,使用方式為 phonenum...STOP
NewDocumentCommand phonenum { u{ STOP } }
{
l_item:nn {#1} { 1 }
l_item:nn {#1} { 2 }
l_item:nn {#1} { 3 } ,
l_item:nn {#1} { 4 }
l_item:nn {#1} { 5 }
l_item:nn {#1} { 6 }
l_item:nn {#1} { 7 } ,
l_item:nn {#1} { 8 }
l_item:nn {#1} { 9 }
l_item:nn {#1} { 10 }
l_item:nn {#1} { 11 }
}

ExplSyntaxOff

egin{document}

phonenum 13641344123STOP

end{document}

用 l_item:nn{#1}{#2} 取出記號列表 #1 中的第 #2 個項目(單記號或者分組)。這裡使用了 LaTeX3,如果你看不慣,我們也可以改用 ltxcmds 宏包的 ltx@CarNumth。

documentclass{article}

usepackage{ltxcmds}

makeatletter

defphonenum#1STOP{%
ltx@CarNumth{1}#1@nil
ltx@CarNumth{2}#1@nil
ltx@CarNumth{3}#1@nil,%
ltx@CarNumth{4}#1@nil
ltx@CarNumth{5}#1@nil
ltx@CarNumth{6}#1@nil
ltx@CarNumth{7}#1@nil,%
ltx@CarNumth{8}#1@nil
ltx@CarNumth{9}#1@nil
ltx@CarNumth{10}#1@nil
ltx@CarNumth{11}#1@nil}

makeatother

egin{document}

phonenum 13641344123STOP

end{document}

我才不會告訴你,ltxcmds 用了黑科技且不處理異常,在效率上,ltx@CarNumth 要比 l_item:nn 要高很多,並且不依賴 eTeX。你有興趣可以去看一下源代碼。


有多種迂迴的辦法。直接的辦法是拆開來:

deffoo#1#2#3#4#5#6#7#8#9{%
保存 #1 到 #9 到宏
foocontinue}
deffoocontinue#1#2{%
使用前面保存的宏表示前 9 個參數
#1 是第 10 個,#2 是第 11 個}

但定義如此多參數是非常奇怪的用法,基本上我想不出什麼有合適的應用場景——所以並不建議這樣做

如果每個參數的意義都相同,只是需要逐個處理,那應該用循環的方式逐個處理。比如說使用 LaTeX2e 內核的 @tfor。當然這類工具非常多,LaTeX2e 內核還有處理逗號列表的 @for,宏包 etoolbox、expl3 等也都有很多這種針對列表的操作工具。這裡只對 @tfor 舉一個例子:

documentclass{article}

makeatletter
defmakeparens#1{%
@tfor mp:=#1do{%
( mp)}}
makeatother

egin{document}

makeparens{1234567890abcdef{xxx}{yyy}}

end{document}

而如果各個參數的意義不相同,只是需要做大量設置,應該像其他常見工具包一樣使用 key=value 的語法來處理。有許多編程工具包來處理這種語法,基本的就是用 keyval 宏包,其他常用的還有 xkeyval、pgfkeys、l3keys2e 等。舉一個書裡面的例子:

documentclass{article}

usepackage{keyval}

makeatletter
% 定義 text 族的 emph 選項,控制 emph 命令的定義
let ext@emph=emph
define@key{text}{emph}[ ext@emph]{%
letemph=#1}

ewcommandsettext[1]{%
setkeys{text}{#1}}
makeatother

egin{document}

settext{emph= extbf} % 粗體
An emph{important} example.

settext{emph} % 默認的格式
An emph{important} example.

end{document}

這個例子只給 settext 定義了一個參數 emph。但可以增加任意多的參數。


推薦閱讀:

如何並排擺放一個tikzpicture和一個tabular,使得其底端在一條水平線上?
LateX 生成的辭彙表 辭彙與其解釋間均如何控制?
請問這個TeX Live的依賴關係是什麼呀?
LaTeX 怎麼禁止標題在目錄中的折行?
為什麼 LaTeX 的命令以不便盲打的反斜桿開始?

TAG:LaTeX |