我还没有看到这个问题,如果有的话请纠正我。
这不是在命令后添加空格的常见问题。更具体地说,这是在写入文件时出现的问题。出于某种原因,使用该\write
命令时不适用相同的方法。
最小工作示例:
\documentclass{article}
\newcommand\Insert{Insert}
\begin{document}
% write to pdf
\Insert stuff.\par % wrong method
\Insert\ stuff.\par %
\Insert{} stuff.\par % all valid methods
\Insert~stuff.\par %
% open file to write to
\immediate\newwrite\file
\immediate\openout\file=filename.txt
\newcommand\writefile{\immediate\write\file}
% write the same to file
\writefile{\Insert stuff.}
\writefile{\Insert\ stuff.}
\writefile{\Insert{} stuff.}
\writefile{\Insert~stuff.}
% close file
\immediate\closeout\file
\end{document}
输出pdf:
插入东西。
插入东西。
插入东西。
插入东西。插入东西。
输出文件名.txt
Insertstuff.
Insert\ stuff.
Insert{} stuff.
Insert\protect \unhbox \voidb@x \penalty \@M \ {}stuff.
这并不是我所需要的或期望的。
答案1
TeX 忽略控制序列(由字母组成)后的空格和在执行时执行完全扩展\write
。
当您这样做时,它看到的标记\writefile{\Insert stuff.}
是(为了清楚起见,用 • 分隔)
\Insert•s•t•u•f•f•.
还有不空间。扩展给出
Insertstuff
当您放置一对括号时,括号后面的空格不会被忽略(它不遵循控制序列):
\Insert•{•}• •s•t•u•f•f•.
与之\Insert\ stuff
相同:令牌“控制空间”是不可扩展的,因此你得到
Insert\ stuff.
你\Insert~stuff
会输:的完全展开~
并不是你所期望的:它是“打印不间断空格”所必需的一组指令。事实上,LaTeX 必须\protected@write
处理这种在写入过程中不应展开的命令。
正如 zeroth 所解释的那样,扩展\space
是一个空间;但它不是在 之后被忽略\Insert
,因为当 TeX 读取标记时,它还没有看到 的扩展\space
,但是那个标记(毫无疑问它不是空格标记)。
答案2
要在输出文件中写入空格,您需要显式的\space
。因此您只需执行以下操作:
\writefile{\Insert\space stuff.}
答案3
\writefile{\noexpand\Insert stuff.}
或者如果您不需要立即写入:
\protected@write\file{}{\protect\Insert stuff.}