Wie kann ich die drei Spalten meiner Tabelle vertikal ausrichten (oben, oben, Mitte)?

Wie kann ich die drei Spalten meiner Tabelle vertikal ausrichten (oben, oben, Mitte)?

Ich möchte, dass die Formeln in der dritten Spalte vertikal mittig ausgerichtet sind, d. h. die Formeln sollten vertikal in der Mitte der beiden Zeilen der Beschreibungen stehen.

\documentclass{article}
\usepackage{amsmath}
\usepackage{tabularx,booktabs}
\usepackage{caption}
\begin{document}
\begin{table}[htb]
    \centering
    \caption{I would like the formulae here to be vertically at the middle of the two lines of text}
    \begin{tabularx}{\linewidth}{lX>{$}c<{$}}
        \toprule
        Name & Description & \multicolumn{1}{c}{Formula}\\
        \midrule
        Ducks & Something which goes on two lines, something which goes on two lines &
        A=\dfrac{B}{C}\\
        Lions & Something which goes on two lines, something which goes on two lines &
        D=\dfrac{E}{F}\\
        \bottomrule
    \end{tabularx}
\end{table}
\begin{table}[htb]
    \centering
    \caption{Here the formulae are correctly aligned with the description, but I would like the name at the top like in the previous table}
    \begin{tabular}{lm{24em}>{$}c<{$}}
        \toprule
        Name & Description & \multicolumn{1}{c}{Formula}\\
        \midrule
        Ducks & Something which goes on two lines, something which goes on two lines &
        A=\dfrac{B}{C}\\
        Lions & Something which goes on two lines, something which goes on two lines &
        D=\dfrac{E}{F}\\
        \bottomrule
    \end{tabular}
\end{table}
\end{document}

Bildbeschreibung hier eingeben

Antwort1

Hier eine Lösung basierend auf der Neudefinition des XSpaltentyps und zwei möglichen Hacks für die erste Spalte (diese müssen ggf. an den tatsächlichen Inhalt angepasst werden):

