PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Text ausblenden, enthaltene Tabellen aber mitzählen



ClaudiL
10-06-2013, 09:49
Hallo,

ich habe hier leider ein Problem, bei dem ich nicht sicher bin, ob es lösbar ist. Ich hoffe, ihr könnte mir dabei vielleicht weiterhelfen.

Ich habe eine Dokument, das eine Art Aufgabensammlung mit Lösungen darstellt. Die Struktur ist im Prinzip immer „Aufgabe 1 – Lösung 1 – Aufgabe 2 – Lösung 2 – usw.“. Es handelt sich dabei um eines meiner ersten LaTeX-Projekte und das erste in dieser Größenordnung. Daher stehe ich nun vor folgendem (möglicherweise konzeptionellen) Problem:
Ich brauche eine Möglichkeit, mit relativ wenigen Handgriffen ein Dokument nur mit den Aufgabenstellungen (ohne Lösungen) zu erstellen. Als ich das Dokument begonnen habe, habe ich mir leider keine genauen Gedanken gemacht, wie das funktionieren soll, doch da ich etwas Erfahrung mit Webtechnik habe, bin ich davon ausgegangen, es könnte eine gute Idee sein, Aufgabenstellungen und Lösungen in eigene Umgebungen zu packen, in der Hoffnung, sie wie mit CSS display:none; ausblenden zu können.
Daher habe ich mir zwei eigene Umgebungen definiert: question und answer. Mit dem comment-Paket komme ich meinem Ziel auch schon recht nahe: \excludecomment{answer}, und schon sind die Lösungen weg. Nur ein Problem entsteht, welches folgendes Minimalbeispiel hoffentlich verdeutlicht:



