Seite 1 von 1

Senkrechten Tabellenkopf zentrieren

Verfasst: Di 26. Jan 2021, 17:08
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

___

Re: Senkrechten Tabellenkopf zentrieren

Verfasst: Di 26. Jan 2021, 17:50
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}

Re: Senkrechten Tabellenkopf zentrieren

Verfasst: Di 26. Jan 2021, 20:14
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.


Re: Senkrechten Tabellenkopf zentrieren

Verfasst: Mi 27. Jan 2021, 16:27
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}

Re: Senkrechten Tabellenkopf zentrieren

Verfasst: Mi 27. Jan 2021, 16:49
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}