`tcolorbox` und `tabularx` – Toprule und Einstellungskonflikt

`tcolorbox` und `tabularx` – Toprule und Einstellungskonflikt

Beim Umwandeln einiger tabularxTabellen in tcolorboxed-Tabellen habe ich festgestellt, dass tcolorboxviele 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 booktabsSetups 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 tcolorboxund einmal mit before 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:

Tabellenproblem

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 tabularxSchlü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 tcolorboxdie oberste Regel, sondern Sie fügen eine ein, \toprulewo es nicht wehtut.

  • tableboxAist Ihrer eigenen Antwort recht ähnlich, definiert aber ein mytablarx*anstatt neu zu definieren tabularx*. Hinweis \toprule\let\toprule\relaxzu meiner Alternative zur obersten Regel.

  • tableboxBmuss nicht neu definiert werden tabularx*oder mytabularx*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 \toprulenicht 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 tabularxStils, um jeden unerwünschten und nicht benötigten Codeabschnitt auszusortieren und
  • Lassen Sie \toprulezu \relaxund emulieren Sie dann die Toprule mit den Boxregeln

Tabellex

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}

verwandte Informationen