
Ich möchte den Inhalt einer mit generierten Box nehmen \begin{lrbox} ... \end{lrbox}
und in eine Datei schreiben.
Der Anwendungsfall ist eine Frage- und Antwortumgebung, in der die Antworten gesammelt und an verschiedenen Stellen im Dokument angezeigt werden sollen. Außerdem möchte ich die Antwort neben der Frage anzeigen. Daher packe ich die Frage in eine Box und gehe dann davon aus, dass der Inhalt dieser Box sowohl innerhalb der Umgebung als auch zum Speichern der Daten in einer externen Datei verwendet werden kann. Aber der letzte Teil ist der Grund für diese Frage.
Der Ansatz, den ich bisher verwendet habe, ist das newfile
Paket und der Code unten. Das Problem ist, dass in test3.comment Folgendes geschrieben wird
\unhbox \voidb@x \copy \myboxquestion \relax
Fast funktionierender Code
\documentclass{article}
\usepackage{newfile}
\newoutputstream{comment}
\openoutputfile{\jobname.comment}{comment}
\newsavebox{\myboxquestion}
\newenvironment{question}{%
\begin{lrbox}{\myboxquestion}\begin{minipage}{\linewidth}}{%
\end{minipage}\end{lrbox} \par\usebox{\myboxquestion}
% What to do here?
\addtostream{comment}{\usebox{\myboxquestion}}}
\setlength{\parindent}{0.0cm}
\begin{document}
Testing
\begin{question}
What is 3 + 4
\end{question}
\section{Collected}
\input{\jobname.comment}
\end{document}
Antwort1
TeX verfügt nicht über eine Serialisierung seiner Boxstrukturen, auf die zugegriffen werden kann, insbesondere kann sie nicht in eine Datei geschrieben werden. Sie müssen die Box entweder im TeX-Speicher zur Wiederverwendung speichern oder anstatt die Box zu speichern, die Token, aus denen der Text besteht, erfassen und diese in eine Datei schreiben, die beim Einlesen der Datei zurückgesetzt wird. So funktionieren Inhaltsverzeichnisse und Endnotenpakete, um die Abschnittsüberschriften oder Fußnoten am Anfang oder Ende eines Dokuments zu wiederholen.
Hier verwendet das MWE ein globales Boxregister anstelle einer externen Datei.
\documentclass{article}
\newsavebox{\myboxquestion}
\newbox\savedqns
\setbox\savedqns\vbox{}
\newenvironment{question}{%
\begin{lrbox}{\myboxquestion}\begin{minipage}{\linewidth}}{%
\end{minipage}\end{lrbox} \par\noindent\usebox{\myboxquestion}
\global\setbox\savedqns\vbox{%
\unvbox\savedqns
\bigskip
\filbreak
\noindent\usebox{\myboxquestion}}}
\setlength{\parindent}{0.0cm}
\begin{document}
Testing
\begin{question}
What is 3 + 4
\end{question}
Testing again
\begin{question}
What is 3 + 3
\end{question}
\section{Collected}
\unvbox\savedqns
\end{document}
Antwort2
Wie David bereits sagte, kann der Inhalt von Boxen nicht in eine Datei geschrieben werden. Der Inhalt der Umgebung kann jedoch mithilfe des Pakets abgefangen environ
und in einem Makro gespeichert werden, das aufgerufen und ebenfalls in eine Datei geschrieben werden kann.
Übrigens sollte der Ausgabestream vor dem Lesen zuerst geschlossen werden.
\documentclass{article}
\usepackage{newfile}
\newoutputstream{comment}
\openoutputfile{\jobname.comment}{comment}
\usepackage{environ}
\NewEnviron{question}{%
\BODY
\addtostream{comment}{\detokenize\expandafter{\BODY}}%
% \detokenize prevents macro expansion
}
\setlength{\parindent}{0cm}
\begin{document}
Testing
\begin{question}
What is 3 + 4?
\end{question}
\section{Collected}
\closeoutputstream{comment}
\input{\jobname.comment}
\end{document}
Ergebnis:
Der Nachteil dieser Methode ist, dass der Inhalt der Umgebung wortwörtlich ist. Dies könnte dadurch unterstützt werden, dass der Inhalt der Umgebung wortwörtlich erfasst wird. In dieser Form kann er in eine Datei geschrieben werden. Die erfasste Umgebung kann mithilfe von festgelegt werden \scantokens
.