我正在寻找关于双下标/上标的最佳实践。我有一堆宏来表示某些子类、x
-component、n
th 顺序、外部值等。我希望它们能够以任意顺序独立使用它们。起初我有这样的宏
\documentclass{article}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\begin{document}
\newcommand{\x}[1]{{#1}_x}
\newcommand{\n}[1]{{#1}_n}
\newcommand{\additive}[1]{{#1}^\text{a}}
\newcommand{\out}[1]{{#1}^*}
$\x{\out{\additive{\n{B}}}}$
\end{document}
但这把事情搞得一团糟:
删除花括号
\documentclass{article}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\begin{document}
\newcommand{\x}[1]{#1_x}
\newcommand{\n}[1]{#1_n}
\newcommand{\additive}[1]{#1^\text{a}}
\newcommand{\out}[1]{#1^*}
$\x{\out{\additive{\n{B}}}}$
\end{document}
这正确显示:
但是它给出了一个双上标错误。我不介意双上标;相反,这就是我想要的(除非有人有更好的符号建议,我知道它很拥挤,但这是一个很长的文档,有很多错综复杂的内容……)!我知道我可以手动完成,但是有没有办法让这些宏的任意顺序产生后者的结果而不会出现错误?
谢谢。
答案1
使用带有专用宏的前缀列表来标记列表的结尾比注释中讨论的嵌套调用要容易一些。
\documentclass{article}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\makeatletter
\gdef\zzsub{}
\gdef\zzsup{}
\newcommand{\x}{\g@addto@macro\zzsub{x}}
\newcommand{\n}{\g@addto@macro\zzsub{n}}
\newcommand{\additive}{\g@addto@macro\zzsup{\text{a}}}
\newcommand{\out}{\g@addto@macro\zzsup{*}}
\newcommand\zz[1]{%
#1%
\ifx\zzsub\@empty\else_{\zzsub}\fi
\ifx\zzsup\@empty\else^{\zzsup}\fi
\gdef\zzsub{}%
\gdef\zzsup{}%
}
\makeatother
\begin{document}
$\x\out\additive\n\zz{B} + \out\out\n\zz{Z}$
\end{document}
你可能喜欢前置项,而不是将它们附加到列表中。这对于复合构造很有帮助,例如拥有简写\newcommand{\Bax}{\x\additive\zz{B}}
,然后能够添加远离核心的更多标记\n\Bax
。在这种情况下,使用这种技术。