PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spalten in S-Tabelle (siunitx) leider unterschiedlich breit



josephine
17-02-2014, 22:00
Hallo zusammen,

ich möchte ein paar deskriptive Statistiken in einer Tabelle darstellen und die Daten am Komma ausrichten. Außerdem soll es sich bei der Tabelle um eine longtable im Querformat handeln. Das Ganze habe ich auch schon ganz gut hinbekommen, nur leider sind die Spalten in der Darstellung unterschiedlich groß. Insgesamt hat die Tabelle 6 Spalten, von denen die erste von links die Beschriftungen, wie Mittelwert, Median etc., enthält und über den Spaltentyp "l" formatiert wird. Die restlichen fünf Spalten werden über den Spaltentyp "S" des siunitx-package formatiert. Wie man erkennt, ist die letzte Spalte ganz rechts deutlich größer als die übrigen Spalten. Wie also lässt sich die Tabelle so formatieren, dass die 5 Daten-enthaltenen Spalten alle gleich breit sind? Die Tabelle soll dabei trotzdem über die ganze Breite bzw. Höhe der Seite gehen.

Ein Hinweis noch: die Optionen table-figures-decimal, table-figures-integer, table-figures-alignment bringen hier wohl nichts, zumindest haben sie bei meinen misslungenen Versuchen in jeglichen Variationen nichts gebracht;)

Viele Grüße


