Conheça a largura da célula com tabular* ou inclua uma caixa de parágrafo sem especificar sua largura

Conheça a largura da célula com tabular* ou inclua uma caixa de parágrafo sem especificar sua largura

Escrevi a tabela a seguir usando tabular* dentro de um \newenvironment. Funcionou bem, mas prefiro ter quebra automática de texto em uma coluna. A tabela usa células "fantasmas" para conseguir o que eu quero que seja ter uma coluna que ocupe toda a largura disponível que todas as outras três colunas (visíveis) deixam, ou seja, três colunas têm sua largura mínima dependendo do texto escrito nelas, e a outra coluna ocupa a largura restante. A largura total é \linewidth, por isso usei tabular* em vez de tabular. O 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}

Agora, o que eu quero é a quebra de texto na segunda coluna visível (a "grande"). Nem uma coluna parbox nem uma coluna tipo p podem ser usadas por causa das colunas ajustadas dinamicamente. Não sei como ler a largura da segunda coluna para incluir uma parbox com essa largura para permitir a quebra de texto em linhas.

É possível ler um comprimento em que tabular* armazena a largura da célula atual? ou existe uma maneira de incluir alguma caixa de parágrafo sem especificar seu comprimento?

Não posso usar tabu por causa de [1]. Também pode funcionar tabularx, mas requer alguma redefinição do enddef ao incluí-lo em um novo ambiente. Tabularx apresentou outro problema do qual não me lembro agora, mas se o que preciso não for possível com tabular*, tentarei novamente com tabularx.

Eu li [2]. Usar '<' e '>' na definição de coluna com lrbox não resolve meu problema porque o tamanho da caixa é restrito ao tamanho de seu conteúdo, não ao tamanho da coluna resultante.

Também tentei com zref-savepos salvar a posição x de duas colunas para depois tirar sua diferença e subtrair \tabcolsep e \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}

...mas toda vez que o documento é compilado, a segunda referência se move para a direita porque tabular* recalcula a posição da 2ª coluna.

[1]Não é possível incluir um 'tabu' dentro de \newenvironment com células no postâmbulo

[2]\parbox "textwidth" para a largura combinada de um subconjunto de células da tabela

Responder1

O pacote tabularxpode ajudar. Como você está usando \newenvironment, você não pode usar \begin{tabularx}e \end{tabularx}, porque então \end{tabularx}está oculto. No entanto, \tabularxe \endtabularxfunciona:

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

Resultado

Também é possível capturar o conteúdo do ambiente via pacote environ(algumas restrições para \verbcoisas). Talvez você possa adicionar suas coisas misteriosas no final da mesa com mais facilidade.

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

Responder2

Como tabularxjá foi sugerido, darei uma tabularyresposta. Observe também que se você especificar que a tabela tem largura total (por qualquer um desses métodos), você precisa ter certeza de que ela não está recuada pelo recuo do parágrafo, caso contrário sua linha ficará cheia demais. Portanto, você precisa prefixar a tabela com \noindentou, como definido aqui \parindentcomo zero.

Observe também que se você estiver usando, tabular*não há necessidade de colunas extras, você pode trocar a separação de colunas extras pelas colunas existentes. A única parte um pouco complicada é reinserir a regra vertical.

insira a descrição da imagem aqui

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

Responder3

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

insira a descrição da imagem aqui

informação relacionada