如何以“追加”模式打开文件?

如何以“追加”模式打开文件?

在 TeXBook 中找不到任何内容,但这可能只是我的问题。

我猜总是可以打开文件进行读取,将其内容复制到另一个文件,然后继续写入该文件。最后,您可以退出到 shell 以删除原始文件,并将新生成的文件重命名为您刚刚创建的文件。

答案1

我同意 Joseph 的观点,TeX 不支持追加到现有文件。但是可以读取现有内容并将其与新内容一起写回文件。这当然比简单地追加内容效率低得多,但在 TeX 中这是唯一可行的方法。

catchfile使得现有内容的阅读变得相当容易:

\documentclass{article}

\usepackage{catchfile}

\newwrite\appendwrite
\newcommand*\appendtofile[2]{%
    \begingroup
    \IfFileExists{#1}%
      {\CatchFileDef{\filecontent}{#1}{\endlinechar=`^^J\catcode\endlinechar=12\relax}}% keep existing end-of-lines
      {\let\filecontent\empty}%
    \immediate\openout\appendwrite=#1\relax
    \immediate\write\appendwrite{\filecontent #2}%
    \immediate\closeout\appendwrite
    \endgroup
}

\begin{document}

\appendtofile{\jobname.test}{First line}

First:\\\fbox{\input{\jobname.test}}

\appendtofile{\jobname.test}{Second line}

Second:\\\fbox{\input{\jobname.test}}

\end{document}

另请参阅问题的答案“不扩展的文件复制“。

答案2

您可以将要附加的内容写入新文件,并在运行结束时将两个文件重写在一起。如下所示。

\documentclass{minimal}
\newwrite\mywrite
\newcount\mycount

\makeatletter
\newcommand{\makeallother}{%
  \mycount0\relax
  \loop\ifnum\mycount<255\relax
  \catcode\mycount12\relax
  \advance\mycount by 1\relax
  \repeat
}
\newcommand*{\VerbatimFile}[2]{%
  \begingroup
  \newlinechar\endlinechar
  \makeallother
  \everyeof{\noexpand}%
  \immediate\openout\mywrite #1\relax
  \def\from##1{\immediate\write\mywrite{\@@input ##1 }}%
  #2\relax
  \immediate\closeout\mywrite
  \endgroup
}
\makeatother

\AtBeginDocument{\immediate\openout\mywrite\jobname.append\relax}
\AtEndDocument{%
  \immediate\closeout\mywrite
  \VerbatimFile{\jobname.output}{%
    \from{\jobname.tex}%
    \from{\jobname.append}%
  }%
}

\begin{document}

\newcommand{\test}[1]{\immediate\write\mywrite{#1}}
\test{abc}
\test{cde}

\end{document}

答案3

我对此感到疑惑,并得出结论,唯一的方法就是像你说的那样读入所有内容。TeX\openout原语根本不允许附加。(当然,LuaTeX情况有所不同)。如果你要读入所有内容,e-TeX\readline原语可能会有用,因为它会读取所有去标记化的内容。

相关内容