Inkompatibilität zwischen tocstyle und KOMA-Script

Klassen und Pakete zur einfachen Umsetzung individueller Vorstellungen


senf_topf
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Mi 6. Dez 2017, 08:01
Wohnort: Dresden

Inkompatibilität zwischen tocstyle und KOMA-Script

Beitrag von senf_topf »

Hallo,

ich werde demnächst mit meiner Bachelorarbeit beginnen und nutze daher meinen zu schreibenden Praktikumsbericht, um mich in LaTeX einzuarbeiten, bin also noch ein Neuling.
Mein Prof fordert, dass es am Ende des Dokuments vor dem Anhang ein Anhangsverzeichnis gibt, welche alle Inhalte des Anhangs auflistet, so auch die Inhalte der CD. Dafür nutze ich den im Minimalbeispiel unter "%Für separates Anhangsverzeichnis" aufgezeigten Code, den ich von hier bezogen habe.

Wenn ein neues chapter im Anhang hinzugefügt wird, wird es in das Anhangsverzeichnis eingebunden und im Inhaltsverzeichnis unterdrückt. Das funktioniert soweit so gut.
Möchte ich nun allerdings dem Anhangsverzeichnis eine Zeile für ein auf der CD liegenden Anhang hinzufügen, so möchte ich dafür keine leere Seite mit einer Überschrift erstellen, sondern "händisch" eine Zeile hinzufügen, welche entweder keine Seitennummer besitzt oder anstatt der Seitennummer ein "CD-ROM" eingefügt ist.
Dies habe ich mittels tocstyle und cftaddtitleline hinbekommen. Problem ist nur, dass sich dieses mit KOMA-Script nicht verträgt und dann listof=totoc keine Wirkung mehr zeigt, sodass mein Abbildungsverzeichnis nicht im Inhalt aufgeführt wird.

addcontentsline funktioniert in der Hinsicht besser, allerdings kann ich damit nicht die Seitennummern unterdrücken.

Daher nutze ich derzeit addtocontents, was allerdings nicht nur einen Eintrag im Abbildungsverzeichnis sondern auch im globalen Inhaltsverzeichnis erstellt. Um dies zu umgehen, ändere ich nach dem ersten Kompiliervorgang die *.toc Datei so um, dass händisch hinzugefügte Zeilen dem Format eines chapters entsprechen, damit bekomme ich sowohl Inhalts- als auch Abbildungsverzeichnis nach Vorgaben.

Nun meine Frage: Ist eine Lösung der Inkompatibilität zwischen KOMA und tocstyle bekannt oder gibt es eine Möglichkeit, mittels addcontentsline die Seitennummern zu unterdrücken bzw. auf "CD-ROM" zu ändern? Am schönsten wäre natürlich die tatsächliche Erstellung eines "unsichtbaren" chapter, da ich dieses dann auch aus dem Text heraus referenzieren kann.
Für Hilfe wäre ich sehr dankbar, da meine derzeitige Lösungsvariante alles andere als sauber und komfortabel ist.

Fehler im Minimalbeispiel wie das falsche Darstellen von Umlauten und das List of figures auf Englisch erscheint bitte nicht beachten, in meinem Hauptdokument sind diese Fehler nicht vorhanden und müssen daher auch nicht betrachtet werden.
Hier das Minimalbeispiel mit addcontents:
%KOMA-Script Dokumentenklasse scrbook verwendet
\documentclass[pdftex,a4paper,12pt,halfparskip,listof=totoc,bibliography=totoc]{scrreprt}

%Paket zum Übersetzen, babel erkennt Sprache
\usepackage[ngerman,english]{babel}

%Eingabe von Umlauten
\usepackage[latin1]{inputenc}

%Verwenden von T1 Fonts und lmodern zum beheben der verpixelten Schrift
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{textcomp}

%Ändern der Seitenränder
\usepackage[left=3.5cm,right=3cm,top=2cm,bottom=2cm]{geometry}

