tabularx i textwidth

Oct 01 2020

Chciałbym wstawić do projektu tabelę z trzema kolumnami, ale mam problemy z dopasowaniem tekstu do komórki o objętości wielokolumnowej. Oto mój kod:

\begin{center}
\begin{tabularx}{\textwidth}{|c X c|}
\hline

\multicolumn{1}{|c}{} & 
\multicolumn{2}{>{\hsize=\dimexpr2\hsize+2\tabcolsep+\arrayrulewidth\relax}X|}{ cell0: text text text text text text text text text text text text text text text text }\\
\hline

cell1 & cell2: text text text text text text text text & cell3\\

\hline
\end{tabularx}
\end{center}

Problem polega na tym, że za każdym razem, gdy używam polecenia hsize, aby poprawnie dopasować tekst do komórki 0, komórka 2 w następnym wierszu traci automatyczne dostosowanie do tekstu i uzyskuje stałą szerokość (której nie chcę). Jak więc mogę dostosować tekst w cell0 w tym samym czasie, gdy cell2 zachowuje automatyczne dopasowanie do tekstu?

Odpowiedzi

2 Mico Oct 01 2020 at 11:48

Obliczenie użytecznej szerokości obiektu „cell0” jest nieprawidłowe. Byłoby (prawie) poprawne, gdyby obie kolumny bazowe były typu X; jednak tak nie jest, prawda?

Aby poprawnie obliczyć użyteczną łączną szerokość kolumn 2 i 3, proponuję postępować w następujący sposób.

  • Najpierw znajdź komórkę w kolumnie 3, która określa naturalną szerokość tej kolumny. Zwykle odbywa się to łatwo i niezawodnie poprzez kontrolę wzrokową.

  • Załóżmy, że komórka definiująca naturalną szerokość kolumny 3 składa się z ciągu aratherlongword. Jego szerokość można określić biegiem

   \newlength\colwidth
   \settowidth\colwidth{aratherlongword}
  • Następnie użyteczną łączną szerokość kolumn 2 i 3 można obliczyć jako
   \hsize=\dimexpr\hsize+\colwidth+2\tabcolsep\relax

Pełne MWE (pamiętaj, że odrzuciłem, \multicolumn{1}{|c}{}ponieważ jest zbędne).

\documentclass{article}
\usepackage{tabularx}
\begin{document}

\begin{center}
\newlength\colwidth
\settowidth\colwidth{aratherlongword}
\begin{tabularx}{\textwidth}{|c X c|}
\hline
& \multicolumn{2}{>{\hsize=\dimexpr\hsize+\colwidth+2\tabcolsep\relax}X|}{%
  cell0: text text text text text text text text text text text text text text text text }\\
\hline
cell1 & cell2: text text text text text text text text & aratherlongword\\
\hline
\end{tabularx}
\end{center}
\end{document}