我想myorange
通过更改hue
先前给定的颜色 ( ) 的值来定义新颜色 ( ) oldcolour
,从而保持其原始饱和度和亮度。 有办法吗?
我能想到两种策略。首先,有一个函数\changehue
从另一个函数返回一种颜色,但色调由用户定义。它的用法如下:
\colorlet{myorange}{\changehue{oldcolour}{30}}
或者可能:
\colorlet{myorange}{\changehue{oldcolour}{orange}}
在最后一种情况下,\changehue
将提取色调orange
并将其插入代码中。这种方式对我来说更好。
definecolor
在第二种策略中,我们只是用颜色模型来定义颜色,hsb
借助函数来提取先前给定颜色的色调、饱和度和亮度。
\definecolor{myorange}{hsb}{\hue{orange}, \saturation{oldcolour}, \brightness{oldcolour}}
我强烈倾向于第二种策略,这也是我的问题所预设的方式。知道是否存在或可以定义诸如\hue
、\saturation
和 之类的命令会很有用。\brightness
在此先感谢您的帮助。
答案1
这可能是部分答案。您可以定义颜色系列并改变色调值。也许更重要的信息是允许\extractcolorspecs
您提取给定颜色的颜色规范。这可以用 转换为给定的配色方案\convertcolorspec
。最后两个命令已合并到命令\convertdirectly
,我在这里回收它。
\documentclass{article}
\usepackage{xcolor}
% from https://tex.stackexchange.com/a/283618
\newcommand{\convertdirectly}[3][hsb]{\begingroup%
\extractcolorspecs{#2}{\modelcmd}{\colorcmd}%
\convertcolorspec{\modelcmd}{\colorcmd}{#1}{\tmp}%
\message{#2 in #1 is \tmp^^J}%
\aftergroupdef#3\tmp}
\def\First#1,#2,#3{#1}
\def\Second#1,#2,#3{#2}
\def\Third#1,#2,#3{#3}
\newcommand{\hue}[1]{\convertdirectly{#1}{\tmp}%
\expandafter\First\tmp}
\newcommand{\Hue}[2]{\begingroup\convertdirectly{#1}{\tmp}%
\edef\res{\expandafter\First\tmp}%
\aftergroupdef#2\res}
\newcommand{\saturation}[1]{\convertdirectly{#1}{\tmp}%
\expandafter\Second\tmp}
\newcommand{\Saturation}[2]{\begingroup\convertdirectly{#1}{\tmp}%
\edef\res{\expandafter\Second\tmp}%
\aftergroupdef#2\res}
\newcommand{\brightness}[1]{\convertdirectly{#1}{\tmp}%
\expandafter\Third\tmp}
\newcommand{\Brightness}[2]{\begingroup\convertdirectly{#1}{\tmp}%
\edef\res{\expandafter\Third\tmp}%
\aftergroupdef#2\res}
\newcounter{myc}
\begin{document}
\definecolorseries{changehue}{hsb}{step}{orange}{0,0.1,0}
\resetcolorseries[12]{changehue}%
\loop\stepcounter{myc}\colorlet{mycolor}{changehue!![\number\value{myc}]}%
\extractcolorspecs{mycolor}{\modelcmd}{\colorcmd}%
model=\textcolor{mycolor}{\modelcmd},%
color=\textcolor{mycolor}{\colorcmd}\par\ifnum\value{myc}<11\repeat
the hsb ``code'' of orange is \convertdirectly{orange}{\hsborange}\hsborange
the hsb ``code'' of brown is \convertdirectly{brown}{\hsbbrown}\hsbbrown
hue of orange=\hue{orange}
saturation of orange=\saturation{orange}
brightness of orange=\brightness{orange}
\Hue{orange}{\myhue}\Saturation{blue}{\mysaturation}\Brightness{brown}\mybrightness
\definecolor{myorange}{hsb}{\myhue,\mysaturation,\mybrightness}
\textcolor{myorange}{Test}
\end{document}