列出(运行时)当前定义的宏

列出(运行时)当前定义的宏

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(它是图灵完备的)。

相关内容