LaTeX \newcommand默认参数:是空的?

kol*_*pto 36 latex if-statement conditional-statements

我正在尝试编写一个简单的示例命令,在没有参数的情况下打印任何内容,但是使用参数将其包围起来.

我已经读过默认值应该是\@empty,并且简单\ifx\@empty#1条件应该完成这项工作:

\newcommand{\optarg}[1][\@empty]{%
\ifx\@empty#1  {}  \else  {(((#1)))}  \fi
}

\optarg % (((empty)))
\optarg{} % (((empty)))
\optarg{test} % (((empty))) test
Run Code Online (Sandbox Code Playgroud)

后三个命令都是empty出于某种原因打印出来的,我希望前两个不打印,最后打印(((test))).

我正在使用TeXLive/Ubuntu.一个想法?

god*_*byk 48

尝试以下测试:

\documentclass{article}

\usepackage{xifthen}% provides \isempty test

\newcommand{\optarg}[1][]{%
  \ifthenelse{\isempty{#1}}%
    {}% if #1 is empty
    {(((#1)))}% if #1 is not empty
}

\begin{document}

Testing \verb|\optarg|: \optarg% prints nothing

Testing \verb|\optarg[]|: \optarg[]% prints nothing

Testing \verb|\optarg[test]|: \optarg[test]% prints (((test)))

\end{document}
Run Code Online (Sandbox Code Playgroud)

xifthen提供了\ifthenelse构造和\isempty测试.

另一种选择是使用ifmtarg包装(见ifmtarg.sty文件的文档).


Jos*_*ght 12

使用LaTeX3 xparse包:

\usepackage{xparse}
\NewDocumentCommand\optarg{g}{%
  \IfNoValueF{#1}{(((#1)))}%
}
Run Code Online (Sandbox Code Playgroud)


Nor*_*sey 8

在用于编写LaTeX的底层TeX引擎中,命令可以采用的参数数量是固定的.你使用默认设置做的[\@empty]是要求LaTeX检查下一个标记,看它是否是一个开放的方括号[.如果是这样,LaTeX将方括号的内容作为参数,如果不是,则将下一个标记放回输入流中,而使用默认\@empty参数.因此,为了让您的想法发挥作用,您必须使用括号来界定可选参数(如果存在):

\optarg
\optarg[]
\optarg[test]
Run Code Online (Sandbox Code Playgroud)

你应该用这种表示法获得更好的运气.

令人讨厌的是,您不能使用相同的括号作为可选参数,因为您使用了必需的参数,但这就是它的方式.