我喜欢使用xcolor
定义一个命名的颜色,它实际上不是更改当前颜色。因此\textcolor{mycolor}{text}
应以text
当前活动颜色进行打印。换句话说:我正在寻找一种定义无操作颜色的方法。
我说的不是特殊颜色名称“ .
”,它指的是当前使用的颜色。使用\colorlet{mycolor}{.}
只会定义mycolor
当时使用的颜色。但是,拥有名称别名' .
' 即可达到目的。
关于背景:在ydoc
我用于软件包手册的包中,我对某些可重复使用的项目使用了预定义样式。例如,软件包名称使用 进行格式化,内部\pkg{name}
用于\pkgstyle
格式化名称。除了其他内容之外,此样式宏还使用颜色pkg
来为软件包名称着色。默认情况下,我不希望以不同的方式为软件包名称着色,因此 被pkg
定义为黑色。这对于普通的黑色文本来说很好,但如果\pkg
在彩色文本中使用 ,则软件包名称仍为黑色。有些适用于所有其他类似的宏,它们都使用这组通用宏。
我的问题是,现在是否可以定义一个命名的颜色,而xcolor
实际上不会改变当前颜色。这将允许禁用特殊颜色的使用,而无需重新定义样式宏以不包括。如果这种特殊的无操作颜色也\textcolor
可以复制到其他颜色名称中,那就太好了。\colorlet
MWE 如下。单词“test”应始终与“before”和“after”具有相同的颜色。\myformat
不应更改 的定义,而应更改 的定义mycolor
。
\documentclass{article}
\usepackage{xcolor}
\colorlet{mycolor}{.}% Wanted: Always be the currently active color
\newcommand{\myformat}[1]{\textcolor{mycolor}{\ttfamily #1}}
\begin{document}
before \myformat{test} after
\color{blue}
before \myformat{test} after
\color{red}
before \myformat{test} after
\end{document}
答案1
我想你知道这一点:
\documentclass{article}
% Users cannot touch these
% But users can change pkgcolor
\usepackage{xcolor}
\newcommand\pkg[1]{%
\textcolor{\ifcsname\string\color@pkgcolor\endcsname pkgcolor\else .\fi}{#1}}
\begin{document}
The package \pkg{ydoc} is good.
{\color{red}
The package \pkg{ydoc} is good.}
\colorlet{pkgcolor}{blue}
The package \pkg{ydoc} is good.
{\color{red}
The package \pkg{ydoc} is good.}
\end{document}
感谢 egerg \csname\string\color@xyz\endcsname
。
但我更喜欢键值接口:
\documentclass{article}
% Users cannot touch these
% But users can use \ydocset to change pkgcolor key
\usepackage{xcolor}
\usepackage{keyval}
\makeatletter
\define@key{ydoc}{pkgcolor}{%
\def\pkg@color{#1}}
\newcommand\ydocset[1]{\setkeys{ydoc}{#1}}
\ydocset{pkgcolor=.}
\newcommand\pkg[1]{%
\textcolor{\pkg@color}{#1}}
\makeatother
\begin{document}
The package \pkg{ydoc} is good.
{\color{red}
The package \pkg{ydoc} is good.}
\ydocset{pkgcolor=blue}
The package \pkg{ydoc} is good.
{\color{red}
The package \pkg{ydoc} is good.}
\end{document}
答案2
当有人说\definecolor{xyz}{...}{...}
,彩色定义宏
\\color@xyz
更准确地说,
\csname\string\color@xyz\endcsname
特别\csname\string\color@.\endcsname
是扩展到当前颜色的宏;所以
\expandafter\let\csname\string\color@mycolor\expandafter\endcsname
\csname\string\color@.\endcsname
似乎是可行的办法。然而,正如你所观察到的,这就像\colorlet{mycolor}{.}
。
一种解决方法似乎是将所请求的伪彩色的定义添加到\XC@display
:
\makeatletter
\preto\XC@display{\XC@bcolor\XC@let@cN{\string\color@mycolor}\XC@current@color}
\makeatother
\colorlet{mycolor}{.} % initialization
我想,不太令人满意。