\documentclass{article}
\usepackage{amsmath}
\usepackage{tabularx, booktabs, makecell}
\renewcommand{\tabularxcolumn}[1]{m{#1}}

\begin{document}

\begin{table}[htb]
    \centering
    \begin{tabularx}{\linewidth}{lX>{$}c<{$}}
        \toprule
        Name & Description & \multicolumn{1}{c}{Formula}\\
        \midrule
       \makecell[l]{Ducks\\\mbox{}} & Something which goes on two lines, something which goes on two lines &
        A=\dfrac{B}{C}\\
\addlinespace
        \makecell[l]{Lions\\\mbox{}} & Something which goes on two lines, something which goes on two lines &
        D=\dfrac{E}{F}\\
\addlinespace
       \raisebox{1.4ex}{Lions} & Something which goes on two lines, something which goes on two lines &
        D=\dfrac{E}{F}\\
        \bottomrule
    \end{tabularx}
\end{table}

\end{document} 

Bildbeschreibung hier eingeben

Antwort2

Das ist ziemlich schwierig: Das Problem besteht darin, dass Sie das mittlere Feld auf zwei Arten ausrichten möchten: links entlang der Grundlinie, rechts entlang der Mitte. Dieser Tabellentyp erfordert normalerweise entweder das Verschachteln von Tabellen (was mit tabularx schwierig ist) oder das Messen eines Teils des Inhalts, um \llap-Tricks zu verwenden.

Uns fehlt hier tabellarischer Code basierend auf xcoffins, der mehr als einen Handle hat ...

\documentclass{article}
\usepackage{amsmath}
\usepackage{tabularx,booktabs}
\usepackage{caption,xcoffins}
\newlength\colA

\begin{document}
\begin{table}[htb]
    \centering
    \renewcommand{\tabularxcolumn}[1]{m{#1}}
    \settowidth\colA{\begin{tabular}{l}Name\\Ducks\\Lions\end{tabular}}
    \caption{I would like the formulae here to be vertically at the middle of the two lines of text}
    \begin{tabularx}{\linewidth}{p{\dimexpr\colA-2\tabcolsep}X>{$}c<{$}}
        \toprule
        Name & Description & \multicolumn{1}{c}{Formula}\\
        \midrule
             &\leavevmode\llap{\makebox[\colA][l]{Ducks}}Something which goes on two lines, something which goes on two lines &
        A=\dfrac{B}{C}\\
             &\leavevmode\llap{\makebox[\colA][l]{Lions}}Something which goes on two lines, something which goes on two lines and on one more line and on one more line and on one more line &
        D=\dfrac{E}{F}\\
        \bottomrule
    \end{tabularx}
\end{table}

%Only for show some coffin code:

\NewCoffin\CoffinA
\NewCoffin\CoffinB
\NewCoffin\CoffinC

\SetHorizontalCoffin\CoffinA{Ducks}
\SetHorizontalCoffin\CoffinC{$D=\dfrac{E}{F}$}

\SetVerticalCoffin\CoffinB{\dimexpr \textwidth-\CoffinWidth\CoffinA-\CoffinWidth\CoffinC-6\tabcolsep}{\noindent Something which goes on two lines, something which goes on two lines and on one more line and on one more line and on one more line}

\JoinCoffins\CoffinA[H,r]\CoffinB[T,l](2\tabcolsep,0pt)
\JoinCoffins\CoffinA[vc,r]\CoffinC[vc,l](2\tabcolsep,0pt)
\noindent\hspace*{\tabcolsep}\TypesetCoffin\CoffinA
\end{document}

Bildbeschreibung hier eingeben

Antwort3

So was:

Bildbeschreibung hier eingeben

Bearbeiten:

Die Position des Spalteninhalts wird durch die Zeilengrundlinie bestimmt, die (leider) nicht von Spalte zu Spalte geändert werden kann.

Bisher sehe ich keine andere Möglichkeit, als entweder in der letzten oder in der ersten Spalte Kästchen zu verwenden, die ihre Grundlinie ausrichten. Ein guter Kandidat für Ihren speziellen Fall ist \adjustbox:

\documentclass{article}
\usepackage{amsmath}
\usepackage{tabularx,booktabs}
\usepackage{caption}

\usepackage{adjustbox}

\begin{document}
\begin{table}[htb]
    \centering
    \caption{I would like the formulae here to be vertically at the middle of the two lines of text}
    \begin{tabularx}{\linewidth}{lXc}
        \toprule
        Name & Description & Formula    \\
        \midrule
        Ducks & Something which goes on two lines, something which goes on two lines &
        \adjustbox{valign=t}{$A=\dfrac{B}{C}$}\\
        Lions & Something which goes on two lines, something which goes on two lines &
        \adjustbox{valign=t}{$D=\dfrac{E}{F}$}\\
        \bottomrule
    \end{tabularx}
\end{table}
\end{document}

Um das Schreiben der Tabelle zu vereinfachen, können Sie einen neuen Spaltentyp definieren:

\newcolumntype{E}{>{\begin{adjustbox}{valign=t}$}c<{$\end{adjustbox}}}

und schreiben Sie dann die Tabelle (den Hauptteil) wie folgt:

    \begin{tabularx}{\linewidth}{lXE}
        \toprule
        Name & Description & Formula    \\
        \midrule
        Ducks & Something which goes on two lines, something which goes on two lines &
        A=\dfrac{B}{C}\\
        Lions & Something which goes on two lines, something which goes on two lines &
        D=\dfrac{E}{F}\\
        \bottomrule
    \end{tabularx}

Wenn der Text in den Zellen der mittleren Spalte beliebig viele Zeilen hat oder die Gleichung nur eine Zeile hat, ist das Ergebnis schlechter. In einem solchen Fall ist eine mögliche Lösung, multirowin der ersten Spalte Folgendes zu verwenden und die Anzahl der Spalten, die diese Zellen umfassen, manuell anzupassen und in der zweiten Spalte die Grundlinie vertikal in der Mitte festzulegen:

\documentclass{article}
\usepackage{amsmath}
\usepackage{booktabs, multirow, tabularx}
\usepackage{caption}

\usepackage{adjustbox}
\usepackage{lipsum}

\begin{document}
\begin{table}[htb]
    \centering
    \renewcommand\tabularxcolumn[1]{m{#1}} % <---
    \caption{I would like the formulae here to be vertically at the middle of the two lines of text}
    \begin{tabularx}{\linewidth}{lX>{$}c<{$}}
        \toprule
        Name & Description & Formula    \\
        \midrule
\multirow{-6}{*}{Ducks} % <--- manually adjusted
      & \lipsum[66] & A=\dfrac{B}{C}\\
        \bottomrule
    \end{tabularx}
\end{table}
\end{document}

Bildbeschreibung hier eingeben

oder verwenden Sie die in der Antwort von @Bernard vorgeschlagene Lösung.

Antwort4

Um ein vollständiges Bild der Möglichkeiten zu erhalten, füge ich einen Tabellensatz mit Hilfe vonKalorien. Es ist sehr einfach, solche Ausrichtungen mit einem zu erreichen calstable. Ich habe die linke und rechte Seitenlagerung entfernt, was Code hinzufügt, der für die Erstellung der OP-Tabelle nicht unbedingt erforderlich ist:

Bildbeschreibung hier eingeben

\documentclass{article}
\usepackage{cals, caption, amsmath}
\usepackage{lmodern}

\begin{document}

\begin{table*}
\caption{I would like the formulae here to be vertically at the middle of the two lines of text}
\begin{calstable}[c]
% Defining columns relative to each other and relative to the margins
\colwidths{{\dimexpr(\columnwidth)/6\relax}
            {\dimexpr(\columnwidth)/6*4\relax}
            {\dimexpr(\columnwidth)/6\relax}
            }

% Set up the tabular
\makeatletter
\def\cals@framers@width{0.8pt}   % Outside frame rules, reduce if the rule is too heavy
\def\cals@bodyrs@width{0.6pt}
\def\cals@cs@width{0pt}             % Inside rules, reduce if the rule is too heavy
\def\cals@rs@width{0.4pt}

\def\bb{\ifx\cals@borderB\relax     % Botton border switch (off-on)
    \def\cals@borderB{0pt}
\else \let\cals@borderB\relax\fi}

\def\lp{\ifdim\cals@paddingL=0.0pt\relax    % Left padding switch (off-on)
    \cals@setpadding{Ag}
\else \setlength{\cals@paddingL}{0pt}\fi}

\def\rp{\ifdim\cals@paddingR=0.0pt\relax    % Right padding switch (off-on)
    \cals@setpadding{Ag}
\else \setlength{\cals@paddingR}{0pt}\fi}


% R1H1
\thead{\small%
\brow
    \lp\alignL\cell{Name}\lp
    \alignL\cell{Description}
    \rp\alignR\cell{Formula}\rp
\erow
\normalsize%
}
\tfoot{\lastrule\strut}
%R2B1
\brow
    \lp\bb\alignL\cell{Ducks}\lp
    \alignL\cell{Something which goes on two lines, something which goes on two lines}
    \rp\alignR\cell{\vfil$A=\dfrac{B}{C}$}\rp
\erow
%R3B2
\brow
    \bb\lp\alignL\cell{Gnus}\lp
    \alignL\cell{Something which goes on two lines, something which goes on two lines and on one more line and on one more line and on one more line}
    \rp\alignR\cell{\vfil$D=\dfrac{E}{F}$}\rp\bb
\erow
%R4B3
\brow
    \lp\alignL\cell{Gnats}\lp
    \alignL\cell{Something which goes on two lines, something which goes on two lines and on one more line and on one more line and on one more line}
    \rp\alignR\cell{\vfil $D=\dfrac{E}{F}$}\rp
\erow
\makeatletter
\end{calstable}\par
\end{table*}
\end{document}

verwandte Informationen