gpt4 book ai didi

latex - 与它定义的命令相比,如何解释 Latex 中\newcommand 的语法

转载 作者:行者123 更新时间:2023-12-02 16:53:33 29 4
gpt4 key购买 nike

我是 Latex 新手,问这个问题只是出于好奇。我想知道为什么 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 中.因此,虽然它的定义似乎需要一个参数,但嵌套它会导致它的用途类似于可以采用两个或三个参数的东西,具体取决于您是否提供可选参数。

enter image description here

这样,可选/强制参数序列的任何配置都是可能的。 \newcommand以类似的方式定义。无论如何,在定义可能具有散布在其参数序列中的可选参数的命令时,您应该考虑可用性。例如,假设您定义了 \mycmd{.}[..][...]{....} ,希望允许两个可选参数彼此相邻。如果最终用户指定

\mycmd{.}[..]{....}

执行(按照预期的方式选择适当的参数)将按预期发生。但是,如果最终用户指定

\mycmd{.}[...]{....}

希望跳过第二个可选参数 [..] ,执行肯定会失败(或不会按预期发生),因为没有区别遗漏/提供了哪个可选参数。

避免这种混淆的一般方法是使用键值方法。例如,定义一个带有单个可选参数的命令,该参数采用键值列表:

\mycmd[key1=value, key2=value, ...]{<arg>}{...}

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


无论如何,其他包也提供了一种更简单的方法来混合可选参数和强制参数,如果那是您所追求的。这是使用 xparse 的示例:

enter image description here

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

关于latex - 与它定义的命令相比,如何解释 Latex 中\newcommand 的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57444209/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com