Ich habe mit xsim eine Aufgabenansammlung angelegt und würde jetzt gerne den Quelltext aller Aufgaben ausgeben lassen. Dafür nütze ich tcblisting von tcolorbox.

Aufbauend auf dieser Frage habe ich den Befehl \GetBody erstellt. Dieser ist in der Schleife \ForEachUsedExerciseByID platziert. Ohne einer tcblisting Umgebung werden die Fragentexte auch normal eingbunden.

Wenn ich nun

Öffne in Overleaf
\ForEachUsedExerciseByID{
    begin{tcblisting}{listing only}
        \GetBody{#1}{#2}{exercise}
    \end{tcblisting}
}

nutze, dann erhalte ich den Fehler:

Öffne in Overleaf
! File ended while scanning use of \next.
<inserted text> 
                \par 
<*> minimal.tex

I suspect you have forgotten a `}', causing me
to read past where you wanted me to stop.
I'll try to recover; but if the error is serious,
you'd better type `E' or `X' now and fix your file.

! Emergency stop.

Ich wollte dann mithilfe die \tcbinputlisting die Dateien direkt einbinden, was auch mithilfe von

Öffne in Overleaf
\tcbinputlisting{listing only,listing file=\jobname-#1-#2-exercise-body.tex}

funktioniert. Jedoch ist dies nicht flexibel genug, wenn man z.B. den Ordner für die Dateien ändert.

Daraufhin habe ich \GetFullPath definiert, welcher aber zum folgenden Fehler führt:

Öffne in Overleaf
! Missing number, treated as zero.
<to be read again> 
                   {
l.40 }

A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)
    enter code here

Das setzen der Option listing options={escapechar=\%} brachte auch keinen Erfolg.

Hat jemand eine Idee?

Hier das Minimalbeispiel:

Öffne in Overleaf
\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}

\usepackage{xsim}

\usepackage[most]{tcolorbox}

\ExplSyntaxOn
    \NewDocumentCommand \GetBody {m m m}
        { \xsim_input:nnn { #1 } { #2 } { #3 } }
\ExplSyntaxOff

\ExplSyntaxOn
\NewDocumentCommand \GetFullPath {m m m}
{ \__xsim_set_file_signature:nnn {#1} {#2} {#3} \l__xsim_file_path_and_name_tl }
\ExplSyntaxOff

\begin{document}

\begin{exercise}[subtitle={Ein schöner Titel}]
    Fragetext
\end{exercise}
\begin{solution}
    Antworttext 
\end{solution}

\newpage
\section*{Quelltext}
\ForEachUsedExerciseByID{%
    \begin{tcblisting}{listing only,listing options={escapechar=\%}}
        %\GetBody{#1}{#2}{exercise}%
    \end{tcblisting}
%   \tcbinputlisting{listing only,listing file=\jobname-#1-#2-exercise-body.tex}
%   \tcbinputlisting{listing only,listing file=\GetFullPath{#1}{#2}{exercise}}
}
\end{document}

gefragt 06 Aug, 06:16

maphy-psd's gravatar image

maphy-psd
371716
Akzeptiert: 80%

bearbeitet 12 Aug, 06:48

@saputello danke für die Hinweise. Das war mein erster Kontakt mit verbatim-Umgebungen. Das mit den Tokens war mir nicht klar. Wieder was gelernt.

(12 Aug, 07:31) maphy-psd

Wie @saputello in seinem Kommentar bereits schrieb, kann man alle Arten von verbatim-Umgebungen nicht gefahrlos im Argument eines anderen Befehls verwenden. Schon ein einfaches:

Öffne in Overleaf
\documentclass{article}
\newcommand{\Ausgabe}[1]{#1}
\begin{document}
\Ausgabe{
  \begin{verbatim}
  % Dies ist ein Beispiellisting
  \Test
  \end{verbatim}
}
\end{document}

erzeugt nicht das gewünschte Ergebnis, sondern die Fehlermeldung:

Runaway argument? \Test \end {verbatim} ^^M\end{document}^^M^^M\documentclass{article}\ETC. ! File ended while scanning use of \@xverbatim.

Das gilt bei Verwendung von Umgebungen wie lstlisting oder eben tcblisting umso mehr.

Nun bietet aber das Paket tcolorbox auch einen Befehl, um eine externe Datei direkt einzulesen. Definiert man sich nun eine Abwandlung von xsim_input:nnn, bei der eben dieser Befehl an Stelle von file_input:n verwendet wird, so funktioniert es schon einmal ohne Fehler:

Öffne in Overleaf
\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}

\usepackage{xsim}

\usepackage[most]{tcolorbox}

\ExplSyntaxOn
\cs_new_protected:Npn \xsim_tcbinput:nnn #1#2#3
  {
    \group_begin:
      \__xsim_set_file_signature:nnn {#1} {#2} {#3}
      \tcbinputlisting { listing~only, listing~file = \l__xsim_file_path_and_name_tl }
    \group_end:
  }
\NewDocumentCommand \GetBodyTCB {m m m}
  {
    \xsim_tcbinput:nnn { #1 } { #2 } { #3 }
  }
\ExplSyntaxOff

\begin{document}

\begin{exercise}[subtitle={Ein schöner Titel}]
    Fragetext
\end{exercise}
\begin{solution}
    Antworttext 
\end{solution}

\newpage
\section*{Quelltext}
\let\ListingList\empty
\ForEachUsedExerciseByID{%
  \GetBodyTCB{#1}{#2}{exercise}
}
\end{document}

Die Formatierung ist sicher noch verbesserungsfähig:

Quelltextseite mit Listing

Permanenter link

beantwortet 12 Aug, 07:02

Ijon%20Tichy's gravatar image

Ijon Tichy
7.7k11019

bearbeitet 12 Aug, 07:03

Mit \tcbinputlisting hatte ich auch schon experimentiert, aber es hat ein Stück gefehlt. Die Formatierung ist wirklich etwas verbesserungswürdig. Ich werde mit geometry das Layout auf den entsprechenden Seiten ändern. Danke für die Hilfe!

(12 Aug, 07:42) maphy-psd
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×20
×11
×6

Frage gestellt: 06 Aug, 06:16

Frage wurde angeschaut: 262 Mal

Zuletzt aktualisiert: 12 Aug, 07:42