防止Emacs在TeX内联数学中断线

防止Emacs在TeX内联数学中断线,emacs,auctex,math-mode,Emacs,Auctex,Math Mode,我将Emacs与AUCTeX结合使用,使用$编辑包含大量内联数学的手稿。当自动填充(例如,使用M-q)时,Emacs经常在干扰阅读流畅性的位置(例如,在下标或类似位置)中断这些内联数学环境 有没有一种方法可以告诉Emacs更愿意将整个$…$环境放在一个新行中,如果这样可以防止中断的话?更具体地说,如果在数学上出现突破,整个环境应该转移到一条不应该被打破的新路线 例如: Lorem ipsum dolor sit amet, consectetur adipisici elit, sed $a^2

我将Emacs与AUCTeX结合使用,使用
$
编辑包含大量内联数学的手稿。当自动填充(例如,使用M-q)时,Emacs经常在干扰阅读流畅性的位置(例如,在下标或类似位置)中断这些内联数学环境

有没有一种方法可以告诉Emacs更愿意将整个
$…$
环境放在一个新行中,如果这样可以防止中断的话?更具体地说,如果在数学上出现突破,整个环境应该转移到一条不应该被打破的新路线

例如:

Lorem ipsum dolor sit amet, consectetur adipisici elit, sed $a^2 + b^2 = c^2$ eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.
应该导致

Lorem ipsum dolor sit amet, consectetur adipisici elit, sed
$a^2 + b^2 = c^2$ eiusmod tempor incidunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam.

您可以执行以下操作:

(add-hook 'LaTeX-mode-hook
          (lambda ()
            (add-hook 'fill-nobreak-predicate 'my-latex-fill-nobreak)))
(defun my-latex-fill-nobreak ()
  (save-excursion
    (when (search-backward "$" (- (point) 20) t)
      ;; We found a nearby $.  Now let's see if it's an opening $
      ;; rather than a closing one.  Using font-lock properties is
      ;; a hack, but it might be good enough.  Apparently (texmathp)
      ;; could be a better choice.
      (eq (get-text-property (point) 'face) 'font-latex-math-face))))
然后定义一个函数
my latex fill nobreak
,如果您在一个简短的数学环境中,该函数将返回非零,例如:

(add-hook 'LaTeX-mode-hook
          (lambda ()
            (add-hook 'fill-nobreak-predicate 'my-latex-fill-nobreak)))
(defun my-latex-fill-nobreak ()
  (save-excursion
    (when (search-backward "$" (- (point) 20) t)
      ;; We found a nearby $.  Now let's see if it's an opening $
      ;; rather than a closing one.  Using font-lock properties is
      ;; a hack, but it might be good enough.  Apparently (texmathp)
      ;; could be a better choice.
      (eq (get-text-property (point) 'face) 'font-latex-math-face))))
尝试:


将其放置在
.emacs
中,然后重新启动emacs。

您可以使用
texmathp
检测点是否处于数学模式。我尝试将其添加到~/.emacs中,但似乎没有任何效果。可能是因为regexp搜索中没有引号$。我改为使用非regexp搜索,这可能会解决您的问题。谢谢!很好,它把长长的数学放在自己的线上。但是,这有一个问题,因为它似乎错误地将最后一部分(包括结束部分
$
)放在了下一行。更重要的是,你能解释一下阈值是从哪里来的吗(尝试和错误给了我大约47个,但我不知道这是从哪里来的)。谢谢,很接近了!很好,它收集了分布在多行上的简短数学环境。然而,这样做的代价是,很长的行不能被明确地打断(我的意思是,当按下
M-q
时,明确的打断会被删除)。你知道如何合并这个吗。(虽然这很棘手;我甚至不能用一种简洁的方式更精确地表述。)我不确定我是否理解你所说的“显式中断”是什么意思。如果你只是指你按下
RET
时文本的位置,那么,没有办法将它们与emacs填充函数完成的自动换行区分开来。但是,您可以在一行末尾添加注释符号
%
,以尝试防止该换行符被
M-q
更改。我的意思是,如果长数学(长于一行)已经在一个单独的行上,并且已被(任何人)打断,那么我不想将Emacs后续的行向上拉(即,如果删除换行符会导致换行过长,则不要删除该换行符)。我已经在使用
%
了,但是它不是很方便。我想我理解。但是,使用
fill nobreak谓词
变量似乎不可能实现您想要的。甚至在调用此列表中的函数之前,
m-q
已经将整个段落压缩到一行,从而无法确定是什么在前面的换行符出现之前。感谢您的澄清。可能有不同的解决方案,但不使用
fill nobreak谓词