Wenn man etwas in eine externe Datei schreiben möchte, kann man eine der folgender Methoden verwenden:
Was ist der Unterschied der verschiedenen Methoden und in was für Fällen bietet sich welche Methode an? gefragt 06 Aug '14, 10:59 cgnieder |
Beispiel ( Open in writeLaTeX
\documentclass{article} \usepackage{blindtext} \newcounter{test} \makeatletter \newcommand*{\dowrite}[1]{% \stepcounter{test}% \write\@mainaux{\string\def\string\testpage{\thetest: #1}}% } \makeatother \begin{document} \dowrite{\thepage} \blindtext[1] \dowrite{\thepage} \blindtext[4] \dowrite{\thepage} \end{document} schreibt in die
Die Erklärung dafür ist einfach: Der Zähler test wird bei jedem Aufruf von \dowrite um eins erhöht. Geschrieben wird aber tatsächlich erst am Ende des Dokuments, weil erst dann LaTeX erkennt, dass nicht mehr alles auf die erste Seite passt. Daher ist beim Schreiben der Zähler bereits test bereits 3. Der Zähler page wird erst beim Schreiben einer Seite erhöht. Daher ist er beim Schreiben der ersten Seite tatsächlich 1 und beim Schreiben der zweiten Seite tatsächlich 2.
Jetzt mit Open in writeLaTeX
\documentclass{article} \usepackage{blindtext} \newcounter{test} \makeatletter \newcommand*{\dowrite}[1]{% \stepcounter{test}% \immediate\write\@mainaux{\string\def\string\testpage{\thetest: #1}}% } \makeatother \begin{document} \dowrite{\thepage} \blindtext[1] \dowrite{\thepage} \blindtext[4] \dowrite{\thepage} \end{document} Hier lauten die Einträge in die
Nun haben wir quasi den umgekehrten Fall. Da die Einträge direkt bei der Ausführung von \dowrite geschrieben werden, befinden wir uns zu diesem Zeitpunkt noch immer auf Seite 1 und es wird der jeweils aktuelle Wert von test geschrieben. Die letzte \dowrite -Anweisung wird ebenfalls noch auf Seite 1 verarbeitet, weil erst beim impliziten Absatz von \end{document} erkannt wird, dass ein Teil des Materials der letzten \blindtext -Anweisung auf einer neuen Seite ausgegeben werden muss.
Open in writeLaTeX
\documentclass{article} \usepackage{blindtext} \newcounter{test} \makeatletter \newcommand*{\dowrite}[1]{% \stepcounter{test}% \protected@write\@mainaux{}{\protect\def\protect\testpage{\thetest: #1}}% } \makeatother \begin{document} \dowrite{\thepage} \blindtext[1] \dowrite{\thepage} \blindtext[4] \dowrite{\thepage} \end{document} Hier erhalten wird:
Das ist also eine Art Mischform aus \immediate\write und \write . Die unmittelbare Expansion wird durch das erwähnte \edef erreicht und führt dazu, dass der bei Ausführung von \dowrite aktualisierte Wert von test geschrieben wird. Die Expansion von \thepage wurde durch dessen Umdefinierung innerhalb von \protected@write verhindert, so dass der beim Schreiben der Seite gültige Wert von page geschrieben wird. Die zusätzlichen Lücken nach \def und \testpage kommen übrigens daher, dass hier kein String, sondern tatsächlich das nicht expandierte Makro geschrieben wird. Vergleichbar wäre das der Verwendung von \noexpand statt \string in den vorherigen Beispielen.
Stellt sich nun die Frage, wie wir auch Open in writeLaTeX
\documentclass{article} \usepackage{blindtext} \newcounter{test} \makeatletter \newcommand*{\dowrite}[1]{% \stepcounter{test}% \protected@write\@mainaux{\let\thetest\relax}{\protect\def\protect\testpage{\thetest: #1}}% } \makeatother \begin{document} \dowrite{\thepage} \blindtext[1] \dowrite{\thepage} \blindtext[4] \dowrite{\thepage} \end{document} Und schon erhalten wir wieder:
Durch das LaTeX selbst verwendet Das Paket beantwortet 06 Aug '14, 11:57 gast3 Das ist tatsächlich erleuchtend, v.a. was
(06 Aug '14, 20:30)
cgnieder
Nachfolgefrage: ich nehme an, der Unterschied zwischen
(08 Aug '14, 19:51)
cgnieder
@Clemens: Nicht ganz.
(08 Aug '14, 20:31)
gast3
|