【发布时间】:2011-01-28 14:12:33
【问题描述】:
是否可以看到 TeX “预处理器”的输出,即。 e.实际输出完成之前的中间步骤,但所有用户定义的宏都被替换,只剩下 TeX 原语的一个子集?
还是没有这样的中间步骤?
【问题讨论】:
是否可以看到 TeX “预处理器”的输出,即。 e.实际输出完成之前的中间步骤,但所有用户定义的宏都被替换,只剩下 TeX 原语的一个子集?
还是没有这样的中间步骤?
【问题讨论】:
写
\edef\xxx{Any text with any commands. For example, $\phantom x$.}
然后在日志文件中输出
\show\xxx
或用于文档中的输出
\meaning\xxx
【讨论】:
【讨论】:
TeX 内置了很多差异追踪工具,包括追踪宏扩展。这仅在实际扩展时跟踪实时宏,但它仍然非常有用。 The TeXbook 以及其他地方的详细信息。
当我尝试调试宏问题时,我通常只使用 大 锤子:
\tracingall\tracingonline
然后我在输出或 .log 文件中挖掘我想知道的内容。
【讨论】:
\tracingonline需要一个参数。 (但\tracingall 应该已经涵盖了所有内容,不是吗?)
TeX 中没有“预处理器”。任何阶段的任何控制序列的替换文本都可以变化(这用于很多事情!)。例如
\def\demo{\def\demo{cde}}
\demo
将首先以一种方式定义\demo,然后对其进行更改。以同样的方式,您可以重定向 TeX 原语。例如,LaTeX 内核将 \input 移动到一个内部位置并改变它。简化版:
\let\@@input\input
\def\input#1{\@@input#1 }
【讨论】:
\def\demo{\def\demo{cde}}\demo 的计算结果为 \def\demo{\def\demo{cde}}\def\demo{cde},因为在此步骤之后无法进行计算,我们可以删除所有 \def 语句,从而将其减少为 ∅。 — \def\demo{\def\demo{c{\it de}}}\demo\demo 但最终会评估为 c{\it de}。
在 tex.SE 的 this question 和 this question 上有很多关于这个问题的讨论。但我会借此机会指出,最好的答案 (IMO) 是使用 de-macro 程序,这是 TeXLive 附带的一个 python 脚本。它非常有能力,可以处理参数以及简单的替换。
要使用它,请将要扩展的宏移动到 <something>-private.sty 文件中,并使用 \usepackage{<something>-private} 将其包含到您的文档中,然后运行 de-macro <mydocument>。它会输出<mydocument>-private.tex,这与您原来的相同,但您的私有宏被它们更基本的东西所取代。
【讨论】: