替换下标中的字符串

替换下标中的字符串

我想定义一个命令来缩短这样的公式a^1,\cdots,a^n,使用占位符(-)而不是索引,代码是

\usepackage{xstring}
\newcommand{\replaceStr}[2]{\begingroup\expandarg\StrSubstitute{#1}{(-)}{#2}\endgroup}
\newcommand\coordsnn[1]{\replaceStr{#1}{^1},\cdots,\replaceStr{#1}{^n}}

它有效,例如$\coordsnn{A(-)B(-)C}$导致$A^1B^1C,\cdots,A^nB^nC$

但是,如果我进一步将其扩展到类似的情况a_{01},\cdots,b_{0n},命令如下所示:

\newcommand\coordsnX[1]{\replaceStr{#1}{1},\cdots,\replaceStr{#1}{n}}

不再起作用,保持(-)不变。如何实现这种命令?supscript 怎么样?

以下是示例测试代码:

\documentclass{article}
\usepackage{xstring}
\newcommand{\replaceStr}[2]{\begingroup\expandarg\StrSubstitute{#1}{(-)}{#2}\endgroup}
\newcommand\coordsnn[1]{\replaceStr{#1}{^1},\cdots,\replaceStr{#1}{^n}}
\newcommand\coordsnX[1]{\replaceStr{#1}{1},\cdots,\replaceStr{#1}{n}}
\begin{document}
Working example:
$$
\coordsnn{a(-)b(-)c}
$$
Not working example:
$$
\coordsnn{a_{0(-)}b_{0(-)}c}, \coordsnn{a^{0(-)}b^{0(-)}c}
$$
\end{document}

答案1

您要查找的文本周围有括号组:这些括号组会将其“隐藏”起来,使 TeX 无法通过常规方法进行搜索和替换。因此,您需要做的是将输入去标记化(删除类别代码),然后再重新标记。字符串包确实提供了这种功能,但我可能会选择l3regex这里:

\documentclass{article}
\usepackage{l3regex,xparse}
\ExplSyntaxOn
\cs_new_protected:Npn \mw_replace_all:nn #1#2
  {
    \group_begin:
      \tl_set:Nn \l_tmpa_tl {#1}
      \regex_replace_all:nnN { \(\-\) } { #2 } \l_tmpa_tl
      \tl_use:N \l_tmpa_tl
    \group_end:
  }
\NewDocumentCommand \coordsnn { m }
  {
    \mw_replace_all:nn {#1} { \cU^\cB{1\cE} }
    \cdots
    \mw_replace_all:nn {#1} { \cU^\cB{n\cE} }
  }
\NewDocumentCommand \coordsnX { m }
  {
    \mw_replace_all:nn {#1} { 1 }
    \cdots
    \mw_replace_all:nn {#1} { n }
  }
\ExplSyntaxOff
\begin{document}
Working example:
\[
  \coordsnn{a(-)b(-)c}
\]
Not working example:
\[
  \coordsnX{a_{0(-)}b_{0(-)}c}, \coordsnX{a^{0(-)}b^{0(-)}c}
\]
\end{document}

这个包提供了正则表达式替换,更重要的是将要自动查找括号组内部。这里的“匹配”部分很简单:\(\-\)是您的字符串(-),但每个字符都经过转义。替换有点棘手:\cU^是 catcode“上标” ^\cB{ 是 catcode“开始组” {\cE}是 catcode“结束组” }1无需特殊处理)。

相关内容