![xcolor 的定义颜色集 --- 以“f”开头的颜色值有问题?](https://linux22.com/image/321528/xcolor%20%E7%9A%84%E5%AE%9A%E4%B9%89%E9%A2%9C%E8%89%B2%E9%9B%86%20---%20%E4%BB%A5%E2%80%9Cf%E2%80%9D%E5%BC%80%E5%A4%B4%E7%9A%84%E9%A2%9C%E8%89%B2%E5%80%BC%E6%9C%89%E9%97%AE%E9%A2%98%EF%BC%9F.png)
我正在尝试编写一个脚本(这很容易)来创建一个xkcd
颜色设置对于包xcolor
。看看这个 MWE:
\documentclass{article}
\usepackage{xcolor} %
\definecolorset{HTML}{xkcd}{}{%
OneColor,fcc2d9;%
LastColor,56ae57%
}
\begin{document}
\textcolor{xkcdOneColor}{OneColor}
\textcolor{xkcdLastColor}{LastColor}
\end{document}
...这将失败:
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian)
[...]
! Missing number, treated as zero.
<to be read again>
f
l.6 }
?
如果我将第一个改为f
,例如:OneColor
a
\definecolorset{HTML}{xkcd}{}{%
OneColor,acc2d9;%
LastColor,56ae57%
}
...现在一切正常。
我知道我可以轻松绕过这个问题(似乎大写的 F 不会产生任何问题),但我很好奇:这是一个错误还是驱动程序(/我)错误?
答案1
这是 中的一个错误xcolor.sty
,我们发现
283 \def\@hex@@Hex#1%
284 {\if a#1A\else \if b#1B\else \if c#1C\else \if d#1D\else
285 \if e#1E\else \if f#1f\else #1\fi\fi\fi\fi\fi\fi \@hex@Hex}
很明显它应该是\if f#1F
。因此,不会f
转换为F
,这是在稍后需要符合 TeX 语法的十六进制数字时(作为 的参数\number"
)的预期结果。
确实输入
\documentclass{article}
\usepackage{xcolor}
\makeatletter
\def\@hex@@Hex#1%
{\if a#1A\else \if b#1B\else \if c#1C\else \if d#1D\else
\if e#1E\else \if f#1F\else #1\fi\fi\fi\fi\fi\fi \@hex@Hex}
\makeatother
\definecolor{xk}{HTML}{fcc2d9}
\definecolor{XK}{HTML}{FCC2D9}
\begin{document}
A \textcolor{xk}{BCD} E
A \textcolor{XK}{BCD} E
\end{document}
产生预期
当然,用大写字母表达 HTML 数字也可以避免这个错误。
可能更好的补丁是使用etoolbox
,它可能在包或类中使用(\RequirePackage{etoolbox}
在本例中是)。
\documentclass{article}
\usepackage{xcolor}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\@hex@@Hex}{f\else}{F\else}{\typeout{Patching xcolor}}{}
\makeatother
\definecolor{DHBW-blue}{HTML}{026f93}
\begin{document}
Hello World
\end{document}