TeX 当然随时都知道定义了哪些控制字和符号。是否可以访问这些信息,例如在运行结束时?
编辑:pdfTeX 的答案是否定的,因为控制序列名称列表仅存储在字符串池中,无法从 TeX 运行中访问。XeTeX 的答案目前是肯定的,因为有一个错误(请参阅我的答案)。LuaTeX 中的答案可能是肯定的,但如果有一个实际的实现就太好了。
因此,我必须按照不同的方式执行我的计划(对于这一点,该cmdtrack
软件包应该会有所帮助)。
我想使用宏列表本质上是这个问题:扩展 LaTeXsource 中的一些宏。
答案1
这命令轨道包尝试跟踪已定义的命令(以便告诉您是否以及在何处使用定义的命令)。也许您可以从其方法中获得一些启发。
答案2
虽然告诉我这是不可能的答案是正确的,但是 XeTeX 中恰好有一个错误(似乎在开发分支中已修复),这让我们可以访问 XeTeX 已知的所有字符串,特别是控制序列名称。当然,此代码不适合严肃使用。它错过了所有单字母控制序列,XeTeX 对它们的区别是怎样处理的。因此,为了避免用辅助程序污染字符串池,我在一个组内使用单字母辅助程序。 \l
递增\count0
并使用\lowercase
它来构建一个具有 BMP 之外的字符代码的字母(XeTeX 目前对此有错误)。然后从含义中\s
删除以获取字符串,然后我们用测试该字符串是否对应于控制序列(它也可以是错误消息、路径等)。当遇到时我们停止,这标志着分配的字符串的结束(如果要多次使用,则应调整该代码)。the letter
\ifcsname
\selfreferencingmacro
\begingroup
\edef\selfreferencingmacro{\detokenize{selfreferencingmacro}}
\def\s#1 #2 {}
\def\l{\advance\count0 1\lccode`a\count0
\lowercase{\edef\x{\expandafter\s\meaning a}}%
\ifx \x \selfreferencingmacro \else
\ifcsname\x\endcsname \immediate\write16{\x}\fi
\expandafter \l
\fi
}
\count0="FFFF
\l
\endgroup
\bye
答案3
您的目的是从文件中删除用户定义的宏,并用其定义替换它们,以供独立发布吗?
也许有更简单的方法可以做到这一点。不过我猜你总是可以疯狂地用 TeX 重新实现 TeX(它是图灵完备的)。