如果未传递可选参数,则会出现特殊行为

如果未传递可选参数,则会出现特殊行为

我正在寻找定义一个命令(实际上,一个环境,但这对于这个问题的目的来说并不重要)来执行一些默认行为,如果传递了一个可选参数,则执行其他操作。

例如,

\newcommand{mycommand}[1]{%
if (#1 != NULL){%
The argument #1 was passed}
else {%
No argument was passed.}}

显然这不是有效的 LaTeX,但希望这能清楚地说明我想做什么。有没有办法用普通的 LaTeX 做到这一点?是否值得切换到 LuaLaTeX 来实现这样的行为?

答案1

您可以使用以下方式轻松完成xparse

\documentclass{article}

\usepackage{xparse}

\NewDocumentCommand{\mycommand}{o}{%
  % <code>
  \IfNoValueTF{#1}
    {code when no optional argument is passed}
    {code when the optional argument #1 is present}%
  % <code>
}

\begin{document}

\mycommand

\mycommand[HERE]

\end{document}

这将打印

未传递可选参数时的
代码 存在可选参数 HERE 时的代码

对于环境来说,情况类似

\NewDocumentEnvironment{myenv}{o}
  {\IfNoValueTF{#1}{start code no opt arg}{start code with #1}}
  {\IfNoValueTF{#1}{end code no opt arg}{end code with #1}}

可以随意添加这两种情况共有的其他代码。如您所见,xparse还允许(但不是强制性的)在结尾部分使用参数说明符。

答案2

\makeatletter
\newcommand{\mycommand}[1][\@nil]{%
  \def\tmp{#1}%
   \ifx\tmp\@nnil
       no argument
    \else
         argument #1
    \fi}
\makeatother



\mycommand zzzz \mycommand[hello]  zzz

答案3

这是一个使用 LaTeX 内部的解决方案\@ifnextchar

\documentclass{minimal}
\makeatletter
\def\foo{\@ifnextchar[\foo@BT\foo@BF}
\def\foo@BT[#1]{Bracket true. Optional argument was: #1.}
\def\foo@BF{Bracket false. No optional argument.}
\makeatother

\begin{document}
\foo[Hello, world]

\foo
\end{document}

相关内容