我正在尝试将扩展的宏写入文件,并且不让扩展占用其后面的空间。
我可以{}
用显式的 替换空组\space
,但我希望它相当健壮。这可能吗?
我猜测,由于 TeX 从未进入该过程的布局部分,它不知道如何处理不可扩展的标记,这就是为什么它们会在?{}
期间出现。\write
例子
% tex test.tex
\def \test {Hello}
\openout 0 hello.txt
\write 0 {\test{} World}
\end
hello.txt 的内容
Hello{} World
预期的
Hello World
背景
概括地说,该项目试图将一种注释/交叉引用系统改造为包含许多宏且由许多人编辑的大型文档。
...
\def\proj{Foobar}
\def\rev{1.0}
\def\revstr{\proj{} v\rev}
\def\complicated{...} % essentially a bunch of ifs and concats
... % A bunch of macros scattered throughout
Body of document contains macros like \proj{} and \revstr.
The definitions of these macros are tweaked and modified.
... % A bunch of text with \notes scattered throughout,
% also tweaked/modified, added/removed
\note{Used for callouts to \proj{} and whatever else}
...
目前,注释与文档一起排版,任务是将它们放入文件中以供外部程序处理。在大多数情况下,标注只有文本和宏:没有格式或任何无法用 ASCII 表示的内容。
{}
由于数量庞大并且违背既定的工作流程,手动检查所有要替换的宏\space
似乎是不可能的。
TeX 处理完文件后,后备方案就是对其进行后处理。不过,这似乎是个笨拙的方法,因为 TeX 拥有精简文本所需的所有信息。
也许有一种方法可以假装布局页面,然后将内容从框中剥离出来并放入文件中?
答案1
{}
在写作中使用将产生{}
预期的效果。
你可以使用\space
不清楚为什么你认为正常的 TeX 标记化不适用于这里,因为你期望\test
像正常一样被标记和扩展。如果不是这样,你可以使用
\write20{\noexpand\test zzz}
它将写 \test zzz
但如果你想\test
扩大规模
\write20{\test\space zzz}
是最简单的解决方案,尽管有时还有其他有用的解决方案,例如
\def\zz#1{\write20{\test#1zzz}}\zz{ }
它将放置一个空格标记,而不是\space
将其扩展为一个空格标记放入 的参数中\write
。
你也可以(也可能是你想要的)逐字地将空格标记视为不是普通的 TeX 空格,因此
{\catcode`\ =12\relax% space is a normal punctuation character
\write20{\test zzz}%
}% back to normal