coenig
27-10-2012, 19:05
Hallo,
ich habe gerade ein Problem mit einem Latex-Code, der als Grundlage für eine Aufgabensammlung genutzt werden soll. Dabei sollen zu Beginn des Dokuments alle Aufgabentexte nacheinander erscheinen, und am Ende alle Lösungen. Im Latex-Code soll aber bei jeder Aufgabe die Lösung gleich darunter geschrieben werden und das Verschieben ans Ende Latex überlassen, damit man sich um das korrekte Platzieren am Ende nicht selbst kümmern muss.
Ein kleines Beispiel zum Verständnis (die zwei mittleren Parameter der Umgebung bitte ignorieren):
\begin{aufgabe}{AufgabenThema1}{}{}{ID1}
Aufgabentext1\begin{loesung}Loesungstext1\end{loes ung}
\end{aufgabe}
In der aufgabe-Umgebung schreibt man zuerst den Aufgaben-Text hin, danach schreibt man in eine loesung-Umgebung die zugehörigen Lösungen. Latex geht dann über den Lösungstext drüber und schreibt ihn zunächst mal in eine Datei, ohne ihn in das Dokument zu schreiben. Erst wenn man einen Befehl \includeLoesungen eingibt, werden an der Stelle die Lösungen aller Aufgaben, die bis dahin gekommen sind, platziert. Soweit funktioniert das auch.
Allerdings möchte ich gerne auch noch die Seitenzahl der Aufgabe bei den Lösungen mit angeben, damit man die zur Lösung gehörende Aufgabe leichter finden kann. Auch das funktioniert im Prinzip schon, allerdings nur, wenn man das Paket hyperref NICHT einbindet. Wenn man das tut - und ich brauche dieses Paket unbedingt, dann meldet Tex einen "TeX capacity exceeded [input stack size=5000]" - Fehler.
Hier ist das minimale Beispiel:
\documentclass{article}
\usepackage{verbatim}
\usepackage{hyperref} % Hier liegt der Fehler.
\newenvironment{aufgabe}[4]
{\noindent
\textbf{\sffamily Aufgabe.\label{aufgabe:#4}}
#1
\newline
\bigbreak\def\dieserAufgabeID{#4}}{}
%%% Lösungsumgebung
\makeatletter
\newenvironment{ex@solution}[1]{\paragraph{#1}}{}
\newwrite\verbatim@out % Datei wird definiert
\immediate\openout\verbatim@out=\jobname.sol % Datei wrid zum Schreiben geöffnet
\def\loesung{
\@bsphack
\let\do\@makeother\dospecials
\catcode`\^^M\active
\def\verbatim@processline{%
\immediate\write\verbatim@out{\the\verbatim@line}} %
\immediate\write\verbatim@out{\string\begin{ex@sol ution}{Seite \pageref{aufgabe:\dieserAufgabeID}}}%
\verbatim@start}
\def\endloesung{%
\immediate\write\verbatim@out{\string\end{ex@solut ion}}
\@esphack}
\newcommand*{\includeLoesungen}{%
\immediate\closeout\verbatim@out % schließt die Datei
\section{Lösungen}
\InputIfFileExists{\jobname.sol}{}{}
\newwrite\verbatim@out % Datei wird definiert
\immediate\openout\verbatim@out=\jobname.sol % Datei wrid zum Schreiben geöffnet
}
\makeatother
%%% Lösungsumgebung Ende
\begin{document}
\begin{aufgabe}{AufgabenThema1}{}{}{ID1}
Aufgabentext1\begin{loesung}Loesungstext1\end{loes ung}
\end{aufgabe}
~\pagebreak
\begin{aufgabe}{AufgabenThema2}{}{}{ID2}
Aufgabentext2\begin{loesung}Loesungstext2\end{loes ung}
\end{aufgabe}
~\pagebreak
\includeLoesungen
\end{document}
Die Aufgaben-ID (4. Parameter) wird in der aufgabe-Umgebung in einer Variable (\dieserAufgabeID) zwischengespeichert und durch "\label{aufgabe:#4}" für die Erstellung eines Labels benutzt, das in der Lösungsumgebung durch "Seite \pageref{aufgabe:\dieserAufgabeID}" referenziert wird.
Für die Lösungen wird das Paket verbatim benutzt, um alles, was in der loesung-Umgebung steht, unverändert in eine Datei zu schreiben, die bei Eingabe von \includeLoesungen wieder ausgelesen und an der Stelle platziert wird.
Wenn man das hyperref-Paket auskommentiert, dann funktioniert das Ganze auch prima, sonst aber leider nicht. Ich vermute, dass es irgendwie mit den Verbatim-Befehlen liegt, die beim Schreiben der Lösungsdatei benutzt werden. Ich komme aber nicht dahinter, woran es wirklich liegt und wie ich es umgehen kann.
Ich würde mich wirklich sehr freuen, wenn jemand dazu eine Idee hätte!
Viele Grüße und danke
Lukas
ich habe gerade ein Problem mit einem Latex-Code, der als Grundlage für eine Aufgabensammlung genutzt werden soll. Dabei sollen zu Beginn des Dokuments alle Aufgabentexte nacheinander erscheinen, und am Ende alle Lösungen. Im Latex-Code soll aber bei jeder Aufgabe die Lösung gleich darunter geschrieben werden und das Verschieben ans Ende Latex überlassen, damit man sich um das korrekte Platzieren am Ende nicht selbst kümmern muss.
Ein kleines Beispiel zum Verständnis (die zwei mittleren Parameter der Umgebung bitte ignorieren):
\begin{aufgabe}{AufgabenThema1}{}{}{ID1}
Aufgabentext1\begin{loesung}Loesungstext1\end{loes ung}
\end{aufgabe}
In der aufgabe-Umgebung schreibt man zuerst den Aufgaben-Text hin, danach schreibt man in eine loesung-Umgebung die zugehörigen Lösungen. Latex geht dann über den Lösungstext drüber und schreibt ihn zunächst mal in eine Datei, ohne ihn in das Dokument zu schreiben. Erst wenn man einen Befehl \includeLoesungen eingibt, werden an der Stelle die Lösungen aller Aufgaben, die bis dahin gekommen sind, platziert. Soweit funktioniert das auch.
Allerdings möchte ich gerne auch noch die Seitenzahl der Aufgabe bei den Lösungen mit angeben, damit man die zur Lösung gehörende Aufgabe leichter finden kann. Auch das funktioniert im Prinzip schon, allerdings nur, wenn man das Paket hyperref NICHT einbindet. Wenn man das tut - und ich brauche dieses Paket unbedingt, dann meldet Tex einen "TeX capacity exceeded [input stack size=5000]" - Fehler.
Hier ist das minimale Beispiel:
\documentclass{article}
\usepackage{verbatim}
\usepackage{hyperref} % Hier liegt der Fehler.
\newenvironment{aufgabe}[4]
{\noindent
\textbf{\sffamily Aufgabe.\label{aufgabe:#4}}
#1
\newline
\bigbreak\def\dieserAufgabeID{#4}}{}
%%% Lösungsumgebung
\makeatletter
\newenvironment{ex@solution}[1]{\paragraph{#1}}{}
\newwrite\verbatim@out % Datei wird definiert
\immediate\openout\verbatim@out=\jobname.sol % Datei wrid zum Schreiben geöffnet
\def\loesung{
\@bsphack
\let\do\@makeother\dospecials
\catcode`\^^M\active
\def\verbatim@processline{%
\immediate\write\verbatim@out{\the\verbatim@line}} %
\immediate\write\verbatim@out{\string\begin{ex@sol ution}{Seite \pageref{aufgabe:\dieserAufgabeID}}}%
\verbatim@start}
\def\endloesung{%
\immediate\write\verbatim@out{\string\end{ex@solut ion}}
\@esphack}
\newcommand*{\includeLoesungen}{%
\immediate\closeout\verbatim@out % schließt die Datei
\section{Lösungen}
\InputIfFileExists{\jobname.sol}{}{}
\newwrite\verbatim@out % Datei wird definiert
\immediate\openout\verbatim@out=\jobname.sol % Datei wrid zum Schreiben geöffnet
}
\makeatother
%%% Lösungsumgebung Ende
\begin{document}
\begin{aufgabe}{AufgabenThema1}{}{}{ID1}
Aufgabentext1\begin{loesung}Loesungstext1\end{loes ung}
\end{aufgabe}
~\pagebreak
\begin{aufgabe}{AufgabenThema2}{}{}{ID2}
Aufgabentext2\begin{loesung}Loesungstext2\end{loes ung}
\end{aufgabe}
~\pagebreak
\includeLoesungen
\end{document}
Die Aufgaben-ID (4. Parameter) wird in der aufgabe-Umgebung in einer Variable (\dieserAufgabeID) zwischengespeichert und durch "\label{aufgabe:#4}" für die Erstellung eines Labels benutzt, das in der Lösungsumgebung durch "Seite \pageref{aufgabe:\dieserAufgabeID}" referenziert wird.
Für die Lösungen wird das Paket verbatim benutzt, um alles, was in der loesung-Umgebung steht, unverändert in eine Datei zu schreiben, die bei Eingabe von \includeLoesungen wieder ausgelesen und an der Stelle platziert wird.
Wenn man das hyperref-Paket auskommentiert, dann funktioniert das Ganze auch prima, sonst aber leider nicht. Ich vermute, dass es irgendwie mit den Verbatim-Befehlen liegt, die beim Schreiben der Lösungsdatei benutzt werden. Ich komme aber nicht dahinter, woran es wirklich liegt und wie ich es umgehen kann.
Ich würde mich wirklich sehr freuen, wenn jemand dazu eine Idee hätte!
Viele Grüße und danke
Lukas