
Я написал следующую таблицу, используя 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
ответ. Также обратите внимание, что если вы указываете таблицу полной ширины (любым из этих методов), вам нужно убедиться, что она не отступает от абзацного отступа, иначе ваша строка будет переполнена. Поэтому вам нужно добавить к таблице префикс \noindent
or, как здесь установлено \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}