我想定义一个接受 1、2 或 3 个参数的命令,如果未定义,则第二个参数的值与第一个参数的值相同。我试过
\newcommand\codefrom[3][#1][Matlab]{ ... }
但我收到错误说
! \codefrom 定义中的参数数量非法。
<待重读>
1
l.57 \newcommand{\codefrom}[3][#1][
Matlab]
有什么方法可以完成我想要做的事吗?
答案1
您无法仅使用一个 来实现这一点\newcommand
。您可以在那里定义一个可选参数,并且它必须是第一个。有一个twoopt
包定义了\newcommandtwoopt
两个可选参数,但我认为它无法处理您想要实现的目标。我最初以为您需要使用 TeX 的\def
,但这里有一个完全没有任何\def
s 和@
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]}}