考虑一下这个MWE:
\documentclass{scrartcl}
\usepackage{expl3}
\ExplSyntaxOn
\str_new:N \my_str
\str_set:Nn \my_str {Test}
\cs_new:Nn \my_printer:x { \sys_shell_now:n { echo ~ #1 ~ > ~ output } }
% \my_printer:n {This ~ is ~ a ~ test}
\my_printer:n {\my_str ~ another ~ word}
\begin{document}
MWE
\end{document}
\ExplSyntaxOff
尽管我总是在 的参数的单词之间添加一个显式(非忽略)空格\my_printer:n
,但第二种情况是写入文件Got 'Testanother word'
而不是Got 'Test another word'
写入output
文件。在参数中没有宏的示例中,一切都按预期工作。
如果我在常规 LaTeX 中遇到宏占用空格的情况,我只需将其添加到{}
宏的末尾,确保它不会占用其参数后面的空格。然而,当我尝试这样做时,expl3
括号内的空格实际上被打印为纯字符。
我也尝试明确地使用它\use_str:N
来获取字符串的值,但结果是一样的。
\my_str
为了避免占用以下空间,需要采取什么技巧?
编辑:
事实证明,常规\my_str{}
方法对我的 MWE 来说效果很好,但它在非排版环境中不起作用,例如 shell-escape(在这种情况下,行为正如我所描述的那样)。
编辑2:
调整 MWE 以实际反映我的问题
答案1
\foo word
情况与经典 TeX完全相同 。
您可以使用\foo{} word
或\foo\space word
(或\foo\c_space_tl word
)
请注意,在第一种形式中,它们{}
不会被吸收,而是会生成两个额外的标记。如果是排版,空组不会产生任何影响,但这些标记会显示在\typeout
或 shell 转义符或其他非排版上下文中。
答案2
\xspace
我喜欢从包中添加xspace
所有处理排版的宏。例如:
\newcommand{\arduino}{Arduino\textsuperscript{\tiny\textregistered}\xspace}
\xspace
最后注意