我喜欢 Emacs 中 Auctex/LaTeX 的“格式化段落”功能,但它似乎会移动标记命令。有什么方法可以格式化缓冲区但只格式化其纯文本部分,以便最终像填充段落或格式化区域命令一样,但不触及 LaTeX 命令?
只是为了更清楚一点,如果命令在换行符上,我希望它们不会被弄乱,因此段落内的命令texbf
可以移动。
答案1
我在 Emacs 中编写了一个快速实现该功能的 hack。其思路如下:首先,找到第一个“硬”段落分隔符(即两个换行符)。我相信应该有更好的方法来识别段落,也许通过其他 elisp 函数,但我还没有研究过。该分隔符将限制段落填充的应用范围(fill-paragraph
永远不会超出硬段落)。然后,我们将任何“起始”TeX 命令(\
换行符后面的命令)转换为其自己的段落的起始。这很丑陋,因为它会更改文本,为以新行开头的 TeX 命令插入换行符。
但请注意有时,获得正确的行为是不可能的。例如,如果你保持礼仪,你的台词长度大约为 75 个字符和将以换行符结束。\textbf
例如, 可能偶然在换行符之后开始,但您显然希望它在当前段落内。
这是代码。您可以在 TeX/LaTeX 模式下将其绑定到 Mq:
(defun latex-fill-paragraph ()
(interactive)
(save-excursion
;; Insert a newline before a TeX command starting a line to avoid
;; fill-paragraph to include it in the current paragraph
(let ((end-point
(or
(save-excursion
(re-search-forward "\n\n" (point-max) t))
(point-max))))
(replace-regexp "\n\\\\" "\n\n\\\\" t (point) (- end-point 2))))
(save-excursion
(fill-paragraph)))