在 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
原语可能会有用,因为它会读取所有去标记化的内容。