仅对符号应用横线或波浪线(忽略下标)

仅对符号应用横线或波浪线(忽略下标)
\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}

相关内容