PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Angabe-Lösung-Ergebnis ausblendbar



yeahright
04-03-2008, 07:57
Liebe Forumsgemeinde!

Nachdem ich das Netz einigermaßen ausführlich nach einer Lösung für mein Problem durchsucht habe, und doch keine gefunden habe, wende ich mich nun an das Forum. Ich möchte ein Skript mit Übungsbeispielen für Studenten erstellen, wobei jedes Beispiel aus drei Teilen besteht: Einer Angabe, einer Lösung (d.h. mit dem gesamten Lösungsweg), und dem Ergebnis (d.h. ohne Lösungsweg, nur das Endergebnis). Jedes Beispiel soll eine eindeutige ID (z.B. LZI001) erhalten und mit dieser ID als Dateinamen als .tex-Datei (also z.B. LZI001.tex) abgelegt sein, also pro Beispiel eine Datei, die jeweils wie folgt aufgebaut sein soll:



\begin{exercise}{Titel des Beispiels}
\begin{problem}
Gegeben sei... (Angabe)
\end{problem}
\begin{solution}
Um dieses Beispiel zu lösen, geht man am besten wie folgt vor: ... (Lösung)
\end{solution}
\begin{result}
$x = 42$ (Ergebnis)
\end{result}
\end{exercise}

Im Hauptdokument möchte ich nun eine Beispielsammlung zusammenstellen können, wobei ich bei jedem einzelnen Beispiel angeben können möchte, welcher Teil des Beispiels (Angabe, Lösung, Ergebnis) angezeigt werden soll, in der Art



\inputExercise{LZI001}{1}{1}{0}
\inputExercise{LZI004}{0}{0}{1}
\inputExercise{LZI008}{1}{0}{1}

wobei die 4 Parameter von \inputExercise bedeuten: Dateiname (zugleich Beispiel-ID), Anzeigen der Angabe, Anzeigen der Lösung, Anzeigen des Ergebnisses. In diesem Beispiel würden also von LZI001 Angabe und Lösung, von LZI004 nur das Ergebnis, und von LZI008 Angabe und Ergebnis angezeigt werden.

Die Lösung des ganzen könnte ich mir *vom Prinzip* mit folgenden Definitionen im Hauptdokument vorstellen:


\newcommand{\exerciseTitle}{}
\newcommand{\printProblem}{0}
\newcommand{\printSolution}{0}
\newcommand{\printResult}{0}

