Wie begrenzt man die Breite einer verschachtelten Tabelle?

Wie begrenzt man die Breite einer verschachtelten Tabelle?

Die innere Tabelle (also die „sehr lange Beschreibung“) geht über die Seitengrenzen hinaus:

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

Wie zwingt man es, drinnen zu sein?

Es wäre schön, die Größe zu begrenzen \textwidth - \widthof{#1}und gleichzeitig zu ermöglichen, den gesamten verfügbaren Platz auszufüllen. Wie geht das?

Antwort1

Um eine ungeschickte environVerschachtelung zu vermeiden , würde ich Folgendes verwenden :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}

Bildbeschreibung hier eingeben

Ohne die nutzlosen Klammern:

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

Bildbeschreibung hier eingeben

Antwort2

Ich weiß nicht, ob das eine geeignete Lösung ist, aber ich habe festgestellt Hierdie Art und Weise, wie die Zellenbreite festgelegt wird, und ich habe diese Breite verwendet, um die Breite der verschachtelten Tabellenspalten festzulegen:

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

Bildbeschreibung hier eingeben

PS: Ich habe noch nie eine verschachtelte Tabelle erstellt oder eine neue Umgebung geschaffen, daher habe ich als Übung geantwortet.

verwandte Informationen