文件复制的命令是什么?我想将一个文件的内容复制到另一个文件中,而无需任何命令扩展。在命令行驱动的操作系统中,可以使用
copy source target
我尝试将一个文件的内容读入一个变量并将其写入目标:
\CatchFileDef{\OriginalF}{\jobname.sc0}{}
\newwrite\hcOutputStreamF
\immediate\openout\hcOutputStreamF=\jobname.sc1
\immediate\write\hcOutputStreamF{\OriginalF}
\immediate\closeout\hcOutputStreamF
但它扩展了原始文件中保存的 TeX 命令。
答案1
这是一个使用 Plain TeX 的解决方案ε-TeX 扩展名\readline
。它将源代码复制到\jobname.copy
。
\newread\in
\openin\in=\jobname.tex
\newwrite\out
\immediate\openout\out\jobname.copy
\endlinechar-1
\loop \unless\ifeof\in
\readline\in to\l
\immediate\write\out{\l}
\repeat
\immediate\closeout\out
\closein\in
\end
答案2
这verbatimcopy
软件包提供的命令\VerbatimCopy
似乎可以完成您所需的操作。但它似乎不适用于“二进制”(即非文本)文件。
\documentclass{scrartcl}
\pagestyle{empty}
\usepackage{verbatimcopy}
\usepackage{graphicx}
\begin{document}
\VerbatimCopy{input.tex}{input.tmp}
\input{input.tmp}
% This doesn't work for binary files:
%\VerbatimCopy{img.png}{img2.png}
%\includegraphics{img2.png}
\end{document}
我添加了可编译示例到 GitHub。
答案3
您的原始问题非常接近;只需替换
\immediate\write\hcOutputStreamF{\OriginalF}
和
\immediate\write\hcOutputStreamF{\unexpanded\expandafter{\OriginalF}}
我想你会得到你想要的。
答案4
expl3 中的解决方案,供将来参考。阅读部分与我怎样才能将整个文件内容逐字逐句地读入(expl3)字符串变量中?。
%! TEX program = pdflatex
\documentclass{article}
\begin{filecontents*}{source.txt}
line 1 !?#\xyz
line 2
\end{filecontents*}
\ExplSyntaxOn
\ior_open:Nn \g_tmpa_ior {source.txt}
\iow_open:Nn \g_tmpa_iow {target.txt}
\ior_str_map_variable:NNn \g_tmpa_ior \l_tmpa_str {
\iow_now:Nx \g_tmpa_iow {\l_tmpa_str}
}
\ior_close:N \g_tmpa_ior
\iow_close:N \g_tmpa_iow
\ExplSyntaxOff
\begin{document}
\end{document}
\ExplSyntaxOn
您可以看到和之间的块\ExplSyntaxOff
将复制名为的文件source.txt
到target.txt
。
请注意所有现有的答案(包括这个),因为它们使用 TeX 原语来读取数据,所以每行的尾随空格(可能还有制表符,取决于版本)将被删除,如果源文件没有最终换行符,则会添加换行符。(因此无法复制二进制文件。)
另一种方法是使用 shell-escape。请参阅https://tex.stackexchange.com/a/585404/250119。