\documentclass[12pt]{article}
\usepackage{amsmath}
\begin{document}
$ \bar{S_{i,k}} $
\end{document}
我想要的是将横条仅跨越字母 S。显然,解决方案是 $\bar{S}_{i,k}$。但假设我们有一个通用命令
\newcommand{\makeBar}[1]{\bar{#1}}
我们称之为
\makeBar{B_i}
在后一种情况下,再次,条形跨越整个表达式而不仅仅是符号 B。好吧,我们可以做 $\makeBar{B}_i$,但这不是我的解决方案,因为我想通过宏来控制我的大部分编码。
是否有一个好的解决方案,让横线(或波浪号,...)只跨越符号,而忽略符号相邻的可能的下标或上标?
答案1
您可以使用正则表达式,可用expl3
:
\cs_new:Nn \simon_apply_to_symb:nn
{
\tl_set:Nn \l_tempa_tl { #2 }
\regex_replace_once:nnN { [^\_\^]+ }
{ \c{ #1 } \{ \0 \} } \l_tempa_tl
\tl_use:N \l_tempa_tl
}
例子:
\documentclass[12pt]{article}
\usepackage{amsmath}
\ExplSyntaxOn
\cs_new:Nn \simon_apply_to_symb:nn
{
\tl_set:Nn \l_tempa_tl { #2 }
\regex_replace_once:nnN { [^\_\^]+ }
{ \c{ #1 } \{ \0 \} } \l_tempa_tl
\tl_use:N \l_tempa_tl
}
\NewDocumentCommand{\NewApplyToSymbolCommand}{ m m }
{
\NewDocumentCommand{ #1 }{ m }{ \simon_apply_to_symb:nn { #2 } { ##1 } }
}
\ExplSyntaxOff
\NewApplyToSymbolCommand{\makebar}{\bar}
\NewApplyToSymbolCommand{\makewidetilde}{\widetilde}
\begin{document}
\newcommand*{\mysymb}{\alpha BC}
\begin{align*}
\bar{S_{i,k}} && \widetilde{S_{i,k}} \\
\makebar{S_{i, k}} && \makewidetilde{S_{i, k}} \\
\makebar{S^{i, k}} && \makewidetilde{S^{i, k}} \\
\makebar{\mysymb_{i, k}^{2}} && \makewidetilde{\mysymb_{i, k}^{2}} \\
\end{align*}
\end{document}
注意它不适用于双下标,例如\makebar{{S_i}_j}