如果宏中未提供可选的第一个参数,则使用第二个参数作为第一个参数

如果宏中未提供可选的第一个参数,则使用第二个参数作为第一个参数

我正在尝试构造一个带有一个可选参数和一个强制参数的命令,并且如果未提供可选参数,我希望默认值为#2。

为什么这不起作用?(错误Illegal parameter number ...:)

\documentclass{article} 
\newcommand{\mycommand}[2][#2]{\label{#1}#2}
\begin{document}
\mycommand{mytext}
\end{document}

那么有什么办法可以解决这个问题呢?

编辑:
为了澄清我的具体用例:我正在尝试定义一个命令,将一个变量作为一个选项传递给环境,其中myenv可以有类似的选项optionone=Xoptiontwo=Y可选的#1的默认值应该是optionone=#2(而不是字面上的#2)。

\newcommand{\mycommand}[2][optionone=#2]{\begin{myenv}[#1]\input{#2}\end{myenv}}

也许通常有更好的方法?(我使用的环境定义来自这里

答案1

有几种方法可以做到这一点。

经典方法

\makeatletter
\newcommand{\mycommand}{\@dblarg\my@command}
\def\my@command[#1]#2{\label{#1}#2}
\makeatother

xparse

\usepackage{xparse}
\NewDocumentCommand{\mycommand}{O{#2}m}{\label{#1}#2}

您的用例

\NewDocumentCommand{\mycommand}{O{optionone=#2}m}{%
 \begin{myenv}[#1]\input{#2}\end{myenv}%
}

答案2

这里,\mycommand确定是否有 1 个或 2 个参数,并将结果传递给\mycommandaux,后者处理两个参数,无论是否重复。

\documentclass{article} 
\newcommand\mycommand[2][\relax]{%
  \ifx\relax#1%
    \mycommandaux{#2}{#2}%
  \else
    \mycommandaux{#1}{#2}%
  \fi
}
\newcommand\mycommandaux[2]{Arguments 1,2: [#1]\{#2\}}
\begin{document}
\mycommand{xyz}

\mycommand[xyz]{pdq}
\end{document} 

在此处输入图片描述

尝试更符合 OP 编辑​​的示例

\documentclass{article} 
\usepackage[T1]{fontenc}
\newcommand\mycommand[2][\relax]{%
  \ifx\relax#1%
    \mycommandaux{optionone=#2}{#2}%
  \else
    \mycommandaux{#1}{#2}%
  \fi
}
\newcommand\mycommandaux[2]{\detokenize{\begin{myenv}[#1]\input{#2}\end{myenv}}}
\begin{document}
\mycommand{ABC}

\mycommand[optiontwo=xyz]{pdq}
\end{document} 

在此处输入图片描述

相关内容