我不确定这个问题是否适合 tex.SE。如果您认为不应该在这里问这样的问题,请表达您的担忧。如有必要,我会在 meta 上提出问题。
为了便于阅读,我喜欢将源文件中的行长保持在 80 个字符左右。Vim 有一个不错的快捷方式gqap
,可以重新排列当前段落以适应 80 个字符,而不会因行太短而浪费空间。它甚至保留了缩进。不幸的是,它认为段落是用空行标记的,并且认为没有被空行分隔的所有内容都在同一段落中。特别是任何方程式(以\[
或开头\begin{...}
)始终被视为段落的一部分并重新排列。
有没有办法让 vim 在这方面更智能地处理 LaTeX 语法?还有其他文本编辑器可以做到这一点吗?
(我知道我可以只突出显示文本然后使用gq
,但如果可能的话,我希望有一个命令来重新排列一个段落,而无需手动标记该段落是什么。)
答案1
我的文件中有以下函数$VIM/ftplugin/context.vim
来格式化 ConTeXt 段落(与 LaTeX 相同:环境包含在\start...
and中\stop...
而不是\begin{...}
and \end{...})。它应该很容易适应 LaTeX(事实上,我认为我最初是从为 LaTeX 编写它的人那里复制而来,并将其改编为 ConTeXt)。
" Reformat lines (getting the spacing correct) {{{
fun! TeX_fmt()
if (getline(".") != "")
let save_cursor = getpos(".")
let op_wrapscan = &wrapscan
set nowrapscan
let par_begin = '^\(%D\)\=\s*\($\|\\start\|\\stop\|\\Start\|\\Stop\|\\\(sub\)*section\>\|\\item\>\|\\NC\>\|\\blank\>\|\\noindent\>\)'
let par_end = '^\(%D\)\=\s*\($\|\\start\|\\stop\|\\Start\|\\Stop\|\\place\|\\\(sub\)*section\>\|\\item\>\|\\NC\>\|\\blank\>\)'
try
exe '?'.par_begin.'?+'
catch /E384/
1
endtry
norm V
try
exe '/'.par_end.'/-'
catch /E385/
$
endtry
norm gq
let &wrapscan = op_wrapscan
call setpos('.', save_cursor)
endif
endfun
nmap Q :call TeX_fmt()<CR>
答案2
我知道对其他答案发表评论是违反政策的,但在这种情况下——考虑到我缺乏直接对相关答案发表评论所需的 50 点声誉——我认为这是值得的。
Aditya 提供的函数完美适用于 LaTeX,但有一个细节除外:通常在开始一个环境或一个部分后,下一行将是 \label{}。原始 TeX_fmt() 函数错误地将此行视为段落的一部分。要解决此问题,请将设置 par_begin 的行修改为:
let par_begin = '^\(%D\)\=\s*\($\|\\label\|\\begin\|\\end\|\\[\|\\]\|\\\(sub\)*section\>\|\\item\>\|\\NC\>\|\\blank\>\|\\noindent\>\)'
基本上,在 \begin 之前添加一个 \label。
利润!!
答案3
以下解决方案仅适用于段落格式,它将根据 LaTeX 样式设置正常工作。
另一个可能的解决方案是设置一个硬包装最多 80 个字符。
http://vimcasts.org/episodes/hard-wrapping-text/
formatoptions
:
t
- 使用 textwidth 自动换行
c
- 使用文本宽度自动换行注释,自动插入当前注释引线。
a
- 自动格式化段落。
以下是一些设置命令:
:set formatoptions=tc
:set fo+=a
:set textwidth=80
提示:使用autocmd
或ftplugin
文件夹根据文件类型自动设置这些设置。运行help: ftplugin
以vim
获取更多信息。
请阅读此处了解有关格式化的更多信息:
答案4
我遇到了同样的问题。这是对我有用的解决方案。我编写了一个外部脚本来处理 latex 文本的格式(https://github.com/elmanuelito/par-latex)。我通常会一次性重新格式化整个文档,但也可以逐段进行。
vim 中的使用示例:
- 选择一些文本(例如
Vj
或ggVG
) - 输入“:!par-latex”(vim 命令行如下所示
'<,'>!par-latex
:) - 输入回车
您可以自定义脚本(它基于一些正则表达式)并在开始时更改一些参数。