
При преобразовании некоторых tabularx
таблиц в tcolorboxed я обнаружил, что это tcolorbox
делает много вещей, которые не "разрешены", но не отключаются. Например, это изменяет общий цвет правила для таблицы и arraystretch. Использование настроенногоbooktabs
настройки действительно разрушает согласованность.
Основные две проблемы я уже упомянул. Поэтому два вопроса (в руководстве я не нашел никаких настроек):
- Как можно отключить изменение цвета правила необходным способом? Выполнив изменение дважды (один раз с помощью
tcolorbox
и один раз с помощьюbefore upper app
) не может быть хорошим решением. - Как можно отключить изменение
arraystretch
? Я не нашел хорошего решения. Мне действительно нужно патчить один из этих внутренних макросов tcolorbox?
И что было бы очень неплохо:
- Я не хочу менять все таблицы, касающиеся контента. Поэтому я был бы очень признателен за обходной путь, позволяющий использовать первую строку таблицы, начинающуюся с
\toprule
(в настоящее время приводит к ошибкам, и я использую правило tcolorbox).
Чтобы проиллюстрировать проблему:
МВЭ:
\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}
Обновлять:Код, который вызывает все эти проблемы (параметры задаются tabularx
ключом):
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}},
решение1
Вы сами дали ответ, но вы также написали, что не считаете, что он является ответом на ваш вопрос. Я не вижу, почему нет.
В любом случае, поскольку вы просили менее инвазивный способ, я могу дать две альтернативы. Обе альтернативы не используют tcolorbox
для верхнего правила, но вставляют a \toprule
там, где это не повредит.
tableboxA
очень похоже на ваш собственный ответ, но определяетmytablarx*
вместо переопределенияtabularx*
. Примечание\toprule\let\toprule\relax
для моей альтернативы главного правила.tableboxB
не нуждается в переопределенииtabularx*
илиmytabularx*
в том, что оба используют некоторый внутренний код. Растяжка массива и цвет правила массива задаются напрямую. В своем вопросе вы выразили, что определение цвета дважды не является хорошим решением... Но, что ж, это решение, и я считаю, что это не плохое решение...
На мой взгляд, единственное, что раздражает, это то, что \toprule
нельзя использовать напрямую, как можно было бы ожидать. Здесь нам нужен обходной путь, как в вашем ответе или в моем, но настройка цвета и растяжение массива (даже дважды) более или менее безвредны:
\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}
решение2
Ниже приведен обходной путь (если кто-то знает менее инвазивный способ, пожалуйста, напишите его здесь). Он явно НЕ решает вопрос. Что он делает:
- переопределение
tabularx
стиля для удаления всех нежелательных и ненужных фрагментов кода и - позволяя и затем
\toprule
эмулируя\relax
правило toprule с правилами box
Код:
\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}