如何将一个参数用作另一个参数的默认值?

如何将一个参数用作另一个参数的默认值?

我想定义一个接受 1、2 或 3 个参数的命令,如果未定义,则第二个参数的值与第一个参数的值相同。我试过

\newcommand\codefrom[3][#1][Matlab]{ ... }

但我收到错误说

! \codefrom 定义中的参数数量非法。
<待重读>
                   1
l.57 \newcommand{\codefrom}[3][#1][
                                                              Matlab]

有什么方法可以完成我想要做的事吗?

答案1

您无法仅使用一个 来实现这一点\newcommand。您可以在那里定义一个可选参数,并且它必须是第一个。有一个twoopt包定义了\newcommandtwoopt两个可选参数,但我认为它无法处理您想要实现的目标。我最初以为您需要使用 TeX 的\def,但这里有一个完全没有任何\defs 和@s 的解决方案:

\documentclass[12pt]{report}
\newcommand\storefirst{}
\newcommand\storesecond{}
\newcommand\codefrom[1]{\renewcommand\storefirst{#1}\codefromi}
\newcommand\codefromi[1][\storefirst]{\renewcommand\storesecond{#1}\codefromii}
\newcommand\codefromii[1][Matlab]{\storefirst, \storesecond, #1}
\begin{document}
\codefrom{first}\par
\codefrom{first}[second]\par
\codefrom{first}[second][third]
\end{document}

答案2

以下是基于的解决方案xparse

\documentclass{minimal}

\usepackage{xparse}

\NewDocumentCommand\codefrom{moO{Matlab}}{%
  \IfValueTF{#2}{%
    \codefromaux{#1}{#2}{#3}%
  }{%
    \codefromaux{#1}{#1}{#3}%
  }%
}
\NewDocumentCommand\codefromaux{mmm}{%
  1 = #1, 2 = #2, 3 = #3%
}

\begin{document}

\codefrom{a}\par
\codefrom{a}[b]\par
\codefrom{a}[b][c]

\end{document}

答案3

这个问题已经很老了,但是由于所有答案都是不必要的复杂,所以我想直接使用 xparse 的可能性来提供一个更简单的解决方案。

\documentclass{minimal}
\usepackage{xparse}
\begin{document}
    \NewDocumentCommand{\codefrom}{mO{#1}O{Matlab}}{#1, #2, #3}
    \codefrom{a} \quad \codefrom{a}[b] \quad \codefrom{a}[b][c]
\end{document}

结果为在此处输入图片描述。第一个参数为m可选参数,第二和第三个参数为O可选参数。第二个参数的默认值为第一个参数,第三个参数的默认值为Matlab。

答案4

\documentclass{article}
\makeatletter
\newcommand{\codefrom}[1][]{\def\c@defr@m{#1}\c@defrom}
\newcommand{\c@defrom}[2][\c@defr@m]{\message{[\c@defr@m,#1,#2]}}
\makeatother
\begin{document}
\codefrom{a}
\codefrom[a]{b}
\codefrom[a][b]{c}
\end{document}

编辑:如果访问参数 #1–#3 对您来说很重要,那么还有另一种选择:

\newcommand{\codefrom}[1][]{\def\c@defr@m{#1}\c@defrom}
\newcommand{\c@defrom}[1][\c@defr@m]
  {\expandafter\@codefrom\expandafter{\c@defr@m}{#1}}
\newcommand{\@codefrom}[3]{\message{[#1,#2,#3]}}

相关内容