是否有一个工具可以将“正常书写”的 TeX 源转换为每个句子末尾都有换行符的源?

是否有一个工具可以将“正常书写”的 TeX 源转换为每个句子末尾都有换行符的源?

在提出的许多问题中,人们建议对编写的 LaTeX 文档使用控制版本控制,尤其是对于大型文档,例如论文。

这样做的问题是,为了让传统的控制版本控制diff发挥作用,必须将句子分成几行。否则,diff无法真正了解文档中发生了哪些变化,事情很快就会变得混乱。

我计划让所有新文档都遵循“每句换行”格式。但我想开始对我的一些现有(和大型)文档使用控制版本控制。

我想知道是否有一个工具可以将.tex文件作为输入并输出一个新.tex文件,其中的句子由换行符分隔。我主要对 UNIX 工具感兴趣,但越便携越好。

笔记:不幸的是,问题并不像在每个句号后插入换行符那么简单。例如,当工具在文本中找到“eg”时,它需要足够智能以避免在那里插入换行符。或者,这更像是一个烦恼而不是一个大问题,因为段落中的最后一个字符很可能是一个句号,它需要避免在那里插入额外的换行符。也许有一个利用 LaTeX 内部机制来识别句子何时真正结束的工具?

答案1

转换旧文档

以下是我对 Emacs Lisp 的看法(Emacs 运行在多种操作系统,所以我认为它真的很便携)。 它不是万无一失的,但可以改进:

(defun mg-split-paragraphs-into-sentences ()
  "Split paragraphs into sentences the current buffer.
Newlines within a sentence are removed."
  (interactive)
  (let ((sentence-end-double-space nil))
    ;; Go to beginning of the buffer.
    (goto-char (point-min))
    (while (null (eobp))
      ;; Move to the end of the next sentence.
      (forward-sentence)
      ;; Skip the white spaces.
      (skip-chars-forward " \t")
      ;; Delete all new lines in the current sentence.
      (save-excursion
    (save-match-data
      (while (re-search-backward
          "\\(\n\\|\r\\)"
          (save-excursion (backward-sentence) (point))
          t)
        (replace-match "" nil nil))))
      ;; Insert a new line if needed.
      (if (null (eq (following-char) ?\n))
      (LaTeX-newline)))))

Emacs 默认双倍句间距(这有助于区分句子结尾和缩写结尾),但可以通过设置为sentence-end-double-space来指示使用单句间距nil。如果您的文档使用双句间距,请将

(sentence-end-double-space nil)

进入

(sentence-end-double-space t)

该函数使用LaTeX-newlineAUCTeX 提供的 LaTeX 注释感知函数来插入换行符。如果您不使用 AUCTeX 替换

(LaTeX-newline)

(newline)

newline不支持 LaTeX 注释。您可以使用 运行该函数M-x mg-split-paragraphs-into-sentences RET

撰写新文档时自动在句子后插入换行符

正如我在评论中所建议的那样,对于新文档,可以将空格键绑定到检查句子是否结束的函数。

(eval-after-load "latex"
  '(progn
     (define-key LaTeX-mode-map " "
       (lambda ()
     (interactive)
     (if
         (save-match-data
           (save-excursion
         (re-search-backward (concat (sentence-end) "\\=")
                     (save-excursion (beginning-of-line)) t)))
         (LaTeX-newline)
       (insert " "))))))

如果需要在句点后插入空格,可以使用C-q SPC

相关内容