Senkrechten Tabellenkopf zentrieren

Tabellen und Grafiken erstellen und anordnen


Max16hr
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: Do 24. Okt 2019, 17:10
Wohnort: Dresden

Senkrechten Tabellenkopf zentrieren

Beitrag von Max16hr »

Hallo!

Ich habe eigentlich ein recht leichtes Problem, denke ich, bekomme es aber irgendwie nicht hin.
Und zwar habe ich in einer Tabelle mit \multirow und \rotatebox eine senkrechte Überschrift erzeugt und möchte, dass diese zentriert ist. Aber wie schaffe ich das?

Die Tabelle erzeuge ich mit folgendem Code

\documentclass{scrreprt}

\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{multirow}
\usepackage{rotating}
\usepackage{makecell}
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\renewcommand\theadfont{\bfseries}

\begin{document}

\begin{table}[ht]
  \centering
  \begin{tabularx}{.3\textwidth}{@{}Y|*{4}{Y}@{}}
    \toprule
    \multicolumn{2}{c}{} & \multicolumn{3}{c@{}}{\thead{Columns}} \\
    \cmidrule(l){3-5}
    \multicolumn{2}{c}{} & \thead{X} & \thead{Y} & \thead{Z} \\
    \multirow{4}{*}{\rotatebox[origin=c]{90}{\thead{Rows}}}
    & \thead{A} & ax & ay & az \\
    & \thead{B} & bx & by & bz \\
    & \thead{C} & cx & cy & cz \\
    & \thead{D} & dx & dy & dz \\
    \bottomrule
  \end{tabularx}
\end{table}

\end{document}

Ein Bild der Tabelle ist im Anhang. Das Wort "Rows" ist klar zu weit oben.

Ich weiß, dass \multirow eine Option [<vmove>] anbietet, mit der man Inhalte verschieben kann. Zum Beispiel liefert diese Zeile ein gutes Ergebnis:

\multirow{4}{*}[-.81em]{\rotatebox[origin=c]{90}{\thead{Rows}}}

Aber der Wert von -.81em ist hierbei natürlich komplett willkürlich gewählt per Trial and Error. Das ist nicht exakt und jedes Mal, wenn ich eine weitere Zeile zur Tabelle hinzufügen oder entferne oder ich den Titel ändere, muss ich mühsam eine neue Schätzung finden, um es per Hand zu zentrieren.
Das geht sicher besser, aber ich weiß nicht wie.

Kann vielleicht jemand helfen? :) Danke!

Max

___
Dateianhänge
lA27K.png
lA27K.png (19.15 KiB) 2176 mal betrachtet

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Re: Senkrechten Tabellenkopf zentrieren

Beitrag von Bartman »

Ein Vorschlag mithilfe der TikZ-Bibliothek tikzmark:

\documentclass{scrreprt}

\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{multirow}
\usepackage{rotating}
\usepackage{makecell}
\usepackage{tikz}

\usetikzlibrary{tikzmark}

\newcolumntype{Y}{>{\centering\arraybackslash}X}
\renewcommand{\theadfont}{\bfseries}

\begin{document}
\begin{table}[ht]
  \centering
  \begin{tabularx}{.3\textwidth}{@{}Y|*4Y@{}}
    \toprule
    \multicolumn{2}{c}{} & \multicolumn{3}{c@{}}{\thead{Columns}} \\
    \cmidrule(l){3-5}
    \multicolumn{2}{c}{} & \thead{X} & \thead{Y} & \thead{Z} \\
%    \multirow{4}{*}{\rotatebox[origin=c]{90}{\thead{Rows}}}
    \tikzmarknode{firstrow}{\phantom{A}} & \thead{A} & ax & ay & az \\
    & \thead{B} & bx & by & bz \\
    & \thead{C} & cx & cy & cz \\
    \tikzmarknode{lastrow}{\phantom{D}} & \thead{D} & dx & dy & dz \\
    \bottomrule
  \end{tabularx}
  \begin{tikzpicture}[remember picture,overlay]
  \path (firstrow) -- node [rotate=90] {\thead{Rows}} (lastrow);
  \end{tikzpicture}
\end{table}
\end{document}

gast

Re: Senkrechten Tabellenkopf zentrieren

Beitrag von gast »

\documentclass{scrreprt}

\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{multirow}
\usepackage{rotating}
\usepackage{makecell}
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\renewcommand\theadfont{\bfseries}

\begin{document}

