\newcommand:使用一个参数作为另一个参数的默认值

\newcommand:使用一个参数作为另一个参数的默认值

我想定义一个接受两个参数的宏,其中一个是可选的。如果没有给出,则应该将另一个作为默认值。

很遗憾,

\newcommand{\mycommand}[2][#1]{ ... }

不起作用,也不起作用

\newcommand{\mycommand}[2][#2]{ ... }

有人知道怎么做这个吗?

答案1

好消息:你可以很容易地做到这一点xparse

\documentclass{article}
\usepackage{xparse}

\NewDocumentCommand{\foo}{O{#2}m}{%
  Optional=``#1'', mandatory=``#2''\par
}
\NewDocumentCommand{\oof}{mO{#1}}{%
  Mandatory=``#1'', optional=``#2''\par
}

\begin{document}

\foo{x}

\foo[y]{x}

\oof{x}

\oof{x}[y]

\end{document}

O{...}当参数本身在调用时未出现时,参数说明符将参数 what 作为默认值进行替换。这很可能是指向另一个参数的参数标记。

在此处输入图片描述

答案2

您可以使用xparse轻松判断是否存在可选参数,并将适当的组合提供给另一个(辅助)函数。以下是示例:

在此处输入图片描述

\documentclass{article}

\usepackage{xparse}

\newcommand{\printthis}[2]{%
  Optional: #1; Mandatory: #2%
}

\NewDocumentCommand{\mycommand}{o m}{%
  \IfValueTF{#1}
    {\printthis{#1}{#2}}% \mycommand[..]{...}
    {\printthis{#2}{#2}}% \mycommand{...}
}

\begin{document}

\mycommand{first}

\mycommand[first]{second}

\end{document}

稍微不同的版本源于 的使用\caption,其中您可以为 LoT/LoF 提供可选参数,但如果不提供,则会发送强制参数(对于具有发往 ToC 的可选参数的部分单元,情况类似)。这使用核心\@dblarg

\documentclass{article}

\newcommand{\printthis}[2][]{%
  Optional: #1; Mandatory: #2%
}

\makeatletter
\newcommand{\mycommand}{%
  \@dblarg\printthis
}
\makeatother

\begin{document}

\mycommand{first}

\mycommand[first]{second}

\end{document}

答案3

与处理可选参数的其他宏一样,这是尝试添加保护:

%%\errorcontextlines=1000
\documentclass[a4paper]{article}

\makeatletter
\newcommand\makefirstmandatorytheoptional[1]{%
  \expandafter\innermakefirstmandatorytheoptional
  \expandafter{\csname\string#1\endcsname}{#1}%
}%
\newcommand\innermakefirstmandatorytheoptional[2]{%
  \def#2{%
    \ifx\protect\@typeset@protect
      \expandafter\@firstoftwo
    \else
      \expandafter\@secondoftwo
    \fi
    {\kernel@ifnextchar[{#1}{\@dblarg{#1}}}%
    {\protect#2}%
  }%
}%
\newcommand\mycommand[2][dummyoptional]{%
  This is taken for the optional argument: #1.\\
  This is taken for the mandatory argument: #2.
}%
\makefirstmandatorytheoptional{\mycommand}%
\makeatother

\parindent=0ex
\parskip=\medskipamount

\begin{document}

No optional argument given---\verb|\mycommand{A}|:

\mycommand{A}

Optional argument "B" given---\verb|\mycommand[B]{A}|:

\mycommand[B]{A}

\end{document}

在此处输入图片描述

相关内容