定义一个无操作颜色名称,该名称始终是当前颜色

定义一个无操作颜色名称,该名称始终是当前颜色

我喜欢使用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

我想,不太令人满意。

相关内容