PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Latex-Problem: vermutlich irgendwas Merkwürdiges mit Verbatim und Hyperref



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

cgnieder
27-10-2012, 22:05
Ich habe noch nicht genau gesehen, wo das Problem ist, habe aber zwei Vorschläge/Tipps. Erstens ist es glaube ich einfacher für Deine Aufgabe, environ (http://www.ctan.org/pkg/environ) zu verwenden:


\documentclass{article}
\usepackage{environ}

\newwrite\schreibauf
\immediate\openout\schreibauf=\jobname.sol
\NewEnviron{test}{\immediate\write\schreibauf{\une xpanded\expandafter{\BODY}}}

\newcommand*\zeigaufschrieb{%
\immediate\closeout\schreibauf
\input{\jobname.sol}}

\AtEndDocument{\immediate\closeout\schreibauf}

\begin{document}

\begin{test}
bla bla bla \textbf{bla}
\end{test}

text dazwischen

\zeigaufschrieb

\end{document}

Zweitens gibt aus die Pakete answers (http://www.ctan.org/pkg/answers) und exsheets (http://www.ctan.org/pkg/exsheets), vielleicht noch weitere, die für das, was Du entwickeln willst, existieren. (Hier ist ein Beispiel für exsheets. (http://www.mrunix.de/forums/showpost.php?p=346868&postcount=10))

Grüße

coenig
28-10-2012, 01:36
Ach krass, das sieht einfacher aus als meine Lösung.

Ich schaue mir das morgen gleich mal an - vielen Dank auf jeden Fall!

(Ob das das Problem mit den Seitenzahlen löst, weiß ich aber nicht...)

coenig
29-10-2012, 16:38
Hallo nochmal,


Clemens, vielen Dank für deine Idee, die ich auch deutlich einfacher finde als meinen Code.

Allerdings löst es das Problem mit hyperref nicht. Die folgende Version funktioniert prima (und ich überlege unabhängig von allem anderen, darauf umzusteigen, weil es weniger selbstgefrickelt ist...), solange man hyperref nicht einkommentiert:



\documentclass{article}
\usepackage{environ}
%\usepackage{hyperref}

\newenvironment{aufgabe}[4]
{\noindent
\textbf{\sffamily Aufgabe.\label{aufgabe:#4}}
#1 (#4)
\newline
\bigbreak\def\dieserAufgabeID{#4}}{}

\newwrite\schreibauf
\immediate\openout\schreibauf=\jobname.sol
\NewEnviron{test}{\immediate\write\schreibauf{Seit e \pageref{aufgabe:\dieserAufgabeID} \unexpanded\expandafter{\BODY}}}

\newcommand*\zeigaufschrieb{%
\immediate\closeout\schreibauf
\input{\jobname.sol}}

\AtEndDocument{\immediate\closeout\schreibauf}

\begin{document}

\begin{aufgabe}{Aufgabenthema}{}{}{ID}
Aufgabentext
\begin{test}
Lösungstext \textbf{bla}
\end{test}
\end{aufgabe}

text dazwischen

\zeigaufschrieb

\end{document}


Sobald man es aber mit einbaut, sagt er irgendwas von Runaway argument und hängt sich ernsthaft komplett auf, ohne überhaupt fertigzukompilieren.

:confused:


Viele Grüße

Lukas

u_fischer
29-10-2012, 16:43
Da gibst du dir soviel Mühe mit \unexpanded den Body vor der Expansion zu schützen, und das arme \pageref lässt du ins Messer laufen


\immediate\write\schreibauf{%
Seite \noexpand\pageref{aufgabe:\dieserAufgabeID}
...

coenig
30-10-2012, 12:32
Schön formuliert :-)

Danke, das ist natürlich richtig und so



\NewEnviron{test}{\immediate\write\schreibauf{Seit e \noexpand\pageref{aufgabe:\dieserAufgabeID} \unexpanded\expandafter{\BODY}}}


tut es jetzt auch.

Vielen Dank an alle!

coenig
30-10-2012, 12:35
Ach, und übrigens: auch wenn ich immer noch nicht so recht weiß, woher der Fehler kam, mit "noexpand" funktioniert auch die alte Version plötzlich!

Besten Dank nochmal!


Viele Grüße

Lukas