使用 \write 命令后留空格

使用 \write 命令后留空格

我还没有看到这个问题,如果有的话请纠正我。

这不是在命令后添加空格的常见问题。更具体地说,这是在写入文件时出现的问题。出于某种原因,使用该\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.}

相关内容