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{xsim}
\usepackage{needspace}
\DeclareExerciseProperty{shortsolution}
% we'll use a description list for the shortsolutions:
\newcommand\printshortsolutions{%
\begin{description}
\ForEachUsedExerciseByType{%
\def\ExerciseType{##1}%
\def\ExerciseID{##2}%
\GetExercisePropertyT{shortsolution}
{%
\item[Short Solution ##3]
####1%
}%
}%
\end{description}
}
\usepackage{environ,etoolbox}
\NewEnviron{shortsolution}{\SetExpandedExerciseProperty{shortsolution}{\expandonce{\BODY}}}
\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][1]][1]
[1]: https://texwelt.de/wissen/upfiles/test_467.png