我正在尝试使用 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 函数编写。