Sie sind hier

Inhaltsverzeichnis mit zweispaltigen Seitenangaben (fuer Aufgaben und Loesungen)?

Hallo zusammen,

Ich wuerde gerne ein Inhaltsverzeichnis (TOC) wie im Buch "One thousand exercises in
probability" (Grimmett, Stirzaker) erstellen. Das ist ein Aufgabenbuch das aus
zwei Teilen besteht: Alle Aufgaben und dann alle Loesungen. Nun sieht es nicht
so toll aus wenn alle Chapters/Sections zweimal hintereinander im
TOC auftauchen. Daher haben Grimmett und Stirzaker (damals noch
von Hand) ein TOC gebaut bei dem alle Chapters und Sections
genau 1x auftauchen, daneben in einer Spalte dann die Seitenzahlen fuer die
Aufgaben und in einer weiteren Spalte die Seitenzahlen fuer die Loesungen (hier
noch ein screenshot:
http://tex.stackexchange.com/questions/267045/table-of-contents-page-num...
bzw. siehe Code unten)

Okay, bei mir sollen die Sections nicht nummeriert sein aber trotzdem im Head
und im TOC auftauchen. Das sollte mit \addsec gehen. Wie man unten sieht,
funktioniert das auch. Nur habe ich noch folgende Problem (welche vermutlich
alle zusammenhaengen und daher hier in einem Post erwaehnt werden):

1) Die Seitenzahlen fuer die Loesungen tauchen nicht im TOC auf. Das liegt
irgendwie daran, dass ich mit \addsec arbeite und nicht mehr mit \section.

2) Wenn man die Nickelbrille bemueht stellt man fest, dass die Seitenzahlen
(3,21) der Sections nicht mehr rechtsbuendig vertikal an der Seitenzahl des
Chapters ausgerichtet sind. Ich weiss nicht warum (aber der urspruengliche
Loesungsvorschlag basierend auf \section unter obigem Link hatte das Problem
nicht).

3) Ein weiteres Problem sieht man die Loesungen auf einer 3-stelligen Seitenzahl
sind, die Aufgaben auf einer 2-stelligen Seitenzahl. Da der Abstand zwischen
beiden Seitenzahlen konstant (via \hspace) gemacht ist, stimmt daher die
vertikale Ausrichtung der Seitenzahlen der Aufgaben auch nicht mehr (alle die
deren Loesungen auf einer 3-stelligen Seitenzahl sind, sind um eine Stelle nach
links verschoben).

Wie macht man das richtig? (ich hab' auch noch mein Glueck mit einer Tabelle von
Seitenzahlen probiert [wo zumindest die Ausrichtung einfacher waere], bin aber gescheitert).

Ich sehe ein, dass das kein 'alltaegliches Problem' ist, hoffe aber dass man das
via komascript aber noch recht einfach umsetzen kann (bloss geht das ueber mein
LaTeX-Wissen hinaus).

Danke & LG,
Marius

PS: Das Problem ist auch auf
http://tex.stackexchange.com/questions/270623/table-of-contents-chapters...
gepostet, aber ich habe (noch) keine brauchbare Antwort bekommen.

\documentclass{scrbook}
 
\usepackage{scrlayer-scrpage}
\usepackage{titletoc}
\usepackage{hyperref}
 
% TOC
% {section}, [left], {above}, {before with label (left side)}, {before wo label
% (left side)}, {filler and page}, [after]
\titlecontents{chapter}[1.9em]{\addvspace{1pc}\sffamily\bfseries}{\contentslabel{1.7em}}{}
    {\hfill\contentspage\hspace{5.4em}\pageref{\thecontentslabel}\hspace*{-1.4em}}
\titlecontents{section}[2em]{\addvspace{0.1pc}}{\contentslabel{2.5em}}{}
    {\hfill\contentspage\hspace{6.02em}\hyperlink{\thecontentslabel}{\pageref{\thecontentslabel}}\hspace*{-1.5em}}
