我知道我可以使用可选参数创建一个新命令
\newcommand{\mycommand}[2][Hello]{\textbf{#1} #2}
我希望命令中有一个可选参数,如果未指定,则该参数将采用非可选参数的值。类似这样的
\newcommand{\mycommand}[2][#2]{\textbf{#1} #2}
有任何想法吗?
答案1
LaTeX 内核解决方案
\makeatletter
\newcommand{\mycommand}{\@dblarg\@mycommand}
\def\@mycommand[#1]#2{\textbf{#1} #2}
\makeatother
看这个答案了解 的描述\@dblarg
。
xparse
解决方案
\usepackage{xparse}
\NewDocumentCommand{\mycommand}{o m}
{\textbf{\IfValueTF{#1}{#1}{#2}} #2}
\IfValueTF{#1}{A}{B}
查看可选参数是否指定;如果指定,则传递A
,否则传递B
。在前面的定义中,A
和就像您希望的那样#1
。B
#2
该xparse
解决方案更加稳健。
答案2
使用一种非常基本的方法,您可以将可选参数默认为某个可以进行测试的宏:
\documentclass{article}
\makeatletter
\newcommand{\mycommand}[2][\@empty]{%
\textbf{\ifx\@empty#1\relax#2\else#1\fi} #2}
\makeatother
\begin{document}
\mycommand{Second} \par
\mycommand[First]{Second}
\end{document}
在上面的例子中,可选参数默认\mycommand
设置为\@empty
(如果未指定)。使用\ifx\@empty#1\relax
,您可以测试是否提供了默认参数(因此#1
实际上缺少)。然后,打印#2
,否则,打印#1
。