Unterschiedliche Ausrichtung der Spalten, wenn die Spalte „X“ in tabularx umbrochen wird

Unterschiedliche Ausrichtung der Spalten, wenn die Spalte „X“ in tabularx umbrochen wird

Ich habe diese Frage 2013 gestellt und sie hat mir geantwortet, aber bei der Implementierung in einen anderen Code sind neue Probleme aufgetreten, die vorher nicht aufgetreten sind.

Ich habe drei Spalten , tabularxvon denen zwei oder sind und die mittlere Spalte eine Spalte ist. Wenn die Spalte mehr als eine Zeile umfasst, ist das gewünschte Verhalten, dass die erste Spalte (sagen wir die Spalte) oben ausgerichtet ist (in derselben Zeile wie die erste Zeile der Spalte) und die dritte Spalte unten ausgerichtet ist (in derselben Zeile wie die letzte Zeile der Spalte). Die leeren Spalten werden mit etwas wie einem gefüllt .lrcXXlXX\cdot

Der Originalbeitrag ist unter [1] verfügbar. Die von David Carlisle bereitgestellte Lösung umfasste neue Befehle zum Durchführen von Messungen und zum Platzieren des Textes an den gewünschten Positionen: \xleft, \xright, \xstart, \xendund \xpad. Bis jetzt hat es perfekt funktioniert.

  1. Wenn die Zellen in der ersten und dritten Spalte mehr als ein Textzeichen enthalten, werden die ausgefüllten Zellen nicht zentriert, sondern horizontal am Textanfang/-ende der anderen beteiligten Zellen ausgerichtet (das ist das gewünschte Erscheinungsbild).
  2. Die Verwendung von \hboxzum Drucken des Zellinhalts verhindert die Verwendung dehnbarer Leerzeichen wie \hfill, und eine Zelle in der rechten Spalte muss das Muster aufweisen, text\hfill textum den Abstand zwischen den beiden Wörtern bis zur Spaltenbreite zu erweitern (genommen von der längeren Zelle, in meinem Fall dem Spaltentitel).

Der folgende Code ist die Lösung von David Carlisle und soll beispielhaft zeigen, was ich jetzt will:

\documentclass{article}
\usepackage{tabularx}

\makeatletter
\def\savepos#1{\leavevmode\pdfsavepos\write\@auxout{%
\gdef\noexpand#1{\the\pdflastypos sp }}}

\def\xstart#1{\expandafter\savepos\csname save@start@#1\endcsname}
\def\xend#1{\expandafter\savepos\csname save@end@#1\endcsname}
\def\xpad#1#2#3{%
\vtop{%
\baselineskip\normalbaselineskip
#2%
\expandafter\ifx\csname save@start@#1\endcsname\relax
\else
\dimen@\csname save@start@#1\endcsname\relax
\loop
\ifdim\dimen@>\csname save@end@#1\endcsname
\advance\dimen@-\baselineskip
\hbox{$\cdot$}%
\repeat
\fi
#3%
}}
\def\xleft#1#2{\xpad{#1}{\hbox{#2}}{}}
\def\xright#1#2{\xpad{#1}{}{\hbox{#2}}}

\begin{document}
\begin{tabularx}{5cm}{cXr}
title 1 & title 2 & title 3 \\

 \xleft{a}{7890} & \xstart{a}qwer asdf zxcv qwer 
    asdf zxcv qwer asdf
    zxcv\xend{a} & \xright{a}{1} \\
 \xleft{b}{50} & \xstart{b}qwer asdf zxcv\xend{b} & \xright{b}{A\hfill1} \\
 90 & ..... & B\hfill2
\end{tabularx}
\end{document}

Wie wir sehen können, sind die Punkte unter „7890“ am Anfang dieser Zelle ausgerichtet, also unter der Zahl „7“, und der Punkt unter der Zelle „50“ liegt direkt unter der „5“. Insgesamt scheint alles falsch ausgerichtet zu sein. Ich bevorzuge, sie alle sowohl in der ersten als auch in der dritten Spalte ( cund rSpalten) zentriert zu haben.

Der zweite Punkt bezieht sich auf die Verwendung von \hfill. Im Beispiel \hfillwird A\hfill1in nichts erweitert, sodass der angezeigte Text „A1“ ist, die nächste Zeile jedoch enthält, A\hfill2in der sich der dehnbare Raum bis zur Größe der breitesten Zelle (der ersten: „Titel 3“) erweitert. Wäre toll, wenn der Effekt von \hfillauch mit den Zeilen erreicht werden könnte, in denen die XSpalte umbrochen werden kann.

Ich bin dir dankbar.

[1]tabularx: untere Ausrichtung auf R- oder L-Spalten, wenn die X-Spalte umbrochen wird

Antwort1

Am einfachsten ist es, ohne alles neu schreiben zu müssen, eine Breite für die Box anzugeben, damit sie sich \hfillausdehnen kann. Es wäre (vermutlich) möglich, den \pdflatstposMechanismus zum Messen der vertikalen Ausdehnung der X-Spalte zum Messen der horizontalen Ausdehnung der 1. und 3. Spalte zu verwenden, aber das führt zu vielen Komplikationen, die vielleicht kaum praktisch sind. Anstatt wie hier eine feste Breite von 2 cm zu verwenden, könnten Sie \settowidthdie Breite des Eintrags ermitteln, von dem Sie wissen, dass er am breitesten ist.

Bildbeschreibung hier eingeben

\documentclass{article}
\usepackage{tabularx}

\makeatletter
\def\savepos#1{\leavevmode\pdfsavepos\write\@auxout{%
\gdef\noexpand#1{\the\pdflastypos sp }}}

\def\xstart#1{\expandafter\savepos\csname save@start@#1\endcsname}
\def\xend#1{\expandafter\savepos\csname save@end@#1\endcsname}
\def\xpad#1#2#3{%
\vtop{%
\baselineskip\normalbaselineskip
#2%
\expandafter\ifx\csname save@start@#1\endcsname\relax
\else
\dimen@\csname save@start@#1\endcsname\relax
\loop
\ifdim\dimen@>\csname save@end@#1\endcsname
\advance\dimen@-\baselineskip
\hbox{$\cdot$}%
\repeat
\fi
#3%
}}
\def\xleft#1#2#3{\xpad{#1}{\hbox\ifx!#3!\else to #3\fi{#2}}{}}
\def\xright#1#2#3{\xpad{#1}{}{\hbox\ifx!#3!\else to #3\fi{#2}}}

\begin{document}
\begin{tabularx}{5cm}{lXr}
\multicolumn{1}{c}{title 1}& title 2 & title 3 \\

 \xleft{a}{7890}{} & \xstart{a}qwer asdf zxcv qwer 
    asdf zxcv qwer asdf
    zxcv\xend{a} & \xright{a}{1}{2cm} \\
 \xleft{b}{50}{} & \xstart{b}qwer asdf zxcv\xend{b} & \xright{b}{A\hfill1}{2cm} \\
 90 & ..... & B\hfill2
\end{tabularx}
\end{document}

verwandte Informationen