是否有编辑器或 IDE(或脚本)用于替换 TeX 命令$
并将$$
数学区域打开和关闭到相应的 LaTeX 命令\(
、\)
和\[
中\]
?
我确信有一个工具 - 我正在寻找。我认为这将产生更易读的代码。简单的搜索和替换不会做到这一点 - 但使用正则表达式,这应该不是问题。我只是不想再发明轮子了。
答案1
尽管我喜欢安德鲁的回答,因为该脚本显然处理的内容比(我调用的)旧的好一些sed
,但我会添加我的评论作为答案。
sed -r 's/\$\$([^\$]+)\$\$/\\[\1\\]/g' | sed -r 's/\$([^\$]+)\$/\\(\1\\)/g'
$$...$$
基本上,它首先用 替换每个出现的\[...\]
,然后用 替换每个出现的$...$
。\(...\)
正如 Seamus 指出的那样,当您使用替代数学模式构造时,它会中断,并且正如 OP 指出的那样,$
评论中的不平衡 也会中断它。处理诸如此类的事情\text
将极其困难。我认为您几乎必须实现一半的 TeX 编译器才能涵盖这些情况。
答案2
答案3
如果你的编辑器有很好的正则表达式支持,那么你可以很容易地用它来替换$...$
(\(...\)
和$$...$$
)/
以下是如何匹配$...$
/\s\$(.|\n)+?\$/g
类似地,匹配$$...$$
:
/\s\$\$(.|\n)+?\$\$/g
这将无法匹配美元符号,因为它们必须用转义符转义,\$
而上述模式要求美元符号前有任何空白字符(空格、制表符或换行符)。您可以看到一个很好的可视化效果这里和这里分别。
该组合+?
会执行您通常期望的操作+
(即匹配前一个字符的一个或多个实例),但会将?
行为从贪婪修改为惰性。不同之处在于贪婪方法将找到最长的匹配字符串,而惰性方法将匹配最小的字符串。下面这个例子可能最清楚:
Input string: | Greedy match: | Lazy match:
$lorem$ipsum$dolor$ | $lorem$ipsum$dolor$ | $lorem$, $dolor$
如果您的编辑器支持s
Perl 的标志,那么您可以简化(.|\n)+?
为.+?
就像.
匹配新行一样。
最后,将其与替换结合起来,你会得到:
s/(\s)\$(.+?)\$/\1\(\2\)/sg
请注意,我没有转义某些字符,因为这将取决于正则表达式的特定实现。特别是,组括号可能需要\(...\)
,并且替换中的+
和?
反斜杠可能也需要转义,具体取决于您使用的正则表达式实现。
如果您在命令行中并且有 Perl,那么以下两个命令应该可以解决问题:
perl -077pi.bak -e 's/(\s)\$\$(.+?)\$\$/\1\\[\2\\]/sg' document.tex
perl -077pi.bak -e 's/(\s)\$(.+?)\$/\1\\(\2\\)/sg' document.tex
请注意,这将不是匹配文件最开始的任何内容;不过,我认为这不会是一个大问题,因为文件的开头通常是一个注释,或者至少是\documentclass
。
答案4
迈克尔·夏普开发了一个python
名为“dedollar”的脚本。包含该脚本、Apple Script 和文档的存档可在以下位置找到:
https://mjsharpe.github.io/tex-software/Files/dedollar.zip
据作者介绍,该软件的版本为 1.0,发布于低功率激光功率放大器。
引用手册:
这是一个
python
脚本,其目的是将.tex
使用$..$
内联数学和$$..$$
显示数学的文件转换为相应的形式\(..\)
。\[..\]
很可能有更强大的程序可以做到这一点,但我找不到。
一些注意事项:
- 没有任何程序能够处理任意
.tex
文件——有太多巧妙的技巧(和聪明的人)让它无法预料。- 此程序处理逐字设置
verb
、verbatim
和。添加其他此类Verbatim
环境lstlisting
并不困难。- 假设环境
verbatim
、Verbatim
和lstlisting
不在它们开始的同一行上结束,并且在任何一行上只有一个这样的环境开始。- 它唯一能理解的注释是那些跟在未转义的 后面的注释
%
。其他注释环境(如 comment 和 原语)则不会被处理,如果它们包含的内容扰乱了或 的\iffalse..\fi
奇偶校验,则会导致问题。$
$$
- 该程序尚不适用于除 8 位 ascii 扩展之外的编码。
注意:$
用于计算图片坐标的 (感谢calc
库)TikZ
不应被 替换\(...\)
。但是,本页提供的所有解决方案都弄乱了以下示例:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw (0, 0) node (y1) {$\bullet$};
\draw [->] (y1) to ($(y1)-(3, 0)$);
\end{tikzpicture}
\end{document}
这可能说明了夏普的观点,即
没有任何程序能够处理任意
.tex
文件——有太多巧妙的技巧(和聪明的人)让它无法预料。