
Beim Umwandeln einiger tabularx
Tabellen in tcolorboxed-Tabellen habe ich festgestellt, dass tcolorbox
viele Dinge passieren, die nicht „autorisiert“ sind, aber nicht deaktiviert werden können. Beispielsweise ändert es die allgemeine Regelfarbe für die Tabelle und die Array-Stretching-Funktion. Bei Verwendung eines benutzerdefinierten booktabs
Setups zerstört dies die Konsistenz erheblich.
Die beiden Hauptprobleme habe ich bereits angesprochen. Daher zwei Fragen (im Handbuch habe ich keine Einstellungen dazu gefunden):
- Wie kann man die Änderung der Regelfarbe auf eine nicht umständliche Weise abschalten? Die Änderung zweimal vorzunehmen (einmal mit
tcolorbox
und einmal mitbefore upper app
) kann keine gute Lösung sein. - Wie kann man die Änderung des abstellen
arraystretch
? Ich habe keine gute Lösung gefunden. Muss ich wirklich eines dieser internen tcolorbox-Makros patchen?
Und was auch sehr schön wäre:
- Ich möchte nicht alle Tabellen inhaltlich ändern. Daher wäre ich für einen Workaround sehr dankbar, um eine erste Tabellenzeile verwenden zu können, die mit beginnt
\toprule
(führt derzeit zu Fehlern und ich verwende eine tcolorbox-Regel).
Um das Problem zu veranschaulichen:
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}
Aktualisieren:Der Code, der all diese Probleme verursacht (Optionen werden durch tabularx
Schlüssel festgelegt):
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}},
Antwort1
Du hast selbst eine Antwort gegeben, aber auch geschrieben, dass du nicht glaubst, dass deine Frage damit beantwortet ist. Ich verstehe nicht, warum nicht.
Da Sie nach einer weniger invasiven Methode gefragt haben, kann ich Ihnen zwei Alternativen nennen. Bei beiden Alternativen gilt nicht tcolorbox
die oberste Regel, sondern Sie fügen eine ein, \toprule
wo es nicht wehtut.
tableboxA
ist Ihrer eigenen Antwort recht ähnlich, definiert aber einmytablarx*
anstatt neu zu definierentabularx*
. Hinweis\toprule\let\toprule\relax
zu meiner Alternative zur obersten Regel.tableboxB
muss nicht neu definiert werdentabularx*
odermytabularx*
beide verwenden internen Code. Array-Stretch und Array-Regelfarbe werden direkt festgelegt. In Ihrer Frage haben Sie zum Ausdruck gebracht, dass die zweimalige Definition der Farbe keine gute Lösung ist ... Aber, nun ja, es ist eine Lösung und ich denke, es ist auch keine schlechte Lösung ...
Das einzig Ärgerliche ist in meinen Augen, dass man es \toprule
nicht direkt so verwenden kann, wie man es erwarten würde. Hier brauchen wir einen Workaround wie in deiner oder meiner Antwort, aber das Anpassen von Farbe und Array-Stretch (sogar zweimal) ist mehr oder weniger harmlos:
\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}
Antwort2
Das Folgende ist ein Workaround (wenn jemand eine weniger invasive Methode kennt, posten Sie sie bitte hier). Es löst die Frage ausdrücklich NICHT. Was es tut:
- Neudefinition des
tabularx
Stils, um jeden unerwünschten und nicht benötigten Codeabschnitt auszusortieren und - Lassen Sie
\toprule
zu\relax
und emulieren Sie dann die Toprule mit den Boxregeln
Code:
\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}