\begin{table}[ht]
  \centering
  \begin{tabularx}{.3\textwidth}{@{}Y|*{4}{Y}@{}}
    \toprule
    \multicolumn{2}{c}{} & \multicolumn{3}{c@{}}{\thead{Columns}} \\
    \cmidrule(l){3-5}
    \multicolumn{2}{c}{} & \thead{X} & \thead{Y} & \thead{Z} \\
    \multirow{4}{*}[-\dp\strutbox]{\rotatebox[origin=r]{90}{\thead{Rows}}}
    & \thead{A} & ax & ay & az \\
    & \thead{B} & bx & by & bz \\
    & \thead{C} & cx & cy & cz \\
    & \thead{D} & dx & dy & dz \\
    \bottomrule
  \end{tabularx}
\end{table}

\end{document}

Passt auch, wenn man einen längeren Text, beispielsweise das Nonsenswort "Rowselen" statt "Rows" verwendet.


Max16hr
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: Do 24. Okt 2019, 17:10
Wohnort: Dresden

Re: Senkrechten Tabellenkopf zentrieren

Beitrag von Max16hr »

@gast: Danke für deinen Vorschlag, aber leider funktioniert das nicht. Bei 4 Zeilen sieht das Ergebnis gut aus, aber je mehr Zeilen man hinzufügt, desto mehr wird deutlich, dass es doch nicht zentriert ist.

\documentclass{scrreprt}

\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{multirow}
\usepackage{rotating}
\usepackage{makecell}
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\renewcommand\theadfont{\bfseries}

\begin{document}

\begin{table}[ht]
  \centering
  \begin{tabularx}{.3\textwidth}{@{}Y|*{4}{Y}@{}}
    \toprule
    \multicolumn{2}{c}{} & \multicolumn{3}{c@{}}{\thead{Columns}} \\
    \cmidrule(l){3-5}
    \multicolumn{2}{c}{} & \thead{X} & \thead{Y} & \thead{Z} \\
    \multirow{8}{*}[-\dp\strutbox]{\rotatebox[origin=r]{90}{\thead{Rows}}}
    & \thead{A} & ax & ay & az \\
    & \thead{B} & bx & by & bz \\
    & \thead{C} & cx & cy & cz \\
    & \thead{D} & dx & dy & dz \\
    & \thead{E} & ex & ey & ez \\
    & \thead{F} & fx & fy & fz \\
    & \thead{G} & gx & gy & gz \\
    & \thead{H} & hx & hy & hz \\
    \bottomrule
  \end{tabularx}
\end{table}

\end{document}
Dateianhänge
2021-01-27_162227.png

Max16hr
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: Do 24. Okt 2019, 17:10
Wohnort: Dresden

Re: Senkrechten Tabellenkopf zentrieren

Beitrag von Max16hr »

@Bartman: Auch dir vielen Dank! Klasse, was es doch alles für Möglichkeiten gibt.
Diese Variante funktioniert sehr gut. Ich staune nur, dass es letztlich doch ein ziemlich umständliches Verfahren ist, um so eine Zentrierung hin zu bekommen. Neue Bibliotheken usw. Warum bietet multirow hier nicht einfach eine Option zur vertikalen Zentrierung an?

Und ein was anderes fällt mir auf: Die vrule ( | ), die tabularx zur Spaltentrennung nutzt, scheint selbst nicht zentriert zu sein. Als ich zur Kontrolle einen Vergleichsstring eingesetzt habe statt des Wortes "Rows", habe ich erwartet, dass dieses Vergleichslinie exakt neben der Spaltentrennlinie liegt, aber das ist nicht der Fall:

2021-01-27_163346.png
\documentclass{scrreprt}

\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{multirow}
\usepackage{rotating}
\usepackage{makecell}
\usepackage{tikz}

\usetikzlibrary{tikzmark}

\newcolumntype{Y}{>{\centering\arraybackslash}X}
\renewcommand{\theadfont}{\bfseries}

\begin{document}

\begin{table}[ht]
  \centering
  \begin{tabularx}{.3\textwidth}{@{}Y|*4Y@{}}
    \toprule
    \multicolumn{2}{c}{} & \multicolumn{3}{c@{}}{\thead{Columns}} \\
    \cmidrule(l){3-5}
    \multicolumn{2}{c}{} & \thead{X} & \thead{Y} & \thead{Z} \\
    \tikzmarknode{firstrow}{\phantom{A}} & \thead{A} & ax & ay & az \\
    & \thead{B} & bx & by & bz \\
    & \thead{C} & cx & cy & cz \\
    \tikzmarknode{lastrow}{\phantom{D}} & \thead{D} & dx & dy & dz \\
    \bottomrule
  \end{tabularx}
  \begin{tikzpicture}[remember picture, overlay]
    \path (firstrow) -- node [rotate=90] {\thead{---------.---------}} (lastrow);
  \end{tikzpicture}
\end{table}

\end{document}

Antworten