不扩展的文件复制

不扩展的文件复制

文件复制的命令是什么?我想将一个文件的内容复制到另一个文件中,而无需任何命令扩展。在命令行驱动的操作系统中,可以使用

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.txttarget.txt

请注意所有现有的答案(包括这个),因为它们使用 TeX 原语来读取数据,所以每行的尾随空格(可能还有制表符,取决于版本)将被删除,如果源文件没有最终换行符,则会添加换行符。(因此无法复制二进制文件。)


另一种方法是使用 shell-escape。请参阅https://tex.stackexchange.com/a/585404/250119

相关内容