`tcolorbox` y `tabularx`: conflicto entre reglas y configuraciones

`tcolorbox` y `tabularx`: conflicto entre reglas y configuraciones

Al transformar algunas tabularxtablas en tcolorboxed, descubrí que tcolorboxhace muchas cosas que no están "autorizadas", pero no se pueden desactivar. Fi cambia el color de la regla general para la tabla y el estiramiento de la matriz. Usar una booktabsconfiguración personalizada esto realmente destruye la coherencia.

Las dos cuestiones principales ya las he mencionado. Por lo tanto dos preguntas (no he encontrado ninguna configuración en el manual):

  • ¿Cómo se puede desactivar el cambio del color de la regla de una manera que no sea alternativa? Hacer el cambio dos veces (una vez con tcolorboxy otra usando before upper app) no puede ser una buena solución.
  • ¿Cómo se puede desactivar el cambio de arraystretch? No he encontrado ninguna buena solución. ¿Realmente tengo que parchear una de esas macros internas de tcolorbox?

Y lo que también sería muy bueno:

  • No quiero cambiar todas las tablas relacionadas con el contenido. Así que realmente agradecería una solución para poder usar una primera línea de la tabla que comience con \toprule(actualmente genera errores y uso una regla tcolorbox).

Para ilustrar el problema:

problema de mesa

MWE:

\documentclass{scrbook}
\usepackage{array,tabularx}
\usepackage[table]{xcolor}
\usepackage[most]{tcolorbox}
\usepackage{booktabs}

\renewcommand*{\arraystretch}{1.4}

