calc와 ehhline이 함께 있는 버그

calc와 ehhline이 함께 있는 버그

며칠 전, 나는 \hhline. 저는 두 가지 방법을 시도하다가 결국 두 번째 방법을 택했습니다. 하지만 calc로드된 경우 첫 번째 방법에 버그가 있음을 발견했습니다 .

모든 것이 내 예제 코드에 있습니다. 패키지 에 주석을 달면 calc세 번째 행 아래의 수직선(빨간색과 청록색)이 정상적으로 표시됩니다.

\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{tikz}
\usepackage{multirow}
\usepackage{colortbl}
\usepackage{ehhline}
% \usepackage{calc} % make method 1 not work

%% vertical line
% vertical colored line #1 color #2 width
\newcommand{\vsl}[2]{\color{#1}\vrule width #2}
% colored solid line pattern
% #1 color #2 width #3 height
\newcommand{\hsp}[3]{\hbox{\textcolor{#1}{\rule{#2}{#3}}}}
% #1 top fill #2 bottom fill
\newcommand{\leaderfill}[1]{%
  \xleaders\hbox{%
    \vbox{\baselineskip=0pt\lineskip=0pt#1}%
  }\hfill%
}
% #1 color #2 height
\newcommand{\sfill}[2]{%
  \leaderfill{\hsp{#1}{0.1pt}{#2}}%
}
%% vline settings
% #1 rule width #2 color
\newcommand{\setvline}[2]{%
  \global\setlength\arrayrulewidth{#2}\arrayrulecolor{#1}%
}

\begin{document}
\begin{tabular}{
  !{\vsl{red}{5pt}}c
  !{\vsl{teal}{5pt}}p{0.5cm}
  !{\vsl{blue}{3pt}}
}
% row 1
  \cellcolor{gray}
  & \cellcolor{yellow}\\
\hhline{
  ~ % blank in merged cell
  !{\sfill{black}{3pt}}
}
% row 2
  \cellcolor{gray}
  & \cellcolor{yellow}\\
\hhline{
  !{\sfill{gray}{3pt}} % overlap the vertical line
  !{\sfill{black}{3pt}}
}
% row 3
  \cellcolor{gray} third row
  & \cellcolor{orange}\\
% first method: set arrayrulewidth and arraycolor
% not work with calc
\hhline{
  >{\setvline{red}{5pt}}|
  !{\sfill{gray}{3pt}}
  >{\setvline{teal}{5pt}}|
  !{\sfill{black}{3pt}}
}
% row 4
  \cellcolor{gray}\tikz[->, baseline=-.5ex] \draw (0, 0) -- (-1ex, 1ex);
%   load calc
  not load
  & \cellcolor{pink}\\
% second method: use box
\hhline{
  >{\vsl{red}{5pt}}
  !{\sfill{gray}{3pt}}
  >{\vsl{teal}{5pt}}
  !{\sfill{black}{3pt}}
}
% row 5
  \cellcolor{gray}\multirow{-5}*{}
  & \cellcolor{cyan}\\
\end{tabular}
\end{document}

여기에 이미지 설명을 입력하세요 여기에 이미지 설명을 입력하세요

답변1

MWE는 다음과 같이 단순화될 수 있습니다.

\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{ehhline}

\usepackage{stackengine}

\begin{document}
\begin{tabular}{p{0.5cm} !{\color{yellow}\vrule width 5pt} p{0.5cm}}
  a & b \\
  \hhline{
    -
    >{\global\setlength\arrayrulewidth{5pt}\arrayrulecolor{yellow}}|
    >{\global\setlength\arrayrulewidth{.4pt}} -
  }
  c & d
\end{tabular}
\end{document}

여기에 이미지 설명을 입력하세요

질문 의견에서 지원되지 않는 구문을 재정의 하고 금지하는 calc것은 에 의해 로드 됩니다 .stackengine\setlength\global\setlength

전역적으로 길이를 변경하려면 다음을 사용할 수 있습니다.

\global\deflength{<length>}{<glue expression>}

여기서는 패키지 \deflength로 정의됩니다 etoolbox.

또는 다음의 새로운 프리앰블을 사용하여 \arrayrulewidth전역적으로 변경할 필요를 피할 수 있습니다.>{...}hhlineV[<color>]{<width>}내 이전 답변.

내부에서는 \hhline특정 색상과 너비와 V[<color>]{<width>}같이 작동합니다 . |전체 예:

\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{ehhline}

\usepackage{stackengine}

\usepackage{xpatch} % or etoolbox
\usepackage{xparse}

\makeatletter
% based on \vline from latex2e
\def\HHvline#1{\vrule\@width#1}

\AtBeginDocument{
  \@ifpackageloaded{colortbl}{
    % based on \ifx\@tempb|...\else part of \HH@loop from colortbl.sty
    \NewDocumentCommand{\HH@preamble@V}{ m o m }{%
      \if@tempswa
        \ifx\CT@drsc@\relax
          \HH@add{\hskip\doublerulesep}%
        \else
          \HH@add{{\CT@drsc@\vrule\@width\doublerulesep}}%
        \fi
      \fi
      \@tempswatrue
      \IfNoValueTF{#2}
        {\HH@add{{\CT@arc@{\HHvline{#3}}}}}
        {\HH@add{{\color{#2}\HHvline{#3}}}}%
      \HH@let V%
    }
    \xpatchcmd\HH@loop
      {\PackageWarning{hhline}}
      {%
        \ifx\@tempb V% V[<color>]{<width>}
          \let\next\HH@preamble@V
        \else
        \PackageWarning{hhline}%
      }
      {}{\fail}
  }{
    % based on \ifx\@tempb|...\else part of \HH@loop from hhline.sty
    \NewDocumentCommand{\HH@preamble@V}{ m o m }{%
      \if@tempswa\HH@add{\hskip\doublerulesep}\fi\@tempswatrue
      \IfNoValueTF{#2}
        {\HH@add{\@tempc{\HHvline{#3}}\@tempc}}
        {\HH@add{\@tempc{\color{#2}\HHvline{#3}}\@tempc}}%
      \HH@let V%
    }
    \xpatchcmd\HH@loop
      {\PackageWarning{hhline}}
      {%
        \ifx\@tempb V% V[<color>]{<width>}
          \let\next\HH@preamble@V
        \else
      }
      {}{\fail}
  }
  \xpatchcmd\HH@loop
    {\fi\fi\fi}
    {\fi\fi\fi\fi}
    {}{\fail}
}
\makeatother

\begin{document}
\begin{tabular}{p{0.5cm} !{\color{yellow}\vrule width 5pt} p{0.5cm}}
  a & b \\
  \hhline{- V[yellow]{5pt} >{\arrayrulecolor{yellow}}-}
  c & d
\end{tabular}
\end{document}

관련 정보