Anzeige:
Ergebnis 1 bis 15 von 15

Thema: Mehrzeilige Überschrift einer Tabelle oder Abbildung zentrieren inklusive Einzug

  1. #1
    Registrierter Benutzer
    Registriert seit
    01.02.2009
    Beiträge
    33

    Mehrzeilige Überschrift einer Tabelle oder Abbildung zentrieren inklusive Einzug

    Hallo,

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

    Code:
    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:
    Code:
    \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}

  2. #2
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

    nutze:
    Code:
    \newcommand{\captionquelle}[2]{\caption[#1]{#1\newline#2}}
    Gruß
    Marco

  3. #3
    Registrierter Benutzer
    Registriert seit
    01.02.2009
    Beiträge
    33
    Hallo,

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


    Code:
    \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}

  4. #4
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

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

    Code:
    \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\\\rule{\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. 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.
    Geändert von mechanicus (13-03-2010 um 12:20 Uhr)

  5. #5
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    Moin Marco,
    Zitat Zitat von mechanicus Beitrag anzeigen
    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.
    Code:
    \sbox\TestBoxI{\captionfont#1}
    \sbox\TestBoxII{\captionfont#2}
    MfG
    Rainer
    There's nothing a good whack with a hammer won't fix!

  6. #6
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Zitat Zitat von rais Beitrag anzeigen
    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

  7. #7
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von mechanicus Beitrag anzeigen
    Axel wird mich sicherlich gleich korrigieren.


    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!

  8. #8
    Registrierter Benutzer
    Registriert seit
    01.02.2009
    Beiträge
    33
    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:
    Code:
    \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}

  9. #9
    Registrierter Benutzer
    Registriert seit
    01.02.2009
    Beiträge
    33
    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.

    Code:
    \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}

  10. #10
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von xaMax Beitrag anzeigen
    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

  11. #11
    Registrierter Benutzer
    Registriert seit
    01.02.2009
    Beiträge
    33
    Zitat Zitat von sommerfee Beitrag anzeigen
    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...

  12. #12
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Hier eine mögliche Lösung:

    Code:
    \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

  13. #13
    Registrierter Benutzer
    Registriert seit
    01.02.2009
    Beiträge
    33
    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

  14. #14
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von xaMax Beitrag anzeigen
    Vielen Dank, Alex!!
    Bitte beachten:

    http://www.mrunix.de/forums/showthre...36130&p=233100



    Liebe Grüße,
    Axel

  15. #15
    Registrierter Benutzer
    Registriert seit
    01.02.2009
    Beiträge
    33
    Zitat Zitat von sommerfee Beitrag anzeigen
    Bitte beachten:

    http://www.mrunix.de/forums/showthre...36130&p=233100



    Liebe Grüße,
    Axel
    öhm... ich glaube, ich kenne einfach zu viele Alexander... da ist man das einfach gewöhnt

    sorry und danke Axel!!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •