將一個命令別名為另一個命令的正確方法是什麼?
\newcommand*{\keyword}{\emph}
或者:
\newcommand*{\keyword}[1]{\emph{#1}}
除了第二個更明確之外,還有什麼真正的差異嗎?
答案1
當別名的命令採用可選參數。
\newcommand*\keyword{\othercommand}
將能夠處理任何可能的可選參數。但
\newcommand*\keyword[1]{\othercommand{#1}}
只能處理\othercommand
不帶可選參數呼叫的情況。
對於 的情況\emph
,這不是問題,因為那裡沒有可選參數。所以這兩種方法都應該可以正常運作。
當你只是嚴格混疊,我個人的意見是使用第一個
\newcommand*\keyword{\othercommand}
在我做的事情不僅僅是別名的情況下,我會使用
\newcommand*\keyword[1]{\othercommand{#1}}
純粹是為了舉例,
\newcommand*\keyword[1]{`\emph{#1}'}
(儘管其他人很可能會反對,認為引號是不必要的,\emph
我的意思只是為了說明「不僅僅是別名」可能意味著什麼。)
出租
既然評論中已經提到了這一點,我將提到一些有關\let
命令的事情。
有時您想要變更 LaTeX 巨集的預設行為。例如,假設有一個巨集定義為
\newcommand*\somecommand[1]{\emph{#1}}
但你希望它有不同的行為。然後你可以簡單地重寫它如下:
\renewcommand*\somecommand[1]{\textbf{#1}}
但隨後您可能會遇到一種情況,您確實希望擁有原始定義。在這種情況下,之前更新命令,你可以做類似的事情
\let\oldsomecommand\somecommand
\renewcommand*\somecommand[1]{\textbf{#1}}
現在\somecommand
將按照您的意願行事,但您也可以使用\oldsomecommand
可用的命令來為您提供舊的行為。
簡而言之,透過寫作\newcommand\keyword{\emph}
,\keyword
將擴展為\emph
。透過寫作\let\keyword\emph
,\keyword
將擴展,不是擴展為\emph
,而是擴展為 的定義\emph
。
然而,\let
並非總是能夠捕捉已被執行的命令的全部功能。祝福/詛咒帶有可選參數。該網站上有很多關於如何處理此類情況的帖子,因此我將在這裡向您介紹一些:
- 看\let 和 \def 有什麼不同?其基本要點。
- 看何時使用 \LetLtxMacro?
\let
有關解決涉及選項的問題的詳細說明。 - 另請參閱「閉」(平方)根符號(儘管最初的問題實際上並不是關於
\let
ting。)