将带有空格的扩展宏写入文件

将带有空格的扩展宏写入文件

我正在尝试将扩展的宏写入文件,并且不让扩展占用其后面的空间。

我可以{}用显式的 替换空组\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

相关内容