내부 테이블이있는 Tcolorbox 규칙 너비

Aug 20 2020

분명히이 boxrule명령은 tcolorbox내부에 표 형식 이있는 향상된 기능에는 효과가 없습니다 .

표에서 프레임의 너비를 어떻게 지정할 수 있습니까?

MWE는 다음과 같습니다.

\documentclass{article}
\usepackage[skins]{tcolorbox}
\usepackage{array,tabularx}
\usepackage{colortbl}
\begin{document}

% \usepackage{array,tabularx}
% \usepackage{colortbl} - or - \usepackage[table]{xcolor}
\tcbset{enhanced,fonttitle=\bfseries\large,fontupper=\normalsize\sffamily,
    colback=yellow!10!white,colframe=red!50!black,colbacktitle=red!30!white,
    coltitle=black,center title,
    boxrule=10pt, % NO EFFECT
}
\begin{tcolorbox}[tabularx*={\arrayrulewidth0.5mm}{X|X|X},title=My table]
    One
    & Two
    & Three \\\hline\hline
    1000.00 & 2000.00 & 3000.00\\\hline
    2000.00 & 3000.00 & 4000.00
\end{tcolorbox}

% EDIT : with a multicolumn as 1st cell this does not compile anymore
\begin{tcolorbox}[boxrule=2pt,tabularx*={\arrayrulewidth2pt}{YY|YY|YY},
    title=My table
    ]
    \multicolumn{2}{c|}{title}
    &   \multicolumn{2}{c|}{title}
    &   \multicolumn{2}{c}{title} \\\hline
    2 & d & 3 & e & 4 & f \\\hline
    title & \multicolumn{3}{|l|}{h} & \multicolumn{1}{c|}{title} & j \\
\end{tcolorbox}

\end{document}

편집 : 첫 번째 대답은 MWE의 첫 번째 테이블에 대해 괜찮지 만 multicolumn첫 번째 셀로 사용하고 있으며 Misplaces \omit오류가 발생합니다. MWE가 문제가있는 테이블로 수정되었습니다.

답변

6 Marijn Aug 20 2020 at 19:05

tabularx스타일 의 정의는에 대한 설정 boxrule으로 있습니다 0.5mm. 소스에서 스타일을 복사하고이 부분을 제거하여 설정을 덮어 쓸 수 있습니다.

\documentclass{article}
\usepackage[skins]{tcolorbox}
\usepackage{array,tabularx}
\usepackage{colortbl}
\begin{document}

