确定lualatex中的组嵌套级别

确定lualatex中的组嵌套级别

是否可以准确地确定 lualatex 中的组嵌套级别(无需创建解析器,而是让 lualatex 决定)?

到目前为止,我可以轻松地将源代码行号映射到 pdf 页面。这使我能够将 tex 代码与生成的页面关联起来,这最终将有助于缓存。

问题是我无法任意将源代码分成块,因为某些代码(例如宏)可能跨越多个块,这会破坏缓存机制。

实现此目的的一种黑客方法是简单地解析源代码并测试分组标记({ 和 })并简单地保留计数({ = 1 和 } = -1)。当计数为 0 时,我们处于最外层,这就是我所需要的。

这种方法的问题在于它不够健壮(必须处理 {, } 环境,因为它们实际上是群组、宏对齐、动词等)。

关键是,当我将源代码拆分成块时,我必须以允许缓存成为有效 tex 代码的方式拆分它们。我不能将宏或环境(如表)拆分成两个块并缓存一个而不缓存另一个,因为另一个不会编译(例如,它将像\include{}...\end{array}并且\include具有\begin{array}

因此,了解事物何时处于组或环境中至关重要。我不想编写一个完整的 tex 解析器,而是想让引擎以某种方式通知我它何时处于某个组内。基本上,当可以安全地将文本文件拆分为可以假设编译为单个 tex 文件的块时。

我只是指\begin{document}和之间的内容\end{document},并且可以做出某些假设,例如,除非通过调用其他宏(但不在源中),否则不会在文档环境内定义任何命令。

如果在进入组时有一个回调函数那就太理想了,但我还没有找到这样的回调函数。

为了更好地理解这一点:每个源 tex 文件在其文档环境中都有自然分割点。这些自然分割点将源代码划分为可以自行编译的代码范围/块。对于每个块,如果从源代码中删除每个其他块,代码仍然可以编译。通过了解这些块(分割点),可以轻松地缓存它们而不会出现任何问题(在某些极端情况下可能不起作用,但大多数代码都可以正常工作)。

这些分割点将由文档环境中的组和宏调用来定义(普通文本在每个标记处都有一个分割点)以及可能还有其他我不知道或在 tex 文件中很少发现的东西。

一个例子

\begin{document}
This is a test
\textcolor{afjkdlslf}
This is more stuff...
\end{document}

在环境中除了跨越线之外的任何地方都有分裂点\textcolor{...}(尽管如果我们知道\textcolor{<x><y>} = \textcolor{<x>}\textcolor{<y>}我们可以使用它在参数中的每个字母处创建分裂点,但我不知道如何轻松做到这一点)。

因此,将文档拆分成如下内容

\begin{document}
test
\textcolor{afjkd
\end{document}

导致文件无效,因此该块无效(因为它将文本颜色宏一分为二且只保留一半)

lualatex 中有任何类似的东西吗?或者我必须接受一种低劣的黑客方法?

答案1

您可以使用参数检查当前的群组级别\currentgrouplevel

\noindent
(start) \the\currentgrouplevel\hfill\break
(open brace) {\the\currentgrouplevel\hfill\break
(open brace) {\the\currentgrouplevel\hfill\break
(closed brace) }\the\currentgrouplevel\hfill\break
(begingroup) \begingroup\the\currentgrouplevel\hfill\break
(open brace) {\the\currentgrouplevel\hfill\break
(closed brace) }\the\currentgrouplevel\hfill\break
(endgroup) \endgroup\the\currentgrouplevel\hfill\break
(closed brace) }\the\currentgrouplevel\hfill\break
(end)

\bye

在此处输入图片描述

还有\currentgrouptype显示当前组的类型(图片来自 e-TeX 手册):

在此处输入图片描述

请参阅LuaTeX 0.95 手册中的第 9.3.3 节,了解该参数的内部名称是tex.currentgrouplevel

相关内容