%Links aus Inhaltsverzeichnis
\usepackage[colorlinks,
pdfpagelabels,
pdfstartview = FitH,
bookmarksopen = true,
bookmarksnumbered = true,
linkcolor = black,
plainpages = false,
hypertexnames = false,
citecolor = black] {hyperref}

%Abkürzungsverzeichnis
\usepackage{acronym}

%Für separates Anhangsverzeichnis
%normales Ihaverz einfügen mit \maintoc
%im Anhang erst Anhang ankündigen mit \appendix und dann Anhangsverzeichnis einfügen mit \appendixtoc
\usepackage{tocstyle}
\makeatletter% --> De-TeX-FAQ
\newcommand*{\maintoc}{% Hauptinhaltsverzeichnis
  \begingroup
    \@fileswfalse% kein neues Verzeichnis öffnen
    \renewcommand*{\appendixattoc}{% Trennanweisung im Inhaltsverzeichnis
      \value{tocdepth}=-10000 % lokal tocdepth auf sehr kleinen Wert setzen
    }%
    \tableofcontents% Verzeichnis ausgeben
  \endgroup
}
\newcommand*{\appendixtoc}{% Anhangsinhaltsverzeichnis
  \begingroup
    \edef\@alltocdepth{\the\value{tocdepth}}% tocdepth merken
    \setcounter{tocdepth}{-10000}% Keine Verzeichniseinträge
    \renewcommand*{\contentsname}{% Verzeichnisname ändern
      Anhangsverzeichnis}%
    \renewcommand*{\appendixattoc}{% Trennanweisung im Inhaltsverzeichnis
      \setcounter{tocdepth}{\@alltocdepth}% tocdepth wiederherstellen
    }%
    \tableofcontents% Verzeichnis ausgeben
    \setcounter{tocdepth}{\@alltocdepth}% tocdepth wiederherstellen
  \endgroup
}
\newcommand*{\appendixattoc}{% Trennanweisung im Inhaltsverzeichnis
}
\g@addto@macro\appendix{% \appendix erweitern
  \if@openright\cleardoublepage\else\clearpage\fi% Neue Seite
  \addcontentsline{toc}{chapter}{\appendixname}% Eintrag ins Hauptverzeichnis
  \addtocontents{toc}{\protect\appendixattoc}% Trennanweisung in die toc-Datei
}
\makeatother


\begin{document}
%Inhalts- und Abbildungsverzeichnis
\pagenumbering{roman}
\maintoc

\addchap{Abkürzungsverzeichnis}
\begin{acronym}[PUE]
   \acro{Abk}{Abkürzung1}
   \acro{Abk2}{Abkürzung2}
\end{acronym}

\listoffigures

\pagenumbering{arabic}
\chapter{Einleitung}
Ein Text für die Einleitung mit erster \ac{Abk}.
\chapter{Zweites Kapitel}
Ein zweites Kapitel mit zweiter \ac{Abk2}
\begin{figure}[h]
	\centering
	\caption{picture}
	\label{fig:picture}
\end{figure}
\chapter{Fazit}
Ein Fazit.

%Anhangsverzeichnis
\appendix
\appendixtoc
\addtocontents{toc}{%
 \protect\noindent A \ Messwerte (auf CD)\protect\par
}
\addtocontents{toc}{%
 \protect\noindent B \ Literatur und Datenblätter (auf CD)\protect\par
}

\setcounter{chapter}{2}
\chapter{Verzeichnisbaum CD}
Hier kommt der Verzeichnisbaum der CD.


\end{document}
  

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Der von Dir verlinkte Thread auf komascript.de ist geschlossen, weil der Vorschlag mit dem Paket tocstyle veraltet ist. Das Paket wird nicht mehr weiter entwickelt und wird deshalb den Alpha-Status nie verlassen. Trotzdem sind KOMA-Script und tocstyle kompatibel.

Allerdings stammt der von Dir erwähnte Befehl \cftaddtitleline auch nicht aus diesem Paket. Insofern ist auch der Titel Deiner Frage falsch - Du meinst vermutlich Inkompatibilität KOMA-Script und Paket tocloft. Die beiden sind tatsächlich inkompatibel.

Aktuell ist der Vorschlag von Markus Kohm unter Mit einem aktuellen KOMA-Script geht alles viel einfacher, der die Möglichkeiten des ohnehin geladenen KOMA-Script Pakets tocbasic nutzt. Falls Du Mitglied bei dante bist, findest Du zusätzliche Erklärungen in einem Artikel von Markus in der DTK 3/2017.

Im folgenden Beispiel habe ich die für das Problem nicht relevanten Pakete und Einstellungen weggelassen. Achte darauf, dass Du keine veralteten KOMA-Script Optionen setzt, da ansonsten automatisch in einen Kompatibilitätsmodus gewechselt wird. Eine entsprechende Warnung solltest Du bei Deinem Beispiel erhalten haben.
\documentclass[pdftex,a4paper,12pt,
  parskip=half,% aktuelle Syntax verwenden!!
  listof=totoc,bibliography=totoc,
  twoside=false% einseitig
  ]{scrbook}% um \frontmatter und \mainmatter nutzen zu können

\usepackage[english,main=ngerman]{babel} 
\usepackage[utf8]{inputenc}% Overleaf nutzt utf8
\usepackage[T1]{fontenc} 
\usepackage{lmodern} 

\usepackage{xpatch}% zum patchen von \appendix

\usepackage[colorlinks,hidelinks]{hyperref}% in der Regel als letztes Paket laden
\usepackage{bookmark}% verbessert noch den Umgang mit Lesezeichen

% basierend auf https://komascript.de/comment/5578#comment-5578
\DeclareNewTOC[%
  owner=\jobname,
  listname={Inhalt des Anhangs},% Titel des Verzeichnisses
]{atoc}% Dateierweiterung (a=appendix, toc=table of contents)
\DeclareNewTOC[%
  listname={Abbildungen im Anhang},% Titel des Verzeichnisses
]{alof}% Dateierweiterung (a=appendix, lof=list of figures)
\DeclareNewTOC[%
  listname={Tabellen im Anhang},% Titel des Verzeichnisses
]{alot}% Dateierweiterung (a=appendix, lot=list of tables)

\DeclareTOCStyleEntry[
  level=\chaptertocdepth,
  indent=0pt,
  numwidth=1.5em,
  pagenumberbox=\cd
]{chapter}{cd}
\newcommand\cd[1]{{%
  \usekomafont{chapterentry}\usekomafont{chapterentrypagenumber}
  CD-ROM%
}}

\makeatletter
\newcommand\CDEintragImTOC[2]{%
  \refstepcounter{chapter}\label{app:#1}%
  \addxcontentsline{\ext@toc}{cd}[\thechapter]{#2}
}
\newcommand*{\useappendixtocs}{%
  \renewcommand*{\ext@toc}{atoc}%
  \scr@ifundefinedorrelax{hypersetup}{}{% damit es auch ohne hyperref funktioniert
    \hypersetup{bookmarkstype=atoc}%
  }%
  \renewcommand*{\ext@figure}{alof}%
  \renewcommand*{\ext@table}{alot}%
}
\newcommand*{\usestandardtocs}{%
  \renewcommand*{\ext@toc}{toc}%
  \scr@ifundefinedorrelax{hypersetup}{}{% damit es auch ohne hyperref funktioniert
    \hypersetup{bookmarkstype=toc}%
  }%
  \renewcommand*{\ext@figure}{lof}%
  \renewcommand*{\ext@table}{lot}%
}
\ifundefinedorrelax{ext@toc}{%
  \newcommand*{\ext@toc}{toc}
  \renewcommand{\addtocentrydefault}[3]{%
    \expandafter\tocbasic@addxcontentsline\expandafter{\ext@toc}{#1}{#2}{#3}%
  }
}{}
\makeatother

\xapptocmd\appendix{%
  \addpart{\appendixname}
  \useappendixtocs
  \listofatocs
  %\listofalofs
  %\listofalots
}{}{}

\begin{document}
\frontmatter
\tableofcontents
\listoffigures 

\mainmatter
\chapter{Einleitung} 
Ein Text für die Einleitung mit erster
\chapter{Zweites Kapitel} 
Ein zweites Kapitel mit zweiter 
\begin{figure}[h] 
   \centering 
   \caption{picture} 
   \label{fig:picture} 
\end{figure} 
\chapter{Fazit} 
Ein Fazit. 
\appendix 
\CDEintragImTOC{mess}{Messwerte}
\CDEintragImTOC{lit}{Literatur und Datenblätter}
\chapter{Verzeichnisbaum CD} 
Hier kommt der Verzeichnisbaum der CD. 
\end{document}
Edit: für CD-ROM Eintrag pagenumberbox statt pagenumberformat anpassen
Zuletzt geändert von esdd am Mi 6. Dez 2017, 22:21, insgesamt 1-mal geändert.

senf_topf
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Mi 6. Dez 2017, 08:01
Wohnort: Dresden

Beitrag von senf_topf »

Vielen vielen Dank für deine Mühen!

In der Überschrift habe ich mich tatsächlich leider vertan und meinte tocloft. Sollte eine Änderung des Titels möglich sein, dann werde ich es ändern.

Die Warnungen (insbes. halfparskip) sind mir aufgefallen, allerdings hatte ich diese erst einmal ignoriert da ich sonst keine Probleme mit dem Dokument hatte. Aber danke für die Anpassung dieser!

Nochmal ein riesiges Dankeschön für deine Mühen, es ist so ziemlich exakt das was ich wollte. Leider verstehe ich einige, aber nicht alle Zeilen. Zwei Fragen haben sich nämlich aufgetan:
1. Warum wird "Anhang" im Inhaltsverzeichnis in einer größeren Schriftgröße dargestellt, als die restlichen Inhaltspunkte?
2. Wie kann ich die Punkte zwischen Inhaltspunkt und Seitenzahl einfügen?

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

senf_topf hat geschrieben: Eine Frage hat sich nämlich aufgetan: Warum wird "Anhang" im Inhaltsverzeichnis in einer größeren Schriftgröße dargestellt, als die restlichen Inhaltspunkte? Was müsste hierfür geändert werden?
In dem Beispiel wird mit \part eine Seite mit der Überschrift Anhang auf einer eigenen Seite gesetzt. Deren Eintrag ist im Inhaltsverzeichnis dann anders formatiert. Wenn Du die Seite nicht möchtest/brauchst, dann kannst Du vor \useappendixtocs noch einen Eintrag in das Hauptinhaltsverzeichnis vornehmen, der genauso wie die Kapiteleinträge formatiert ist. Das relevante Codestück wäre:
\xapptocmd\appendix{%
  \cleardoublepage
  \addchaptertocentry{}{\appendixname}%
  \useappendixtocs
  \listofatocs
  %\listofalofs
  %\listofalots
}{}{}

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Die zweite Frage habe ich vorhin gar nicht gesehen. Die Füllpunkte auch für Kapiteleinträge bekommst Du mit einer der beiden Klassenoptionen chapterentrydots bzw. toc=chapterentrywithdots.

Allerdings zeigt sich dann, dass CD-ROM breiter ist als der für Seitenzahlen vorgesehene Platz. Deshalb ist es sinnvoller der Eintrag dieser speziellen "Seitenzahl" über die Option pagenumberbox statt pagenumberformat vorzunehmen. Also:
\DeclareTOCStyleEntry[
  level=\chaptertocdepth,
  indent=0pt,
  numwidth=1.5em,
  pagenumberbox=\cd
]{chapter}{cd}
\newcommand\cd[1]{{%
  \usekomafont{chapterentry}\usekomafont{chapterentrypagenumber}
  CD-ROM%
}}
Oder nochmal als vollständiges Beispiel mit beiden Änderungen:
\documentclass[pdftex,a4paper,12pt,
  parskip=half,% aktuelle Syntax verwenden!!
  listof=totoc,bibliography=totoc,
  twoside=false,% einseitig
  chapterentrydots% Füllpunkte auch für Kapiteleinträge
  ]{scrbook}% um \frontmatter und \mainmatter nutzen zu können

\usepackage[english,main=ngerman]{babel} 
\usepackage[utf8]{inputenc}% Overleaf nutzt utf8
\usepackage[T1]{fontenc} 
\usepackage{lmodern} 

\usepackage{xpatch}% zum patchen von \appendix

\usepackage[colorlinks,hidelinks]{hyperref}% in der Regel als letztes Paket laden
\usepackage{bookmark}% verbessert noch den Umgang mit Lesezeichen

% basierend auf https://komascript.de/comment/5578#comment-5578
\DeclareNewTOC[%
  owner=\jobname,
  listname={Inhalt des Anhangs},% Titel des Verzeichnisses
]{atoc}% Dateierweiterung (a=appendix, toc=table of contents)
\DeclareNewTOC[%
  listname={Abbildungen im Anhang},% Titel des Verzeichnisses
]{alof}% Dateierweiterung (a=appendix, lof=list of figures)
\DeclareNewTOC[%
  listname={Tabellen im Anhang},% Titel des Verzeichnisses
]{alot}% Dateierweiterung (a=appendix, lot=list of tables)

\DeclareTOCStyleEntry[
  level=\chaptertocdepth,
  indent=0pt,
  numwidth=1.5em,
  pagenumberbox=\cd
]{chapter}{cd}
\newcommand\cd[1]{{%
  \usekomafont{chapterentry}\usekomafont{chapterentrypagenumber}
  CD-ROM%
}}

\makeatletter
\newcommand\CDEintragImTOC[2]{%
  \refstepcounter{chapter}\label{app:#1}%
  \addxcontentsline{\ext@toc}{cd}[\thechapter]{#2}
}
\newcommand*{\useappendixtocs}{%
  \renewcommand*{\ext@toc}{atoc}%
  \scr@ifundefinedorrelax{hypersetup}{}{% damit es auch ohne hyperref funktioniert
    \hypersetup{bookmarkstype=atoc}%
  }%
  \renewcommand*{\ext@figure}{alof}%
  \renewcommand*{\ext@table}{alot}%
}
\newcommand*{\usestandardtocs}{%
  \renewcommand*{\ext@toc}{toc}%
  \scr@ifundefinedorrelax{hypersetup}{}{% damit es auch ohne hyperref funktioniert
    \hypersetup{bookmarkstype=toc}%
  }%
  \renewcommand*{\ext@figure}{lof}%
  \renewcommand*{\ext@table}{lot}%
}
\ifundefinedorrelax{ext@toc}{%
  \newcommand*{\ext@toc}{toc}
  \renewcommand{\addtocentrydefault}[3]{%
    \expandafter\tocbasic@addxcontentsline\expandafter{\ext@toc}{#1}{#2}{#3}%
  }
}{}
\makeatother

\xapptocmd\appendix{%
  \cleardoublepage
  \addchaptertocentry{}{\appendixname}%
  \useappendixtocs
  \listofatocs
  %\listofalofs
  %\listofalots
}{}{}

\begin{document}
\frontmatter
\tableofcontents
\listoffigures 

\mainmatter
\chapter{Einleitung} 
Ein Text für die Einleitung mit erster
\chapter{Zweites Kapitel} 
Ein zweites Kapitel mit zweiter 
\begin{figure}[h] 
   \centering 
   \caption{picture} 
   \label{fig:picture} 
\end{figure} 
\chapter{Fazit} 
Ein Fazit. 
\appendix 
\CDEintragImTOC{mess}{Messwerte}
\CDEintragImTOC{lit}{Literatur und Datenblätter}
\chapter{Verzeichnisbaum CD} 
Hier kommt der Verzeichnisbaum der CD. 
\end{document}

senf_topf
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Mi 6. Dez 2017, 08:01
Wohnort: Dresden

Beitrag von senf_topf »

Ich bin wirklich begeistert von deiner Hilfsbereitschaft. :o
Durch die kleinen Änderungen wird mir dein Code jetzt auch um einiges klarer.

Jetzt ist es wirklich exakt so wie ich es benötige, vielen Dank nochmal!

Antworten