![如果宏中未提供可选的第一个参数,则使用第二个参数作为第一个参数](https://linux22.com/image/394179/%E5%A6%82%E6%9E%9C%E5%AE%8F%E4%B8%AD%E6%9C%AA%E6%8F%90%E4%BE%9B%E5%8F%AF%E9%80%89%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0%EF%BC%8C%E5%88%99%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%8F%82%E6%95%B0%E4%BD%9C%E4%B8%BA%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0.png)
我正在尝试构造一个带有一个可选参数和一个强制参数的命令,并且如果未提供可选参数,我希望默认值为#2。
为什么这不起作用?(错误Illegal parameter number ...
:)
\documentclass{article}
\newcommand{\mycommand}[2][#2]{\label{#1}#2}
\begin{document}
\mycommand{mytext}
\end{document}
那么有什么办法可以解决这个问题呢?
编辑:
为了澄清我的具体用例:我正在尝试定义一个命令,将一个变量作为一个选项传递给环境,其中myenv
可以有类似的选项optionone=X
,optiontwo=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}