¿Cómo limitar el ancho de una tabla anidada?

¿Cómo limitar el ancho de una tabla anidada?

La tabla interna (es decir, la 'descripción muy larga') sale de los límites de la página:

\documentclass{article}
\usepackage[margin=3cm]{geometry}
\usepackage{array}
\usepackage{booktabs}
\usepackage[table]{xcolor}
\usepackage{tabularx}

\begin{document}

\newenvironment{messageWithProperties}[1]
    {
      \noindent
      \tabularx{\textwidth}{>{\bfseries}lX}
          \toprule
          \midrule
          header &
              $\left\{\tabular{>{\bfseries}l l >{\sffamily}p{\dimexpr\textwidth-12\tabcolsep-5\fboxsep-7.5cm\relax}}
                  \toprule
                  id & integer & desc \\
                  key & integer & desc \\
                  \bottomrule
              \endtabular\right\}$ \\[4ex]
          \midrule
          #1 &
              $\left\{\tabular{>{\bfseries}l l >{\sffamily}p{\dimexpr\textwidth-12\tabcolsep-5\fboxsep-7.5cm\relax}}
                  \toprule
    }
    {
                  \bottomrule
              \endtabular\right\}$ \\[4ex]
          \midrule
          \bottomrule
      \endtabularx
    }

\begin{messageWithProperties}{someVeryLongName}
    userId & string & desc \\
    propertyName & veryLongStringType & a very very long description of the field \\
\end{messageWithProperties}

\end{document}

¿Cómo obligarlo a estar dentro?

Sería bueno limitar su tamaño \textwidth - \widthof{#1}y también permitir llenar todo el espacio disponible. ¿Como hacer eso?

Respuesta1

Yo usaría environpara evitar anidar tabularxde forma torpe:

\documentclass{article}
\usepackage[margin=3cm]{geometry}
\usepackage{array}
\usepackage{booktabs}
\usepackage[table]{xcolor}
\usepackage{tabularx,environ}

\newlength{\bracewidth}
\settowidth{\bracewidth}{$\left\{\vbox to 1in{}\right.\kern-\nulldelimiterspace$}

\newcommand{\innerMWP}[1]{%
  $\left\{\begin{tabularx}{\dimexpr\hsize-2\bracewidth}{ >{\bfseries}l l >{\sffamily}X }
  #1
  \end{tabularx}\right\}$%
}
\NewEnviron{messageWithProperties}[1]
  {\noindent
   \begin{tabularx}{\textwidth}{>{\bfseries}lX}
   \toprule
   \midrule
   header & \innerMWP{%
     \toprule
     id & integer & desc \\
     key & integer & desc \\
     \bottomrule
     }%
   \\[4ex]
   \midrule
   #1 & \innerMWP{\toprule\BODY\bottomrule} \\[4ex]
  \midrule
  \bottomrule
  \end{tabularx}%
}

\begin{document}

\begin{messageWithProperties}{someVeryLongName}
    userId & string & desc \\
    propertyName & veryLongStringType & a very very long description of the field \\
\end{messageWithProperties}

\end{document}

ingrese la descripción de la imagen aquí

Sin los inútiles brackets:

\documentclass{article}
\usepackage[margin=3cm]{geometry}
\usepackage{array}
\usepackage{booktabs}
\usepackage[table]{xcolor}
\usepackage{tabularx,environ}

\newcommand{\innerMWP}[1]{%
  \begin{tabularx}{\hsize}{ >{\bfseries}l l >{\sffamily}X }
  #1
  \end{tabularx}%
}
\NewEnviron{messageWithProperties}[1]
  {\noindent
   \begin{tabularx}{\textwidth}{>{\bfseries}lX}
   \toprule\addlinespace
   header & \innerMWP{%
     \toprule
     id & integer & desc \\
     key & integer & desc \\
     \bottomrule
     }%
   \\\addlinespace
   \midrule
   \addlinespace
   #1 & \innerMWP{\toprule\BODY\bottomrule} \\
   \addlinespace
  \bottomrule
  \end{tabularx}%
}

\begin{document}

\begin{messageWithProperties}{someVeryLongName}
    userId & string & desc \\
    propertyName & veryLongStringType & a very very long description of the field \\
\end{messageWithProperties}

\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

No sé si esta es una solución adecuada pero he encontrado aquíla forma de tener el ancho de la celda y he usado este ancho para establecer el ancho de las columnas de la tabla anidada:

\documentclass{article}
\usepackage[margin=3cm]{geometry}
\usepackage{array}
\usepackage{booktabs}
\usepackage[table]{xcolor}
\usepackage{tabularx}
% These code lines are from: https://tex.stackexchange.com/a/30673/101651
\makeatletter
\newcommand\cellwidth{\TX@col@width}
\makeatother

\begin{document}

\newenvironment{messageWithProperties}[1]
    {
      \noindent
      \tabularx{\textwidth}{>{\bfseries}lX}
          \toprule
          \midrule
          header &
              $\left\{\tabular{>{\bfseries}p{.24\cellwidth} p{.27\cellwidth} >{\sffamily}p{.34\cellwidth}}
                  \toprule
                  id & integer & desc \\
                  key & integer & desc \\
                  \bottomrule
              \endtabular\right\}$ \\[4ex]
          \midrule
          #1 &
              $\left\{\tabular{>{\bfseries}p{.24\cellwidth} p{.27\cellwidth} >{\sffamily}p{.34\cellwidth}}
                  \toprule
    }
    {
                  \bottomrule
              \endtabular\right\}$ \\[4ex]
          \midrule
          \bottomrule
      \endtabularx
    }

\begin{messageWithProperties}{someVeryLongName}
    userId & string & desc \\
    propertyName & veryLongStringType & a very very long description of the field \\
\end{messageWithProperties}

\end{document}

ingrese la descripción de la imagen aquí

PD = Nunca antes había hecho una tabla anidada, ni creado un nuevo entorno, por eso lo he respondido como ejercicio.

información relacionada