`tcolorbox` и `tabularx` - конфликт toprule и настроек

`tcolorbox` и `tabularx` - конфликт toprule и настроек

При преобразовании некоторых 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

таблицаx

Код:

\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}

Связанный контент