
Ao transformar algumas tabularx
tabelas em tcolorboxed descobri que isso tcolorbox
faz muitas coisas que não são "autorizadas", mas não devem ser desativadas. Fi altera a cor da regra geral para a tabela e o arraystretch. Usar uma booktabs
configuração personalizada realmente destrói a consistência.
As duas principais questões que já mencionei. Portanto duas perguntas (não encontrei nenhuma configuração no manual):
- Como desligar a mudança da cor da regra de uma forma que não seja alternativa? Fazer a alteração duas vezes (uma vez
tcolorbox
e outra usandobefore upper app
) não pode ser uma boa solução. - Como desligar a mudança do
arraystretch
? Não encontrei nenhuma boa solução. Eu realmente preciso corrigir uma dessas macros internas do tcolorbox?
E o que seria muito bom também:
- Não quero alterar todas as tabelas relativas ao conteúdo. Então, eu realmente apreciaria uma solução alternativa para poder usar a primeira linha da tabela começando com
\toprule
(atualmente resulta em erros e eu uso uma regra tcolorbox).
Para ilustrar o 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}
Atualizar:O código que causa todos esses problemas (opções definidas por tabularx
chave):
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}},
Responder1
Você mesmo deu uma resposta, mas também escreveu que não acha que sua pergunta seja respondida com ela. Não vejo porque não.
Enfim, já que você pediu uma forma menos invasiva, posso dar duas alternativas. Ambas as alternativas não usam tcolorbox
para regra superior, mas inserem um \toprule
onde não dói.
tableboxA
é bastante semelhante à sua própria resposta, mas define amytablarx*
em vez de redefinirtabularx*
. Nota\toprule\let\toprule\relax
para minha alternativa de regra principal.tableboxB
não precisa de uma redefiniçãotabularx*
ou de umamytabularx*
que ambos usem algum código interno. A extensão da matriz e a cor da regra da matriz são definidas diretamente. Na sua pergunta você expressou que definir a cor duas vezes não é uma boa solução... Mas, bem, é uma solução e acho que também não é uma solução ruim...
Aos meus olhos, a única coisa irritante é que \toprule
não pode ser usado diretamente como seria de esperar. Aqui, precisamos de uma solução alternativa como na sua resposta ou na minha, mas ajustar a cor e o alongamento da matriz (até duas vezes) é mais ou 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}
Responder2
A seguir está uma solução alternativa (se alguém souber uma maneira menos invasiva, poste aqui). Isso NÃO resolve explicitamente a questão. O que faz:
- redefinindo o
tabularx
estilo para eliminar cada pedaço de código indesejado e desnecessário e - deixando e emulando a regra superior com as regras da
\toprule
caixa\relax
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}