\def\tabletitle#1{%
    \refstepcounter{table}Table\ \thetable\ --\ #1%
    \addcontentsline{lot}{section}{#1}%
}
\newtcolorbox{tablebox}[3][]{
    enhanced, sharp corners=all,colback=white,colframe=white,tabularx={#2},title={\tabletitle{#3}},label=#1,attach boxed title to top right={xshift=1cm,yshift=-2mm},before upper app={\arrayrulecolor{black}}
}

\begin{document}

\begin{tabularx}{.5\linewidth}{lX}
  \toprule \textbf{Stufe} & \textbf{Name}\\\midrule
    -1 & Teil\\
  0 & Kapitel\\
    1 & Abschnitt\\
    2 & Unterabschnitt\\
    3 & Unterunterabschnitt\\
    4 & Absatz\\
    5 & Unterabsatz\\\bottomrule
\end{tabularx}
\captionof{table}{Test}

\begin{tablebox}{lX}{Test}
  \textbf{Stufe} & \textbf{Name}\\\midrule%\toprule
    -1 & Teil\\
  0 & Kapitel\\
    1 & Abschnitt\\
    2 & Unterabschnitt\\
    3 & Unterunterabschnitt\\
    4 & Absatz\\
    5 & Unterabsatz\\\bottomrule
\end{tablebox}
\end{document}

Actualizar:El código que causa todos esos problemas (opciones establecidas por tabularxclave):

boxsep=\z@,top=\z@,bottom=\z@,leftupper=\z@,rightupper=\z@,
toptitle=1mm,bottomtitle=1mm,boxrule=0.5mm,
before upper={\arrayrulecolor{tcbcol@frame}\def\arraystretch{1.1}#1%
   \tcb@hack@currenvir\tabularx{\linewidth}{#2}},
after upper=\endtabularx\arrayrulecolor{black}},

Respuesta1

Usted mismo dio una respuesta, pero también escribió que no cree que su pregunta se responda con ella. No veo porque no.

De todos modos, como me pediste una forma menos invasiva, puedo darte dos alternativas. Ambas alternativas no se utilizan tcolorboxpara la regla superior, sino que se inserta una \topruledonde no hace daño.

  • tableboxAes bastante similar a su propia respuesta, pero define a mytablarx*en lugar de redefinir tabularx*. Nota \toprule\let\toprule\relaxpara mi alternativa de regla principal.

  • tableboxBNo necesita una redefinición tabularx*o una mytabularx*que ambos usen algún código interno. La extensión de la matriz y el color de la regla de la matriz se configuran directamente. En tu pregunta expresaste que definir el color dos veces no es una buena solución... Pero bueno, es una solución y me imagino que tampoco es mala solución...

En mi opinión, lo único molesto es que \topruleno se puede utilizar directamente como cabría esperar. Aquí, necesitamos una solución alternativa como en su respuesta o en la mía, pero ajustar el color y la extensión de la matriz (incluso dos veces) es más o menos inofensivo:

\documentclass{scrbook}
\usepackage[table]{xcolor}
\usepackage{booktabs}
\usepackage{array}
\usepackage{tabularx}
\usepackage[most]{tcolorbox}

\renewcommand{\arraystretch}{1.4}

\makeatletter
\tcbset{%
  mytabularx*/.style 2 args={%
    boxsep=\z@,top=\z@,bottom=\z@,leftupper=\z@,rightupper=\z@,
    toptitle=1mm,bottomtitle=1mm,boxrule=0pt,
    before upper={#1\tcb@hack@currenvir\tabularx{\linewidth}{#2}\toprule\let\toprule\relax},            % through deleting: solve the arraystretch and color issue
    after upper=\endtabularx}
}
\makeatother

\newtcolorbox[use counter*=table]{tableboxA}[3][]{%
  enhanced jigsaw, sharp corners=all, colback=white,colframe=black,
  title={Table\ \thetable\ --\ #3},list text={#3},add to list={lot}{section},label=#1,
  mytabularx*={}{#2},
  attach boxed title to top right={xshift=1cm,yshift=2mm},
}

\newtcolorbox[use counter*=table]{tableboxB}[3][]{%
  blank, sharp corners=all, colback=white,colframe=black,
  title={Table\ \thetable\ --\ #3},list text={#3},add to list={lot}{section},label=#1,
  tabularx*={\arrayrulecolor{black}\renewcommand{\arraystretch}{1.4}}{#2},
  before upper app={\toprule\let\toprule\relax},
  boxrule=0pt,
  attach boxed title to top right={xshift=1cm,yshift=2mm},
}

\begin{document}

\captionof{table}{Test}
\begin{tabularx}{\linewidth}{lX}
  \toprule \textbf{Stufe} & \textbf{Name}\\\midrule
    -1 & Teil\\
    0 & Kapitel\\
    1 & Abschnitt\\
    2 & Unterabschnitt\\
    3 & Unterunterabschnitt\\
    4 & Absatz\\
    5 & Unterabsatz\\\bottomrule
\end{tabularx}

\vskip2\baselineskip

\begin{tableboxA}{lX}{Test}
  \toprule \textbf{Stufe} & \textbf{Name}\\\midrule
    -1 & Teil\\
    0 & Kapitel\\
    1 & Abschnitt\\
    2 & Unterabschnitt\\
    3 & Unterunterabschnitt\\
    4 & Absatz\\
    5 & Unterabsatz\\\bottomrule
\end{tableboxA}

\vskip2\baselineskip

\begin{tableboxB}{lX}{Test}
  \toprule \textbf{Stufe} & \textbf{Name}\\\midrule
    -1 & Teil\\
    0 & Kapitel\\
    1 & Abschnitt\\
    2 & Unterabschnitt\\
    3 & Unterunterabschnitt\\
    4 & Absatz\\
    5 & Unterabsatz\\\bottomrule
\end{tableboxB}

\end{document}

Respuesta2

La siguiente es una solución alternativa (si alguien conoce una forma menos invasiva, publíquela aquí). Explícitamente NO resuelve la pregunta. Que hace:

  • redefinir el tabularxestilo para eliminar cada fragmento de código no deseado e innecesario y
  • dejar \topruley \relaxluego emular la regla superior con las reglas de la caja

tablax

Código:

\documentclass{scrbook}
\usepackage[table]{xcolor}
\usepackage{booktabs}
\usepackage{array}
\usepackage{tabularx}
\usepackage[most]{tcolorbox}

\renewcommand{\arraystretch}{1.4}

\makeatletter
\tcbset{%
  tabularx*/.style 2 args={%
    boxsep=\z@,top=\z@,bottom=\z@,leftupper=\z@,rightupper=\z@,
    toptitle=1mm,bottomtitle=1mm,boxrule=0pt, toprule=1pt, top=2.25pt,        % "solve" toprule issue (i)
    before upper={#1\tcb@hack@currenvir\tabularx{\linewidth}{#2}},            % through deleting: solve the arraystretch and color issue
    before upper app = {\let\toprule\relax},                                  % "solve" toprule issue (ii)
    after upper=\endtabularx}
}
\makeatother

\newtcolorbox[use counter*=table]{tablebox}[3][]{%
  enhanced jigsaw, sharp corners=all, colback=white,colframe=black,
  title={Table\ \thetable\ --\ #3},list text={#3},add to list={lot}{section},label=#1,
  tabularx*={}{#2},
  attach boxed title to top right={xshift=1cm,yshift=2mm},
}

\begin{document}

\captionof{table}{Test}
\begin{tabularx}{\linewidth}{lX}
  \toprule \textbf{Stufe} & \textbf{Name}\\\midrule
    -1 & Teil\\
    0 & Kapitel\\
    1 & Abschnitt\\
    2 & Unterabschnitt\\
    3 & Unterunterabschnitt\\
    4 & Absatz\\
    5 & Unterabsatz\\\bottomrule
\end{tabularx}

\vskip2\baselineskip

\begin{tablebox}{lX}{Test}
  \toprule \textbf{Stufe} & \textbf{Name}\\\midrule
    -1 & Teil\\
    0 & Kapitel\\
    1 & Abschnitt\\
    2 & Unterabschnitt\\
    3 & Unterunterabschnitt\\
    4 & Absatz\\
    5 & Unterabsatz\\\bottomrule
\end{tablebox}
\end{document}

información relacionada