[心得] newcommand renewcommand providecommand
這三個指令都和建立巨集相關,差別只在使用時機:
a) 假設已定義巨集\ABC,內容為{abc}
1) \newcommand\ABC{def}
\ABC
產生編譯錯誤!
2) \renewcommand\ABC{def}
\ABC
def
3) \providecommand\ABC{def}
\ABC
abc
b) 假設巨集\ABC未定義
1) \newcommand\ABC{def}
\ABC
def
2) \renewcommand\ABC{def}
\ABC
產生編譯錯誤!
3) \providecommand\ABC{def}
\ABC
def
============================================================
除了上述差異外,三個指令的語法結構等等都完全相同,以下只用
\newcommand 來當範例。
A) 基本用法
\newcommand\巨集名稱[n]{巨集內容}
巨集名稱可以是任何可用的 TeX字串,但最好避免和系統指令或
其他套件定義的巨集相同,以免混淆。
n為引數數量,是1--9間的正整數;換言之,引數最多為9個。*
* n 為 0就沒有寫出的必要;此外,還是有方法讓引數大於 9,但在
這裡不討論。
巨集中可用 #m來調用引數,例如:
\newcommand\foo[3]{#3,#1;#2。#1#2#3!}
\foo{A}{B}{C}
C,A;B。ABC!
B) 星號型態
\newcommand\ABC[1]{#1 ABC} %"長"指令
\newcommand*\ABC[1]{#1 ABC} %"短"指令
指令長短與巨集內容毫無關聯,而是和引數型態相關。長指令的
引數可以大於一個段落 (就算是整本書也吃得下去) ,短指令則
反之。
此外,指令長短和是否脆弱 (fragile ) 或穩固 (robust) 相關
但非全等;兩者的關係如下:^
穩固 -> 短指令 長指令 -> 脆弱
^ 穩固與脆弱指令非本文討論範圍,當另外討論。
在非必要的情況下,請用短指令形態來定義自己的巨集!優點是
由於短指令的有效範圍只在同一個段落內,系統偵錯與執行的效
率比長指令好得多。
C) 巨集本身的星號型態
\makeatletter
\newcommand{\ABC}{\@ifstar
\ABCStar
\ABCNoStar
}
\newcommand{\ABCStar}[m]{星號型態巨集}
\newcommand{\ABCNoStar}[n]{無星號巨集}
\makeatother
上例只是一種做法,還有很多方式可以達到相同的目的。在 TeX
裡這是常態,請選擇自己最熟悉、最有把握的方法。特別要注意
的是,兩種型態可以有不同數量的引數!
\makeatletter
\newcommand{\ABC}{\@ifstar
\ABCStar
\ABCNoStar
}
\newcommand{\ABCStar}[3]{#3,#2;#1。}
\newcommand{\ABCNoStar}[2]{#1!#2。}
\makeatother
\ABC{A}{B}\\
\ABC*{A}{B}{C}
A!B。
C,B;A。
D) 選擇性參數
\newcommand\ABC[3][defaultA][defaultB]{#3,#1;#2。}
\ABC[D]{E}
E,D;defaultB。
\ABC[][D]{E}
E,defaultA;D。
上例定義了一個使用三個引數的巨集,其中兩個是有預設值的選
擇性引數:
#1 選擇性 預設值 defaultA
#2 選擇性 預設值 defaultB
#3 必要
當選擇性引數無預設值時,直接用[]即可。!
! 在設定選擇性引數時,請注意括號的使用。
\newcommand\ABC[2](D){#2,#1.}
\ABC[a]{A}
編譯錯誤
\ABC(a){A}
A,a.
使用不同的括號會影響使用方式!一般來說,[]是最好的選擇。
E) 選擇性引數放在後面
\makeatletter
\newcommand\ABC[1]{\def\ABC@temp{#1}\ABC@real}% ----- (I)
\newcommand{\ABC@real}[1][default]{#1,\ABC@temp.}% -- (II)
\makeatother
\ABC{A}[B]
B,A.
(I) 將必要引數儲存在\ABC@temp 然後呼叫執行指令;在後面要
呼叫必要引數時,就必須用\ABC@temp 來表示。
如果有多個必要引數,暫存變數就必須隨之增加;例如:
\newcommand\ABC[2]{%
\def\ABC@tempA{#1}%
\def\ABC@tempB{#2}%
\ABC@real}
(II)接受選擇性引數,且包含巨集的真正內容。
F) 如果我希望能簡單一點
請參考使用 xparse這個套件。
=============================================================
希望以上內容有所幫助;發現錯誤的請不吝指教!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.255.183.58
※ 編輯: LSC112233 來自: 111.255.183.58 (11/06 15:56)
推
11/06 20:24, , 1F
11/06 20:24, 1F
推
11/07 19:34, , 2F
11/07 19:34, 2F
討論串 (同標題文章)
LaTeX 近期熱門文章
PTT數位生活區 即時熱門文章