\write 中的显式回车符

\write 中的显式回车符

是否有可能\write在 LaTeX 中明确显示回车符?

提出这个问题的原因:我有一个工作流程,其中 latex 运行为另一个程序生成输出,该程序需要 CRLF 行尾。我知道我可以使用 unix2dos (或类似工具) 随后转换文件,(或通过 调用它们\write18),但如果我可以在 Linux 系统上生成带有 CRLF 行尾的文件而无需其他工具,那就更优雅了。

答案1

我们可以^^M在参数末尾简单地添加字符\write

\newwrite\w
\immediate\openout\w=test.txt

{\catcode`\^^M=12 %
  \gdef\writecrlf#1#2{\immediate\write#1{#2^^M}}%
}

\writecrlf\w{First line}
\writecrlf\w{Second line}

\bye

该文件的test.txt行尾有 CRLF。

答案2

使用 LuaLaTeX,你可以在书写时切换转义^^。例如

%!TeX LuaLaTeX
\documentclass{article}
\begingroup
  \catcode`\^^M=12\relax%
  \gdef\writewithcrlf#1#2{%
    \directlua{texio.setescape(0)}%
    \write#1{#2^^M}%
    \directlua{texio.setescape(1)}%
  }%
\endgroup
\newwrite\txtfile
\begin{document}
Test:
\openout\txtfile{\jobname.txt}
\writewithcrlf\txtfile{This line ends with CRLF.}
\write\txtfile{This line ends with LF only.}
\closeout\txtfile

\end{document}

会写入一个文件,其中第一行以 CRLF 结尾,第二行仅以 LF 结尾。以下是生成文件的十六进制转储:

00000000  54 68 69 73 20 6c 69 6e  65 20 65 6e 64 73 20 77  |This line ends w|
00000010  69 74 68 20 43 52 4c 46  2e 0d 0a 54 68 69 73 20  |ith CRLF...This |
00000020  6c 69 6e 65 20 65 6e 64  73 20 77 69 74 68 20 4c  |line ends with L|
00000030  46 20 6f 6e 6c 79 2e 0a                           |F only..|
00000038

相关内容