我正在寻找一个语法检查工具,即可以检查诸如“two dog”或“a books”之类的错误的工具。它必须在 Linux(Ubuntu)上运行。此外,由于我使用宏来生成一些散文,因此它必须以某种方式与 LaTeX 配合使用。我不认为此类检查器能够识别 LaTeX,因此它必须与某些 LaTeX 编译产品配合使用:DVI 或 PDF。
如果您建议使用检查纯文本的语法检查器,请解释如何提取文本。catdvi 做得很好,但它留下了一些垃圾,比如页码。
答案1
语言工具是一款非常不错的独立 Java 语法检查器。但是,它只能处理纯文本。因此,我需要将我的 LaTeX 文档转换为尽可能简单的文本文档 - 这不是一项简单的任务。我使用以下技巧成功做到了这一点:
- 我使用 floats 包和 H 选项安排所有浮动元素保持其位置。这是必需的,这样字幕在转换为纯文本时就不会破坏段落。
- 我使用 nopageno 包删除了行号。
- 我使用 sed 脚本进行了一些更精细的调整,例如在部分名称和描述标签中添加句点。我没有在这里发布该脚本,因为它确实特定于我自己的风格和惯例。
- 经过这个预处理后,我编译为 DVI 并运行
catdvi -s
。 - 我使用了另一个简单的 sed 脚本来删除空行和分页符。最终结果是对 LaTeX 文档进行了合理的文本转换,LanguageTool 可以对其进行处理。
仍然存在一些遗留的烦恼,例如内联程序列表,语法检查器无法理解,但总的来说,我从中获得了不错的自动校对功能:)
答案2
我编写了一个用于检查 TeX 文档的语法检查器,名为利喜树碱。它还可以在线用作Web 应用程序。
它可以使用 LanguageTool 作为后端。与直接使用 LanguageTool 相比,它的主要优势在于:(1) 它过滤 TeX 以避免 LanguageTool 尝试将 TeX 命令解释为英语而产生误报;(2) 它有数百条自己的规则,包括特定于 TeX 的规则。例如,它知道“ See \ref{lem:foo}
”实际上应该是“ See Lemma \ref{lem:foo}
”。(此外,如果您使用莱克斯,LyX-GC显然具有能够与LyX集成的优势。)
LyX-GC 实际上只支持英语(尽管 git 存储库中有实验性的法语支持)。
答案3
我刚刚编写了一个新工具,用于直接在 LaTeX 文件中检查拼写和语法,名为特克提多特:
https://sylvainhalle.github.io/textidote
该程序可以从文件中删除标记并将其发送到语言工具库,该库对十几种语言的拼写和语法进行验证。TeXtidote 的独特之处在于它会跟踪原始文本和“干净”文本之间的单词相对位置。这意味着它可以将语言工具中的消息直接翻译回源文件中的正确位置。默认情况下,TeXtidote 会生成一个 HTML 报告,其中显示原始源,语言工具发现的错误会突出显示在正确的位置:
该工具免费且易于安装(独立于操作系统,需要 Java)。我鼓励您尝试一下并告诉我您的想法!(有关下载/安装/使用的更多信息,请参阅 GitHub 存储库的 Readme 页面;单击网站上的“下载”按钮即可到达那里。)
答案4
基于 VIM 的解决方案
介绍
语言工具在拼写和语法检查方面,它是开源社区的福音。作为额外福利,它是一个独立于平台的 Java (.jar) 应用程序。请注意,它还不完美,但它绝对可用,并填补了存在已久的空白。它正在积极开发中,我真诚地希望有一天它能成为有史以来最好的工具。
首先,任何语法检查解决方案都不可避免地会使用 LanguageTool。这几乎是不可避免的——即使是付费的商业实用程序也无法为您提供 LanguageTool 提供的灵活性和集成性。现在考虑到这一事实,问题简化为:
如何在 X 平台上使用 LanguageTool 处理 Y 类型的文档?
我现在将开始回答这个问题VIM平台(Latex 文档只是一种特殊情况)。就 Linux 操作系统而言,这是一个典型案例。
基本设置
总而言之,截至 2017 年 2 月,我发现三个可用的解决方案是三个插件。我通常推荐 Vundle 插件管理器,其包含在 .vimrc 中的简单语法是:(同时拥有所有三个插件没有坏处。每个插件的后续设置在本文的其余部分中提到。)
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'dpelle/vim-LanguageTool'
Plugin 'rhysd/vim-grammarous'
Plugin 'vim-syntastic/syntastic'
call vundle#end()
然后从 vim 内部一次性发出一对命令:
:so $MYVIMRC
:VundleInstall
您还需要将 LanguageTool 主 java (.jar) 应用程序安装到~/LanguageTool/
。您可以使用以下内容:
>> mkdir -p ~/LanguageTool
>> cd ~/LanguageTool
>> wget https://www.languagetool.org/download/LanguageTool-3.6.zip -O LT.zip
>> unzip LT.zip
主要解决方案
1.插件:vim 语言工具
作为最早的LanguageTool插件,除了导航有些不舒服之外,它的性能令人印象深刻。
链接桌面上的 LanguageTool 应用程序时需要注意一点。在您的命令中包含以下行.vimrc
并重新启动 vim(您:so $MYVIMRC
也可以)。
let g:languagetool_jar='~/LanguageTool/languagetool-commandline.jar'
一切就绪,您只需使用命令启动拼写/语法检查会话:LanguageToolCheck
并使用结束会话即可:LanguageToolReset
。您在两者之间执行的操作是关键,并且您使用两个命令:lnext
:lprevious
在错误之间导航。您可以重新映射它们.vimrc
以获得更好的舒适度,例如
nmap gn :lnext<CR>
nmap gp :lprevious<CR>
实际上,您可以稍微聪明一点,尝试仅在LanguageToolCheck
处于活动状态时使用这些地图。并nunmap
在发出时立即使用它们LanguageToolReset
。(我发现别名 LTC 和 LTR 很好,发出这些额外的 nmap/nunmap 命令)
您还可以使用 vim 命令更改每种错误类型的颜色(例如,语法错误用绿色表示,拼写错误用红色表示),例如:hi LanguageToolGrammarError guibg=peru guifg=wheat
。错误类型的完整列表可在 中找到:h LanguageTool
。
2.插件:vim 语法
这实际上是上述方法的一个不错的替代方案。它在第一次调用时会自动为自己安装 languagetool java 应用程序,因此安装过程更快、更简单。
直接进入用法,除了多几个命令外,它与上面的用法非常相似。用于:GrammarousCheck
开始和:GrammarousReset
结束拼写/语法检查会话。主要任务介于两者之间,使用打开的小窗口执行,该窗口会解释文件中的错误。这个新窗口很特别,您可以使用命令、、f
和进行导航。n
p
?
我个人更喜欢一些重新映射如下所述,以便更舒适地使用。
let g:grammarous#hooks = {}
function! g:grammarous#hooks.on_check(errs) abort
nmap <buffer>gn <Plug>(grammarous-move-to-next-error)
nmap <buffer>gp <Plug>(grammarous-move-to-previous-error)
nmap <buffer>gr <Plug>(grammarous-move-to-info-window)r
nmap <buffer>gas f <Plug>(grammarous-move-to-info-window)f
nmap <buffer>gR <Plug>(grammarous-move-to-info-window)R
endfunction
function! g:grammarous#hooks.on_reset(errs) abort
nunmap <buffer>gn
nunmap <buffer>gp
nunmap <buffer>gr
nunmap <buffer>gf
nunmap <buffer>gR
endfunction
上述示例出现在您的程序中时,.vimrc
将创建五个方便的附加正常模式命令,即gn
(下一个错误)、gp
(上一个错误)、gr
(忽略错误)、gf
(使用建议的更正自动修复)、gR
(使用相同规则忽略所有错误)。这些命令仅适用于当前缓冲区,并且仅在:GrammarousCheck
处于活动状态时可用,使用后将立即消失:GrammarousReset
。
3.Python包装器:语言检查与 vim 结合句法插入
注意:上述操作过程中应该已经安装了 synastic基本设置三个插件的步骤。
如果你已经在 vim 上安装了臭名昭著的 Syntastic 插件,并且在 Linux 上安装了 Python,那么这是一个有趣且最简单的解决方案。你所要做的就是安装 python-wrapper语言检查使用终端命令:
>> pip install --upgrade language-check
并将以下两行添加到.vimrc
。
let g:syntastic_text_checkers = ['language_check']
let g:syntastic_tex_checkers = ["lacheck", "chktex", "text/language_check"]
let g:syntastic_text_language_check_args = '--language=en-GB'
let g:syntastic_tex_language_check_args = '--language=en-GB'
:w
警告:默认情况下,此设置在每次使用保存/写入命令时都会检查拼写,因此减慢速度。您可以使用下面的行来禁用此写入时检查.vimrc
。但请注意,这意味着您将自己手动检查语法。
let g:syntastic_check_on_wq = 0
一切就绪后,您只需使用两个命令:SyntasticCheck
和:SyntasticReset
分别启动和结束会话即可。这里您不需要任何其他命令,因为当您将光标移动到特定位置时,特殊界面会在状态栏上突出显示并解释出现的问题。
如果遇到任何问题,您可能首先需要验证文件类型是否被正确检测到,tex
或者text
使用以下命令:
:SyntasticInfo