un error con calc y ehhline juntos

un error con calc y ehhline juntos

Días antes, estaba lidiando con el problema de dibujar líneas horizontales entre celdas coloreadas de varias filas con \hhline. Probé dos métodos y finalmente tomé el segundo. Pero descubrí que hay un error en el primer método si calcestá cargado.

Todo está en mi código de ejemplo. Comente el calcpaquete, la línea vertical (roja y verde azulado) debajo de la tercera fila se mostrará normalmente.

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

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Respuesta1

El MWE se puede simplificar a

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

ingrese la descripción de la imagen aquí

A partir de los comentarios de las preguntas, es calc, cargado por stackengine, el que redefine \setlengthy prohíbe la sintaxis nunca admitida \global\setlength.

Para cambiar una longitud globalmente, puede usar

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

donde \deflengthestá definido por etoolboxpaquete.

O puede evitar la necesidad de realizar cambios \arrayrulewidthglobalmente >{...}utilizando el nuevo hhlinepreámbuloV[<color>]{<width>} demi respuesta anterior.

En el interior \hhline, V[<color>]{<width>}actúa como |con color y ancho específicos. Un ejemplo completo:

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

información relacionada