我正在编写一个文档,其中必须将所有变量实例更改i
为,x
并且该文档已经很长了。有没有编辑器可以让我这样做,或者一般来说,在数学环境中替换文本?
答案1
emacs 可以相当轻松地完成这类事情
(defun change-mathvar (a b)
(interactive "sfrom: \nsto: ")
(beginning-of-buffer)
(while (re-search-forward
"\\(\\\\(\\|\\\\\\[\\|[^\\\\]\$\$?\\|\\\\begin{equation}\\|\\\\begin{align}\\)" nil 1)
(query-replace-regexp a b t (point)
(progn (re-search-forward
"\\(\\\\)\\|\\\\\\]\\|[^\\\\]\$\$?\\|\\\\end{equation}\\|\\\\end{align}\\)" nil 1) (point)))))
这看起来$
\(
\[
\begin{equation}
\begin{align}
像是 math-start。可以添加其他环境。
从以下文档开始
\documentclass{article}
\begin{document}
i i aib
\[i i aib \]
i i aib
\begin{equation}
i i aib
\end{equation}
\end{document}
然后执行M-x change-mathvar
编辑器将提示输入旧名称和新名称,然后对变量名称进行查询替换以生成:
\documentclass{article}
\begin{document}
i i aib
\[x x aib \]
i i aib
\begin{equation}
x x aib
\end{equation}
\end{document}
请注意,它没有改变任何数学内容,它只改变了i
它作为完整单词出现的位置,而不是aib
。如果您还想aib
更改,请将t
代码中的更改为nil
进行非分隔匹配。
答案2
我的解决方案使用emacs
(> = 24)和auctex
:
(defun latex-replace-in-math ()
"Call `query-replace-regexp' with `isearch-filter-predicate' set to only match inside LaTeX math environments."
(interactive)
(let ((isearch-filter-predicate
(lambda (BEG END)
(save-excursion (save-match-data (goto-char BEG) (texmathp)))))
(case-fold-search nil))
(call-interactively 'query-replace-regexp)))
这用于texmathp
检测数学环境。取消定义case-fold-search
会使搜索区分大小写;这通常对变量符号有意义。
可以使用通常的正则表达式,例如搜索\<i\>
而不是仅仅i
避免更改\sin
为\sxn
。
答案3
WinEdt 就足够了:
在“替换”对话框中,选中“仅全词”和“正则表达式”复选框。
搜索
i\E{isMath}
并替换为x
。
然后,它就可以正常工作了。但是,对于像 这样的表达式_i
,它也会更改为 ,_x
这可能不是您想要的。
您还可以使用 替换不在数学环境中的文本i\e{isMath}
。
我在“WinEdt 帮助”对话框中搜索“正则表达式”找到了这个技巧。也许您可以在帮助中找到更多有用的技巧。
答案4
那么如何使用 TeX 本身来解决这个任务呢?在文档开头写下以下行:
\mathcode`i=\mathcode`x