\write 中的宏扩展

\write 中的宏扩展

我想在 中使用宏\write18,但这会导致其后的空格被忽略。以下示例打印foobartest.txt,而我希望它打印foo bar

\documentclass{standalone}
\newcommand*{\foo}{foo}
\begin{document}
\write18{echo \foo bar > test.txt}
\end{document}

我尝试了{\foo}\foo{}和 ,而\foo\不仅仅是\foo,但这些都会将括号和斜线打印到文件中,这不是我想要的。如何才能扩展宏而不引入额外的字符,也不删除空格?

当然,上面的例子是简化的。在我的实际场景中,我无法修改命令\foo,尽管我可以定义一个包装器。

答案1

您想要\space而不是或 而不是括号。 括号是不可扩展的标记,这意味着它们在 中不会被删除\write18是一个不可扩展的原语,这又意味着它不会被删除(或者更确切地说:扩展)在 中\write18\space另一方面,它是一个可扩展的宏,可以扩展到空格。

\documentclass{article}

\begin{document}

\def\foo{foo}
\edef\test{\foo\ bar}
\show\test

\edef\test{\foo{} bar}
\show\test

\edef\test{\foo\space bar}
\show\test

\end{document}

日志条目:

> \test=macro:
->foo\ bar.
l.7 \show\test

> \test=macro:
->foo{} bar.
l.10 \show\test

> \test=macro:
->foo bar.
l.13 \show\test

相关内容