alt text

Wie erreiche ich in einer Tabelle mit multirow, dass sich die zweite Spalte an der Oberkannte der ersten Spalte orientiert, auch wenn sie Zeilenumbrüche hat?

alt text

Die dritte Spalte kann an sich so bleiben, also zentiert.

Öffne in Overleaf
\documentclass[border=5mm, varwidth]{standalone}
\usepackage{tikz}
\usepackage{array, multirow}
\begin{document}
\newcolumntype{P}[2]{>{\tiny\raggedright}m{#1}}
\def\Links{31}
\def\oben{Das ist ein sehr langer Satz}
\def\unten{bbb  bbb}
\def\Rechts{Multiro}
\setlength{\tabcolsep}{0pt}%
\begin{tabular}{| >{\Huge}l  P{1.5cm}| p{1.2cm}|}
\multirow{2}{*}{\Links} & \oben  & \multirow{2}{1cm}{\Rechts}\\[-3pt] 
{}                                 & \unten & {}                                      \\
\end{tabular}%
\end{document}

gefragt 05 Nov '18, 04:42

cis's gravatar image

cis
9.5k93459491
Akzeptiert-Rate: 29%

1

Am besten, indem du kein \multirow verwendest. \multirow rät die Größe der Zeilen, die es zusammenfasst -- genau genommen nimmt es einfach nur Standardgröße an. Ist irgendetwas in den zusammengefassten Zeilen, das die Zeilen vertikal streckt, so schlägt \multirows Ausrichtung fehl.

(05 Nov '18, 09:25) Skillmon

Außerdem hast du einen Fehler in der Definition von P, es müsste heißen: \newcolumntype{P}[1]{>{\tiny\raggedright}m{#1}} (du hattest ein Argument zu viel). Für das gewünschte top-alignment ist allerdings die m Variante ungeeignet.

(05 Nov '18, 09:39) Skillmon

Grundsätzlich ist meine persönliche Erfahrung, dass das Umsetzen einer gewünschten Vertikalausrichtung einfacher ist, wenn man, anstatt \multirow auf alle Spalten außer einer anzuwenden, die eine Spalte teilt (entweder mit \makecell oder indem man manuell eine tabular einfügt -- \makecell macht nichts anderes).

Im Fall von gemischten Schriftgrößen ist die Ausrichtung allerdings nicht so ganz einfach, wenn sie automatisch durchgeführt wird, da die Grundlinien an einander ausgerichtet werden. Deshalb habe ich ein kleines Makro implementiert, das sein zweites Argument soweit hebt, dass die obere Kante mit der des ersten Arguments übereinstimmt. Ich könnte das Ganze auch automatisieren, wenn das erwünscht sein sollte (mittels collcell), allerdings halte ich den manuellen Ansatz für besser (in der Hoffnung, du mischst verschiedene Schriftgrößen nicht ständig, sondern nur dieses eine Mal).

Öffne in Overleaf
\usepackage{array, multirow}

\newcolumntype{P}[1]{>{\tiny\raggedright}p{#1}}
\def\Links{31}
\def\oben{Das ist ein sehr langer Satz}
\def\unten{bbb  bbb}
\def\Rechts{Multiro}
\setlength{\tabcolsep}{0pt}%

\newcommand\movetoptotop[2]
  {%
    \begingroup
    \setbox0\hbox{#1}%
    \raisebox{\dimexpr\ht0-\height}{#2}%
    \endgroup
  }

\begin{document}
\begin{tabular}{| >{\Huge}l  P{1.5cm}| p{1.2cm}|}
  \Links
    & \movetoptotop{\Huge\Links}
        {%
          \begin{tabular}{@{}P{1.5cm}@{}}
            \oben\\\unten
          \end{tabular}%
        }
    & \movetoptotop{\Huge\Links}{\Rechts}
\end{tabular}%
\end{document}

alt text


Eine (limitierte) automatisierte Version. Ich hoffe, die Syntax ist selbsterklärend. Wichtig ist, dass die Zellen, in denen eine tabular (oder anderes seltsames) genestet wird, mit zusätzlichen geschweiften Klammern umgeben werden müssen.

Öffne in Overleaf
\documentclass[border=2mm]{standalone}

\usepackage{array, multirow}

\usepackage{collcell}

\newcolumntype{P}[1]{>{\tiny\raggedright}p{#1}}

\def\Links{31}
\def\oben{Das ist ein sehr langer Satz}
\def\unten{bbb  bbb}
\def\Rechts{Multiro}
\setlength{\tabcolsep}{0pt}%

\newcommand\movetoptotop[2]
  {%
    \begingroup
    \setbox0\hbox{#1}%
    \raisebox{\dimexpr\ht0-\height}{#2}%
    \endgroup
  }

\newcommand\onecell[2]
  {%
    \begin{tabular}{@{}#1@{}}
      #2%
    \end{tabular}%
  }

\newcolumntype{\reference}[2]
  {>{\collectcell\movetoptotopsetref{#1}}#2<{\endcollectcell}}
\newcolumntype{\moved}[1]
  {>{\collectcell\movedcol}#1<{\endcollectcell}}
\newcommand\movetoptotopsetref[2]
  {%
    \gdef\movetoptotopref{#1#2}%
    #1#2%
  }
\newcommand\movedcol[1]
  {%
    \movetoptotop{\movetoptotopref}{#1}%
  }

\begin{document}
\begin{tabular}{| \reference{\Huge}{l}  \moved{P{1.5cm}}| \moved{p{1.2cm}}|}
  \Links
    & {\onecell{P{1.5cm}}{\oben\\\unten}}
    & \Rechts
\end{tabular}%
\end{document}
Permanenter link

beantwortet 05 Nov '18, 09:55

Skillmon's gravatar image

Skillmon
1.2k6
Akzeptiert-Rate: 46%

bearbeitet 06 Nov '18, 14:32

Aja, mir ist aufgefallen: Wenn \unten leer ist, bleibt die Tabelle genauso hoch...

(05 Nov '18, 14:28) cis

Wobei das ist eigentlich gut.

(05 Nov '18, 14:42) cis
1

@cis das liegt daran, dass \\ noch die Definition von \raggedright hat. Eigentlich müsste (wenn man korrekt sein möchte) P definiert sein als \newcolumntype{P}[1]{>{\tiny\raggedright\arraybackslash}p{#1}} (alternativ kann man auch >{\tiny\raggedright\let\newline\\\arraybackslash} verwenden). Sollte die P Spalte als letzte Spalte verwendet werden, hättest du sonst ein Problem, da \\ nun nicht in die nächste Zeile der Tabelle gehen würde.

(05 Nov '18, 14:50) Skillmon

Könnte man das movetotop in die Definition der newcolumn mit reinnehmen? Das wäre eleganter.

(05 Nov '18, 20:15) cis
1

@cis wie bereits oben erwähnt: Ja, mittels des Pakets collcell. Gib mir ein paar Minuten.

(06 Nov '18, 10:30) Skillmon

Aja, sehr gut.
Ich habe heute gesehen, dass es eine b-Spalte (für bottom) gibt (glaube booktabs.sty). Aber eine t-Spalte gibt es scheints nicht (?). Und dann nimmt das gleich wieder unfassbare Formen an.

(09 Nov '18, 00:06) cis

@cis die p Spalte ist doch bereits eine top-alignment Spalte. Allerdings wird eben entlang der Grundlinie ausgerichtet.

(09 Nov '18, 09:09) Skillmon
Ergebnis 5 von 7 show 2 more comments
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×256

gestellte Frage: 05 Nov '18, 04:42

Frage wurde gesehen: 4,483 Mal

zuletzt geändert: 09 Nov '18, 09:09