【问题标题】:Transform a tex source so that all macros are replaced by their definition转换 tex 源,以便所有宏都被它们的定义替换
【发布时间】:2011-01-28 14:12:33
【问题描述】:

是否可以看到 TeX “预处理器”的输出,即。 e.实际输出完成之前的中间步骤,但所有用户定义的宏都被替换,只剩下 TeX 原语的一个子集?

还是没有这样的中间步骤?

【问题讨论】:

    标签: latex tex


    【解决方案1】:

    \edef\xxx{Any text with any commands. For example, $\phantom x$.}
    

    然后在日志文件中输出

    \show\xxx
    

    或用于文档中的输出

    \meaning\xxx
    

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      TeX 内置了很多差异追踪工具,包括追踪宏扩展。这仅在实际扩展时跟踪实时宏,但它仍然非常有用。 The TeXbook 以及其他地方的详细信息。

      当我尝试调试宏问题时,我通常只使用 锤子:

      \tracingall\tracingonline
      

      然后我在输出或 .log 文件中挖掘我想知道的内容。

      【讨论】:

      • 根据this answer\tracingonline需要一个参数。 (但\tracingall 应该已经涵盖了所有内容,不是吗?)
      【解决方案4】:

      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}
      • 在这种情况下是的,但在实际使用中,我们可以为 \demo 定义多个定义,并且在多个地方使用它。我的意思是每个宏都没有固定的替换文本,所以你不能只用它们的代码替换东西。当然,如果它们是宏,TeX 本身确实会替换它们,但不是“一次性”:每个标记都会根据需要进行检查。
      【解决方案5】:

      在 tex.SE 的 this questionthis question 上有很多关于这个问题的讨论。但我会借此机会指出,最好的答案 (IMO) 是使用 de-macro 程序,这是 TeXLive 附带的一个 python 脚本。它非常有能力,可以处理参数以及简单的替换。

      要使用它,请将要扩展的宏移动到 <something>-private.sty 文件中,并使用 \usepackage{<something>-private} 将其包含到您的文档中,然后运行 ​​de-macro <mydocument>。它会输出<mydocument>-private.tex,这与您原来的相同,但您的私有宏被它们更基本的东西所取代。

      【讨论】:

        猜你喜欢
        • 2019-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-11
        • 1970-01-01
        • 1970-01-01
        • 2018-08-08
        相关资源
        最近更新 更多