如何在(可能是 LaTeX3)包中定义私有颜色?

如何在(可能是 LaTeX3)包中定义私有颜色?

假设我想在个人包中定义mypackage一个私有的xcolor颜色:

\definecolor{my_so_beautiful_red}{rgb}{1,0,0}

我希望作者或其他包/类不会意外使用该名称。实现此目标的最佳方法是什么,特别是如果允许此包使用 LaTeX3 功能?

答案1

我想简短的回答是我们还没有“LaTeX3”的方法,因为还没有实现完整的 l3 颜色模型,也就是说,我们没有操作颜色的 expl3 代码

但作为一种通用方法,我认为唯一真正安全的方法是能够定义表示颜色的常量。在这种情况下,“名称”将获得固定的含义,任何重新定义它的其他方法都会生成警告或错误。

通过选择一个不常见的名称来尝试使用“私有”名称只会降低颜色被覆盖的可能性。但只要我们没有定义常量的能力,并且您必须依赖 2e 提供的颜色包接口,那么这可能是您能做的最好的事情,正如 egreg 所解释的那样。

答案2

当颜色通过名称指定时,\csname...\endcsname将使用该功能,并且其中的字符将独立于其类别代码使用,前提是此代码不是 0(转义)、9(忽略)、13(活动)、14(注释)或 15(无效)。不过,通常的读取规则适用,因此您可以使用字节 0 通常为类别代码 9 的事实:

\documentclass{article}
\usepackage{color}

\catcode`\^^@=12
\definecolor{my^^@private^^@color}{rgb}{0.5,0.4,0.9}
\newcommand{\myHello}{\textcolor{my^^@private^^@color}{Hello}}
\catcode`\^^@=9

\begin{document}

\myHello

\textcolor{my^^@private^^@color}{Hello}

\end{document}

此文档将引发错误

! LaTeX Error: Undefined color `myprivatecolor'.

并打印

在此处输入图片描述

诀窍是,一旦使用私有颜色的宏全部定义完毕,就恢复到正常设置。

当然,每个人都可以通过激活\tracingmacros文档或更简单地使用颜色分析仪来发现您的颜色的定义。

相关内容