
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 tabularx
pode 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, \tabularx
e \endtabularx
funciona:
\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}
Também é possível capturar o conteúdo do ambiente via pacote environ
(algumas restrições para \verb
coisas). 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 tabularx
já foi sugerido, darei uma tabulary
resposta. 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 \noindent
ou, como definido aqui \parindent
como 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.
\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}