Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Latex-Problem: vermutlich irgendwas Merkwürdiges mit Verbatim und Hyperref

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.10.2012
    Beiträge
    14

    Question Latex-Problem: vermutlich irgendwas Merkwürdiges mit Verbatim und Hyperref

    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):

    Code:
    \begin{aufgabe}{AufgabenThema1}{}{}{ID1}
    Aufgabentext1\begin{loesung}Loesungstext1\end{loesung} 
    \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:

    Code:
    \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@solution}{Seite \pageref{aufgabe:\dieserAufgabeID}}}%
    \verbatim@start}
    
    \def\endloesung{%
    \immediate\write\verbatim@out{\string\end{ex@solution}}
    \@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{loesung} 
    \end{aufgabe}
    ~\pagebreak
    
    \begin{aufgabe}{AufgabenThema2}{}{}{ID2}
    Aufgabentext2\begin{loesung}Loesungstext2\end{loesung}
    \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
    Geändert von coenig (27-10-2012 um 18:11 Uhr)

  2. #2
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    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 zu verwenden:

    Code:
    \documentclass{article}
    \usepackage{environ}
    
    \newwrite\schreibauf
    \immediate\openout\schreibauf=\jobname.sol
    \NewEnviron{test}{\immediate\write\schreibauf{\unexpanded\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 und exsheets, vielleicht noch weitere, die für das, was Du entwickeln willst, existieren. (Hier ist ein Beispiel für exsheets.)

    Grüße
    Clemens

  3. #3
    Registrierter Benutzer
    Registriert seit
    17.10.2012
    Beiträge
    14
    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...)

  4. #4
    Registrierter Benutzer
    Registriert seit
    17.10.2012
    Beiträge
    14
    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:

    Code:
    \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{Seite \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.




    Viele Grüße

    Lukas

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    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

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

  6. #6
    Registrierter Benutzer
    Registriert seit
    17.10.2012
    Beiträge
    14
    Schön formuliert :-)

    Danke, das ist natürlich richtig und so

    Code:
    \NewEnviron{test}{\immediate\write\schreibauf{Seite \noexpand\pageref{aufgabe:\dieserAufgabeID} \unexpanded\expandafter{\BODY}}}
    tut es jetzt auch.

    Vielen Dank an alle!

  7. #7
    Registrierter Benutzer
    Registriert seit
    17.10.2012
    Beiträge
    14
    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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •