
Al transformar algunas tabularx
tablas en tcolorboxed, descubrí que tcolorbox
hace 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 booktabs
configuració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
tcolorbox
y otra usandobefore 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:
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 tabularx
clave):
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 tcolorbox
para la regla superior, sino que se inserta una \toprule
donde no hace daño.
tableboxA
es bastante similar a su propia respuesta, pero define amytablarx*
en lugar de redefinirtabularx*
. Nota\toprule\let\toprule\relax
para mi alternativa de regla principal.tableboxB
No necesita una redefinicióntabularx*
o unamytabularx*
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 \toprule
no 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
tabularx
estilo para eliminar cada fragmento de código no deseado e innecesario y - dejar
\toprule
y\relax
luego emular la regla superior con las reglas de la caja
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}