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... 内联命令中断行的主要内容,如果未能解决你的问题,请参考以下文章