xcolor 的定义颜色集 --- 以“f”开头的颜色值有问题?

xcolor 的定义颜色集 --- 以“f”开头的颜色值有问题?

我正在尝试编写一个脚本(这很容易)来创建一个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,例如:OneColora

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

相关内容