Emacs:防止自动填充模式在乳胶 \text... 内联命令中断行

Posted

技术标签:

【中文标题】Emacs:防止自动填充模式在乳胶 \\text... 内联命令中断行【英文标题】:Emacs: Prevent auto-fill mode breaking lines in latex \text... inline commandsEmacs:防止自动填充模式在乳胶 \text... 内联命令中断行 【发布时间】:2018-04-19 09:57:51 【问题描述】:

latex 包 polyglossia 允许正确排版外语:它提供\text[foreign_language]... 形式的内联命令,例如\textspanishSoy el hijo de Fernando

由于我使用 Emacs,我必须防止自动填充模式破坏这些代码块:例如,以 \textspanishSoy el 结束一行,并以 hijo de Fernando 开始下一行。当自动填充模式以这种方式断行时,导出器会感到困惑。

我尝试创建一个函数以将其作为挂钩添加到fill-nobreak-predicate,但我对正则表达式和省略号的了解还不够好。这是我走了多远:

(defun foreign-language-nobreak-p ()
     (or    (looking-at "[[[:space:]]\|[[:print:]]].*")
            (save-excursion 
              (skip-chars-backward " \t")
              (unless (bolp)
                (backward-char 1)
                (looking-at ".*\\text")))))


(add-hook 'fill-nobreak-predicate #'foreign-language-nobreak-p)

对出了什么问题有任何想法吗?

【问题讨论】:

【参考方案1】:

首先,感谢您指出fill-nobreak-predicate。在我使用 Emacs 的头 23 年中从未听说过它。

关于您的正则表达式问题,我想提一下函数regexp-opt,它接受一个字符串列表并构建一个与这些字符串匹配的有效正则表达式:

(defvar foreign-lang-re
  (regexp-opt
   '("\\textspanish"
     "\\textrussian"
     "\\textfrench")))

如果您将支持的语言分解为另一个变量,您还可以使用循环构建字符串列表,添加\text 和尾部

如果您的启发式算法足够稳定,以至于当当前行某处只有打开命令时您不希望自动填充启动,您可以像这样使用thing-at-point

(defun foreign-language-nobreak-p ()
  (string-match
   foreign-lang-re
   (thing-at-point 'line t)))

当您已经使用 关闭命令时,这不起作用。为了更好地工作,您需要从当前点向后搜索优化的正则表达式,向前搜索右花括号,分别将搜索限制为 (bolp)(eolp)。但是,如果您开始在 \textspanish 命令中使用带有花括号的其他命令,这将变得非常棘手。

希望这是有道理的,并有所帮助。

【讨论】:

我把上面的代码除了 CC-BY-SA 的 *** 默认值之外,也放在 GPLv3 下

以上是关于Emacs:防止自动填充模式在乳胶 \text... 内联命令中断行的主要内容,如果未能解决你的问题,请参考以下文章

Emacs:尝试切换到乳胶模式时出现与 dbus 相关的错误

Emacs 中的长线模式

如何在 Emacs 中禁用自动填充模式?

运行 emacs 时将自动填充模式作为次要模式打开

禁用填写 xml-mode

防止emacs混合制表符和空格?