数学下标在自定义命令中不起作用

数学下标在自定义命令中不起作用

我创建了一个自定义命令,它接受两个参数并使用其中一个作为下标。显然,下标必须处于数学模式。不幸的是,它没有将参数放在下标中。我可以手动使下标工作,但在我的自定义命令中不行。

我不明白为什么这不起作用。

梅威瑟:

\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]$

参考:

相关内容