\newcommand{\inputExercise}[4]{%
\renewcommand{\exerciseTitle}{#1}%
\renewcommand{\printProblem}{#2}%
\renewcommand{\printSolution}{#3}%
\renewcommand{\printResult}{#4}%
\input{#1.tex}}%

\newenvironment{problem}{\ifthenelse{\printProblem = 1}{ % öffnende Klammer von \ifthenelse
}{
}{} % schließende Klammer und False-Zweig von \ifthenelse
}
\newenvironment{solution}{\ifthenelse{\printSoluti on = 1}{ % öffnende Klammer von \ifthenelse
}{
}{} % schließende Klammer und False-Zweig von \ifthenelse
}
\newenvironment{result}{\ifthenelse{\printResult = 1}{ % öffnende Klammer von \ifthenelse
}{
}{} % schließende Klammer und False-Zweig von \ifthenelse
}
Der ganze Inhalt des \begin{problem}...\end{problem} (bzw. solution und result) Blocks soll also in das \ifthenelse-Kommando eingeschlossen werden, das den jeweiligen Blockinhalt nur dann kompiliert, wenn \printProblem = 1. Das funktioniert natürlich nicht, weil die öffnenden und schließenden geschwungenen Klammern so nicht geschachtelt werden dürfen - es kommt zu einer Fehlermeldung. Ich hätte das ganze auch schon mit TeX \if und probiert, was aber auch nicht klappt.

Über verschiedene packages bin ich bei meiner Suche nach einer Problemlösung gestolpert (u.a. answers, exerquiz), die scheinen aber alle nicht so recht das zu tun, was ich möchte.

Vielen Dank schon einmal für jede Hilfe.

Markus

rais
04-03-2008, 10:03
Hallo und Herzlich Willkommen :)


Ich möchte ein Skript mit Übungsbeispielen für Studenten erstellen, wobei jedes Beispiel aus drei Teilen besteht: Einer Angabe, einer Lösung (d.h. mit dem gesamten Lösungsweg), und dem Ergebnis (d.h. ohne Lösungsweg, nur das Endergebnis). Jedes Beispiel soll eine eindeutige ID (z.B. LZI001) erhalten und mit dieser ID als Dateinamen als .tex-Datei (also z.B. LZI001.tex) abgelegt sein, also pro Beispiel eine Datei, die jeweils wie folgt aufgebaut sein soll:



\begin{exercise}{Titel des Beispiels}
\begin{problem}
Gegeben sei... (Angabe)
\end{problem}
\begin{solution}
Um dieses Beispiel zu lösen, geht man am besten wie folgt vor: ... (Lösung)
\end{solution}
\begin{result}
$x = 42$ (Ergebnis)
\end{result}
\end{exercise}

wenn Du in der Gestaltung dieser Übungen noch frei bist, würde ich in etwa


%%%LZI001.tex:

\begin{exercise}{Titel des Beispiels}
\problem{%
Gegeben sei... (Angabe)%
}
\solution{%
Um dieses Beispiel zu lösen, geht man am besten wie folgt vor: ... (Lösung)%
}
\result{%
$x = 42$ (Ergebnis)%
}
\end{exercise}
vorschlagen, evtl. auch den Titel in einen eigenen Befehl packen und die Umgebung hier weglassen und stattdessen im \inputExercise setzen ... hmm:(

Zumindest funzt es dann mit der eigenen Defintion


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

\newcounter{exercise}

\newif\ifprintProblem
\newif\ifprintSolution
\newif\ifprintResult

\newif\ifgotprintedProblem
\newif\ifgotprintedSolution
\newif\ifgotprintedResult
\gotprintedProblemfalse
\gotprintedSolutionfalse
\gotprintedResultfalse

\newcommand*\exerciseTitle{}
\newcommand*\problemname{Problemstellung}
\newcommand*\solutionname{Lösungsweg}
\newcommand*\resultname{Ergebnis}

\newcommand{\inputExercise}[4]{%
\renewcommand*\exerciseTitle{#1}%
\ifnum#2 > 0 \printProblemtrue \else \printProblemfalse \fi%
\ifnum#3 > 0 \printSolutiontrue \else \printSolutionfalse \fi%
\ifnum#4 > 0 \printResulttrue \else \printResultfalse \fi%
\input{#1}}%

\newenvironment{exercise}[1]{%
\gotprintedProblemfalse
\gotprintedSolutionfalse
\gotprintedResultfalse
\refstepcounter{exercise}
\subsection*{(\theexercise) #1}
}{%
\ifprintProblem %
\ifgotprintedProblem\relax\else\typeout{Environmen t exercise: `\problemname' was requested for `\exerciseTitle' (\theexercise) but none was given!}%
\fi\fi%
\ifprintSolution %
\ifgotprintedSolution\relax\else\typeout{Environme nt exercise: `\solutionname' was requested for `\exerciseTitle' (\theexercise) but none was provided!}%
\fi\fi%
\ifprintResult %
\ifgotprintedResult\relax\else\typeout{Environment exercise: `\resultname' was requested for `\exerciseTitle' (\theexercise) but none was provided!}%
\fi\fi%
}

\newcommand\problem[1]{%
\ifprintProblem \noindent\textbf{\problemname:} #1\par\gotprintedProblemtrue\fi%
}
\newcommand\solution[1]{%
\ifprintSolution \noindent\textbf{\solutionname:} #1\par\gotprintedSolutiontrue\fi%
}
\newcommand\result[1]{%
\ifprintResult \noindent\textbf{\resultname:} #1\par\gotprintedResulttrue\fi%
}
\begin{document}
\inputExercise{LZI001}{1}{1}{0}
\inputExercise{LZI002}{0}{0}{1}
\inputExercise{LZI001}{1}{0}{0}
\end{document}

d. h. mit


%%% LZI002.tex:

\begin{exercise}{Titel eines anderen Beispiels}
\problem{%
Gegeben sei... (Angabe)%
}
\solution{%
Um dieses Beispiel zu lösen, geht man am besten wie folgt vor: ... (Lösung)%
}
\end{exercise}
dann siehst Du auch gleich was passiert, wenn eine Anforderung mal nicht erfüllt wird.;)
...nutzt natürlich nix, wenn die ganze exercise-Umgebung fehlt.:D

Wenn Du bei Umgebungen bleiben willst, dann schau Dir mal das comment-Paket an, afaik kannst Du da per \includecomment bzw. \excludecomment Deine Umgebungen entsprechend zum Nichts/-Tun überreden; vermutlich findest Du auch dazu hier bereits irgend einen Thread.;-)

MfG

yeahright
04-03-2008, 13:00
Hallo Rainer!

Wow, das ging ja schnell, vielen Dank! Wahrscheinlich ist es tatsächlich einfacher und sinnvoller, auf die environments zu verzichten und das ganze in commands zu verpacken. Ich werde mir die Lösung eingehend anschauen.

Viele Grüße,

Markus