我可以使用 \substitutecolormodel{hsb}{rgb} 而不是 \selectcolormodel{rgb} 来绘制具有 hsb 定义颜色系列的 PGF/TikZ 路径吗?

我可以使用 \substitutecolormodel{hsb}{rgb} 而不是 \selectcolormodel{rgb} 来绘制具有 hsb 定义颜色系列的 PGF/TikZ 路径吗?

考虑以下 MNWE:

\documentclass{article}
% \usepackage[rgb]{xcolor}
\usepackage{tikz}
\definecolorseries{xcolor g2}{hsb}{grad}[hsb]{.575,1,1}{.987,-.234,0}
\definecolorseries{xcolor s2}{hsb}{step}[hsb]{.575,1,1}{.11,-.05,0}
\resetcolorseries{xcolor g2}
\resetcolorseries{xcolor s2}
\begin{document}
\begin{tikzpicture}
  \node (b)  {% works
    \textcolor{xcolor g2!![6]}{colour 6}};
  
  % fails
  \path [draw=xcolor g2!!+] (b) -- +(0,-2);
\end{tikzpicture}
\end{document}

\path这未能吸引

! Package pgf Error: Unsupported color model `hsb'. Sorry.

See the pgf package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.273   \path [draw=xcolor g2!!+] (d) -- +(0,-2);

这个问题有一个简单的解决方案,pgf/Ti 第 114.1.1 节暗示了这一点Z 手册并图示Gonzalo Medina 的回答这是使用xcolor选项加载rgbrgb作为全局选项传递给包。

但是,我正在使用包中的颜色系列,并且不想强制rgb全局用户使用。所以我认为最好\selectcolormodel{rgb}在本地组中使用。

\selectcolormodel{rgb}
% now works
\path [draw=xcolor g2!!+] (d) -- +(0,-2);

因为用户可能会使用其他模型将系列中的一种颜色与另一种颜色混合,所以我更愿意将效果限制在颜色系列本身。但是,将其应用于用 定义的任何颜色似乎并不完全不合理hsb,即使这并不理想。所以

\substitutecolormodel{hsb}{rgb}

似乎是最好的选择。但是,我无法让它工作。即使

\substitutecolormodel{hsb}{rgb}
\convertcolorsUtrue

没有效果。添加

\convertcolorsDtrue

没有任何区别。使用替代 active 定义颜色系列也无济于事。只有全面切换到rgb,尽管是暂时的,才能避免错误。

是否可以rgbhsb这里替换,而无需对其他颜色模型执行相同的操作,例如cymk

答案1

问题是 xcolor 不支持描边和填充颜色。因此,pgf 有自己的用于描边和填充的后端命令,可以写入正确的文字,而这个后端不支持 hsb 模型。

您可以尝试这个,但我不确定颜色是否在任何地方都是正确的,因为 pgf 低级命令在组之后不会重置。

\documentclass{article}
\usepackage{tikz}
\definecolorseries{xcolor g2}{hsb}{grad}[hsb]{.575,1,1}{.987,-.234,0}
\definecolorseries{xcolor s2}{hsb}{step}[hsb]{.575,1,1}{.11,-.05,0}
\resetcolorseries{xcolor g2}
\resetcolorseries{xcolor s2}

\makeatletter\ExplSyntaxOn
\def\pgfsys@color@hsb@fill#1#2#3{\color_fill:nn{hsb}{#1,#2,#3}}
\def\pgfsys@color@hsb@stroke#1#2#3{\color_stroke:nn{hsb}{#1,#2,#3}}

%example how to force cmyk:
\AddToHookWithArguments{cmd/selectcolormodel/before}
 {\tl_set:Nn\l_color_fixed_model_tl{#1}}
\selectcolormodel{cmyk}
\ExplSyntaxOff\makeatother

\begin{document}
\begin{tikzpicture}
  \node (b)  {% works
    \textcolor{xcolor g2!![6]}{colour 6}};
  
  % fails
  \path [draw=xcolor g2!!+] (b) -- +(0,-2);
\end{tikzpicture}
\end{document}

相关内容