Wenn in meinem Dokument keine Tabellen vorhanden sind, soll kein Tabellenverzeichnis ausgegeben werden.

Lässt sich das automatisch bewerkstelligen.

Hier ein Minimalbeispiel:

Open in Online-Editor
\documentclass{scrartcl}
\usepackage[ngerman]{babel}

\begin{document}

Hier sollte nun kein Tabellenverzeichnis erscheinen, da keine Tabelle vorhanden ist.

\listoftables

Mir ist bewusst, dass ich das manuell durch Auskommentieren von \listoftables erreichen würde. Vielmehr interessiert mich, wie ein Automatismus in Latex aussehen müsste.
\end{document}

gefragt 31 Okt '16, 13:17

dzaic's gravatar image

dzaic
631154954
Akzeptiert-Rate: 42%

bearbeitet 31 Okt '16, 13:19

2

Kommentiere den Befehl einfach aus. Das ist viel leichter.

(31 Okt '16, 14:08) Johannes

Dachte es mir schon. Da blöde ist nur, wenn irgendwann in Zukunft eine Tabelle ins Dokument eingepflegt wird, muss man daran denken, die Kommentierung wieder zu entfernen.

(31 Okt '16, 14:26) dzaic

Siehst du das wirklich als Problem an? Ich füge eine Beschriftung hinzu, dann kann ich auch ein Verzeichnis anfügen. Oder hast du dutzende verschiedene Projekte und komplett den Überblick über den Stand der Dinge verloren? Dann könnte ich das sogar nachvollziehen.

(31 Okt '16, 14:29) Johannes

Wegen einer einzigen Abbildung oder einer einzigen Tabelle füge ich in der Regel übrigens noch kein Verzeichnis ein.

(31 Okt '16, 14:40) saputello

Ich sehe es nicht wirklich als "Problem" an, dachte nur, dass es mit Latex "einfach" gehen könnte. Aber eventuell ist hier das Verhältnis zwischen fehleranfälliger automtischer Lösung und weniger fehleranfälliger manueller Lösung nicht mehr gewährleistet.

(31 Okt '16, 14:52) dzaic
Ergebnis 5 von 6 show 1 more comments

In Anlehnung an den Hinweis von Ulrike Fischer, die m.E. "einfachste" Lösung:

Open in Online-Editor
\documentclass{article}
\usepackage[demo]{graphicx}% http://ctan.org/pkg/graphicx
\usepackage{lipsum}% http://ctan.org/pkg/lipsum

\usepackage[tables]{totalcount}

\begin{document}

% Conditionally insert List of Tables
\iftotaltables
  \listoftables
\fi

\section{First section}
\lipsum[1]

%\begin{table}
%  \caption{This is a caption}
%\end{table}

\end{document}
Permanenter link

beantwortet 01 Nov '16, 08:58

dzaic's gravatar image

dzaic
631154954
Akzeptiert-Rate: 42%

bearbeitet 01 Nov '16, 12:03

saputello's gravatar image

saputello
11.1k174365

@saputello Herzlichen Dank für deine reaktionelle Änderung, die ich übersehen hatte. Möchte hier einmal die Gelegenheit ergreifen und mich insbesondere auch bei Dir recht herzlich für deinen Einsatz und die Geduld, die Du mit Dummies wie mir aufbringst, bedanken.

(01 Nov '16, 13:20) dzaic
1

@dzaic: Stell Dein Licht nicht unter den Scheffel. Du stellst meist ;-) vernünftige Fragen mit vernünftigem Minimalbeispiel. Von der Seite hättest Du eigentlich mehr als verdient, dass ich auch für diese Frage hier stimme. Allerdings habe ich beschlossen, nur noch ehrlich für solche Frage zu stimmen, die mich nicht nur formal sondern auch inhaltlich ansprechen. Mir gefällt jedoch die Idee, quasi gedankenlos ein Verzeichnis nur deshalb zu erstellen, weil es (auch nur) ein entsprechendes Element gibt, ganz und gar nicht.

(01 Nov '16, 13:32) saputello

@saputello Ab wieviel Einträgen sollte man denn d.E. ein Abbildungs / Tabellenverzeichnis erstellen? Da ich in meiner Firma die Kolleginnen und Kollegen von Latex überzeugen muss - Du glaubst gar nicht wie stark die Word-Lobby ist :-) - muss ich eben "Features" in die Vorlage einbauen und zeigen, die Word so nicht hat.

(01 Nov '16, 14:15) dzaic

@dzaic: Das kommt auf das Dokument und die Abbildungen etc. an. Man kann das so wenig allgemein entscheiden wie die Frage, ab wievielen Verweisen ein Wort mit welchen Stellen in den Index gehört. Manche Dokumente benötigen auch bei einem Dutzend Abbildungen kein Abbildungsverzeichnis. Andere Dokumente benötigen es schon bei der einen, ganz entscheidenden Abbildung. Meist sind aber Verzeichnisse mit nur einem Eintrag recht albern. Wenn ich bei 1000 Seiten drei Tabellen eher als Garnierung habe, brauche ich dafür auch kein Verzeichnis. Ist es nur die eine zentrale Tabelle, kann es sinnvoll sein.

(01 Nov '16, 15:24) saputello

Bei Klassen, bei denen die Abbildungen und Tabellen durchgehend nummeriert werden, ist das relativ einfach zu erreichen:

Open in Online-Editor
\documentclass{scrartcl}
\usepackage[ngerman]{babel}

\newcommand*{\allfigs}{0}
\newcommand*{\alltabs}{0}
\makeatletter
\BeforeClosingMainAux{%
  \immediate\write\@mainaux{%
    \string\gdef\string\allfigs{\arabic{figure}}^^J%
    \string\gdef\string\alltabs{\arabic{table}}%
  }%
}
\makeatother

\begin{document}

Hier sollte nun kein Tabellenverzeichnis erscheinen, da keine Tabelle vorhanden ist.

\ifnum\allfigs>0
\listoffigures
\fi

\ifnum\alltabs>0
\listoftables
\fi

\section{Test}

Mir ist bewusst, dass ich das manuell durch Auskommentieren von \verb|\listoftables| erreichen würde. Vielmehr interessiert mich, wie ein Automatismus in \LaTeX{} aussehen müsste.

\begin{figure}
  \caption{Beispielbild}
\end{figure}
\end{document}

Der Trick dabei ist, die aktuelle Abbildungs- bzw. Tabellennummer am Ende des Dokuments in die aux-Datei zu schreiben und beim nächsten Lauf wieder darauf zuzugreifen.

Werden die Elemente jedoch beispielsweise kapitelsweise nummeriert, so würde dies nicht mehr so einfach funktionieren. Man müsste dann eine andere Methode finden, für den nächsten LaTeX-Lauf das Vorhandensein von Abbildungen oder Tabellen zu sichern. Beispielsweise könnte man dann über einen Patch der figure-, table- und entsprechender Umgebungen dafür sorgen, dass jede dieser Umgebungen einen Schalter auf true setzt, der dann am Ende des Laufs in die aux-Datei geschrieben wird. Das könnte beispielsweise so aussehen:

Open in Online-Editor
\documentclass{scrbook}
\usepackage[ngerman]{babel}

\newif\iflistoffigures\newif\iffiguresused
\newif\iflistoftables\newif\iftablesused
\usepackage{xpatch}
\makeatletter
\xpretocmd\@caption{\global\csname\@captype susedtrue\endcsname}{}{}
\BeforeClosingMainAux{%
  \iffiguresused\immediate\write\@mainaux{\string\global\string\listoffigurestrue}\fi
  \iftablesused\immediate\write\@mainaux{\string\global\string\listoftablesstrue}\fi  
}
\makeatother

\begin{document}

Hier sollte nun kein Tabellenverzeichnis erscheinen, da keine Tabelle vorhanden ist.

\iflistoffigures\listoffigures\fi
\iflistoftables\listoftables\fi

\chapter{Test}

Mir ist bewusst, dass ich das manuell durch Auskommentieren von \verb|\listoftables| erreichen würde. Vielmehr interessiert mich, wie ein Automatismus in \LaTeX{} aussehen müsste.

\begin{figure}
  \caption{Beispielbild}
\end{figure}

\chapter{Noch ein Test}
\end{document}

Die Anweisung \BeforeClosingMainAux stammt übrigens aus scrlfile, einem Paket, das von allen KOMA-Script-Klassen geladen wird, weshalb ich es oben nicht noch einmal explizit lade. Bei Verwendung einer Nicht-KOMA-Script-Klasse (und auch nicht davon abgeleiteten Klasse) müsste man das Paket ggf. selbst laden. Notfalls könnte man \AtEndDocument stattdessen verwenden. Das ist aber weniger sicher.

Beide Lösungen sind natürlich einfach auf weitere Verzeichnisse beispielsweise von Paketen wie listings erweiterbar.

Permanenter link

beantwortet 31 Okt '16, 14:39

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 01 Nov '16, 12:07

Das Tabellenverzeichnis wird in einer Datei mit der Endung .lot gespeichert. Dort werden, wie auch im TOC, die Einträge mit \contentsline ausgelistet. Ist der erste Token in der Datei also \contentsline, so sind Tabellen im Dokument vorhanden. Dies kann man natürlich mit LaTeX prüfen.

Open in Online-Editor
\documentclass{scrartcl}
\usepackage[ngerman]{babel}

\makeatletter

% read toc file
\newread\tocfile
\openin\tocfile=\jobname.lot

% if there is no file the first line is \relax
\ifeof\tocfile
  \def\firstline{\relax}
\else
  \read\tocfile to \firstline
\fi

% get the first token in the line
\def\gethead#1#2{\expandafter\@gethead\expandafter#1#2\@endgethead}
\def\@gethead#1#2#3\@endgethead{\let#1=#2}
\gethead\firsttoken\firstline

% if the first token is \contentsline there are tables present
\ifx\firsttoken\contentsline
  % Nothing to do
\else
  % No tables:  \listoftables only creates the LOT file
  \def\listoftables{\@starttoc{lot}}
\fi

\makeatother

\begin{document}

Hier sollte nun kein Tabellenverzeichnis erscheinen, da keine Tabelle vorhanden ist.

\listoftables

Mir ist bewusst, dass ich das manuell durch Auskommentieren von
\verb|\listoftables| erreichen würde. Vielmehr interessiert mich, wie
ein Automatismus in \LaTeX\ aussehen m\"usste.

\end{document}
Permanenter link

beantwortet 31 Okt '16, 14:52

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

Das erste Token kann aber auch ein \select@language (oder etwas ganz anderes) sein. Und dann wird bei Dir das Verzeichnis schlicht ohne Überschrift ausgegeben. Einfach einmal \section{Test}\blindtext[10] nach \listoftables einfügen (und natürlich blindtext laden).

(31 Okt '16, 15:30) saputello

@saputello Du könntest Recht haben. In meinen wenigen Experimenten hat sich allerdings herausgestellt, dass \select@language immer der erste Token ist, der reingeschrieben wird und damit immer ganz unten steht. Wenn dann das Verzeichnis gesetzt wird, steht lediglich \select@language in einer Gruppe (kein visueller Output). Deine Lösung gefällt mir ehrlich gesagt auch besser.

(31 Okt '16, 15:34) Henri
1

@Henri: Wie gesagt, mit \listoftables\section{Test}\blindtext[10] und (natürlich min. einer) Tabelle \begin{table}\caption{Testtabelle}\end{table} am Ende bekomme ich als lot:

\select@language {ngerman} \contentsline {table}{\numberline {1}{\ignorespaces Testtabelle}}{3}

und habe dann ein Tabellenverzeichnis ohne Überschrift. Der Test ist also definitiv zu kurz gegriffen.

Es kann übrigens je nach Klasse auch beispielsweise ein \addvspace am Anfang des Verzeichnisses eingetragen werden. Dann funktioniert es auch nicht. Das müsstest Du also schon deutlich erweitern.

(31 Okt '16, 16:00) saputello

In ConTeXt MKIV ist das der Standard, dass das Tabellenverzeichnis nur dann angezeigt wird, wenn Tabellen im Dokument vorhanden sind.

Open in Online-Editor
\setuplist
  [table]
  [before={\startsubject[title={Tabellenverzeichnis}]},
   after=\stopsubject]

\starttext

\placelist[table]

\startsection[title={Knuth}]

  \input knuth

  \startmode[tables]
    \startplacetable
      [
        reference={tab:test},
        title={Hello World!},
      ]
      Hier könnte ihre Werbung stehen!
    \stopplacetable
  \stopmode

\stopsection

\stoptext

Hier das Ergebnis.

  1. context test.tex

    alt text

  2. context --mode=tables test.tex

    alt text

Permanenter link

beantwortet 31 Okt '16, 15:10

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

contex wird mir immer sympatischer. :-)

(31 Okt '16, 15:14) dzaic
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×9

gestellte Frage: 31 Okt '16, 13:17

Frage wurde gesehen: 10,723 Mal

zuletzt geändert: 01 Nov '16, 15:24