我正在编写一个工具来简化一些排版工作,但我无法区分普通 Tex 和 ConTeXt。
LaTeX 很容易通过命令识别\documentclass
(或\documentstyle
对于旧文档),但是我很难找到“确凿证据”来区分 ConTeXt 源和普通 TeX 源。
看起来这\starttext . . . \stoptext
对在 ConTeXt 中很常见,但不能保证。有没有更好的,或者更好的组合?
我知道由于 TeX 的特性,编写一个过滤器来达到 100% 准确的效果是不可能的,但是 90-95% 的准确率仍然会有很大帮助。
答案1
任何\start...
足够好如果您不关心老式的 AMSTeX 文件,则将某些内容标识为 ConTeXt 而不是 Plain。
如果您想要完整的命令,ConTeXt 中有相当多的顶级文档分隔符:
常用的文档分隔符
\starttext
— 加载 bodyfont 并进行所有常规设置,谢谢\startdocument
— 用于参数化文档。请参阅摘要作者列表。
特殊页面环境
这些会创建单独的页面,但当然这样的页面可能构成整个文档
\startTEXpage
— 与其所包含的 TeX 输出完全匹配的页面\startMPpage
— 与其包含的 MetaPost 图形完全匹配的页面
部分项目系统
\startcomponent
— (可重复使用的)产品元素\startproduct
— 一个产品包含多个组件\startenvironment
— 设置和定义\startproject
— 将产品和组件链接到合适的环境
其他辅助文件
\startmodule
— 模块和环境其实是一样的。不过,一般来说,环境是这样写的特别指定,而模块被编写出来是为了被(其他人)重复使用。\startxmlsetups
— ConTeXt 可以将 XML 作为输入,并且可以将一个包含 XML 设置的文件作为输入,该文件可以告诉它如何将 XML 转换为 TeX。
顺便说一句,LaTeX 文档不需要包含{document}
环境。如果在 之前生成任何输出,LaTeX 将生成错误\begin{document}
,而 Context 不会;但是,当然,没有输出的文档仍然有效(编译时没有错误)。如果您使用 访问原始命令\end
,\makeatletter\@@end
则可以结束文档而不必求助于 LaTeX 的\end{document}
。
查尔斯的笔记我制作了这个 CW,因为到目前为止,它包含的大部分知识都来自下面的评论。
答案2
值得一提的是,vim 使用以下逻辑来对具有.tex
扩展名的文件进行分类。
- 忽略文件开头所有以注释开头的行。
在接下来的 1000 行中搜索以下模式:
let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>' let cpat = 'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>'
如果文件包含任一模式,则使用 LaTeX 或 ConTeXt 对其进行分类。
- 否则,将其归类为
g:tex_flavor
(默认为纯 TeX,但可以由用户可以覆盖)。
来源:s:FtTex()
function infiletypes.vim