首页 > 解决方案 > 与它定义的命令相比,如何解释乳胶中 \newcommand 的语法

问题描述

我是 Latex 的新手,这个问题只是出于好奇。我想知道为什么\newcommand乳胶中的命令与其他命令的语法不同?

的语法\newcommand

\newcommand{<arg>}[<options>][<options>]{<arg>}

而用户定义的命令(或宏?)的语法就像

\<command>[<options>]{<arg>}{<arg>}

我没有找到任何方法让用户定义其使用模型类似于以下内容的命令:(即 [] 出现在 {} 之后)

\<command>{<args>}[<options>]{<args>}

那么我们如何区分该\newcommand命令与其他用户定义的命令呢?称他们为保留命令?一些用户无法定义语法的命令?

标签: latex

解决方案


它实际上并没有不同的语法,它只是以一种不同方式吞噬其论点的方式定义。这里有一些例子来强调这一点......

考虑

\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>}{...}

这将清楚地区分作为可选内容传递的内容,并允许您为不存在的键指定默认值(参见keyvalorxkeyval包)。


无论如何,其他包也提供了一种更简单的方法来混合可选和强制参数,如果这是你所追求的。以下是使用示例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}

推荐阅读