Узнайте ширину ячейки с помощью табличной* или включите блок абзаца, не указывая его ширину

Узнайте ширину ячейки с помощью табличной* или включите блок абзаца, не указывая его ширину

Я написал следующую таблицу, используя tabular* внутри \newenvironment. Работает нормально, но я предпочитаю иметь перенос текста в одном столбце. Таблица использует «фантомные» ячейки, чтобы достичь того, что я хочу, а именно, чтобы один столбец занимал всю доступную ширину, которую оставляют все остальные три (видимые) столбца, т. е. три столбца занимают свою минимальную ширину в зависимости от текста, записанного в них, а другой столбец занимает оставшуюся ширину. Общая ширина равна \linewidth, поэтому я использовал tabular* вместо tabular. 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}

Теперь мне нужно, чтобы текст переносился по второму видимому столбцу («большому»). Ни parbox, ни p-like столбец не могут быть использованы из-за динамически настраиваемых столбцов. Я не знаю, как считать ширину столбца второго столбца, чтобы включить parbox с этой шириной, чтобы разрешить перенос текста по строкам.

Можно ли прочитать длину, в которой tabular* хранит ширину текущей ячейки? Или есть способ включить некоторый блок абзаца, не указывая его длину?

Я не могу использовать tabu из-за [1]. Также может работать tabularx, но он требует некоторого переопределения enddef при включении его в новую среду. Tabularx выявил другую проблему, которую я сейчас не помню, но если то, что мне нужно, невозможно с tabular*, я попробую снова с tabularx.

Я читал [2]. Использование '<' и '>' в определении столбца с lrbox не решает мою проблему, поскольку размер поля ограничен размером его содержимого, а не размером результирующего столбца.

Также я попробовал с помощью zref-savepos сохранить x-координату двух столбцов, чтобы позже взять их разницу и вычесть \tabcolsep и \arrayrulewidth:

\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}

...но каждый раз при компиляции документа вторая ссылка перемещается вправо, поскольку tabular* пересчитывает позицию 2-го столбца.

[1]Невозможно включить «табу» внутрь \newenvironment с ячейками в постамбуле

[2]\parbox "textwidth" для общей ширины подмножества ячеек таблицы

решение1

Пакет tabularxможет помочь. Поскольку вы используете \newenvironment, вы не можете использовать \begin{tabularx}и \end{tabularx}, потому что then \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}

Результат

Также возможно поймать содержимое окружения через пакет environ(некоторые ограничения для \verbвещей). Возможно, вы сможете добавить свои таинственные вещи в конец таблицы более легко.

\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}

решение2

Как tabularxуже было предложено, я дам tabularyответ. Также обратите внимание, что если вы указываете таблицу полной ширины (любым из этих методов), вам нужно убедиться, что она не отступает от абзацного отступа, иначе ваша строка будет переполнена. Поэтому вам нужно добавить к таблице префикс \noindentor, как здесь установлено \parindentв ноль.

Также обратите внимание, что если вы используете , tabular*то нет необходимости в дополнительных столбцах, вы можете переключить дополнительный столбец SEP для существующих столбцов, единственная небольшая сложность — повторно вставить вертикальную линию.

введите описание изображения здесь

\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}

решение3

\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}

введите описание изображения здесь

Связанный контент