是否有可能\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