Kennen Sie die Zellenbreite mit tabular* oder schließen Sie ein Absatzfeld ein, ohne dessen Breite anzugeben

Kennen Sie die Zellenbreite mit tabular* oder schließen Sie ein Absatzfeld ein, ohne dessen Breite anzugeben

Ich habe die folgende Tabelle mit tabular* in einer \newenvironment geschrieben. Funktionierte gut, aber ich bevorzuge Textumbruch in einer Spalte. Die Tabelle verwendet „Phantom“-Zellen, um mein Ziel zu erreichen, nämlich eine Spalte zu haben, die die gesamte verfügbare Breite einnimmt, die alle anderen drei (sichtbaren) Spalten übrig lassen, d. h. drei Spalten nehmen ihre Mindestbreite ein, abhängig vom in sie geschriebenen Text, und die andere Spalte nimmt die verbleibende Breite ein. Die Gesamtbreite ist \linewidth, deshalb habe ich tabular* statt tabular verwendet. Das MWE:

\documentclass{article}
\begin{document}
\begin{tabular*}{\linewidth {|c|l@{\extracolsep{\fill}}cc@{\extracolsep{0pt}}|r|r|}
minwidth& remaining width &&& minw & minw\\
x & x &&& x & x
\end{tabular*}
\end{document}

Was ich jetzt möchte, ist ein Textumbruch in der zweiten sichtbaren Spalte (der „großen“). Aufgrund der dynamisch angepassten Spalten kann weder eine Parbox noch eine p-ähnliche Spalte verwendet werden. Ich weiß nicht, wie ich die Spaltenbreite der zweiten Spalte lesen soll, um eine Parbox mit dieser Breite einzuschließen und einen Textumbruch in Zeilen zu ermöglichen.

Ist es möglich, eine Länge zu lesen, in der tabular* die Breite der aktuellen Zelle speichert? Oder gibt es eine Möglichkeit, ein Absatzfeld einzufügen, ohne dessen Länge anzugeben?

Ich kann tabu wegen [1] nicht verwenden. Tabularx könnte auch funktionieren, aber es erfordert eine Neudefinition der Enddefinition, wenn es in eine neue Umgebung eingefügt wird. Tabularx wies ein weiteres Problem auf, an das ich mich jetzt nicht erinnere, aber wenn das, was ich brauche, mit tabular* nicht möglich ist, werde ich es erneut mit tabularx versuchen.

Ich habe [2] gelesen. Die Verwendung von '<' und '>' in der Spaltendefinition mit lrbox löst mein Problem nicht, da die Größe der Box auf die Größe ihres Inhalts beschränkt ist und nicht auf die Größe der resultierenden Spalte.

Außerdem habe ich mit zref-savepos versucht, die X-Position zweier Spalten zu speichern, um später die Differenz zu nehmen und \tabcolsep und \arrayrulewidth abzuziehen:

\documentclass{article}
\usepackage{zref-savepos}
\newlength{\auxleng}
\newsavebox{\auxbox}
\newenvironment{auxenviron}
{\begin{lrbox}{\auxbox}}{\end{lrbox}\usebox{\auxbox}\global\setlength{\auxleng}{\wd\auxbox}}
\begin{document}
\begin{tabular*}{\linewidth}{|c|l@{\extracolsep{\fill}}cc@{\extracolsep{0pt}}|r|r|}
minw & \zsaveposx{XX}remaining width &&& \zsaveposx{XXX} minw & minw\\
x & \setlength{\auxleng}{\zposx{XXX} sp}\addtolength{\auxleng}{-\zposx{XX} sp}\parbox{\auxleng}{asdf}&&& x & x
\end{tabular*}
\end{document}

...aber bei jedem Kompilieren des Dokuments verschiebt sich die zweite Referenz nach rechts, da tabular* die Position der 2. Spalte neu berechnet.

[1]Ein Tabu kann nicht in \newenvironment mit Zellen im Postambel eingefügt werden

[2]\parbox "textwidth" für die kombinierte Breite einer Teilmenge von Tabellenzellen

Antwort1

Paket tabularxkann helfen. Da Sie verwenden , können Sie nicht und } \newenvironmentverwenden , da then ausgeblendet ist. Und funktioniert jedoch:\begin{tabularx}\end{tabularx\end{tabularx}\tabularx\endtabularx

\documentclass{article}
\usepackage{tabularx}

\newenvironment{mytab}{%
  \tabularx
}{%
  \endtabularx
}

\begin{document}
\noindent
\begin{mytab}{\linewidth}{|c|X|r|}
minwidth& remaining width minw & minw\\
x & x & x\\
\end{mytab}
\end{document}

Ergebnis

Es ist auch möglich, den Inhalt der Umgebung über das Paket abzufangen environ(einige Einschränkungen für \verbInhalte). Vielleicht können Sie Ihre mysteriösen Inhalte einfacher am Ende der Tabelle hinzufügen.

\documentclass{article}
\usepackage{tabularx}
\usepackage{environ}

\NewEnviron{mytab}{%
  \expandafter\mytabaction\expandafter{\BODY}%
}
\newcommand{\mytabaction}[1]{%
  \begin{tabularx}#1\end{tabularx}%
}

\begin{document}
\noindent
\begin{mytab}{\linewidth}{|c|X|r|}
minwidth& remaining width minw & minw\\
x & x & x\\
\end{mytab}
\end{document}

Antwort2

Wie tabularxbereits vorgeschlagen, werde ich eine tabularyAntwort geben. Beachten Sie auch, dass Sie, wenn Sie angeben, dass die Tabelle die volle Breite hat (mit einer dieser Methoden), sicherstellen müssen, dass sie nicht durch den Absatzeinzug eingerückt wird, da Ihre Zeile sonst überfüllt wird. Sie müssen der Tabelle also ein „ \noindentoder“ voranstellen, wie hier \parindentauf Null gesetzt.

Beachten Sie auch, dass bei Verwendung tabular*die zusätzlichen Spalten nicht benötigt werden. Sie können die zusätzlichen Spalten durch die vorhandenen Spalten ersetzen. Der einzige etwas knifflige Teil ist das erneute Einfügen der vertikalen Linie.

Bildbeschreibung hier eingeben

\documentclass{article}
\usepackage{tabulary}


% http://tex.stackexchange.com/questions/87097/is-it-possible-to-make-an-underfull-tabulary-spread-out/87543#87543
\makeatletter
\def\foo#1\def\TY@ratio#2#3!!{
\def\TY@checkmin{#1%
 \@tempdima\TY@ratio\TY@tablewidth
 \ifdim\@tempdima>\dimexpr\TY@linewidth+\hfuzz\relax
  \advance\@tempdima-\TY@linewidth
  \Gscale@div\@tempb\@tempdima\TY@tablewidth
  \@tempdimb\TY@ratio\p@
  \advance\@tempdimb-\@tempb\p@
  \edef\TY@ratio{\strip@pt\@tempdimb}%
\fi
#3}}
\expandafter\foo\TY@checkmin!!
\makeatother

\begin{document}
\parindent0pt

\begin{tabular*}{\linewidth}
      {|c|l@{\extracolsep{\fill}}cc@{\extracolsep{0pt}}|r|r|}
minwidth& remaining width &&& minw & minw\\
x & x &&& x & x
\end{tabular*}


\bigskip

\begin{tabular*}{\linewidth}
       {|c|l!{\extracolsep{\fill}}>{\vline\kern\tabcolsep\hfill}r!{\extracolsep{0pt}}|r|}
minwidth& remaining width & minw & minw\\
x & x & x & x
\end{tabular*}


\bigskip


\begin{tabulary}
      {\linewidth}{|c|L|r|r|}
minwidth& remaining width & minw & minw\\
x & x & x & x
\end{tabulary}




\end{document}

Antwort3

\documentclass{article}
\usepackage{tabularx}
\begin{document}
\noindent\rule{\linewidth}{1pt}

\bigskip\noindent
\begin{tabularx}{\linewidth} {|c|Xcc|r|r|}\hline
minwidth& remaining width &&& minw & minw\\
x & x &&& x & x
\end{tabularx}
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen