我想定义一个命令来缩短这样的公式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
无需特殊处理)。