使用vim regex在LaTeX中重命名数学变量

时间:2014-04-04 22:33:50

标签: regex vim latex

我需要在vim正则表达式的帮助下,在一个大的Latex文档中更改数学变量的名称,我正在努力学习。

例如,我想将标记为't'的变量更改为's',例如

\begin{equation}
    f(X) \leq \sqrt{t(t+1)}
\end{equation}

应该变成

\begin{equation}
    f(X) \leq \sqrt{s(s+1)}
\end{equation}

为此,我需要在\begin{equation}和匹配的\end{equation}之间的某个地方搜索字符't',可能有几行换行符,但字符't'不应该是任何关键字的一部分例如\sqrt

我试过了

%s/\\begin{equation}\_.\{-}\(\\\a*\)\@!\zst\ze\_.\{-}\\end{equation}/s/g

但它不能正常工作。此外,这种模式甚至匹配像\sqrt这样的关键字,我不明白为什么。但是,我意识到,正如我所做的那样将两个\_.\{-}之间的匹配夹在中间,不会产生预期的结果,因为它不会匹配字符't'的多次出现

如果可能,我更喜欢纯vim正则表达式解决方案。

注意:

由于我使用equation以外的其他环境,例如aligneqnarraymultline等,因此在模式中插入OR会更好比如

/\\begin{\(equation\|align\|eqnarray\|multline\)}

然后找到匹配的\end{…}。你是如何做到的?

2 个答案:

答案 0 :(得分:0)

您只需将t作为整个单词匹配。要实现这一点,首先应该更改为正则表达式是添加单词start和en boundary \<\>所以您的示例如下所示:

%s/\\begin{equation}\_.\{-}\(\\\a*\)\@!\<t\>\ze\_.\{-}\\end{equation}/s/g

第二件事是使用非常神奇,大多数vim用户发现它更方便:

:%s/\v\\begin\{equation\}\_.{-}(\\\a*)@!<t>\ze\_.{-}\\end\{equation\}/s/g

您正在匹配像sqrt这样的单词,因为\\\a*匹配空字符串。通过使用字词分隔符<>(使用\v)或\<\>(不使用\v),您可以限制{{{}的匹配1}}仅限于单个t未被单词字符包围,就像它上面的单词一样。

然后你有两个选择,第一个是通过在标志中添加c来使用确认字符:

t

然后你可以有选择地使用替换或逃避它。第二种选择是使用范围限制匹配(如果你愿意,可以使用确认):

:%s/\v\\begin\{equation\}\_.{-}(\\\a*)@!<t>\ze\_.{-}\\end\{equation\}/s/gc

此致

答案 1 :(得分:0)

让我们一块一块地建立起来。首先,正如@rbernabe建议的那样,使用单词词头和词尾结构模式将“t”作为整个单词找到:

/\<t\>

接下来,要替换当前行上的所有内容,请使用

:s/\<t\>/s/g

现在,将光标放在\begin{equation}行上。范围.,/\\end{equation}/指定直到并包括等式环境结束的所有行,所以

:.,/\\end{equation}/s/\<t\>/s/g

将用该范围内的“s”替换所有单字“t”。要为文件中的所有方程式环境重复此命令,请使用:g/\\begin{equation}/{command}

:g/\\begin{equation}/.,/\\end{equation}/s/\<t\>/s/g

如果你想玩vimgolf,那么是可选的。最后,如果您想处理多个环境,我担心无法将\begin{...}中的变量环境名称与结束\end{...}联系起来。如果没有嵌套类似等式的环境,则可以使用

:g/\\begin{\(equation\|align\|eqnarray\|multline\)}/.,/\\end{\(equation\|align\|eqnarray\|multline\)}/s/\<t\>/s/g

您还可以使用显式循环,如果存在嵌套环境,这可能会有所帮助:

:let envs = ['equation', 'align', 'eqnarray', 'multline']
:for env in envs
:  execute 'g/\\begin{' . env . '}/.,/\\end{' . env . '}/s/\<t\>/s/g'
:endfor

当然,正则表达式不能代替真正的解析。只要您的实际LaTeX代码与您的样本相似,这应该可行,但如果您有类似

的话,您将遇到麻烦
\end{equation} This is ordinary text with a t in it.