LaTeX 中的括号匹配问题

LaTeX 中的括号情况比较复杂,我使用的 doom emacs 自带的 rainbow-delimiters-mode 经常出现问题,大概有一下几种情况:

  1. 尖括号的误识别

image

  1. 不成对括号

image

这样单侧的括号是一个例子,还有一个例子是 physics2 宏包中的狄拉克符号 \ket|\alpha> 这种 |> 的配对。

  1. 括号中的单侧括号

image

这样的写法在写张量的对称和反对称部分时非常常见。

这些问题感觉都不太好解决,但写复杂的长公式时括号检测又很有帮助。

2 个赞

我想这些问题在于 ranibow-demiliter 好像是完全基于 syntax-table 来识别配对括号的,你应该去issue里面提一下,看一下维护者怎么解决。

你确定括号的高亮背景是 rainbow-delimiters-mode 加的吗?

这个高亮不是 show-paren-mode 的吗?

遇到同样问题. 我使用了下面的配置避免尖括号的匹配.

;; Inhibit paring these delimiters
(add-hook 'after-init-hook #'(lambda ()
                                    (modify-syntax-entry ?< ".")))

开关 show-paren-mode 没有改变括号的高亮,关掉 rainbow-delimiters-mode 高亮就没了。 我没有动过这方面的配置,可能是 Doom 改过什么吧。


在 Doom 的代码仓库里搜了一下,没找到对 rainbow-delimiters-mode 的配置修改,而且打开 org 会自动禁用 show-paren-mode

关掉尖括号的匹配确实能解决很多问题,感谢告知了 modify-syntax-entry 这个函数。

但有时候还是会用到尖括号的(比如说期望),而且还有其他的匹配问题。

如果能用正则之类的语法来匹配更复杂的情况就好了,如果只在编辑中的公式里匹配应该用不了多少性能。可惜我对 Elisp 一窍不同,根本不知道如何实现。

应该是 Doom 引入了一些问题,emacs -Q 同时开启 show-paren-moderainbow-delimiters-mode 也不会有那么多奇怪的高亮。

偏个题. 看了一下 phyisics2, 只感觉重新发明了一堆轮子. 并没有比 physics 多出多少东西, 还比 physics 少了很多有用的东西, 文档写得也不好. 感觉健壮性不如 physics, 而且充满了会很快成为 abandonware 的征兆. 建议继续用 physics, 这样期望直接用 \expval{}, 不用尖括号. latex 是排版语言, 在排版语言上无限追求数学可读性是一条邪路. 如果追求数学可读性, 应该用 mathtype 之类所见即所得的东西. 如果你觉得写 latex 的时候看不见数学不方便, 那可以用 org-elp 之类的包预览.

套用我的使用习惯解决一下你的三个问题:

  1. 我也习惯同时使用 rainbow-delimiters-mode 和 show-paren-mode, 但是我的尖括号不会被识别, 可能是因为我的 emacs 是自己从白板配置的. 你用 doom, 那么情况可能就是 doom 加了些奇怪东西, 这个上面已经有人说过了. 用 emacs 到最后, 可能都会从头配置吧, 这样才一切都在自己的掌控中. 当然你可以按照其他人的建议把尖括号识别关了, 然后用 physics 的 \expval{} 做期望即可.

  2. 这可能又是一个 doom 的幺蛾子问题. 我的 emacs 中的 \{ 是不会被识别为需要配对的括号的, 因为这是转义的花括号, 已经不能算是括号了. 但具体到你这个问题, 你的写法不是 best practice. 这里你需要用用 \begin{cases} \end{cases} 环境, 具体看 amsmath 文档 (写数学所有人必用的默认香草包, 你肯定也用了)

  3. 这可能是唯一真正的问题, 我感觉这本质上不是 regexp 可以解决的问题. 我的 emacs 也会报错, 只不过我个人从来遇不上这种不配对括号. 我个人的解决方案是, 当你需要输出 (a 以及 b)这种符号时, 是有意识知道它括号不配对的, 那么你可以写 \lparen a 以及 b \rparen. 这两个 paren 命令并不是 latex 或 amsmath 自带的, 你可以加载 mathtools 包获得这两个命令(也是流行的大包, 用了不亏). 如果你不想为区区两个命令加载一个宏包, 那么自己定义即可:
    \newcommand{\lparen}{(}
    \newcommand{\rparen}{)}
    把这两行写在 preamble 就行.
    你这样自定义的小命令多了后, 完全可以全都放在自己的一个 mystyle.sty 文件里, 放在你的 texmf tree 中, 这样你在 org 里写数学的时候, 一旦想用, 只需要 \usepackage{mystyle} 就可以愉快地使用你的这些小命令了.
    当然如果你要走自定义命令这条路的话, 你完全可以用更简单的语法来输出你的括号, 比如 \lp \rp 这些你就自行发挥了. 你想用配对花括号 \lp{a} 来输出 (a, 这些也可以自己定义

2 个赞