有时我希望宏依赖于布尔参数,但我不知道实现这一点的最佳方法。到目前为止,我最终引入了一个全局变量(比如说),\newif\ifextra
它在宏内部使用,但每次调用宏之前都需要设置它。
\documentclass{minimal}
\newif\ifextra
\def\showcase{Show a sentence. \ifextra And a little more if asked to. \fi}
\begin{document}
\extratrue\showcase
\extrafalse\showcase
\end{document}
从编程角度来看,最好将标志作为参数传递,而不是依赖全局标志。这里的最佳做法是什么?
附录:埃格尔的回答强调,这也可以理解为实现宏的两个变体,如\showcase
和\showcase*
,其中标志被编码到名称中(技术上来说并非如此,但它看起来是这样的)。
答案1
您可以使用 *-variant:
\usepackage{xparse}
\NewDocumentCommand{\showcase}{s}{%
Show a sentence.%
\IfBooleanT{#1}{ And a little more if asked to.}%
}
现在\showcase
将生成短版本和\showcase*
长版本。只需将其改为\IfBooleanT
相反\IfBooleanF
即可。还有一个\IfBooleanTF
接受两个文本的版本。
变体指示符可以不同:如果你说
\NewDocumentCommand{\showcase}{t+}{...}
那么变体将是\showcase+
。
“经典”方法
使用“纯 LaTeX”可以说
\makeatletter
\newcommand{\showcase}{%
\@ifstar
{\@showcase{ And a little more if asked to.}}
{\@showcase{}}%
}
\newcommand{\@showcase}[1]{Show a sentence.#1}
\makeatother
此版本的\showcase
可能很脆弱,并且\DeclareRobustCommand
需要定义它以防它出现在移动参数中(或它应该以 开头\protect
)。因此必须定义两个宏(如果\DeclareRobustCommand
使用 则为三个),而不是仅定义一个带有 的宏xparse
。
在这种情况下,说实话,一个更简单的方法是可行的:
\makeatletter
\newcommand{\showcase}{Show a sentence.%
\@ifstar{ And a little more if asked to.}{}}
\makeatother
因为你不想获取参数。但如果你想要类似的东西,这将失败
\showcase{b}
\showcase*{b}
生产
显示 b 句。
显示 b 句。如果要求,可以显示更多。
分别。你必须使用辅助宏:
\makeatletter
\newcommand{\showcase}{%
\@ifstar
{\@showcase{ And a little more if asked to.}}
{\@showcase{}}%
}
\newcommand{\@showcase}[2]{Show #2 sentence.#1}
\makeatother
为了正常工作,\@ifstar{...}{...}
必须最后的在替换文本中。
你xparse
会做
\NewDocumentCommand{\showcase}{sm}{%
Show #2 sentence.%
\IfBooleanT{#1}{ And a little more if asked to.}%
}
其他方法
还有其他包允许定义带有变体的宏,例如suffix
:
\usepackage{suffix}
\newcommand{\showcase}{Show a sentence.}
\WithSuffix\def\showcase*{%
\csname\NoSuffixName\showcase\endcsname{} And a little more if asked to.}
无论哪种情况,语法都不太友好。
答案2
您可以尝试以下操作:
\documentclass{minimal}
\newif\ifextra
\newcommand\showcase[1][1]{Show a sentence.
\ifnum#1=1 \extratrue\else\extrafalse\fi
\ifextra And a little more if asked to. \fi}
\begin{document}
\showcase[0] \\
\showcase[1]
\end{document}
我已经使用 1 作为真的以及任何其他数字错误的提供简洁的语法。
正如评论中所述,如果开关\ifextra
未在宏之外使用,则可以将其删除。
\documentclass{minimal}
\newcommand\showcase[1][0]{Show a sentence.
\ifnum#1=1 And a little more if asked to. \fi}
\begin{document}
\showcase\\
\showcase[1]
\end{document}