实现布尔宏参数的最佳实践?

实现布尔宏参数的最佳实践?

有时我希望宏依赖于布尔参数,但我不知道实现这一点的最佳方法。到目前为止,我最终引入了一个全局变量(比如说),\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}

相关内容