Как ограничить ширину вложенной таблицы?

Как ограничить ширину вложенной таблицы?

Внутренняя таблица (то есть «очень длинное описание») выходит за пределы страницы:

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

Как заставить его оказаться внутри?

Было бы неплохо ограничить его размер \textwidth - \widthof{#1}и также позволить заполнить все доступное пространство. Как это сделать?

решение1

Я бы использовал environдля избежания tabularxнеуклюжего вложения:

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

введите описание изображения здесь

Без бесполезных скобок:

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

введите описание изображения здесь

решение2

Я не знаю, является ли это подходящим решением, но я нашел здесьспособ задать ширину ячейки, и я использовал эту ширину для установки ширины вложенных столбцов таблицы:

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

введите описание изображения здесь

PS = Я никогда раньше не делал вложенных таблиц и не создавал новую среду, поэтому ответил в качестве упражнения.

Связанный контент