ein Fehler mit calc und ehhline zusammen

ein Fehler mit calc und ehhline zusammen

Tage zuvor hatte ich mit dem Problem zu kämpfen, horizontale Linien zwischen farbigen mehrzeiligen Zellen zu zeichnen \hhline. Ich habe zwei Methoden ausprobiert und mich schließlich für die zweite entschieden. Aber ich habe festgestellt, dass die erste Methode einen Fehler enthält, wenn calcgeladen wird.

Alle Dinge sind in meinem Beispielcode enthalten. Kommentieren Sie das calcPaket, die vertikale Linie (rot und blaugrün) unter der dritten Zeile wird normal angezeigt.

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

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Antwort1

Das MWE kann vereinfacht werden zu

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

Bildbeschreibung hier eingeben

Aus den Fragekommentaren geht hervor, dass es calc, geladen von stackengine, ist, das \setlengthdie nie unterstützte Syntax neu definiert und verbietet \global\setlength.

Um eine Länge global zu ändern, können Sie verwenden

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

wobei \deflengthdurch das Paket definiert wird etoolbox.

\arrayrulewidthOder Sie können die Notwendigkeit globaler Änderungen vermeiden, >{...}indem Sie die neue hhlinePräambel V[<color>]{<width>}von verwendenmeine vorherige Antwort.

\hhlineIm Inneren V[<color>]{<width>}verhält es sich wie |mit bestimmter Farbe und Breite. Ein vollständiges Beispiel:

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

verwandte Informationen