\documentclass[paper=a4]{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{ngerman}
\usepackage{hyperref}
\usepackage[german]{cleveref}

%\usepackage{comment} % Kommentierung dieser und der nächsten Zeile aufheben, um nur Fragestellungen zu erhalten
%\excludecomment{answer} % \newenvironment{answer} auskommentieren. Funktionert nicht, wegen Grafik- und Tabellen-Nummerierungen

\newenvironment{question}{\par\it}{}
\newenvironment{answer}{\par\centering\rule{11em}{ 0.5pt}\par}{}

\begin{document}
\begin{question}
Erste Fragestellung. Siehe Daten aus \cref{tab:q1}.
\begin{table}[htbp]
\caption{Tabelle zur ersten Fragestellung}\label{tab:q1}
\centering
\begin{tabular}{|c|}
\hline
foo \\
bar \\
\hline
\end{tabular}
\end{table}
\end{question}
\begin{answer}
Die Lösung befindet sich in \cref{tab:a1}.
\begin{table}[htbp]
\caption{Lösungs-Tabelle zur ersten Fragestellung}\label{tab:a1}
\centering
\begin{tabular}{|c|c|}
\hline
foo & 1\\
bar & 2\\
\hline
\end{tabular}
\end{table}
\end{answer}
\begin{question}
Zweite Fragestellung. Siehe Daten aus \cref{tab:q2}. (Hier muss \emph{immer} auf Tabelle \textbf{3} stehen! Dies ist zwar nach dem ersten Kompilieren noch gegeben, aber …)
\begin{table}[htbp]
\caption{Tabelle zur zweiten Fragestellung (Muss \emph{immer} Tabelle \textbf{3} heißen!)}\label{tab:q2}
\centering
\begin{tabular}{|c|}
\hline
baz \\
quz \\
\hline
\end{tabular}
\end{table}
\end{question}
\end{document}


Tabellen, die auskommentiert werden, werden logischerweise in der Nummerierung nicht berücksichtigt. Da ich aber eine durchgehende Nummerierung der Tabellen (über alle Fragen und Antworten hinweg) benötige, ist das ein Problem: Tabellen, die Teil der Antworten sind, fallen im Nur-Fragestellungen-Dokument weg. Nachfolgende Tabellen haben daher die falschen Nummern.
Die Frage ist, gibt es hierfür eine Lösung? Recherchen nach „Ausblenden von Textteilen“ liefern immer Antworten, die Auskommentieren empfehlen. Doch dies scheint hier keine Option. Ich benötige wohl eine Möglichkeit, dass die Antworten unsichtbar sind und keinen Platz einnahmen, aber dennoch intern „vorhanden“ sind.

Hat irgendjemand Ideen hierzu? Ich bin für alle Anregungen äußerst dankbar.

Viele Grüße
Claudi

u_fischer
10-06-2013, 10:00
Nun, es ginge schon. Du musst nur die Lösungen in einen Box speichern. Ggfs muss man die table-Umgebung lokal umdefinieren, damit sie nicht ins normale Dokument wandert. Aber ich persönlich halte es ja nicht für sehr glücklich, wenn es Löcher in der Nummerierung gibt. Und Gleitumgebungen in Aufgabenblättern würde ich auch eher vermeiden. Es will doch in so einer Situation keiner dauernd hin- und herblättern.

ClaudiL
10-06-2013, 10:19
Hallo,

danke für deine Antwort.


Nun, es ginge schon. Du musst nur die Lösungen in einen Box speichern. Ggfs muss man die table-Umgebung lokal umdefinieren, damit sie nicht ins normale Dokument wandert.

Hm, bekomme ich das durch reines Umdefinieren der answer- (und evtl. table-) Umgebung hin? Ich würde nach Möglichkeit gerne vermeiden, alle Antworten einzeln bearbeiten zu müssen, da das Dokument inzwischen schon recht umfangreich ist (>80 Seiten).


Aber ich persönlich halte es ja nicht für sehr glücklich, wenn es Löcher in der Nummerierung gibt.

Ja, optimal ist es nicht. Hauptziel ist es allerdings auch, ein möglichst gutes Komplettdokument (Fragen mit Antworten) zu haben, die Nur-Fragen-Version ist mehr ein Nebenprodukt. Und für das Hauptdokument halte ich die Nummerierung für äußerst sinnvoll, um auf Tabellen und Grafiken (diese sind vom Problem analog betroffen) Bezug nehmen zu können – über das gesamte Dokument hinweg.


Und Gleitumgebungen in Aufgabenblättern würde ich auch eher vermeiden. Es will doch in so einer Situation keiner dauernd hin- und herblättern.

Jain. Ich verwende bereits das placeins-Paket, um mit \FloatBarrier zu verhindern, dass Grafiken und Tabellen außerhalb ihrer Aufgabe gleiten. Allerdings Sind manche Antworten bis zu zwei Seiten lang und hier halte ich es für sinnvoll, zumindest innerhalb dieses Rahmens LaTeX die optimale Positionierung zu überlassen. Gerade diese Möglichkeit war einer meiner Hauptgründe für den Umstieg von Word auf LaTeX …

klops
10-06-2013, 12:19
\documentclass[paper=a4]{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{ngerman}
\usepackage{hyperref}
\usepackage[german]{cleveref}

\newif\ifanswer
\answertrue% Wenn die Antworten gesetzt werden sollen (sonst auskommentieren)

\newenvironment{question}{\par\it}{}
\newsavebox\answerbox
\makeatletter
\newcommand*{\eatoption}[1][]{}
\newenvironment{answer}{%
\par
\ifanswer\else
\renewenvironment*{@float}[1]{%
\def\@captype{##1}%
\noindent\begin{minipage}{\textwidth}
\eatoption
}{%
\end{minipage}%
}%
\let\cref\@gobble
\begin{lrbox}{\answerbox}
\fi
\centering\rule{11em}{0.5pt}
\par
}{%
\ifanswer\else\end{lrbox}\fi
\par
}
\makeatother

\begin{document}
\begin{question}
Erste Fragestellung. Siehe Daten aus \cref{tab:q1}.
\begin{table}[htbp]
\caption{Tabelle zur ersten Fragestellung}\label{tab:q1}
\centering
\begin{tabular}{|c|}
\hline
foo \\
bar \\
\hline
\end{tabular}
\end{table}
\end{question}
\begin{answer}
Die Lösung befindet sich in \cref{tab:a1}.
\begin{table}[htbp]
\caption{Lösungs-Tabelle zur ersten Fragestellung}\label{tab:a1}
\centering
\begin{tabular}{|c|c|}
\hline
foo & 1\\
bar & 2\\
\hline
\end{tabular}
\end{table}
\end{answer}
\begin{question}
Zweite Fragestellung. Siehe Daten aus \cref{tab:q2}. (Hier muss \emph{immer} auf Tabelle \textbf{3} stehen! Dies ist zwar nach dem ersten Kompilieren noch gegeben, aber …)
\begin{table}[htbp]
\caption{Tabelle zur zweiten Fragestellung (Muss \emph{immer} Tabelle \textbf{3} heißen!)}\label{tab:q2}
\centering
\begin{tabular}{|c|}
\hline
baz \\
quz \\
\hline
\end{tabular}
\end{table}
\end{question}
\end{document}

Ggf. müssen allerdings weitere Vorkehrungen getroffen werden, um Querverweise sicher zu stellen. Für \cref habe ich das mal beispielhaft gemacht, ohne eventuelle Sternformen oder optionale Argumente zu berücksichtigen …

ClaudiL
10-06-2013, 17:58
Hallo klops,

vielen Dank für deine Antwort und Mühe, das ist ja fast schon perfekt. Fast …
Im Beispiel funktioniert ja alles, wie es soll. Leider gibt es Probleme, sobald itemize-Umgebungen ins Spiel kommen:


\documentclass[paper=a4]{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{ngerman}
\usepackage{hyperref}
\usepackage[german]{cleveref}

\newif\ifanswer
%\answertrue% Wenn die Antworten gesetzt werden sollen (sonst auskommentieren)

\newenvironment{question}{\par\it}{}
\newsavebox\answerbox
\makeatletter
\newcommand*{\eatoption}[1][]{}
\newenvironment{answer}{%
\par
\ifanswer\else
\renewenvironment*{@float}[1]{%
\def\@captype{##1}%
\noindent\begin{minipage}{\textwidth}
\eatoption
}{%
\end{minipage}%
}%
\let\cref\@gobble
\begin{lrbox}{\answerbox}
\fi
\centering\rule{11em}{0.5pt}
\par
}{%
\ifanswer\else\end{lrbox}\fi
\par
}
\makeatother

\begin{document}
Text.
\begin{answer}
\begin{itemize}
\item Item.
\end{itemize}
\end{answer}
\end{document}

Da ich leider nicht wirklich nachvollziehen kann, wie du das hingezaubert hast, kann ich es auch nicht selbst anpassen. Könntest du vielleicht ein kurzen Worten kommentieren, was du da gemacht hast? Das würde meinem Verständnis sicher weiterhelfen.
Welche Probleme siehst du denn bezüglich der Querverweise, worauf wäre hier zu achten?

Nochmals vielen Dank für deine Mühe!

klops
11-06-2013, 06:44
Ich hatte vergessen, dass eine lrbox-Umgebung eines horizontale Box erzeugt. Deshalb wird noch eine minipage benötigt:
\documentclass[paper=a4]{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{ngerman}
\usepackage{hyperref}
\usepackage[german]{cleveref}

\newif\ifanswer
%\answertrue% Wenn die Antworten gesetzt werden sollen (sonst auskommentieren)

\newenvironment{question}{\par\itshape}{}% \it ist überholt, bitte nicht mehr
% verwenden!
\newsavebox\answerbox
\makeatletter
\newcommand*{\eatoption}[1][]{}
\newenvironment{answer}{%
\par% Neuer Absatz
\ifanswer\else
% Für den Fall, dass die Antworten ausgeblendet werden sollen:
\renewenvironment*{@float}[1]{% - Gleitumgebungn so umdefinieren, dass sie
% nicht mehr gleiten. Dazu
\def\@captype{##1}% * den caption-Typ setzen, damit \caption funktioniert
\noindent% * ohne Einzug
\begin{minipage}{\textwidth}% eine minipage über die gesamte
% Seitenbreite setzen
\eatoption% * das optionale Argument der Gleitumgebung vernichten
}{% * Am Ende der Gleitumgebung
\end{minipage}% die minipage-Umgebung wieder beenden
}%
\let\cref\@gobble% - \cref so umdefinieren, dass nur das Argument
% vernichtet, aber kein Querverweis erzeugt wird.
\begin{lrbox}{\answerbox}% - Den Inhalt der answer-Umgebung in die Box
% \answerbox schreiben (siehe usrguide).
\begin{minipage}{\linewidth}% - Eine minipage über die gesamte Breite
% beginnen
\fi
\centering\rule{11em}{0.5pt}
\par
}{%
\ifanswer\else
\end{minipage}% - Die minipage beenden.
\end{lrbox}% - Die \answerbox schließen, aber nicht ausgeben.
\fi
\par
}
\makeatother

\begin{document}
Text.
\begin{answer}
\begin{itemize}
\item Item.
\end{itemize}
\end{answer}
\end{document}
Das Problem mit den Querverweisen ist, dass das Ziel (nämlich das \label) nicht mehr existiert, das die Box nie ausgegeben wird. Deshalb bekommt man ggf. Warnungen wegen nicht vorhandener Labels. Das gilt auch, wenn die zugehörigen Querverweise in der Antwort stehen, weil die Antworten ja durchaus noch zusammengebaut werden. Du kannst das mit obigem Beispiel selbst ausprobieren, indem Du die Zeile mit der Umdefinierung von \cref auskommentierst. Das gibt dann eine Warnung wegen angeblich referenziertem nicht vorhandenem Label, obwohl die Referenzierung genausowenig wie das Label ausgegeben wird. Klingt jetzt kompliziert, wird aber durch Ausprobieren verständlicher. Die Ursache ist, dass \ref bereits beim Bau der Box aufgelöst wird, während \label erst bei der Ausgabe der Box in die aux-Datei schreiben würde. Die Box wird aber nie ausgegeben.

ClaudiL
11-06-2013, 10:12
Hallo klops,

phantastisch, jetzt funktioniert es!
Das it habe ich ersetzt (hatte ich für eine kurzform von textit gehalten) und neben \let\cref\@gobble% habe ich auch noch \let\ref\@gobble% eingefügt, um diesbezügliche Fehlermeldungen zu unterbinden (ich verwende an einigen Stellen \ref). Die letzte verbleibende Warnung bezieht sich auf eine „overfull \hbox“, die ich aber nirgends sehe. Gehe ich richtig in der Annahme, dass es sich dabei vermutlich um einen ausgeblendeten Bereich handelt und ich die Meldung somit ignorieren kann?

Das Problem mit den Querverweisen ist, dass das Ziel (nämlich das \label) nicht mehr existiert, das die Box nie ausgegeben wird. Deshalb bekommt man ggf. Warnungen wegen nicht vorhandener Labels. Das gilt auch, wenn die zugehörigen Querverweise in der Antwort stehen, weil die Antworten ja durchaus noch zusammengebaut werden. Du kannst das mit obigem Beispiel selbst ausprobieren, indem Du die Zeile mit der Umdefinierung von \cref auskommentierst. Das gibt dann eine Warnung wegen angeblich referenziertem nicht vorhandenem Label, obwohl die Referenzierung genausowenig wie das Label ausgegeben wird. Klingt jetzt kompliziert, wird aber durch Ausprobieren verständlicher. Die Ursache ist, dass \ref bereits beim Bau der Box aufgelöst wird, während \label erst bei der Ausgabe der Box in die aux-Datei schreiben würde. Die Box wird aber nie ausgegeben.

Klingt logisch, vielen Dank für die Erklärung. Auch deine Kommentare im Code haben mir sehr weitergeholfen – und gezeigt, was es noch so alles zu lernen gibt.

Vielen dank für deine Hilfe
Claudi

klops
11-06-2013, 11:02
Du kannst mit der Klassenoption draft alle sichtbaren overfull \hboxes mit einem schwarzen Balken markieren lassen. Ich habe übrigens keine overfull \hbox in obigem Beispiel. Eventuell hast Du irgendwo ein signifikantes Leerzeichen (http://www.komascript.de/signifikanteLeerzeichen) hinzugefügt, als Du den Code übernommen hast.

ClaudiL
11-06-2013, 13:05
Du kannst mit der Klassenoption draft alle sichtbaren overfull \hboxes mit einem schwarzen Balken markieren lassen.

Was es nicht alles an nützlichen Optionen gibt …


Ich habe übrigens keine overfull \hbox in obigem Beispiel. Eventuell hast Du irgendwo ein signifikantes Leerzeichen (http://www.komascript.de/signifikanteLeerzeichen) hinzugefügt, als Du den Code übernommen hast.
Die overfull \hbox tritt nicht im Beispielcode, sondern in meinem tatsächlichen Projekt auf. Auch mit der draft-Option wird mir nichts angezeigt; die Zeilennummern beziehen sich aber auf eine figure innerhalb einer ausgeblendeten answer-Umgebung, weshalb ich annehme, das Problem ignorieren zu können (ist nichts ausgeblendet, gibt es auch keine Warnungen).

klops
11-06-2013, 13:36
Nur zur Erklärung: Da die ausgeblendete figure-Umgebung keine Gleitumgebung mehr ist, kann es sein, dass hier irgendwelche Leerzeichen oder Umbrüche anders interpretiert werden als bei einer Gleitumgebung. Das kann dann durchaus zu einer overfull (oder auch underfull) \hbox führen. Beispielsweise gleitet eine solche Umgebung dann auch nicht mehr aus einer Liste heraus. Innerhalb einer Liste steht aber horizontalen üblicherweise weniger Platz zur Verfügung. Es gibt sicher einige solcher Nebenwirkungen. Die meisten davon könnte man, sobald sie erkannt sind, sicher beseitigen. Auf der anderen Seite bedeutet das aber auch Aufwand. Pragmatisch betrachtet ist Deine Entscheidung daher goldrichtig.

ClaudiL
11-06-2013, 14:37
Hallo klops,

danke auch für diese Erklärung. Du hast richtig vermutet, die figure steht innerhalb einer Liste. Sollte mich die Meldung weiter stören, kann ich das ja ändern. Ansonsten tut's auch nicht weh.

Danke nochmal für deine Unterstützung bei diesem Problem, an das ich sonst sicher noch sehr viel Zeit verschwendet hätte …