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。
在你的例子中,你有一个\sec
macros或者需要一个或两个支撑参数。 这将使用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"