\newcommand{\addsecsol}[2]{\hypertarget{#2}{\addsec{#1}\label{#2}}}% define solution section, which is shown in toc
 
\begin{document}
\pagestyle{scrheadings}
 
% Preface (probably other chapters of this type, title page etc.)
\chapter*{Preface}\label{chap:pref}
Special thanks go to Markus Kohm for helping our limited minds concering special
typesetting requests.
 
% Table of Contents
\cleardoublepage
\pdfbookmark[0]{\contentsname}{toc}
\addtocontents{toc}{{\sffamily\bfseries Preface\hfill\pageref{chap:pref}}\par}% put preface in toc (manually)
\addtocontents{toc}{\vspace{1em}\hfill Exercises\hspace*{1.4em}Solutions\par}% header for toc
\tableofcontents
% No list of tables or figures planned:
% \listoftables
% \listoffigures
 
% Exercises
\chapter{Topic 1}\label{chap:01}
\addsec{Basic exercises}
Foo on Topic 1
\addsec{More advanced exercises}
Bar on Topic 1
 
\chapter{Topic 2}\label{chap:02}
\addsec{Basic exercises}
Foo on Topic 2
\addsec{More advanced exercises}
Bar on Topic 2
 
% Solutions
\setcounter{chapter}{0}% start chapter numbering again
\addtocontents{toc}{\protect\setcounter{tocdepth}{-1}}
 
\chapter{Solutions to Topic 1}\label{1}
\addsecsol{Basic exercises}{1.1}
The solution to Foo works as follows.
\addsecsol{More advanced exercises}{1.2}
The solution to Bar works as follows.
 
\chapter{Solutions to Topic 2}\label{2}
\addsecsol{Basic exercises}{2.1}
The solution to Foo works as follows.
\addsecsol{More advanced exercises}{2.2}
The solution to Bar works as follows.
 
\addtocontents{toc}{\protect\setcounter{tocdepth}{2}}% display contents (down to subsections) in toc again
 
% Bibliography and index
% \printbibliography[title={References}]\label{bib}% without number
% \printindex\label{ind}% without number
\addtocontents{toc}{\vspace{1em}{\sffamily\bfseries References\hfill\pageref{bib}}\par}% put bib in toc (manually)
\addtocontents{toc}{\vspace{1em}{\sffamily\bfseries Index\hfill\pageref{ind}}\par}% put index in toc (manually)
\end{document}
Bild von Markus Kohm

Ich habe zwar eine Idee, wie das ganz vollautomatisch und unter Verzicht auf titletoc funktionieren könnte:

\documentclass{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}% Natürlich nicht bei xelatex oder lualatex!
\usepackage[ngerman]{babel}
\usepackage{hyperref}
 
\makeatletter
% Wir müssen natürlich wissen, ob wir uns gerade mit Problemen oder Lösungen
% beschäftigen. Dazu wird ein Schalter definiert und drei Anweisungen zum
% Umschalten zwischen Problemen und Lösungen und weder noch.
\newcommand*{\SolutionOrProblem}{-1}
\newcommand*{\Problems}{%
  \renewcommand*{\SolutionOrProblem}{0}%
  \addtocontents{toc}{%
    \protect\def\protect\SolutionOrProblem{\SolutionOrProblem}}%
}
\newcommand*{\Solutions}{%
  \renewcommand*{\SolutionOrProblem}{1}%
  \addtocontents{toc}{%
    \protect\def\protect\SolutionOrProblem{\SolutionOrProblem}}%
}
\newcommand*{\NeitherProblemsNorSolutions}{%
  \renewcommand*{\SolutionOrProblem}{-1}%
  \addtocontents{toc}{%
    \protect\def\protect\SolutionOrProblem{\SolutionOrProblem}}%
}
% Außerdem nummerieren wir die Lösungseinträge ins Inhaltsverzeichnis durch,
% so dass wir bei den Lösungen einfach darauf verweisen können. 
\newcounter{problem}
% Genauso nummerieren wir die Lösungen selbst durch, damit wir automatische
% Labels vergeben können.
\newcounter{solution}
% Im Inhaltsverzeichnis werden statt nur der Seitenzahlen der Probleme nun die
% Seitenzahlen der Probleme und die Seitenverweise auf die Lösungen
% ausgegeben.
% Da das für mehrere Ebenen gleich funktioniert, wird dafür eine eigene
% Umdefinierungsanweisung für die \l@chapter, \l@section etc. definiert:
\newcommand*{\renewlcommand}[1]{%
  \expandafter\let\csname orig@l@#1\expandafter\endcsname
    \csname l@#1\endcsname
  \expandafter\renewcommand\expandafter*\csname l@#1\endcsname[2]{%
    \ifcase\SolutionOrProblem
      % 0 = Problem
      \stepcounter{problem}%
      \csname orig@l@#1\endcsname{##1}{%
        \makebox[\problempagenumberwidth][r]{\hyperpage{##2}}\hfill
        \makebox[\solutionpagenumberwidth][r]{\pageref{sol:\theproblem}}%
      }%
    \or
      % 1 = Lösung (nicht ausgeben)
    \else
      % sonst: weder Problem noch Lösung
      \csname orig@l@#1\endcsname{##1}{##2}%
    \fi
  }%
}
\renewlcommand{chapter}
\renewlcommand{section}
\renewlcommand{subsection}
% Hinweis: Hier ggf. \renewlcommand{subsubsection} etc. einfügen.
% Im
\let\orig@addcontentsline\addcontentsline
\renewcommand*{\addcontentsline}[3]{%
  \ifnum\SolutionOrProblem=\@ne% Lösungseinträge ins Inhaltsverzeichnis
    \ifstr{#1}{toc}{% mit einem Label versehen
      \stepcounter{solution}\label{sol:\thesolution}%
    }{}%
  \fi
  % Einträge immer erzeugen (werden ggf. von \l@… vernichtet).
  % alternativ könnte man hier auch nur Einträge erzeugen, wenn
  % \SolutionOrProblem nicht 1 ist, also es sich nicht um Lösungen handelt.
  \orig@addcontentsline{#1}{#2}{#3}%
}
 
\newlength{\problempagenumberwidth}
\newlength{\solutionpagenumberwidth}
\AtBeginDocument{%
  \settowidth{\problempagenumberwidth}{Problem}%
  \settowidth{\solutionpagenumberwidth}{Lösung}%
  \edef\@pnumwidth{%
    \the\dimexpr \problempagenumberwidth 
               + \solutionpagenumberwidth
               + \@pnumwidth
         \relax
  }%
}
\AfterTOCHead[toc]{%
  \hspace*{\fill}%
  \makebox[\@pnumwidth][r]{%
    \makebox[\problempagenumberwidth][r]{Problem}\hfill
    \makebox[\solutionpagenumberwidth][r]{Lösung}}\par
}
\AfterReadingMainAux{%
  \ifnum\value{problem}=\value{solution}\else
    \typeout{Warning: Number of problems differ from number of solutions!}%
  \fi
}
\makeatother
 
\usepackage{mwe}
 
\setcounter{secnumdepth}{0}% Wenn nur die Kapitel nummeriert werden sollen.
 
\begin{document}
\tableofcontents
 
\Problems
\chapter{Problem Kapitel A}\label{cha:pA}
Die Lösungen sind in \autoref{cha:lA} ab \autopageref{cha:lA} zu finden.
\section{Teilproblem A}\label{sec:pA}
\lipsum
\section{Teilproblem B}\label{sec:pB}
\lipsum
 
\chapter{Problem Kapitel B}
\blindtext
\section{Teilproblem C}
\lipsum
\section{Teilproblem D}
\lipsum
 
\Solutions
\chapter{Lösung Kapitel A}\label{cha:lA}
Dies sind die Lösungen zu Kapitel "`\nameref{cha:pA}"' mit den Abschnitten
"`\nameref{sec:pA}"' und "`\nameref{sec:pB}"'.
\section{Teillösung A}
\lipsum
\section{Teillösung B}
\lipsum
 
\chapter{Lösung Kapitel B}
\blindtext
\section{Teillösung C}
\lipsum
\section{Teillösung D}
\lipsum
 
\NeitherProblemsNorSolutions
\addchap{\bibname}
 
\end{document}

Damit der Vorschlag funktioniert, müssen Probleme und Lösungen in exakt gleicher Abfolge angegeben sein. Sicher ist der Vorschlag (mit entsprechenden Befehlen in die toc-Datei bzw. im Text) auch im fehlende Probleme oder fehlende Lösungen erweiterbar. Ausgeführt ist dies bisher aber nicht.

Aber, falls dir das nicht ausreicht habe ich dazu noch ein paar Fragen:

  1. Derzeit ist bei Dir die Problemstellung Kapitel 1 und die Lösung Kapitel 2. Ich frage mich, ob das wirklich so sinnvoll ist. Da es ohnehin nur einen Eintrag gibt, wäre es da nicht sinnvoller, wenn die Nummern gleich wären?
  2. Besteht der Aufgabenteil nur aus dem einen Kapitel oder kann er mehrere Kapitel haben?
  3. Können sich Aufgabenteil und Lösungsteil abwechseln oder gibt es erst einen Aufgaben- und dann einen Lösungsteil?
  4. Gibt es nach dem Lösungsteil noch Kapitel im Inhaltsverzeichnis beispielsweise ein Literaturverzeichnis? Wie sollen diese dargestellt werden?
  5. Muss das ganze am Ende mit Links funktionieren?
  6. Wie sind \subsection im Aufgaben/Lösungsteil zu behandeln?
  7. Gbt es Abbildungs- oder Tabellenverzeichnis und wie sind diese bezüglich Aufgaben und Lösungen zu behandeln?

Je nachdem, wie die Antworten ausfallen, müsste obige Lösung erweitert oder abgewandelt werden. Das Grundprinzip sollte jedoch unabhängig davon funktionieren.

Unabhängig davon sei auch darauf hingewiesen, dass es diverse Pakete für Fragen und Antworten gibt, beispielsweise exsheets. Teilweise bieten diese auch Verzeichnisse.

Hi Markus,

Ich hab's jetzt mal in das Originaldokument eingebaut. Das sieht schon sehr gut aus!

Hier noch zwei "follow-up" Fragen:
1) Vor dem 1. Kapitel mit Loesungen sollte noch \setcounter{chapter}{0} ausgefuehrt werden, so dass die Nummerierung der Loesungskapitel mit der der Aufgabenkapitel uebereinstimmt. Kann man das noch automatisch durch \Solutions machen lassen?

2) Wenn ich mit \addchap das Preface hinzufuege, dann taucht es "unterhalb" der Spaltenueberschriften im Inhaltsverzeichnis auf (also die Seitenzahl steht dann unterhalb der Spalte "Loesung". Kann man es auch oberhalb erscheinen lassen? Also die Zeile mit dem Preface erscheint "normal", danach etwas Platz und dann die "Spaltenueberschriften" "Problem" und "Loesung"...

3) Was mir noch aufgefallen ist (z.B. S. 16 in Deinem MWE): Auf Seiten direkt vor einem neuen Kapitel fehlt stets header & Seitenzahl. Ist das ein neues Feature? (ich denke mal nicht, aber mein letztes Buch (= Diss) war 2010 und da wurden die Seitenzahl und Header auf diesen Seiten noch angezeigt). Kann man Kopf & Seitenzahl auf diesen Seiten auch wieder einblenden?

LG
Marius

Bild von Markus Kohm

Kann man das noch automatisch durch \Solutions machen lassen?

Du kannst in die Definition von \Solutions noch einfügen, was immer Du möchtest. Allerdings solltest Du Dich bei identisch nummerierten Kapiteln nicht wundern, wenn hyperref dann nicht mehr korrekt verlinken kann. Um das zu verhindern, muss man dafür sorgen, dass \theHchapter über alle Kapitel hinweg eindeutig ist. Spätestens das ist aber kein KOMA-Script-Problem mehr.

2) Wenn ich mit \addchap das Preface hinzufuege, dann taucht es "unterhalb" der Spaltenueberschriften im Inhaltsverzeichnis auf (also die Seitenzahl steht dann unterhalb der Spalte "Loesung". Kann man es auch oberhalb erscheinen lassen?

Das hängt alleine davon ab, mit welchen Mitteln man die Spaltenüberschriften in das Verzeichnis schreibt. Da Du aber, wenn ich Dich richtig verstanden habe, auch ein Literaturverzeichnis und einen Index ins Inhaltsverzeichnis eintragen willst, hast Du dort dann genau dasselbe Problem, nur dass diese am Ende des Inhaltsverzeichnisses stehen und man Spaltenüberschriften nicht einfach wieder zurück nehmen kann. Also würde ich das einheitlich machen.

Hier zeigt sich dann auch, wie ungünstig es ist, das Inhaltsverzeichnis mit einem anderen Verzeichnis zu vermischen. Würde man ein eigenes Verzeichnis "Probleme und Lösungen" verwenden, in dem nur Probleme mit Lösungen aufgeführt werden, hätte man dieses Problem gar nicht erst.

3) Was mir noch aufgefallen ist (z.B. S. 16 in Deinem MWE): Auf Seiten direkt vor einem neuen Kapitel fehlt stets header & Seitenzahl. Ist das ein neues Feature?

