Hallo zusammen!

Ich möchte in einem benutzerdefinierten float die Vorteile von threeparttable benutzen. Zum Beispiel:

Open in Online-Editor
\documentclass[a4paper,12pt]{report}

\usepackage[utf8]{inputenc}

\usepackage[german]{babel}

\usepackage[font=normalsize]{caption}
\DeclareCaptionType[fileext=loc,placement=hbt,within=none]{chart}[Diagramm][Diagrammsverzeichnis]

\usepackage{threeparttable}

\begin{document}

\begin{chart}
    \centering
    \begin{threeparttable}
        \begin{tabular}{|c|c|c|} \hline 
            Spalte 1    &   Spalte 2    &   Spalte 3 \\ \hline
            a       &   b       &   c \\ \hline
            d       &   e       &   f \\ \hline
            g       &   h       &   i \\ \hline
        \end{tabular}
        \caption{Diagrammstest.}
    \end{threeparttable}
\end{chart}

\listofcharts
    \listoftables

\end{document}

Das Ziel ist es, die Beschriftung maximal so breit wie das Diagramm einzustellen und sie im Diagrammsverzeichnis anzuzeigen. Das Problem ist, dass die threeparttable-Umgebung das float wie eine Tabelle behandelt, also heißt die Beschriftung Tabelle statt wie gewünscht Diagramm. Außerdem ist die Beschriftung im Tabellensverzeichnis statt in dem von mir genannten Diagramsverzeichnis. Gibt es etwas äquivalent zu threeparttable für eine generelle Umgebung?

Vielen Dank im Voraus!

gefragt 26 Jan, 13:19

fpires's gravatar image

fpires
853
Akzeptiert: 80%

geschlossen 12 Feb, 02:30

saputello's gravatar image

saputello
18.4k22352

Die Frage wurde aus folgenden Grund geschlossen: "Das Problem ist veraltet und tritt seit caption 2016/02/02 v3.3-136 nicht mehr auf." durch saputello 12 Feb, 02:30


Witziger Weise enthält das Paket threeparttable mit den Umgebungen threeparttable und measuredfigure bereits solche Umgebungen. Allerdings beschädigt das Paket caption vor Version 2016/02/02 v3.3-136 diese Funktion, indem es threeparttable immer als Tabellenumgebung und measuredfigure immer als Abbildungsumgebung festschreibt. Man kann die Funktionalität aber wieder hineinpatchen. Dazu muss man die Anweisung \caption@settype mit dem jeweiligen Argument aus der entsprechenden Umgebung durch etwas mehr Intelligenz ersetzen:

Open in Online-Editor
\documentclass[a4paper,12pt]{report}

\usepackage[utf8]{inputenc}

\usepackage[german]{babel}% Alte Rechtschreibung??? Aktuelle wäre ngerman
                          % statt german!

\usepackage{threeparttable}

\usepackage[font=normalsize]{caption}
\DeclareCaptionType[fileext=loc,placement=hbt,within=none]{chart}[Diagramm][Diagrammsverzeichnis]

\usepackage{xpatch}
\makeatletter
\xpatchcmd\measuredfigure{\caption@settype{figure}}{%
  \@ifundefined{\@captype}{\caption@settype{figure}}{%
    \expandafter\caption@settype\expandafter{\@captype}}%
}{}{%
  \typeout{Patch of `measuredfigure' failed!}%
}
\xpatchcmd\threeparttable{\caption@settype{table}}{%
  \@ifundefined{\@captype}{\caption@settype{table}}{%
    \expandafter\caption@settype\expandafter{\@captype}}%
}{}{%
  \typeout{Patch of `threeparttable' failed!}%
}
\makeatother

\begin{document}

\begin{chart}
    \centering
    \begin{measuredfigure}
        \begin{tabular}{|c|c|c|} \hline 
            Spalte 1    &   Spalte 2    &   Spalte 3 \\ \hline
            a       &   b       &   c \\ \hline
            d       &   e       &   f \\ \hline
            g       &   h       &   i \\ \hline
        \end{tabular}
        \caption{Diagrammstest.}
    \end{measuredfigure}
\end{chart}

\begin{chart}
    \centering
    \begin{threeparttable}
        \caption{Diagrammstest.}
        \begin{tabular}{|c|c|c|} \hline 
            Spalte 1\tnote{1}    &   Spalte 2    &   Spalte 3 \\ \hline
            a       &   b       &   c \\ \hline
            d       &   e       &   f \\ \hline
            g       &   h       &   i \\ \hline
        \end{tabular}
        \begin{tablenotes}
          \item[1] Eine Anmerkung
        \end{tablenotes}
    \end{threeparttable}
\end{chart}

\listofcharts
    \listoftables

\end{document}

Achtung: Der Patch ist ab caption 2016/02/02 v3.3-136 nicht mehr erforderlich und gibt dann die Meldungen »Patch of `measuredfigure' failed!« und »Patch of `threeparttable' failed!« aus. Entsprechende Updates sind über die Paketverwaltungen von TeX Live und MiKTeX verfügbar und sollten ggf. eingespielt werden!

Solange Du caption nur verwendest, um neue Gleitumgebungen zu definieren, kannst Du auch auf caption verzichten und das stattdessen mit tocbasic machen:

Open in Online-Editor
\documentclass[a4paper,12pt]{report}

\usepackage[utf8]{inputenc}

\usepackage[german]{babel}% Alte Rechtschreibung??? Aktuelle wäre ngerman
                          % statt german!

\usepackage{threeparttable}
\usepackage{scrbase,tocbasic}
\DeclareNewTOC[%
  type=chart,
  types=charts,
  name=Diagramm,
  listname=Diagrammverzeichnis,
  float,
  floatpos=hbt,
]{loc}

\begin{document}

\begin{chart}
    \centering
    \begin{measuredfigure}
        \begin{tabular}{|c|c|c|} \hline 
            Spalte 1    &   Spalte 2    &   Spalte 3 \\ \hline
            a       &   b       &   c \\ \hline
            d       &   e       &   f \\ \hline
            g       &   h       &   i \\ \hline
        \end{tabular}
        \caption{Diagrammstest.}
    \end{measuredfigure}
\end{chart}

\listofcharts
\listoftables

\end{document}

Dabei muss man dann nichts patchen, weil measuredfigure und threeparttable unangetastet bleiben. Natürlich gilt das nur, solange man caption eben nicht verwendet! Alleine die Verwendung von tocbasic hält caption ja nicht davon ab, threeparttable und measuredfigure auf Tabellen bzw. Abbildungen festzuklopfen. Sobald man caption lädt, benötigt man für diese beiden Umgebungen daher den Patch aus dem ersten Beispiel.

Last but not least, kennt caption auch noch die Anweisung \captionbox. Die Syntax dieses Befehls konnte ich zwar in der Anleitung nicht finden, sie scheint aber der von \subcaptionbox aus dem Paket subcaption zu entsprechen. Die Anweisung bietet zwar nicht die volle Funktionalität der threeparttable-Umgebung, als Ersatz für measuredfigure genügt sie jedoch:

Open in Online-Editor
\documentclass[a4paper,12pt]{report}

\usepackage[utf8]{inputenc}
\usepackage[german]{babel}

\usepackage[font=normalsize,labelfont=bf]{caption}
\DeclareCaptionType[fileext=loc,placement=hbt,within=none]{chart}[Diagramm][Diagrammsverzeichnis]

\begin{document}

\begin{chart}
    \centering
    \captionbox{Diagrammtest mit etwas mehr Text.\label{diag:test}}{%
        \begin{tabular}{|c|c|c|} \hline 
            Spalte 1    &   Spalte 2    &   Spalte 3 \\ \hline
            a       &   b       &   c \\ \hline
            d       &   e       &   f \\ \hline
            g       &   h       &   i \\ \hline
        \end{tabular}%
    }
\end{chart}

\listofcharts
\listoftables

\end{document}

Auch die Verwendung von \captionbox ändert nichts daran, dass threeparttable und measuredfigure von caption vor 2016/02/02 v3.3-136 auf Tabellen bzw. Abbildungen festgelegt wurden. Es nützte daher nichts \captionbox mit diesen Umgebungen zu kombinieren. Stattdessen musste man measuredfigure wie im Beispiel gezeigt durch \captionbox ersetzen.

Permanenter link

beantwortet 27 Jan, 02:10

saputello's gravatar image

saputello
18.4k22352

bearbeitet 12 Feb, 02:56

Vielen Dank saputello!

Ich benutzte dein letztes Beispiel (mit scrbase und tocbasic), weil es mir einfacher zum Verstehen als das erste Beispiel war. Allerdings möchte ich meine Frage ein Bisschen erweitern, denn ich ein weiteres Problem fand. Danke.

(28 Jan, 09:27) fpires
3

Danke für deine Analyze! Den Bug habe ich aufgenommen und behoben: https://sourceforge.net/p/latex-caption/tickets/31/

Ich werde noch heute eine neue Version des caption-Paketes nach CTAN hochladen, sie sollte dann in den nächsten Tagen via Update verfügbar sein.

BTW: Eine weitere alternative Lösung wäre die Verwendung des newfloat-Paketes anstelle des caption-Paketes gewesen. Der Befehl zum Definieren der neuen Gleitumgebung ist dann DeclareFloatingEnvironment statt DeclareCaptionType, die Syntax ist dieselbe. (Intern verwendet DeclareCaptionType sowieso DeclareFloatingEnvironment.)

(31 Jan, 12:44) Axel

@Axel: Danke für den Hinweis und die neue Version. Wenn damit dann das Originalbeispiel von @fpires schon das gewünschte Ergebnis liefert, können wir die Frage als überholt schließen.

(31 Jan, 13:12) saputello

@Axel: newfloat ist eine gute Idee, aber AFAIK bisher nur, wenn man nicht wie vom Fragesteller zwischenzeitlich angemahnt, auch noch das »Diagramm XY:« fett haben will. Wenn man dafür dann doch wieder caption braucht, dann blieb bisher nur patchen oder \captionbox, richtig?

(31 Jan, 13:13) saputello

@saputello: Ja, wenn man dafür dann doch wieder caption braucht, blieb bisher nur das Patchen oder die Verwendung von captionbox statt threeparttable.

Man könnte sich aber nun auch stattdessen sein caption-Paket selber aktualisieren, indem man die Dateien des caption-Paketes (caption.sty usw.) durch diejenigen von https://sourceforge.net/p/latex-caption/code/HEAD/tree/branches/3.3/tex/ austauscht, was vermutlich sowohl die einfachste als auch die praktikabelste Lösung ist.

(02 Feb, 18:28) Axel
2

Update (2016-02-02): Upload nach CTAN ist heute Vormittag erfolgt, d.h. in den nächsten Tagen sollte das Update auch über die Paketverwaltungen der TeX-Distributionen verfügbar sein.

(02 Feb, 18:28) Axel
Ergebnis 5 von 6 Alle anzeigen

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×27
×2
×1
×1

Frage gestellt: 26 Jan, 13:19

Frage wurde angeschaut: 1,042 Mal

Zuletzt aktualisiert: 12 Feb, 02:56