\documentclass[captions=tableheading]{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usepackage{longtable}
\usepackage{booktabs}
\usepackage[decimalsymbol=comma]{siunitx}
\usepackage{pdflscape}
\usepackage[format=hang,justification=justified,singlelinechec k=false]{caption}

\begin{document}
\begin{landscape}
\centering
\renewcommand*{\arraystretch}{1.25}
\begin{longtable}{lSSSSS}
\captionsetup{justification=centering}
\caption{Tabellenüberschrift}\\
\multicolumn{6}{p{\linewidth}}{\textit{Hier steht ein wenig Text \dots.}}\\
\toprule
& {abcdefghijkl} & {abcdefghijkl} & {abcdefghijkl} &{abcdefghijkl} &{abcdefghijkl}\\
Mittelwert & 0.0002 & -0.0002 & -0.0003 & -0.0002 & -0.0002\\
Median & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
SD & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
\bottomrule
\end{longtable}
\end{landscape}
\end{document}

hakaze
18-02-2014, 05:52
die Ursache liegt hier:
\multicolumn{6}{p{\linewidth}}{\textit{Hier steht ein wenig Text \dots.}}\\hiermit zwingst du Tabelle, sich über die gesamte Zeilenbreite auszubreiten. Der Tabellen-Algorhithmus dehnt dann dementsprechend die letzte Spalte auf die notwendige Breite aus. So wird es wieder normal:
\multicolumn{6}{l}{\textit{Hier steht ein wenig Text \dots.}}\\

Wenn du wirklich unbedingt die gesamte Tabelle auf Textbreite haben musst (warum auch immer), dann baue doch die erste Spalte als X-Spalte mit tabularx (http://texdoc.net/pkg/tabularx).

josephine
18-02-2014, 07:04
Danke erstmal für die schnelle Antwort. Mein Grund den Text über der Abbildung mit


\multicolumn{6}{p{\linewidth}}{\textit{Hier steht ein wenig Text \dots.}}\\

zu formatieren liegt darin, dass dieser auch mal länger sein kann und dann im Blocksatz formatiert sein soll. Mit deiner Lösung über


\multicolumn{6}{l}{\textit{Hier steht ein wenig Text \dots.}}\\

sind zwar die Spalten gleich breit, aber die Beschreibung der Tabelle geht über die Seite hinaus (unten ein MB mit ein wenig mehr Text, bei dem genau das passiert).

Danke auch für den Hinweis zu tabularx. Das schau ich mir nachher mal an. Vielleicht gibt es aber auch eine Lösung mit meiner bisherigen Variante. Scheinbar liegt das Problem ja an der Angabe der Breite der p-Spalte über \linewidth. Im Prinzip müsste man diese doch einfach nur automatisch bestimmen lassen und dann wären die Spalten ja wieder gleich breit. Gibt es dafür vielleicht eine Möglichkeit? Der Nachteil wäre allerdings, dass sich dadurch die Beschreibung der Tabelle über deutlich mehr Zeilen erstrecken würde (Beschreibungen sind i.d.R. bei mir etwas länger), was wiederum dazu führen würde, dass die Tabelle nicht mehr auf eine Seite passt. Das ist der Grund, warum die Tabelle über die ganze Breite des Textes gehen soll.

Danke für die Hilfe.


\documentclass[captions=tableheading]{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usepackage{longtable}
\usepackage{booktabs}
\usepackage[decimalsymbol=comma]{siunitx}
\usepackage{pdflscape}
\usepackage[format=hang,justification=justified,singlelinechec k=false]{caption}
\usepackage{blindtext}

\begin{document}
\begin{landscape}
\centering
\renewcommand*{\arraystretch}{1.25}
\begin{longtable}{lSSSSS}
\captionsetup{justification=centering}
\caption{Tabellenüberschrift}\\
\multicolumn{6}{p{\linewidth}}{\textit{Hier steht ein wenig Text \dots. \blindtext}}\\
\toprule
& {abcdefghijkl} & {abcdefghijkl} & {abcdefghijkl} &{abcdefghijkl} &{abcdefghijkl}\\
Mittelwert & 0.0002 & -0.0002 & -0.0003 & -0.0002 & -0.0002\\
Median & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
SD & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
\bottomrule
\end{longtable}
\end{landscape}

\end{document}

josephine
18-02-2014, 11:57
Ich hab mir mal das tabularx-Paket angesehen und bin leider auch zu keiner schönen Lösung gekommen. Insgesamt habe ich jetzt vier Varianten, bei denen entweder die Spalten nicht gleich groß sind, nicht am Komma ausgerichtet wird oder die Beschriftung über den Seitenrand hinausgeht. Leider weiß ich hier nicht mehr weiter. Würde mich sehr freuen, wenn jemand vielleicht noch einen Tipp hätte. Über tabu ginge es vielleicht, aber das wird ja meines Wissens nicht mehr gepflegt, daher würde ich auf weitere Tabellen mit tabu - hab schon genügend davon - gerne verzichten.

Im Minimalbeispiel stehen dieses mal also vier erfolglose Lösungsvorschläge. Die Probleme stehen jeweils in den Tabellenüberschriften.

Außerdem wichtig: Die Tabellen sollen über mehr als eine Seite gehen, daher sollte das Ganze über longtable umgesetzt werden können. Falls tabularx die Lösung für oben beschriebene Probleme sein sollte, ist tabularx denn mit longtable überhaupt kombinierbar?

Viele Grüße



\documentclass[captions=tableheading]{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usepackage{longtable}
\usepackage{booktabs}
\usepackage[decimalsymbol=comma]{siunitx}
\usepackage{pdflscape}
\usepackage[format=hang,justification=justified,singlelinechec k=false]{caption}
\usepackage{blindtext}
\usepackage{array}
\usepackage{tabularx}

\begin{document}
\begin{landscape}
\centering
\renewcommand*{\arraystretch}{1.25}
\begin{longtable}{lSSSSS}
\captionsetup{justification=centering}
\caption{Problem: letzte Spalte zu breit}\\
\multicolumn{6}{p{\linewidth}}{\textit{Hier steht ein wenig Text \dots. \blindtext}}\\
\toprule
& {abcdefghijkl} & {abcdefghijkl} & {abcdefghijkl} &{abcdefghijkl} &{abcdefghijkl}\\
Mittelwert & 0.0002 & -0.0002 & -0.0003 & -0.0002 & -0.0002\\
Median & 0.0000 & 0.0000 & -23.0008 & 0.0000 & -0.0006\\
SD & 0.0000 & 0.02 & -0.0008 & 0.0000 & -0.0006\\
\bottomrule
\end{longtable}
\end{landscape}

\begin{landscape}
\centering
\renewcommand*{\arraystretch}{1.25}
\begin{longtable}{lSSSSS}
\captionsetup{justification=centering}
\caption{Problem: Beschreibung der Tabelle geht über Seitenrand hinaus}\\
\multicolumn{6}{l}{\textit{Hier steht ein wenig Text und noch so viel mehr Text, sodass diese Beschreibung ein wenig länger ist als die Breite dieser wunderschönen Seite.\dots.}}\\
\toprule
& {abcdefghijkl} & {abcdefghijkl} & {abcdefghijkl} &{abcdefghijkl} &{abcdefghijkl}\\
Mittelwert & 0.0002 & -0.0002 & -0.0003 & -0.0002 & -0.0002\\
Median & 0.0000 & 0.0000 & -23.0008 & 0.0000 & -0.0006\\
SD & 0.0000 & 0.02 & -0.0008 & 0.0000 & -0.0006\\
\bottomrule
\end{longtable}
\end{landscape}


% ab hier Varianten mit tabularx ################################################## ##
% Einbindung von longtable möglich?

\begin{landscape}
\begin{table}
\centering
\renewcommand*{\arraystretch}{1.25}
\captionsetup{justification=centering}
\caption{Problem: erste Spalte zu breit}
\begin{tabularx}{\linewidth}{XSSSSS}
\multicolumn{6}{p{\linewidth}}{\textit{Hier steht ein wenig Text \dots. \blindtext}}\\
\toprule
& {abcdefghijkl} & {abcdefghijkl} & {abcdefghijkl} &{abcdefghijkl} &{abcdefghijkl}\\
Mittelwert & 0.0002 & -0.0002 & -0.0003 & -0.0002 & -0.0002\\
Median & 0.0000 & 0.0000 & -23.0008 & 0.0000 & -0.0006\\
SD & 0.0000 & 0.02 & -0.0008 & 0.0000 & -0.0006\\
\bottomrule
\end{tabularx}
\end{table}
\end{landscape}

\begin{landscape}
\begin{table}
\centering
\renewcommand*{\arraystretch}{1.25}
\captionsetup{justification=centering}
\caption{Problem: nicht am Komma ausgerichtet}
\begin{tabularx}{\linewidth}{XXXXXX}
\multicolumn{6}{p{\linewidth}}{\textit{Hier steht ein wenig Text \dots. \blindtext}}\\
\toprule
& {abcdefghijkl} & {abcdefghijkl} & {abcdefghijkl} &{abcdefghijkl} &{abcdefghijkl}\\
Mittelwert & 0.0002 & -0.0002 & -0.0003 & -0.0002 & -0.0002\\
Median & 0.0000 & 0.0000 & -23.0008 & 0.0000 & -0.0006\\
SD & 0.0000 & 0.02 & -0.0008 & 0.0000 & -0.0006\\
\bottomrule
\end{tabularx}
\end{table}
\end{landscape}

\end{document}

esdd
18-02-2014, 13:28
Hier sind mal noch zwei Vorschläge. Beim ersten wird die Breite der S Spalten über die Kopfzeileneinträge gesteuert und die erste Spalte als p-Spalte mit der verbleibenden Breite gesetzt. Beim zweiten bleibt die Tabelle wie sie ist, nur für die oberste Zeile wird die gesamte Breite ausgenutzt.



\documentclass[captions=tableheading]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage[decimalsymbol=comma]{siunitx}
\usepackage{pdflscape}
\usepackage[format=hang,justification=justified,singlelinechec k=false]{caption}

\usepackage{blindtext}

\begin{document}
\begin{landscape}
\centering
\renewcommand*{\arraystretch}{1.25}
\begin{longtable}{p{\dimexpr0.25\linewidth-12\tabcolsep\relax}SSSSS}
\captionsetup{justification=centering}
\caption{Tabellenüberschrift}\\
\multicolumn{6}{p{\dimexpr\linewidth-2\tabcolsep\relax}}{\textit{\blindtext}}\\
\toprule
& {\makebox[0.15\linewidth]{abcdefghijkl}}
& {\makebox[0.15\linewidth]{abcdefghijkl}}
& {\makebox[0.15\linewidth]{abcdefghijkl}}
&{\makebox[0.15\linewidth]{abcdefghijkl}}
&{\makebox[0.15\linewidth]{abcdefghijkl}}\\
Mittelwert & 0.0002 & -0.0002 & -0.0003 & -0.0002 & -0.0002\\
Median & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
SD & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
\bottomrule
\end{longtable}
\end{landscape}

\begin{landscape}
\centering
\renewcommand*{\arraystretch}{1.25}
\setlength\abovetopsep{4\aboverulesep}
\begin{longtable}{lSSSSS}
\captionsetup{justification=centering}
\caption{Tabellenüberschrift}\\
\multicolumn{6}{l}{
~\hfill
\makebox[0pt][c]{\parbox[t]{\linewidth}{\textit{\blindtext}}}
\hfill~}\\
\toprule
& {abcdefghijkl} & {abcdefghijkl} & {abcdefghijkl} &{abcdefghijkl} &{abcdefghijkl}\\
Mittelwert & 0.0002 & -0.0002 & -0.0003 & -0.0002 & -0.0002\\
Median & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
SD & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
\bottomrule
\end{longtable}
\end{landscape}
\end{document}

Eine Kombination aus longtable und tabularx wäre zum Beispiel mit ltxtable möglich:


\documentclass[captions=tableheading]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{ltxtable}
\usepackage{booktabs}
\usepackage[decimalsymbol=comma]{siunitx}
\usepackage{pdflscape}
\usepackage[format=hang,justification=justified,singlelinechec k=false]{caption}

\usepackage{filecontents}

\usepackage{blindtext}

\begin{document}
\begin{landscape}
\centering
\renewcommand*{\arraystretch}{1.25}
\begin{filecontents}{tabelle.tex}
\begin{longtable}{XSSSSS}
\captionsetup{justification=centering}
\caption{Tabellenüberschrift}\\
\multicolumn{6}{p{\dimexpr\linewidth-2\tabcolsep\relax}}{\textit{\blindtext}}\\
\toprule
& {abcdefghijkl} & {abcdefghijkl} & {abcdefghijkl} &{abcdefghijkl} &{abcdefghijkl}\\
Mittelwert & 0.0002 & -0.0002 & -0.0003 & -0.0002 & -0.0002\\
Median & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
SD & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
\bottomrule
\end{longtable}
\end{filecontents}
\LTXtable{\linewidth}{tabelle.tex}
\end{landscape}
\end{document}

Gruß
Elke

u_fischer
18-02-2014, 13:46
Also ich benütze in diesen Fällen entweder ein weitere Dummy-Spalte, die die Breite aufnehmen kann (Beispiel 1 Seite), oder messe die Breite der longtable aus und benütze die in \multicolumn (2. Seite, 2 x kompilieren nötig).


\documentclass[captions=tableheading]{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usepackage{longtable}
\usepackage{booktabs}
\usepackage[decimalsymbol=comma]{siunitx}
\usepackage{pdflscape}
\usepackage[format=hang,justification=justified,singlelinechec k=false]{caption}
\usepackage{blindtext}

%Abmessen der Longtable-Tabellen
\newcommand\LastLTentrywidth{1em}
\makeatletter
\newlength\longtablewidth
\setlength{\longtablewidth}{1in}
\newcommand\getlongtablewidth{%
\begingroup
\ifcsname LT@\roman{LT@tables}\endcsname
\global\longtablewidth=0pt
\renewcommand\LT@entry[2]{\global\advance\longtablewidth by ##2\relax\gdef\LastLTentrywidth{##2}}%
\@nameuse{LT@\roman{LT@tables}}%
\fi
\endgroup}
\makeatother
\begin{document}
\begin{landscape}
\centering
\renewcommand*{\arraystretch}{1.25}
\begin{longtable}{lSSSSSl}
\captionsetup{justification=centering}
\caption{Tabellenüberschrift}\\
\multicolumn{7}{p{\linewidth}}{\textit{Hier steht ein wenig Text \dots. \blindtext}}\\
\toprule
& {abcdefghijkl} & {abcdefghijkl} & {abcdefghijkl} &{abcdefghijkl} &{abcdefghijkl}\\
Mittelwert & 0.0002 & -0.0002 & -0.0003 & -0.0002 & -0.0002\\
Median & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
SD & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
\bottomrule
\end{longtable}
\end{landscape}


\begin{landscape}
\centering
\renewcommand*{\arraystretch}{1.25}
\begin{longtable}{lSSSSS}\noalign{\getlongtablewid th\global\LTcapwidth=\longtablewidth}
\captionsetup{justification=centering}
\caption{Tabellenüberschrift}\\
\multicolumn{6}{p{\dimexpr\longtablewidth-2\tabcolsep}}{\textit{Hier steht ein wenig Text \dots. \blindtext}}\\
\toprule
& {abcdefghijkl} & {abcdefghijkl} & {abcdefghijkl} &{abcdefghijkl} &{abcdefghijkl}\\
Mittelwert & 0.0002 & -0.0002 & -0.0003 & -0.0002 & -0.0002\\
Median & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
SD & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
\bottomrule
\end{longtable}
\end{landscape}

\end{document}

josephine
18-02-2014, 16:31
Vielen, vielen Dank. Die Lösungen gehe alle zumindest in eine gute Richtung. Am besten hat dabei die Lösung über


\begin{landscape}
\centering
\renewcommand*{\arraystretch}{1.25}
\begin{longtable}{p{\dimexpr0.25\linewidth-12\tabcolsep\relax}SSSSS}
\captionsetup{justification=centering}
\caption{Tabellenüberschrift}\\
\multicolumn{6}{p{\dimexpr\linewidth-2\tabcolsep\relax}}{\textit{\blindtext}}\\
\toprule
& {\makebox[0.15\linewidth]{abcdefghijkl}}
& {\makebox[0.15\linewidth]{abcdefghijkl}}
& {\makebox[0.15\linewidth]{abcdefghijkl}}
&{\makebox[0.15\linewidth]{abcdefghijkl}}
&{\makebox[0.15\linewidth]{abcdefghijkl}}\\
Mittelwert & 0.0002 & -0.0002 & -0.0003 & -0.0002 & -0.0002\\
Median & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
SD & 0.0000 & 0.0000 & -0.0008 & 0.0000 & -0.0006\\
\bottomrule
\end{longtable}
\end{landscape}

gepasst. Ich habe diese auch schon auf mein Dokument angewendet und entsprechende Anpassungen haben auch gut funktioniert. Trotzdem verstehe ich noch nicht ganz was 1. hinter


\begin{longtable}{p{\dimexpr0.25\linewidth-12\tabcolsep\relax}SSSSS}

und 2. hinter


\multicolumn{6}{p{\dimexpr\linewidth-2\tabcolsep\relax}}

steckt. So wie ich es verstehe, wird die Breite der linken Spalte über 1. bestimmt. Woher ergeben sich aber die 0.25\linewidth und warum wird 12\tabcolsep abgezogen? Auf die 12 komme ich vielleicht noch: Spaltenabstand ganz rechts + Spaltenabstand ganz links + doppeler Spaltenabstand zwischen den Spalten=1+1+2*5=12? Warum aber werden diese abgezogen. Mann könnte doch alternativ die Breite auch über 0.15\linewidth bestimmen und käme ungefähr zum gleichen Ergebnis. Warum also so und nicht so? Den 2. Punkt kann ich bis auf \dimexpr und \relax nachvollziehen. Würde mich freuen, wenn ihr mir das noch erklären könntet. Habe von token, primitiven und nicht-Expandierbarkeit gelesen, allerdings nicht verstanden, worum es geht, da die Erläuterungen für mich viel zu technisch waren.

Besten Dank für eure Hilfe und euren tollen und schnellen Lösungsvorschläge.

esdd
18-02-2014, 17:25
Eigentlich erwartet Latex als Argument des Spaltentypes p eine Länge. \dimexpr sagt Latex, dass diese erst noch berechnet wird und \relax signalisiert hier das Ende der Berechnung.

Um die Breite der ersten Spalte zu berechnen, wird zunächst von \linewidth die Breite der anderen 5 Spalten, also je 0.15\linewidth, abgezogen. Das ergibt dann 0.25\linewidth, d.h. ich hatte \linewidth-5*0.15\linewidth=0.25\linewidth bereits ausgerechnet, um nicht zwei Mal \linewidth tippen zu müssen. Dann werden noch die Spaltenabstände abgezogen, deren Anzahl sich wie von dir angegeben bestimmen lässt.

Gruß
Elke

josephine
18-02-2014, 17:42
Hab's verstanden. Klappt super!

Danke nochmal.