\read: 尾随空格被删除

\read: 尾随空格被删除

我正在尝试使用 LaTeX 复制一个(二进制)文件(主要是为了这个目的),但是当我读一行时,尾随空格被删除了。

MWE 基于这个 TeX.SX 答案

\edef\infile{infile}
\edef\outfile{outfile}

\newread\in%
\openin\in=\infile%
\newwrite\out%
\immediate\openout\out\outfile%

\endlinechar-1%
\loop\unless\ifeof\in%
\readline\in to\l%
\immediate\write\out{\l}%
\message{copied line : \l}
\repeat%
\immediate\closeout\out%
\closein\in%
\endlinechar13%

\documentclass{article}
\begin{document}
\end{document}

infile文件由一行组成,并且有三个尾随空格:

$ cat infile
abc   def   
$ tr ' ' '_' < infile
abc___def___

outfile运行上述代码后,文件缺少以下空格:

$ latex copy.tex
...
$ cat outfile
abc   def
$ tr ' ' '_' < outfile
abc___def

当然有一种方法可以实现这一点,我猜是通过改变一些 catcodes,但我尝试添加一些\catcode` =11(带有反引号)或\catcode` = 9,但尾随空格仍然不存在outfile

答案1

TeXbook,第 46 页(第三个双重危险弯道):

TeX 会删除输入行右端出现的任何 ⟨space⟩ 字符(编号 32)。然后,它会在行的右端插入一个 ⟨return⟩ 字符(编号 13),但它不会在错误恢复期间用“I”插入的行尾放置任何其他内容。请注意,⟨return⟩ 被视为行中实际存在的字符;您可以通过更改其 catcode 来获得特殊效果。

然而在第 48 页上

每行末尾插入的特殊字符不一定是 ⟨return⟩;TeX 实际上插入了一个名为 的整数参数的当前值\endlinechar,该值通常等于 13,但可以像任何其他参数一样更改。如果 的值为\endlinechar负数或大于 255,则不会附加任何字符,效果就像每行都以 结尾%(即以注释字符结尾)。

看来你运气不好。空格字符的删除与它们的类别代码无关。

答案2

读取二进制文件

正如 egreg 所解释的那样,行尾的空格会丢失,并且行尾标记也是未知的,因为它已被 TeX 替换,由 进行配置\endlinechar

在pdfTeX中\pdffiledump可以用来读取二进制文件:

\pdfunescapehex{\pdffiledump offset 0 length \pdffilesize{test.file}{test.file}}

或者支持 LuaTeX:

\usepackage{pdftexcmds}% or \input pdftexcmds.sty\relax
\makeatletter % or \catcode`\@=11\relax
\pdf@unescapehex{\pdf@filedump{0}{\pdf@filesize{test.file}}{test.file}}

写入二进制文件

  • 根据 TeX 编译器和选项设置,写入的输出可能会有所不同。字节可能会被替换或以 -notation 输出^^

  • 只能写入行。至少文件的最后一个字节是行尾标记,具体取决于 TeX 编译器和操作系统。

因此二进制文件只能由 LuaTeX 使用 Lua 函数编写。

相关内容