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