% \usepackage{array,tabularx}
% \usepackage{colortbl} - or - \usepackage[table]{xcolor}
\tcbset{enhanced,fonttitle=\bfseries\large,fontupper=\normalsize\sffamily,
    colback=yellow!10!white,colframe=red!50!black,colbacktitle=red!30!white,
    coltitle=black,center title,
    boxrule=10pt, % NO EFFECT
}
\makeatletter
\tcbset{tabularx*/.style 2 args={%
    boxsep=\z@,top=\z@,bottom=\z@,leftupper=\z@,rightupper=\z@,
    toptitle=1mm,bottomtitle=1mm,% boxrule setting here removed
    before upper={\arrayrulecolor{tcbcol@frame}\def\arraystretch{1.1}#1%
      \tcb@hack@currenvir\tabularx{\linewidth}{#2}},
    after upper=\endtabularx\arrayrulecolor{black}}}
\makeatother
\begin{tcolorbox}[tabularx*={\arrayrulewidth0.5mm}{X|X|X},title=My table]
    One
    & Two
    & Three \\\hline\hline
    1000.00 & 2000.00 & 3000.00\\\hline
    2000.00 & 3000.00 & 4000.00
\end{tcolorbox}
\end{document}

결과:

편집 : 최신 버전의 tcolorbox정의가 약간 변경되었습니다. 이 경우 새 정의는 다음과 같아야합니다.

\tcbset{tabularx*/.style 2 args={%
    boxsep=\z@,top=\z@,bottom=\z@,leftupper=\z@,rightupper=\z@,
    toptitle=1mm,bottomtitle=1mm,
    before upper*={%
      \let\tcb@CT@arc@save\CT@arc@%
      \arrayrulecolor{tcbcolframe}\def\arraystretch{1.1}#1%
      \tcb@hack@currenvir\tabularx{\linewidth}{#2}},
    after upper*={\endtabularx\global\let\CT@arc@\tcb@CT@arc@save}%
  }
}
muzimuzhiZ Aug 21 2020 at 08:01

필요성의 값으로 변경하는 경우 boxrule옵션으로 지정을 tabularx*하고 tabularx*/.append style={boxrule=<dimen>}있는, 간단 .append style미리 정의 중 하나입니다 pgfkeys핸들러.

전체 예 :

\documentclass{article}
\usepackage[skins]{tcolorbox}
\usepackage{array,tabularx}
\usepackage{colortbl}

\tcbset{
    enhanced,
    fonttitle=\bfseries\large,
    fontupper=\normalsize\sffamily,
    colback=yellow!10!white,
    colframe=red!50!black,
    colbacktitle=red!30!white,
    coltitle=black,
    center title,
    % change boxrule set by "tabularx*", by default it's 0.5mm
    tabularx*/.append style={boxrule=10pt}
}

\begin{document}
\begin{tcolorbox}[tabularx*={\arrayrulewidth0.5mm}{X|X|X}, title=My table]
    One
    & Two
    & Three \\\hline\hline
    1000.00 & 2000.00 & 3000.00\\\hline
    2000.00 & 3000.00 & 4000.00
\end{tcolorbox}
\end{document}

최신 정보

재미로. 여기에 패키지 에서 내부적으로 사용되는 새로운 pgfkeys핸들러 가 정의됩니다..patch code={<search>}{<replace>}\xpatchcmdxpatch

\documentclass{article}
\usepackage{tcolorbox}
\usepackage{xpatch}

\usepackage{array,tabularx}
\usepackage{colortbl}

\makeatletter
% usage:
%   <key>/.patch code={search}{replace}
% similar to def of /handlers/.add code/.code 2 args={...}
\pgfkeys{/handlers/.patch/.code 2 args=%
  % Find out, whether with args or not.
  \pgfkeysifdefined{\pgfkeyscurrentpath/.@args}%
  {% Yes, so add to body and reuse args
    \pgfkeyspatchvalue{\pgfkeyscurrentpath/.@body}{#1}{#2}%
    % Redefine code
    {%
      \pgfkeysgetvalue{\pgfkeyscurrentpath/.@args}{\pgfkeys@tempargs}%
      \pgfkeysgetvalue{\pgfkeyscurrentpath/.@body}{\pgfkeys@tempbody}%
      \def\pgfkeys@marshal{\expandafter\gdef\expandafter\pgfkeys@global@temp\pgfkeys@tempargs}%
      \expandafter\pgfkeys@marshal\expandafter{\pgfkeys@tempbody}%
    }%
    \pgfkeysifdefined{\pgfkeyscurrentpath/.@@body}{%
      % support for \pgfkeysndefargs:
      \pgfkeyslet{\pgfkeyscurrentpath/.@@body}{\pgfkeys@global@temp}%
    }{%
      % support for \pgfkeysdefargs:
      \pgfkeyslet{\pgfkeyscurrentpath/.@cmd}{\pgfkeys@global@temp}%
    }%
  }{% No, so single argument (simple \pgfkeysdef). Redefine accordingly.
    \edef\pgf@expanded@path{\pgfkeyscurrentpath}%
    {%
      \pgfkeysifdefined{\pgf@expanded@path/.@cmd}{%
        \expandafter\expandafter\expandafter\pgfkeys@temptoks
        \expandafter\expandafter\expandafter{%
        \csname pgfk@\pgf@expanded@path/.@body\endcsname}%
      }{%
        \expandafter\pgfkeys@temptoks\expandafter{%
        \expandafter\pgfkeyssetvalue\expandafter{\pgf@expanded@path}{##1}}%
      }%
      \edef\pgfkeys@temp{\the\pgfkeys@temptoks}%
      \pgfkeyspatchvalue\pgfkeys@temp{#1}{#2}%
      \global\let\pgfkeys@global@temp\pgfkeys@temp
    }%
    \def\pgf@temp{\pgfkeyssetvalue{\pgf@expanded@path/.@body}}%
    \expandafter\pgf@temp\expandafter{\pgfkeys@global@temp}%
    \expandafter\long\expandafter\def\expandafter\pgfkeys@temp\expandafter##\expandafter1\expandafter\pgfeov\expandafter{\pgfkeys@global@temp}%
    \pgfkeyslet{\pgf@expanded@path/.@cmd}\pgfkeys@temp
  }%  
}

% usage:
%   \pgfkeyspatchvalue{<key>}{<search>}{<replace>}
% similar to \pgfkeysaddvalue
\long\def\pgfkeyspatchvalue#1#2#3{%
  \pgfkeysifdefined{#1}{%
    \expandafter\xpatchcmd\csname pgfk@#1\endcsname{#2}{#3}{}
      {\PackageError{pgfkeys}{Patching for key #1 fails}}%
  }{}%
}
\makeatother


\begin{document}

\tcbset{
  colframe=black!25,
  colbacktitle=black!75
}

\begin{tcolorbox}[boxrule=5pt, tabularx*={\arrayrulewidth0.5mm}{X|X|X}, title=Before patching]
  One     & Two     & Three   \\ \hline\hline
  1000.00 & 2000.00 & 3000.00 \\ \hline
  2000.00 & 3000.00 & 4000.00
\end{tcolorbox}

% patch option "tabularx*", remove "boxrule=0.5mm"
\tcbset{
  tabularx*/.patch={boxrule=0.5mm}{}
}

\begin{tcolorbox}[boxrule=5pt, tabularx*={\arrayrulewidth0.5mm}{X|X|X}, title=After patching]
  One     & Two     & Three   \\ \hline\hline
  1000.00 & 2000.00 & 3000.00 \\ \hline
  2000.00 & 3000.00 & 4000.00
\end{tcolorbox}

\end{document}