latex - 与它定义的命令相比,如何解释乳胶中 \newcommand 的语法
问题描述
我是 Latex 的新手,这个问题只是出于好奇。我想知道为什么\newcommand
乳胶中的命令与其他命令的语法不同?
的语法\newcommand
是
\newcommand{<arg>}[<options>][<options>]{<arg>}
而用户定义的命令(或宏?)的语法就像
\<command>[<options>]{<arg>}{<arg>}
我没有找到任何方法让用户定义其使用模型类似于以下内容的命令:(即 [] 出现在 {} 之后)
\<command>{<args>}[<options>]{<args>}
那么我们如何区分该\newcommand
命令与其他用户定义的命令呢?称他们为保留命令?一些用户无法定义语法的命令?
解决方案
它实际上并没有不同的语法,它只是以一种不同方式吞噬其论点的方式定义。这里有一些例子来强调这一点......
考虑
\documentclass{article}
\newcommand{\firstcmd}[1]{first: #1}
\newcommand{\secondcmd}[2][opt2]{second: #1/#2}
\newcommand{\thirdcmd}[1]{third: #1 \fourthcmd}
\newcommand{\fourthcmd}[2][opt4]{fourth: #1/#2}
\begin{document}
\firstcmd{abc}
\secondcmd{def}
\secondcmd[abc]{def}
\thirdcmd{ghi}{jkl}
\thirdcmd{ghi}[jkl]{mno}
\fourthcmd{mno}
\fourthcmd[mno]{pqr}
\end{document}
\firstcmd
,\secondcmd
并且\fourthcmd
都以通常的方式定义。\firstcmd
接受一个强制参数,而\secondcmd
每个\fourthcmd
都接受一个可选参数,后跟一个强制参数。也就是说,它们具有\<cmd>[.]{..}
.
\thirdcmd
被定义为采用单个强制参数,但嵌套在\fourthcmd
. 因此,虽然它的定义似乎需要一个参数,但嵌套它会导致它类似于可能需要两个或三个参数的东西,具体取决于您是否提供可选参数。
这样,任何可选/强制参数序列的配置都是可能的。\newcommand
以类似的方式定义。无论如何,在定义可能具有散布在其参数序列中的可选参数的命令时,您应该考虑可用性。例如,假设您定义\mycmd{.}[..][...]{....}
了 ,希望允许两个可选参数彼此相邻。如果最终用户指定
\mycmd{.}[..]{....}
执行(以预期的方式获取适当的参数)将按预期进行。但是,如果最终用户指定
\mycmd{.}[...]{....}
希望跳过第二个可选参数[..]
,执行肯定会失败(或不会按预期发生),因为没有区别哪个可选参数被遗漏/提供。
避免这种混淆的一般方法是使用键值方法。例如,使用带有键值列表的单个可选参数定义一个命令:
\mycmd[key1=value, key2=value, ...]{<arg>}{...}
这将清楚地区分作为可选内容传递的内容,并允许您为不存在的键指定默认值(参见keyval
orxkeyval
包)。
无论如何,其他包也提供了一种更简单的方法来混合可选和强制参数,如果这是你所追求的。以下是使用示例xparse
:
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\mycmd}{o m O{opt2} m}{%
mycmd:
\IfValueTF{#1}
{#1}
{no opt1}%
/#2/#3/#4%
}
\begin{document}
\mycmd{abc}{def}
\mycmd[abc]{def}{ghi}
\mycmd{abc}[def]{ghi}
\mycmd[abc]{def}[ghi]{jkl}
\end{document}