
Escribí la siguiente tabla usando tabular* dentro de \newenvironment. Funcionó bien, pero prefiero ajustar el texto en una columna. La tabla usa celdas "fantasmas" para lograr lo que quiero, que es tener una columna que tome todo el ancho disponible que dejan las otras tres columnas (visibles), es decir, tres columnas toman su ancho mínimo dependiendo del texto escrito en ellas, y la otra La columna toma el ancho restante. El ancho total es \linewidth, por eso usé tabular* en lugar de tabular. El 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}
Ahora, lo que quiero es ajustar el texto en la segunda columna visible (la "grande"). No se puede utilizar ni un parbox ni una columna tipo p debido a las columnas ajustadas dinámicamente. No sé cómo leer el ancho de la segunda columna para incluir un parbox con este ancho para permitir que el texto se ajuste en líneas.
¿Es posible leer una longitud en la que tabular* almacena el ancho de la celda actual? ¿O hay alguna manera de incluir algún cuadro de párrafo sin especificar su longitud?
No puedo usar tabú debido a [1]. También puede funcionar con tabularx, pero requiere cierta redefinición de enddef cuando se incluye dentro de un nuevo entorno. Tabularx presentó otro problema que no recuerdo ahora, pero si lo que necesito no es posible con tabular*, intentaré nuevamente con tabularx.
Leí [2]. Usar '<' y '>' en la definición de columna con lrbox no resuelve mi problema porque el tamaño del cuadro está restringido al tamaño de su contenido, no al tamaño de la columna resultante.
También intenté con zref-savepos guardar la posición x de dos columnas para luego tomar su diferencia y restar \tabcolsep y \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}
...pero cada vez que se compila el documento, la segunda referencia se mueve hacia la derecha porque tabular* recalcula la posición de la segunda columna.
[1]No se puede incluir un 'tabú' dentro de \newenvironment con celdas en el postámbulo
[2]\parbox "ancho de texto" para el ancho combinado de un subconjunto de celdas de la tabla
Respuesta1
El paquete tabularx
puede ayudar. Como está usando \newenvironment
, no puede usar \begin{tabularx}
y \end{tabularx
}, porque \end{tabularx}
está oculto. Sin embargo, \tabularx
y \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}
También es posible capturar el contenido del entorno a través del paquete environ
(algunas restricciones para \verb
las cosas). Quizás puedas agregar tus cosas misteriosas al final de la tabla más fácilmente.
\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}
Respuesta2
Como tabularx
ya se sugirió, daré una tabulary
respuesta. También tenga en cuenta que si especifica que la tabla tiene el ancho completo (mediante cualquiera de estos métodos), debe asegurarse de que no esté sangrada por la sangría del párrafo, de lo contrario, la línea estará demasiado llena. Por lo tanto, debe anteponer a la tabla \noindent
o, como aquí se establece \parindent
en cero.
También tenga en cuenta que si está utilizando tabular*
no hay necesidad de columnas adicionales, puede cambiar la separación de columnas adicionales para las columnas existentes; lo único un poco complicado es volver a insertar la regla 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}
Respuesta3
\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}