我在文本中使用了相当多的符号。因此,我决定写一些命令,例如:
\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}