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

时间:2018-04-19 09:57:52

标签: emacs

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

由于我使用Emacs,因此我必须阻止自动填充模式分解这些代码块:例如,使用\textspanish{Soy el结束一行,然后使用hijo de Fernando}开始下一行。当自动填充模式以这种方式打破线条时,导出器会感到困惑。

我尝试创建一个函数来添加为fill-nobreak-predicate的钩子,但我对正则表达式和elips的了解还不够好。这是我得到了多远:

(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 个答案:

答案 0 :(得分:0)

首先,感谢你指出bookmarks.xml。在Emacs的前23年里从未听说过它。

关于你的正则表达式问题,我想提一下函数fill-nobreak-predicate,它接受​​一个字符串列表并构建一个匹配这些字符串的高效正则表达式:

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)命令中使用带花括号的其他命令,这将变得非常毛茸茸。

希望有意义并且有所帮助。