假设我想在个人包中定义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
文档或更简单地使用颜色分析仪来发现您的颜色的定义。