4
1

Hallo,

ich suche nach einer Möglichkeit, 2 unterschiedliche Lösungen zu Aufgaben anzubieten, nämlich eine ausführliche Lösung und eine Kurzlösung, die z. B. nur einen Hinweis oder einen Ergebniswert enthält.

Eine mögliche Lösung habe ich in den Beispielen zum Paket gefunden, hier wird Execise eine Eigenschaft "hint" (von mir umbenannt in shortsolution) hinzugefügt:

Öffne in Overleaf
\DeclareExerciseProperty{shortsolution}

\newcommand\printshortsolution{%
  \begin{description}
    \ForEachUsedExerciseByType{%
      \def\ExerciseType{##1}%
      \def\ExerciseID{##2}%
      \GetExercisePropertyT{shortsolution}
        {%
          \item[\XSIMmixedcase{\GetExerciseName}~##3]
           ####1%
        }%
    }%
  \end{description}
}

\newcommand\shortsolution[1]{\SetExerciseProperty{shortsolution}{#1}}

Da meine Aufgaben mehrere Unteraufgaben in einer Aufzählung a), b), ... enthalten, wäre folgende Lösung hilfreich:

Öffne in Overleaf
\documentclass{article}
\usepackage{xsim}

\begin{document}
  \begin{exercise}
    A first example for an exercise.
  \end{exercise}
  \begin{shortsolution}
    A first example for a shortsolution.
  \end{shortsolution}
  \begin{solution}
    A first example for a solution.
  \end{solution}
\end{document}

Ich möchte dann entscheiden können, welche Art der Lösung jeweils im Ausdruck landet.

gefragt 05 Jan '19, 10:49

RungeZipperer's gravatar image

RungeZipperer
10627
Akzeptiert-Rate: 0%


So vielleicht – der springende Punkt hier ist die folgende Definition:

\usepackage{environ,etoolbox}
\NewEnviron{shortsolution}{\SetExpandedExerciseProperty{shortsolution}{\expandonce{\BODY}}}

Da Du ja eine Umgebung möchtest, musst Du Dir auch eine definieren. Normalerweise kann man auf den Inhalt einer Umgebung aber nicht einfach so zugreifen. Da wir das aber müssen, um ihn speichern und später aufrufen zu können, müssen wir die Umgebung anders als normal definieren.

Das Paket environ ermöglicht genau das – der Inhalt einer Umgebung ist in der Umgebungsdefinition mit \BODY verfügbar. Den Inhalt kann man dann speichern – und da wir nicht das Makro sondern seinen Inhalt speichern wollen, verwenden wir \SetExpandedExerciseProperty, was sein Argument erst expandiert, bevor es ihn speichert. Zuletzt verwenden wir dann noch \expandonce vom Paket etoolbox, um \BODY nur genau einmal zu expandieren, bevor wir es speichern (sonst bekommen wir Probleme mit fragilen Befehlen…).

Update 2020: heute brauchen wir environ und etoolbox nicht mehr. Das in den Kernel integrierte xparse stellt mit \NewDocumentEnvironment eine noch flexiblere Möglichkeit bereit, den „Body“ einer Umgebung zu bearbeiten:

\NewDocumentEnvironment{shortsolution}{+b}
  {\SetExpandedExerciseProperty{shortsolution}{#1}}
  {}

b bedeutet dabei ein Argument, das sich auf eben jenen Body bezieht. (+ macht das Argument \long…).

Der ganze Code:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[no-files]{xsim}

\usepackage{needspace}

\DeclareExerciseProperty{shortsolution}

% we'll use a description list for the shortsolutions:
\makeatletter
\NewDocumentCommand\printshortsolutions{}{%
  \def\shortsolitems{}%
  \ForEachUsedExerciseByType{%
    \def\ExerciseType{##1}%
    \def\ExerciseID{##2}%
    \GetExercisePropertyT{shortsolution}
      {\g@addto@macro\shortsolitems{\item[Short Solution ##3] ####1}}%
  }%
  \XSIMifblankF\shortsolitems{%
    \begin{description}
      \shortsolitems
    \end{description}
  }%
}
\makeatother

\NewDocumentEnvironment{shortsolution}{+b}
  {\SetExpandedExerciseProperty{shortsolution}{#1}}
  {}

\begin{document}

\section{Problems}
% set shortsolution through option:
\begin{exercise}[subtitle=Pythagoras]
  This is the first problem.
  \begin{shortsolution}
    This is a shortsolution to the first problem.
  \end{shortsolution}
\end{exercise}
\begin{solution}
  This is the solution to the first problem.
\end{solution}

\begin{exercise}[subtitle=Another Problem]
  This is the second problem.
\end{exercise}
\begin{solution}
  This is the solution to the second problem.
\end{solution}

% set shortsolution with custom command:
\begin{exercise}[subtitle=Yet Another Problem]
  This is the third problem.
  \begin{shortsolution}
    This is a shortsolution to the third problem.
  \end{shortsolution}    
\end{exercise}
\begin{solution}
  This is the solution to the third problem.
\end{solution}

\section{Shortsolutions}
\printshortsolutions

\section{Solutions}
\printsolutions[headings=false]

\end{document}

alt text

Permanenter link

beantwortet 05 Jan '19, 11:19

cgnieder's gravatar image

cgnieder
20.9k193463
Akzeptiert-Rate: 60%

bearbeitet 08 Jan, 10:38

Wow...danke...hätte ich mit meinem rudimentären Kenntnissen allerdings tatsächlich nicht hinbekommen!

(05 Jan '19, 12:34) RungeZipperer
1

@RungeZipperer: Die Antwort gefällt dir also? Dann solltest du entsprechend handeln.

(05 Jan '19, 16:18) Ijon Tichy

Wenn ich versuche das zu kompillieren, erhalte ich den Fehler ! LaTeX Error: Something's wrong--perhaps a missing \item.

(06 Jan, 10:12) studentsx

@studentsx Oha. Ja, seit einer Änderung vor einer Weile kann man Eigenschaften von exercises nicht einfach nach der Umgebung setzen. Die shortsolution-Umgebung muss daher in die exercise-Umgebung.

(06 Jan, 10:40) cgnieder

Alles klar, danke! Könnte man eigentlich auch die solution Umgebung in die exercise Umgebung reinziehen (scheint jedenfalls zu funktionieren) oder bringt das irgendwelche Nachteile mit sich, die ich auf Anhieb nicht sehe? Falls die Antwort komplizierter ist, kann ich das auch als neue Frage stellen.

(06 Jan, 11:02) studentsx

@studentsx Davon würde ich abraten, das kann je nach Setup und Verwendung von xsim unerwünschte Nebenwirkungen haben…

(06 Jan, 11:19) cgnieder

Dieselben Nebenwirkungen sind aber bei den shortsolutions dann nicht zu erwarten?

(06 Jan, 11:43) studentsx
(06 Jan, 11:46) cgnieder

Ich habe die Antwort mal etwas modernisiert…

(06 Jan, 15:21) cgnieder

Danke. Mir ist eben noch aufgefallen, dass deine Lösung im trivialen Fall, dass das Dokument keine shortsolutions enthält eine missing item beim kompillieren eine missing item Fehlermeldung ausgibt. Vielleicht hast du noch eine Idee, wie man das geschickt auffängt.

(06 Jan, 22:13) studentsx

@studentsx stimmt, ist mir gestern auch aufgefallen. Ich habe die Lösung modifiziert für diesen Fall

(08 Jan, 10:38) cgnieder
Ergebnis 5 von 11 show 6 more comments
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×15
×1

gestellte Frage: 05 Jan '19, 10:49

Frage wurde gesehen: 2,171 Mal

zuletzt geändert: 08 Jan, 10:38