一个奇怪的问题引起了我的兴趣(如何生成 Texinfo 源文件的 [La]TeX 表示,假设 Texinfo 源文件会以某种方式在“纯”TeX [大概是\ { }
符号] 宏中产生较低级别的文档),我现在想知道如何将 TeX 食道中宏扩展的副产品重定向到标准输出或控制台或文本文件,然后再将其输入到排字机(“胃”)。我不认为\tracing
* 系列调试控制序列中的任何内容可以完成这项工作,因为我想查看实际的标记流。
我想我可以用一些神秘的 LuaTeX 回调来做到这一点,但我想知道肮脏的 dekTeX 宏(带有\immediate\write
或类似的东西)是否可以解决问题。
例如:如果我们pdfinitex
用以下最小输入进行喂养
\pdfoutput 1
\font\myfont ptmr8y
\myfont
Hi!
\end
我们可能会生成一个非常小的 PDF 文件(带有一些错误)。我假设这些标记直接进入排版机内部,因为没有宏,以生成 PDF 输出。
相反,如果我们pdftex
使用 Plain 格式(可能加载 etex.src 宏)运行,并输入以下输入
Hi!
\bye
我推测排字员至少需要输入以下标记:
\pdfoutput 1
\font\tenrm=cmr10
\tenrm
Hi!
\par \vfill \par \penalty -\@MM \end
如何显示(在控制台上、在辅助文件中、任何东西……)精确的标记流?
也许 dekTeX(及其衍生产品)无法做到这一点;但 LuaTeX 可能有办法。
答案1
看看绎包。它在 TeX 中实现了 TeX,但有一些限制,但它在遵循“普通”TeX 代码的扩展链方面做得非常出色。
在您的示例中,您提到了\pdfoutput=1
和\font\tenrm...
。您根本无法获得这一点,即使使用 LuaTeX 也无法获得,因为这些东西被嵌入到格式中,而格式只是 TeX 内存的转储,然后从磁盘重新加载。
不幸的是,该unravel
包仅适用于 LaTeX。这将生成很多的输出。
\RequirePackage{unravel}
\unravel{
\documentclass{article}
\begin{document}
Hi!
\end{document}
}
答案2
- 是什么副产品扩展的产物是不可扩展的标记和/或可扩展的标记,但其扩展由于某种原因受到抑制。
- 假设一个基于扩展的无限循环。什么时候写入?
- 嘴巴产生令牌。扩张发生在食道中。
- 我不知道在 Knuthian TeX 中拦截到达胃的标记流的方法。
\immediate\write
单独使用并不能解决问题:的“参数”\write
被扩展,但扩展没有被标记所抑制,而扩展应该被抑制。
例如,假设\foo
被定义为收益bar
。
\immediate\write\somewritehandle{\def\foo{rab}}
收益\def bar{rab}
写成似乎不是你想要的。- 以下是当不写入所有到达 TeX 胃中的标记(在 Knuthian-TeX 中不可能写入所有到达 TeX 胃中的标记)而仅写入某些标记(例如 的参数内的标记)时出现的问题
\write
:将一组(不可扩展的)标记写入外部文件不足以确保在读取/处理该文件时进行的标记化产生相同的标记集。- 例如,在写作时
\escapechar
可能会有所改变。例如, (不可扩展的)控制序列标记以前导斜杠而不是前导反斜杠\escapechar=`\x
书写。x
- 例如,
a
类别代码可以是 12(其他)。写入标记序列\a
、b
、c
,<space token>
然后会导致将字符序列\abc<space>
写入文本文件。如果在从文本文件中读取/标记内容时,a
具有通常的类别代码 11(字母),则字符序列将被标记为标记\abc
。<space>
根本没有被标记,因为在标记控制字标记后,TeX 的读取装置的状态设置为 S(=跳过空格)。 - 类别 6(参数)的显式字符标记在写入时会加倍。(通常哈希值 (
#
) 的类别代码为 6。) - 根据 TeX 引擎和 TeX 字符转换的配置,某些字符可能以
^^
-notation 书写。如果在禁用 -notation 的情况下读取/标记结果文件的相应部分^^
,例如,在收集属于命令参数的标记时\verb
,或在收集属于环境“主体”的标记时\begin{verbatim}..\end{verbatim}
,那么 Bob 就不再是你的叔叔了。
- 例如,在写作时