解析命令中的下标和上标

解析命令中的下标和上标

我在文本中使用了相当多的符号。因此,我决定写一些命令,例如:

\newcommand{\struct}[1]{\mathsf{#1}}

典型用法如下:

Let $(\struct{A}_n)$ be a sequence of structures.

请注意下标在struct命令之外。

我的问题在于我需要将对象的确切名称“放置”到各个地方。也就是说,写一些与结构一样长的描述:

(\struct{A}_n, S_{\struct{A}_n}, R_{\struct{A}_n})

请注意,我不能只写这样的命令:

\newcommand{\longstruct}[1]{(\mathsf{#1}, S_\mathsf{#1}, R_\mathsf{#1})}

并以类似的方式使用它:

Let $(\longstruct{A}_n)$ be a sequence of structures.

因为下标的_n位置不正确。

作为一种解决方案,它可以分别处理名称的“基数”和下标/上标。例如,在这样的命令中:

% #1 Base
% #2 Subscript
% #3 Superscript
\newcommand{\longstruct}[3]{(\mathsf{#1}_{#2}^{#3}, S_{\mathsf{#1}_{#2}^{#3}}, R_{\mathsf{#1}_{#2}^{#3}})}

但在代码中使用感觉太麻烦了。可选参数有帮助,但仍然不是最佳选择。

我想如何使用该命令:

Let $(\longstruct{A_n})$ be a sequence of structures.

但是当然,因为只有A应该进入\mathsf{.},所以参数需要解析为命令内的基数和下标/上标。

有办法可以做到这一点吗?

注意:我仍然是一个缺乏经验的 Latex 用户,很可能有更好的解决方案,但我甚至没有想到。我愿意接受任何建议。谢谢。

编辑:上标缩进用于命令示例中的三个参数,产生如下结果:

(\struct{A}_n^d, S_{\struct{A}_n^d}, R_{\struct{A}_n^d})

答案1

您可以使用 来完成此操作\NewDocumentCommand,它能够在给定的标记处拆分参数。

\documentclass{article}
\usepackage{amsmath}

\NewDocumentCommand{\struct}{m}{\mathsf{#1}}

\NewDocumentCommand{\longstruct}{>{\SplitArgument{1}{_}}m}{%
  (\makelongstruct#1)%
}

\NewDocumentCommand{\makelongstruct}{mm}{%
  \struct{#1}\IfValueT{#2}{_{#2}},%
  S_{\struct{#1}\IfValueT{#2}{_{#2}}},%
  R_{\struct{#1}\IfValueT{#2}{_{#2}}}%
}

\begin{document}

$\longstruct{A_n}$

$\longstruct{B}$

\end{document}

在此处输入图片描述

解释:\SplitArgument{1}{_}参数A_n变为{A}{n},我们可以将其传递给辅助命令。如果缺少_,我们将得到{A}{-NoValue-},并且可以对其进行测试以避免添加下标。

我们还可以容纳上标:

\documentclass{article}
\usepackage{amsmath}

\NewDocumentCommand{\struct}{m}{\mathsf{#1}}

\NewDocumentCommand{\longstruct}{>{\SplitArgument{1}{_}}m}{%
  (\makelongstructA#1)%
}

\NewDocumentCommand{\makelongstructA}{mm}{%
  \IfNoValueTF{#2}{% no subscripts
    \makestruct{#1}{\kern-\scriptspace}{\kern-\scriptspace}%
  }{% there are subscripts
    \makelongstructB{#1}{#2}%
  }%
}

\NewDocumentCommand{\makelongstructB}{
  >{\SplitArgument{1}{^}}m
  >{\SplitArgument{1}{^}}m
}{%
  \makelongstructC#1#2%
}

\NewDocumentCommand{\makestruct}{mmm}{%
  \struct{#1}\IfValueT{#2}{_{#2}}\IfValueT{#3}{^{#3}},%
  S_{\struct{#1}\IfValueT{#2}{_{#2}}\IfValueT{#3}{^{#3}}},%
  R_{\struct{#1}\IfValueT{#2}{_{#2}}\IfValueT{#3}{^{#3}}}%
}

\NewDocumentCommand{\makelongstructC}{mmmm}{%
  \IfValueTF{#2}{% we had A^s_n
    \makestruct{#1}{#3}{#2}%
  }{% we had A_n^s
%\showtokens{#1,#2,#3}
    \makestruct{#1}{#3}{#4}%
  }%
}

\begin{document}

$\longstruct{A_n}$

$\longstruct{B}$

$\longstruct{C_n^k}$

$\longstruct{D^k_n}$

\end{document}

在此处输入图片描述

相关内容