在提出的许多问题中,人们建议对编写的 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-newline
AUCTeX 提供的 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。