Das ist eine Frage, die mit dem eigentlichen Problem nichts zu tun hat und deshalb getrennt mit eigenem Minimalbeispiel gestellt werden sollte.

Hi Markus,

Danke Dir, ich habe gerade noch mein Minimalbeispiel (nicht mehr ganz so minimal) gemaess Deiner Fragen geaendert. Hier noch die Antworten auf Deine Fragen:

1) siehe geaendertes Minimalbeispiel.
2), 6) Der Aufgabenteil (und damit der Loesungsteil, der die Aufgaben widerspiegelt) besteht aus mehreren Kapiteln. Momentan hat jedes Kapitel zwei Sections (fuer einfache/schwierige Aufgaben). Bei den Sections macht Nummerierung keinen Sinn (da das Aufgabenbuch analog zu einem Textbuch (mit gleichen Kapitelueberschriften) ist und dann wuerden die Sections nicht mehr zu denen im Textbuch passen). Was aber Sinn machen koennte (wenn wir mehr Aufgaben haben) ist, dass wir auch die Sections wie im Textbuch einbauen, dann wuerden die Subsections ohne Nummerierung sein und wieder fuer einfache/schwierige Aufgaben verwendet werden.
3) Wir haben vor, zuerst alle Aufgaben und dann alle Loesungen aufzufuehren. Ansonsten ist es (laut meiner Coautoren) zu einfach direkt zur Loesung zu springen...
4) Genau, das gibt es (Literaturverzeichnis + Index). Auch vor "Preface" kommt vermutlich noch was
5) Das waer natuerlich super :-)
7) Das haben wir nicht vor einzubauen. Es wird wenig Bilder/Tabellen geben.

LG und ich bin jetzt schon auf Deinen Loesungsansatz gespannt.
Marius

Hi Markus,

Danke Dir.

zu 1) Ich habe \setcounter{chapter}{0} nun bei der definition von
\Solutions eingebaut. Eine Loesung zum Problem mit den Links das du angesprochen hast ist hier zu finden
http://tex.stackexchange.com/questions/6098/wrong-hyper-references-after... (fuer die die es interessiert).

zu 2) Es ist 'hackish', aber man kann natuerlich das Preface als \chapter* machen (manuell dann den Header anpassen via \markboth) und dann die Definition von \AfterTOCHead mit {\sffamily\bfseries Preface\hspace*{\fill}\pageref{chap:pref}}\\[0.9em] beginnen (oder so...). Das waere dann die Alternative. Fuer ein Extraverzeichnis fuer die Teile die nicht Probleme oder Loesungen betreffen, hat man vermutlich zu wenig Eintraege (Preface, References, Index).

Viele liebe Gruesse & danke fuer die schnelle Hilfe (ich werde Deine Loesung nachher auf tex.stackexchange noch verlinken),

Marius

Comments for "Inhaltsverzeichnis mit zweispaltigen Seitenangaben (fuer Aufgaben und Loesungen)?" abonnieren