我想在 中使用宏\write18
,但这会导致其后的空格被忽略。以下示例打印foobar
到test.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