
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 , tabularx
von 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 .l
r
c
X
X
l
X
X
\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
, \xend
und \xpad
. Bis jetzt hat es perfekt funktioniert.
- 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).
- Die Verwendung von
\hbox
zum Drucken des Zellinhalts verhindert die Verwendung dehnbarer Leerzeichen wie\hfill
, und eine Zelle in der rechten Spalte muss das Muster aufweisen,text\hfill text
um 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 ( c
und r
Spalten) zentriert zu haben.
Der zweite Punkt bezieht sich auf die Verwendung von \hfill
. Im Beispiel \hfill
wird A\hfill1
in nichts erweitert, sodass der angezeigte Text „A1“ ist, die nächste Zeile jedoch enthält, A\hfill2
in der sich der dehnbare Raum bis zur Größe der breitesten Zelle (der ersten: „Titel 3“) erweitert. Wäre toll, wenn der Effekt von \hfill
auch mit den Zeilen erreicht werden könnte, in denen die X
Spalte 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 \hfill
ausdehnen kann. Es wäre (vermutlich) möglich, den \pdflatstpos
Mechanismus 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 \settowidth
die Breite des Eintrags ermitteln, von dem Sie wissen, dass er am breitesten ist.
\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}