TikZ 的 AucTeX 扩展

TikZ 的 AucTeX 扩展

是否有支持 TikZ 语法的 AucTeX 扩展以及 tkz-collection 之一?

我特别想要这样的想法:

  • 语法高亮
  • 适当的缩进
  • TeX-insert-macro 知道 TikZ (tkz) 命令和选项(也许最好有一个新的 emacs 宏,如 tikz-insert-macro,因为 TikZ 命令没有前导反斜杠)

答案1

更新,11/10/11:我已将代码发布在https://github.com/blerner/auc-tikz-- 最新版本是auc-tikz-struct.el(其他文件是较旧的实验版本)。我有一段时间没有时间更新代码了,所以如果有人想修改代码,那就去做吧!它仍然很粗糙,但如果你想尝试一下,它应该可以工作。

原始答案

根据@egreg 的要求,将评论转化为答案,并详细说明这个前景的棘手之处:我尝试编写一个 AUCTeX TikZ 突出显示插件来解决您问题中的第一个要点,尽管自从我发表评论以来,我没有太多时间去研究它。为 emacs 的任何部分编写语法突出显示模式(又名“字体锁定”模式或“字体化”)的挑战在于 emacs 使用正则表达式来匹配文本。TikZ 的语法... 不是规则的。特别是,这些key=value部分是递归的,因为您可能有key={key=value,key=value},如

\tikzset{foo/.style={draw,circle,etc...},
         bar/.style={blue,etc...}}

虽然 elisp 的正则表达式确实允许您进行反向引用(因此不是真正的正则表达式),但 font-lock 不允许您引用递归匹配的子组,因此您无法获得所需的 font-lock 行为。我尝试了几种可能的方法:

  • 因此我开始使用一种更强大的方法,使用 Toby Cubitt 的自动覆盖包(也是包的作者cleveref)。按照这个包的说法,覆盖层类似于用<span>HTML 标记一段文本,因此您可以将样式挂接到它上面。我不完全理解自动覆盖层如何发挥其魔力,但它允许您根据匹配器函数动态创建覆盖层,并且当文本不再匹配时,它会负责删除它们。至少在理论上是这样的,如果我正确使用它的话 :) 在给作者发送电子邮件后,他建议我避免使用这种方法,因为过多的覆盖会导致 emacs 的性能下降。

  • 有一个非常在字体锁定期间触发任意函数的扭曲方式,然后可用于手动将属性分配'font给文本的延伸。诀窍是使用所谓的“锚定匹配”,它允许您定义一些代替默认字体突出显示的函数。但这会导致无限循环,因为字体锁定在多行匹配中非常脆弱。

  • 似乎有效的方法是劫持 AUCTeX 对字体锁定机制的劫持,在 AUCTeX 完成后,再回头检查是否存在环境tikzpicture,如果有,则手动为其分配字体锁定突出显示。 emacs 一次只重新突出显示缓冲区的块,因此我的代码可以正确突出显示 TikZ 代码,但直到页面完全刷新后才会显示颜色,这仍然存在一个微妙的错误。

结果是,我正在开发一个名为的新包auc-tikz.el,它构建了一些突出显示函数,这些函数与 TikZ 部分语法key=value(包括递归部分)正确匹配,并且硬编码识别命令\tikzset作为创建自动叠加的触发器。在我当前的配色方案中,它看起来像这样:

拍卖行

/Key/paths/.command与最后的(如)分开识别iface/.style,这样您就可以看到哪些设置是简单名称 ( draw,fill=blue!20) 以及哪些是元名称 ( iface/.style)。当括号界定 TikZ 选项组 ( iface/.style={...}) 时,括号是紫色的,但当它们是值的一部分时,括号是浅蓝色的mark=at position...{...}。大多数注释都受支持,但它们可能仍有一些不直观的行为。未知命令是红色的,从第一个解析错误到下一个未注释的分号。

\node\path和 (以及任何其他)命令\draw无法正确解析,特别是并非所有位置都[options]可以散布在这些命令中。所有各种坐标形式都无法正确解析;我目前支持 (coord)、++(coord) 和 (coord)+(coord)。其他形式,如($(coord)!calc!(coord)$),尚不受支持。(它们有点工作正常,因为解析器只是寻找一个平衡的括号组;如果你省略了结尾的$,它会错误地突出显示为正确...)

剩下要做的就是识别通用的 TikZ\macro ... ;语法,并正确刷新高亮。并支持嵌套环境,如pgfonlayerscope等。并大大加快代码速度;即使是解析较小的 ,速度也很慢tikzpicture

相关内容