LaTeX可选参数

如何在LaTeX中使用可选参数创build命令? 就像是:

\newcommand{\sec}[2][]{ \section*{#1 \ifsecondargument and #2 \fi} } } 

那么,我可以这样称呼它

 \sec{Hello} %Output: Hello \sec{Hello}{Hi} %Output: Hello and Hi 

指南中的示例:

 \newcommand{\example}[2][YYY]{Mandatory arg: #2; Optional arg: #1.} This defines \example to be a command with two arguments, referred to as #1 and #2 in the {<definition>}--nothing new so far. But by adding a second optional argument to this \newcommand (the [YYY]) the first argument (#1) of the newly defined command \example is made optional with its default value being YYY. Thus the usage of \example is either: \example{BBB} which prints: Mandatory arg: BBB; Optional arg: YYY. or: \example[XXX]{AAA} which prints: Mandatory arg: AAA; Optional arg: XXX. 

创build“可选参数”的一般思路是首先定义一个中间命令,它可以提前扫描以检测令牌stream中接下来出现的字符,然后插入相关的macros来处理适当的参数。 使用通用的TeX编程这可能非常单调乏味(尽pipe不是很困难)。 LaTeX的\@ifnextchar对于这样的事情是非常有用的。

您的问题的最佳答案是使用新的xparse包。 它是LaTeX3编程套件的一部分,包含用于定义具有相当任意可选参数的命令的广泛function。

在你的例子中,你有一个\secmacros或者需要一个或两个支撑参数。 这将使用xparse与以下实现:

 \ {的DocumentClass文章}
 \ usepackage {xparse}
 \ {开始}文件
 \ DeclareDocumentCommand \ sec {mg} {%
     {#1%
         \ IfNoValueF {#2} {and#2}%
     }%
 }
 (\ {秒你好})
 (\ {秒你好} {您好})
 \ {端文档}

参数{ mg }定义\sec的参数; m表示“强制性参数”, g表示“强制性参数”。 \IfNoValue(T)(F)可以用来检查第二个参数是否确实存在。 请参阅其他types的允许的可选参数的文档。

所有上面的显示很难它可以是一个很好,灵活(或禁止重载)在LaTeX的function! (TeX代码看起来像希腊人)

好吧,只是为了补充我最近(虽然不是那么灵活)的发展,这是我最近在我的论文中使用的

 \usepackage{ifthen} % provides conditonals... 

启动命令,默认情况下“可选”命令设置为空白:

 \newcommand {\figHoriz} [4] [] { 

然后让macros设置一个临时variables\ temp {},取决于可选参数是否为空。 这可以扩展到任何通过的论点。

 \ifthenelse { \equal {#1} {} } %if short caption not specified, use long caption (no slant) { \def\temp {\caption[#4]{\textsl{#4}}} } % if #1 == blank { \def\temp {\caption[#1]{\textsl{#4}}} } % else (not blank) 

然后,我使用两个case的\ temp {}variables来运行macros。 (这里它只是设置短标题等于长标题,如果没有被用户指定)。

 \begin{figure}[!] \begin{center} \includegraphics[width=350 pt]{#3} \temp %see above for caption etc. \label{#2} \end{center} \end{figure} } 

在这种情况下,我只检查\ newcommand {}提供的单个“可选”参数。 如果你设置了3个“可选”参数,你仍然需要发送3个空白参数。

 \MyCommand {first arg} {} {} {} 

这是非常愚蠢的,但我知道,但就我要去用LaTeX而言 – 只要我开始看TeX代码就没有那么重要了…我喜欢Robertson先生的xparse方法,或许我会尝试…

所有你需要的是以下内容:

 \makeatletter \def\sec#1{\def\tempa{#1}\futurelet\next\sec@i}% Save first argument \def\sec@i{\ifx\next\bgroup\expandafter\sec@ii\else\expandafter\sec@end\fi}%Check brace \def\sec@ii#1{\section*{\tempa\ and #1}}%Two args \def\sec@end{\section*{\tempa}}%Single args \makeatother \sec{Hello} %Output: Hello \sec{Hello}{Hi} %Output: Hello and Hi 

我有一个类似的问题,当我想要创build一个命令\dx来缩写\;\mathrm{d}x (即在积分的微分之前放置一个额外的空间,并使“d”直立)。 但是,我还想使其足够灵活,以便将集成variables作为可选参数包含在内。 我在前言中join了下列代码。

 \usepackage{ifthen} \newcommand{\dx}[1][]{% \ifthenelse{ \equal{#1}{} } {\ensuremath{\;\mathrm{d}x}} {\ensuremath{\;\mathrm{d}#1}} } 

然后

 \begin{document} $$\int x\dx$$ $$\int t\dx[t]$$ \end{document} 

给可选参数赋予\ dx

这是我的尝试,但它并不严格按照您的规格。 没有完全testing,所以要谨慎。

 \newcount\seccount \def\sec{% \seccount0% \let\go\secnext\go } \def\secnext#1{% \def\last{#1}% \futurelet\next\secparse } \def\secparse{% \ifx\next\bgroup \let\go\secparseii \else \let\go\seclast \fi \go } \def\secparseii#1{% \ifnum\seccount>0, \fi \advance\seccount1\relax \last \def\last{#1}% \futurelet\next\secparse } \def\seclast{\ifnum\seccount>0{} and \fi\last}% \sec{a}{b}{c}{d}{e} % outputs "a, b, c, d and e" \sec{a} % outputs "a" \sec{a}{b} % outputs "a and b"