我创建了一个自定义命令,它接受两个参数并使用其中一个作为下标。显然,下标必须处于数学模式。不幸的是,它没有将参数放在下标中。我可以手动使下标工作,但在我的自定义命令中不行。
我不明白为什么这不起作用。
梅威瑟:
\documentclass{article}
\usepackage{mwe}
\newcommand{\var}[1]{\textsf{#1}}
\newcommand{\LOC}[2][]{\var{LOC#2}$_{#1}$}
\begin{document}
\LOC{C}---Without optional argument.
\var{LOCC}$_{1}$---This looks correct.
\LOC{C}{1}---What happened here?
\end{document}
答案1
您使用了错误的语法。
可选参数应该放在方括号中,而不是大括号中,并且应该在主参数之前输入,而不是之后。
这是你想要的:\LOC[1]{C}
。
答案2
对于花括号中和尾随位置的可选参数,您需要xparse
。此外,您可能还想使用\textsubscript
。
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand\var{m}{\textsf{#1}}
\NewDocumentCommand\LOC{mG{}}{\var{LOC#1}\textsubscript{#2}}
\begin{document}
\LOC{C}---Without optional argument.
\var{LOCC}\textsubscript{1}---This looks correct.
\LOC{C}{1}---What happened here?
\end{document}
答案3
您对可选参数的使用与预期不符。具体来说,可选参数使用[
..]
而强制参数使用{
.. }
。此外, \newcommand{<cmd>}[<num>][<opt>]{<stuff>}
要求将可选参数放置在前强制性的:
<cmd>[<opt>]{<mandatory>}...
如果您希望获得当前正在使用的输入 - 在最后指定可选参数 - 您可以使用以下选项:
\documentclass{article}
\makeatletter
\newcommand{\var}[1]{\textsf{#1}}
\newcommand{\LOCa@}[1][\relax]{\ifx#1\relax\else\ensuremath{_{#1}}\fi}
\newcommand{\LOCa}[1]{\var{LOC#1}\LOCa@}
\makeatother
\usepackage{xparse}
\NewDocumentCommand{\LOCb}{m o}{%
\var{LOC#1}%
\IfValueT{#2}{\ensuremath{_{#2}}}%
}
\begin{document}
\LOCa{C}---Without optional argument.
$\var{LOCC}_{1}$---This looks correct.
\LOCa{C}[1]---What happened here?
\LOCb{C}---Without optional argument.
$\var{LOCC}_{1}$---This looks correct.
\LOCb{C}[1]---What happened here?
\end{document}
这xparse
界面更容易理解。此外,考虑编写宏时不要考虑强制切换(到数学模式)。而是切换到您在文档中使用它的数学模式:
$\LOC{C}[1]$
参考: