PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrzeilige Überschrift einer Tabelle oder Abbildung zentrieren inklusive Einzug



xaMax
13-03-2010, 01:56
Hallo,

ich versuche mich gerade am caption Paket.
Ziel ist es folgende Bild-/Tabellenüberschrift zu erhalten:


Tabelle 3.1: Überschrift der Tabelle
Quelle: Eigene Darstellung

mit \newcommand{\captionquelle}[2]{\caption[#1]{#1\\#2}} funktioniert das bis auf den Einzug auch relativ gut.

Ich hätte gerne, dass die Überschrift ohne Bezeichner sowie die Quelle als ein "Block" betrachtet werden und davor der Bezeichner: Tabelle 3.1 steht. Und diese der Bezeichner und der Block zusammen soll dann zentriert werden.
Ist das irgendwie möglich?

Danke!

Minimalbeispiel:

\documentclass{scrreprt}
\usepackage[font=small, labelfont=bf, margin=10pt]{caption}
\newcommand{\captionquelle}[2]{\caption[#1]{#1\\#2}}

\begin{document}

\begin{table}[htdp]
\captionquelle{Ueberschrift der Tabelle}{Quelle: Eigene Darstellung, \cite{test}}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}
\end{table}

\end{document}

mechanicus
13-03-2010, 10:10
Hi,

nutze:

\newcommand{\captionquelle}[2]{\caption[#1]{#1\newline#2}}

Gruß
Marco

xaMax
13-03-2010, 11:14
Hallo,

das funktioniert leider auch nicht wirklich.
Wenn man die zweite Zeile dann bspw. verlängert, dann passt der Einzug wieder nicht.



\documentclass{scrreprt}
\usepackage[font=small, labelfont=bf, margin=10pt]{caption}
\newcommand{\captionquelle}[2]{\caption[#1]{#1\newline#2}}

\begin{document}

\begin{table}[htdp]
\captionquelle{Ueberschrift der Tabelle}{Quelle: Eigene Darstellung mit langer zweiter Zeile}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}
\end{table}

\end{document}

mechanicus
13-03-2010, 12:50
Hi,

ohne jetzt zu wissen, ob es eine andere Möglichkeit gibt.


\documentclass{scrreprt}
\usepackage{calc}
\usepackage[font=small, labelfont=bf, margin=10pt]{caption}
\captionsetup[table]{format=hang,indention=0cm,singlelinecheck=true}
\newsavebox\TestBoxI
\newsavebox\TestBoxII
\newlength{\TestBoxLI}
\newlength{\TestBoxLII}
\newif\ifTestBoxZuBreit

\newcommand{\captionquelle}[2]{%
\TestBoxZuBreitfalse
\sbox\TestBoxI{\captionfont#1}
\sbox\TestBoxII{\captionfont#2}
\setlength{\TestBoxLI}{\wd\TestBoxI}
\setlength{\TestBoxLII}{\wd\TestBoxII}
\ifdim\TestBoxLI>12.2cm
\TestBoxZuBreittrue
\fi
\ifdim\TestBoxLII>12.2cm
\TestBoxZuBreittrue
\fi
\ifTestBoxZuBreit
\caption[#1]{#1\\#2}
\else
\caption[#1]{\parbox[t]{\TestBoxLII}{#1\\\rule{\TestBoxLI}{1pt}\\#2\\\rul e{\TestBoxLII}{1pt}}}
\fi
}
\usepackage{showframe}
\begin{document}

\begin{table}[htdp]
\captionquelle{Ueberschrift der Tabelle Ueberschrift der Tabelle Ueberschrift der Tabelle Ueberschrift der Tabelle}{\rlap{\rule{12.2cm}{1pt}}Quelle: Eigene Darstellung mit langer zweiter Zeile Eigene Darstellung mit langer zweiter Zeile Eigene Darstellung mit langer zweiter Zeile Eigene Darstellung mit langer zweiter Zeile}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}

\vskip4\baselineskip


\captionquelle{Ueberschrift der Tabelle}{Quelle: Eigene Darstellung mit langer zweiter Zeile}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}
\end{table}
\end{document}

Axel wird mich sicherlich gleich korrigieren. :D Allerdings frage ich mich gerade, warum die Anweisung \wd jeweils eine zu große Länge bestimmt. Ich habe es mit \rule sichtbar gemacht.

Gruß
Marco

EDIT: Code gemäß Hinweis von Rainer angepasst.

rais
13-03-2010, 13:17
Moin Marco,

Allerdings frage ich mich gerade, warum die Anweisung \wd jeweils eine zu große Länge bestimmt. Ich habe es mit \rule sichtbar gemacht.

Deine \sbox weiß noch nix davon, daß der Text \small (oder wie auch immer) gesetzt werden soll.;)


\sbox\TestBoxI{\captionfont#1}
\sbox\TestBoxII{\captionfont#2}

MfG

mechanicus
13-03-2010, 13:19
Deine \sbox weiß noch nix davon, daß der Text \small (oder wie auch immer) gesetzt werden soll.;)
Das habe ich komplett übersehen. Danke.

Gruß
Marco

sommerfee
13-03-2010, 14:46
Axel wird mich sicherlich gleich korrigieren. :D

Nö :cool: :D

Man könnte natürlich auf die Idee kommen, an dem Code noch das eine oder andere zu verbessern [1] (zum Beispiel um die fest eingebauten 12.2cm loszuwerden), die Frage ist aber, ob sich der Aufwand lohnt. Ich denke nicht.

Liebe Grüße,
Axel

[1] LaTeX-Regel Nr. 1: An jedem LaTeX-Code gibt es noch was zu verbessern! ;)

xaMax
13-03-2010, 17:16
So, vielen Dank! Es funktioniert :)
Ich habe es zwar nicht 100%ig verstanden (warum z.B. 12,2cm?), aber ich habe trotzdem den Code noch etwas weiter verbessert (Trial & Error ;) )
Es traten nämlich Fehler auf, wenn es eine lange erste und eine kurze zweite Zeile gab. Jetzt wird abgefragt, welche länger ist und entsprechend die Abstände gesetzt.

Das einzige was mir noch aufgefallen ist: Der Abstand zwischen Bildunterschrift und Bild hat sich verändert, aber da die Bildunterschrift eh eine Überschrift werden soll, ist das ein anderes Feld ;)

Vielen Dank und hier die vollständige Implementierung:

\documentclass{scrreprt}
\usepackage[font=small, labelfont=bf, margin=10pt]{caption}

\newsavebox\TestBoxI
\newsavebox\TestBoxII
\newlength{\TestBoxLI}
\newlength{\TestBoxLII}
\newif\ifTestBoxZuBreit

\newcommand{\captionquelle}[2]{%
\TestBoxZuBreitfalse
\sbox\TestBoxI{\captionfont#1}
\sbox\TestBoxII{\captionfont#2}
\setlength{\TestBoxLI}{\wd\TestBoxI}
\setlength{\TestBoxLII}{\wd\TestBoxII}
\ifdim\TestBoxLI>12.2cm
\TestBoxZuBreittrue
\fi
\ifdim\TestBoxLII>12.2cm
\TestBoxZuBreittrue
\fi
\ifTestBoxZuBreit
\caption[#1]{#1\\#2}
\else
\ifdim\TestBoxLI>\TestBoxLII
\caption[#1]{\parbox[t]{\TestBoxLI}{#1\\#2}}
\else
\caption[#1]{\parbox[t]{\TestBoxLII}{#1\\#2}}
\fi
\fi
}
\usepackage{showframe}
\begin{document}

\begin{table}[htdp]
\captionquelle{Ueberschrift der Tabelle Ueberschrift der Tabelle Ueberschrift der Tabelle Ueberschrift der Tabelle}{Quelle: Eigene Darstellung mit langer zweiter Zeile Eigene Darstellung mit langer zweiter Zeile Eigene Darstellung mit langer zweiter Zeile Eigene Darstellung mit langer zweiter Zeile}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}

\vskip4\baselineskip

\captionquelle{Ueberschrift der Tabelle}{Quelle: Eigene Darstellung mit langer zweiter Zeile}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}

\vskip4\baselineskip

\captionquelle{Ueberschrift der Tabelle mit langer erster Zeile}{Quelle: Eigene Darstellung}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}

\end{table}

\end{document}

xaMax
19-03-2010, 11:48
Ich muss den Thread leider nochmal nach oben holen.

Ich würde gerne die Überschriften auch für eine longtable Umgebung anwenden. Dort erhalte ich aber mit dem Befehl \captionquelle eine Fehlermeldung :/

Hat jemand eine Idee, woran es liegt und vor allem, wie man es beheben kann, so dass die longtable auch eine 2-zeilige Überschrift hat?

Minimalbeispiel (welches ganz schön groß geworden ist).
Die ersten drei Tabellen zeigen, wie es aussehen soll, die vierte ist die Longtable, die kein \captionquelle zulässt.


\documentclass{scrreprt}
\usepackage[font=small, labelfont=bf, margin=10pt]{caption}
\usepackage{longtable}

\newsavebox\TestBoxI
\newsavebox\TestBoxII
\newlength{\TestBoxLI}
\newlength{\TestBoxLII}
\newif\ifTestBoxZuBreit

\newcommand{\captionquelle}[2]{%
\TestBoxZuBreitfalse
\sbox\TestBoxI{\captionfont#1}
\sbox\TestBoxII{\captionfont#2}
\setlength{\TestBoxLI}{\wd\TestBoxI}
\setlength{\TestBoxLII}{\wd\TestBoxII}
\ifdim\TestBoxLI>12.2cm
\TestBoxZuBreittrue
\fi
\ifdim\TestBoxLII>12.2cm
\TestBoxZuBreittrue
\fi
\ifTestBoxZuBreit
\caption[#1]{#1\\#2}
\else
\ifdim\TestBoxLI>\TestBoxLII
\caption[#1]{\parbox[t]{\TestBoxLI}{#1\\#2}}
\else
\caption[#1]{\parbox[t]{\TestBoxLII}{#1\\#2}}
\fi
\fi
}
\usepackage{showframe}
\begin{document}

\begin{table}[htdp]
\captionquelle{Ueberschrift der Tabelle Ueberschrift der Tabelle Ueberschrift der Tabelle Ueberschrift der Tabelle}{Quelle: Eigene Darstellung mit langer zweiter Zeile Eigene Darstellung mit langer zweiter Zeile Eigene Darstellung mit langer zweiter Zeile Eigene Darstellung mit langer zweiter Zeile}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}

\vskip4\baselineskip

\captionquelle{Ueberschrift der Tabelle}{Quelle: Eigene Darstellung mit langer zweiter Zeile}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}

\vskip4\baselineskip

\captionquelle{Ueberschrift der Tabelle mit langer erster Zeile}{Quelle: Eigene Darstellung}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}

\end{table}

\begin{longtable}{c c}
\caption{Überschrift und in der nächsten Zeile soll die Quelle stehen}\\
test test
\endfirsthead

\caption[]{Überschrift auf nächster Seite}\\
\endhead

test & test\\

\end{longtable}


\end{document}

sommerfee
28-03-2010, 12:17
Ich würde gerne die Überschriften auch für eine longtable Umgebung anwenden. Dort erhalte ich aber mit dem Befehl \captionquelle eine Fehlermeldung :/

Das geht nicht mehr so trivial, sondern erfordert entweder eine Umdefinition von internen Kommandos des longtable-Paketes, oder aber die Erstellung eines komplett eigenen caption-Formates mittels \DeclareCaptionFormat. \captionquelle könnte hierzu das zweite Argument in ein globales Makro zwischenspeichern, damit man dann innerhalb von \DeclareCaptionFormat darauf zugreifen kann.

(Vielleicht finde ich dieses Wochenende noch etwas Zeit, dies zu kodieren, es sieht aber leider schlecht aus...)

Liebe Grüße,
Axel

xaMax
28-03-2010, 15:20
Das geht nicht mehr so trivial, sondern erfordert entweder eine Umdefinition von internen Kommandos des longtable-Paketes, oder aber die Erstellung eines komplett eigenen caption-Formates mittels \DeclareCaptionFormat. \captionquelle könnte hierzu das zweite Argument in ein globales Makro zwischenspeichern, damit man dann innerhalb von \DeclareCaptionFormat darauf zugreifen kann.
Ok, das hört sich komplizierter an. Soweit reichen meine Latex-Kenntnisse leider noch nicht.
Momentan bin ich es so umgangen, dass ich einfach keine Longtables nutze ;)
Ist aber nicht ideal...

sommerfee
28-03-2010, 15:36
Hier eine mögliche Lösung:



\documentclass{scrreprt}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage[font=small, labelfont=bf, margin=10pt]{caption}
\usepackage{longtable}

\newsavebox\TestBoxI
\newsavebox\TestBoxII
\newlength{\TestBoxLI}
\newlength{\TestBoxLII}
\newif\ifTestBoxZuBreit

\makeatletter
\newcommand{\captionquelle}[2]{%
\@ifundefined{LT@captionsetup}%
{\def\captionquelleText{#2}}%
{\noalign{\gdef\captionquelleText{#2}}}%
\captionsetup{format=quelle,singlelinecheck=off}%
\caption{#1}}
\DeclareCaptionFormat{quelle}{%
\TestBoxZuBreitfalse
\sbox\TestBoxI{#1#2#3}%
\sbox\TestBoxII{#1#2\captionquelleText}%
\setlength\TestBoxLI{\wd\TestBoxI}%
\setlength\TestBoxLII{\wd\TestBoxII}%
\ifdim\TestBoxLI>\hsize
\TestBoxZuBreittrue
\fi
\ifdim\TestBoxLII>\hsize
\TestBoxZuBreittrue
\fi
\ifTestBoxZuBreit
\caption@fmt@hang{#1}{#2}{#3\captionquelleText}%
\else
\centering
\ifdim\TestBoxLI>\TestBoxLII
\parbox[t]{\TestBoxLI}{%
\caption@fmt@hang{#1}{#2}{#3\captionquelleText}}%
\else
\parbox[t]{\TestBoxLII}{%
\caption@fmt@hang{#1}{#2}{#3\captionquelleText}}%
\fi
\fi}
\makeatother

\usepackage{showframe}
\begin{document}

\begin{table}[htdp]
\captionquelle{Ueberschrift der Tabelle Ueberschrift der Tabelle Ueberschrift der Tabelle Ueberschrift der Tabelle}{Quelle: Eigene Darstellung mit langer zweiter Zeile Eigene Darstellung mit langer zweiter Zeile Eigene Darstellung mit langer zweiter Zeile Eigene Darstellung mit langer zweiter Zeile}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}

\vskip4\baselineskip

\captionquelle{Ueberschrift der Tabelle}{Quelle: Eigene Darstellung mit langer zweiter Zeile}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}

\vskip4\baselineskip

\captionquelle{Ueberschrift der Tabelle mit langer erster Zeile}{Quelle: Eigene Darstellung}
\centering
\begin{tabular}{c c}
test & test
\end{tabular}

\end{table}

\begin{longtable}{c c}
\captionquelle{Überschrift und in der nächsten Zeile soll die Quelle stehen}{Quelle: Eigene Darstellung}\\
\endfirsthead

\caption[]{Überschrift auf nächster Seite}\\
\endhead

test & test\\

\end{longtable}


\end{document}


Anmerkungen:


\captionquelle speichert jetzt den zweiten Parameter nach \captionquelleText, wählt das selber definierte caption-Format "quelle" und schaltet die automatische Zentrierung bei kurzen Beschriftungen aus, weil wir jetzt innerhalb des Format-Codes ggf. selber zentrieren.
Die Konstruktion mit \@ifundefined{LT@captionsetup}{...}{...} ist leider notwendig, weil wir uns im Falle der longtable-Umgebung innerhalb des Tabellenmodus von TeX befinden. Dort muß \captionquelleText mit \noalign{...} definiert werden, ansonsten gäbe es eine Fehlermeldung.
Innerhalb des Format-Codes (\DeclareCaptionFormat{quelle}{...}) sollte einem der Code bekannt vorkommen. Ich habe mich bemüht, möglichst viel vom Originalcode 1:1 zu übernehmen, damit man den Code wiedererkennt, aber auch sieht, was angepasst werden mußte.
Die 12.2cm habe ich jetzt durch \hsize ersetzt und beim Längencheck das Label (#1) und den Separator (#2) mit einbezogen. \hsize ist die verfügbare Breite. Die Verwendung von \hsize (anstelle einer festen Breite wie 12.2cm) hat den Vorteil, daß es mit allen Papierbreiten funktioniert und man jetzt auch per \captionsetup{margin=...} einen minimalen Rand vorgeben könnte.
Der Gebrauch von \captionfont entfällt bei dieser Lösung, weil bei der Definition mittels \DeclareCaptionFormat die Argumente schon die passenden Zeichensatzanpassungen mitbringen.
\caption@fmt@hang ruft den Code des caption-Formates "hang" auf. \captionquelleText muß hierbei nicht durch \\ getrennt werden, weil #3 schon ein \par am Ende mitbringt.


Wenn irgendwelche Fragen dazu da sind, immer her damit!

Liebe Grüße,
Axel

xaMax
29-03-2010, 11:00
Funktioniert wunderbar!
Vielen Dank, Alex!!

Ist zwar mittlerweile ein recht großer Code geworden für ein eigentlich ganz kleines Problem. Aber da es bisher fehlerfrei läuft... perfekt :)

sommerfee
29-03-2010, 18:04
Vielen Dank, Alex!!

Bitte beachten:

http://www.mrunix.de/forums/showthread.php?t=36130&p=233100

:D

Liebe Grüße,
Axel

xaMax
29-03-2010, 18:20
Bitte beachten:

http://www.mrunix.de/forums/showthread.php?t=36130&p=233100

:D

Liebe Grüße,
Axel

öhm... ich glaube, ich kenne einfach zu viele Alexander... da ist man das einfach gewöhnt ;)

sorry und danke Axel!!