带有可选参数的新命令作为第一个参数

带有可选参数的新命令作为第一个参数

我知道我可以使用可选参数创建一个新命令

\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和就像您希望的那样#1B#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

相关内容