`tcolorbox` 및 `tabularx` - 상위 규칙과 설정이 충돌합니다.

`tcolorbox` 및 `tabularx` - 상위 규칙과 설정이 충돌합니다.

일부 테이블을 tcolorboxed 테이블로 변환하는 동안 "승인"되지는 않았지만 꺼지지 않는 많은 작업을 수행하는 tabularx것을 발견했습니다 . tcolorboxFi는 테이블과 배열 스트레치의 일반 규칙 색상을 변경합니다. 사용자 정의 booktabs설정을 사용하면 일관성이 실제로 파괴됩니다.

제가 이미 언급한 주요 두 가지 문제입니다. 따라서 두 가지 질문이 있습니다(설명서에서 어떤 설정도 찾지 못했습니다).

  • 해결 방법이 아닌 방법으로 규칙 색상 변경을 어떻게 끌 수 있습니까? 변경을 두 번(를 tcolorbox사용하여 한 번 before upper app) 수행하는 것은 좋은 해결책이 될 수 없습니다.
  • 어떻게 변경을 끌 수 있습니까?arraystretch ? 나는 좋은 해결책을 찾지 못했습니다. 실제로 내부 tcolorbox 매크로 중 하나를 패치해야 합니까?

그리고 무엇이 아주 좋을까?

  • 내용과 관련된 모든 테이블을 변경하고 싶지 않습니다. 따라서 다음으로 시작하는 테이블의 첫 번째 줄을 사용할 수 있는 해결 방법을 알려주시면 정말 감사하겠습니다.\toprule (현재 오류가 발생하고 tcolorbox 규칙을 사용합니다).

문제를 설명하려면 다음을 수행하십시오.

테이블 문제

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}

업데이트:이러한 모든 문제를 일으키는 코드( 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상위 규칙에 사용되지 않지만 \toprule손상되지 않는 곳에 a를 삽입합니다.

  • tableboxA자신의 답변과 매우 유사하지만 mytablarx*재정의하는 대신 a를 정의합니다 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

테이블엑스

암호:

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

관련 정보