
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 calc
está cargado.
Todo está en mi código de ejemplo. Comente el calc
paquete, 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}
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}
A partir de los comentarios de las preguntas, es calc
, cargado por stackengine
, el que redefine \setlength
y prohíbe la sintaxis nunca admitida \global\setlength
.
Para cambiar una longitud globalmente, puede usar
\global\deflength{<length>}{<glue expression>}
donde \deflength
está definido por etoolbox
paquete.
O puede evitar la necesidad de realizar cambios \arrayrulewidth
globalmente >{...}
utilizando el nuevo hhline
preá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}