![新颜色命令 \colorPlus[][} 在查看和打印时表现不同](https://linux22.com/image/468087/%E6%96%B0%E9%A2%9C%E8%89%B2%E5%91%BD%E4%BB%A4%20%5CcolorPlus%5B%5D%5B%7D%20%E5%9C%A8%E6%9F%A5%E7%9C%8B%E5%92%8C%E6%89%93%E5%8D%B0%E6%97%B6%E8%A1%A8%E7%8E%B0%E4%B8%8D%E5%90%8C.png)
目的是定义新命令 \colorPlus[<color-when-printed>]{<color-in-PDF>}
那
- 当不带可选参数使用时,其工作方式与通常完全相同,
\color{<color-in-PDF-and-print>}
例如\colorPlus{<color-in-PDF}
; - 当给出可选参数时,执行一些
osgx2
-type 魔法。例如,\colorPlus[black]{red}
将使文本在 PDF 中显示为红色,但在打印时显示为黑色。
根据 2015 年的一些旧评论(1,2) 经过马里亚诺·苏亚雷斯-阿尔瓦雷斯和 Herbert/user2478,这应该是可能的。那么问题是如何做到。
\colorPlus
如果您认为有更好的语法,您可以更改的语法,或使用一些现有的命令。
作为测试,请将\color{red}
以下 MWE 更改为,以\colorPlus{black}{red}
查看您的解决方案是否有效。
\documentclass{book}
\usepackage{tocloft}
\usepackage{titlesec}
\usepackage{xcolor}
\usepackage[colorlinks=true, linkcolor=blue, hypertexnames=false, linktoc=all]{hyperref} % blue internal links for document; in TOC, entry name and page nr are links
\usepackage[ocgcolorlinks]{ocgx2}
%%% Definition of \colorPlus{}
%%%
\renewcommand{\cftsecpagefont}{\color{red}} % change "\color{red}" to \colorPlus[black]{red} as a test
\begin{document}
{\hypersetup{hidelinks}
\tableofcontents}
\chapter{Example chapter}
\section{Example section}
\subsection{Example subsection}
This is some text.
\end{document}
MWE 基本上来自我之前的问题当存在“linktoc=all”和“\hypersetup{linkcolor=black}”时,如何在目录中制作红色页码?和samcarter_is_at_topanswers.xyz的回答。在 PDF 中查看时,章节页码为红色(但在这种情况下,打印时也是如此)。
答案1
colorPlus
需要作为环境来实现,因为根据 OC 设置使用可选颜色填充字体轮廓后文本已插入。
因此,这里有一个基于 的内部代码的解决方案ocgx2
。此外,tocloft
命令\cftsecfillnum
、\cftsecpagefont
和\cftsecafterpnum
需要重新定义。请注意,pdfmanagement-testphase
必须启用 才能使代码正常工作。
新的环境是
\begin{colorPlus}[<printing colour>]{<viewing colour>}
...
\end{colorPlus}
命名颜色和xcolor
颜色表达式可用于<printing color>
和<viewing colour>
。
适用于 Acrobat Reader 和 Chrome/Chromium PDF 查看器插件。
\DocumentMetadata{} % pdfmanagement-testphase needs to be enabled
\documentclass{book}
\usepackage{tocloft}
\usepackage{titlesec}
\usepackage{xcolor}
\usepackage[colorlinks=true, linkcolor=blue, hypertexnames=false, linktoc=all]{hyperref} % blue internal links for document; in TOC, entry name and page nr are links
\usepackage[ocgcolorlinks]{ocgx2}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \begin{colorPlus}[<printing color>]{<viewing colour>}
% ...
% \end{colorPlus}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ExplSyntaxOn
\NewDocumentEnvironment{colorPlus}{om}{
\color_group_begin:
\IfValueTF{#1}{ % optional printing colour given
\ocgxii_colorlinks_init: % create OCGs for printing and viewing
\color_select:n{#1}
\color_export:nnN{#2}{backend}\l_tempb_tl
\tl_set:Nx\l_tempa_tl{\tl_item:Nn\l_tempb_tl{1}} % model
\tl_set:Nx\l_tempb_tl{\tl_item:Nn\l_tempb_tl{2}} % components
\str_replace_all:Nnn\l_tempb_tl{~}{,}
\tl_set:Nx\g_ocgxii_lnkcol_tl{{\l_tempa_tl}{\l_tempb_tl}}
\ocgxii_colourlink_begin:
}{
\color_select:n{#2}
}
\ignorespaces
}{
\unskip
\IfValueT{#1}{\ocgxii_colourlink_end:}
\color_group_end:
}
\ExplSyntaxOff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\renewcommand{\cftsecfillnum}[1]{%
{\cftsecleader}\nobreak
\cftsecpagefont\makebox[\@pnumwidth][\cftpnumalign]{#1}\cftsecafterpnum\par
}
\makeatother
\renewcommand{\cftsecpagefont}{\begin{colorPlus}[black]{blue}}
\renewcommand{\cftsecafterpnum}{\end{colorPlus}}
\begin{document}
{\hypersetup{hidelinks}
\tableofcontents}
\chapter{Example chapter}
\section{Example section}
\subsection{Example subsection}
This is text in default colour.
\begin{colorPlus}[black!50!green]{blue}
The displayed and printed colours of this text may be different.
\end{colorPlus}
Again, text in default colour.
\end{document}
答案2
这不是一个完整的答案,但评论太长了。
ocgcolorlinks
通过在 PDF 中使用OC
标记来包围文本来工作:
/OC/OCPrint BDC
% stuff that should be used when printed
/EMC
/OC/OCView BDC
% stuff that should be used when view
EMC
遗憾的是,看起来“内容”不能只是颜色指令。必须有绘制的内容(文本或图形)。这使得处理包含换行符或分页符的内容变得困难。
hyperref
通过将链接放入框中,然后使用不同的 OC 设置对其进行两次排版,可以避免换行问题,因此它只能处理短文本。ocgx2 包允许使用剪切来换行:它在 OC 设置中放置覆盖整个页面的大彩色矩形,然后将文本的渲染模式更改为剪切,因此基本上文本会从背景中剪切出来。为了处理分页符,该包存储了大量信息并在下次发送开始时恢复状态。虽然 ocgx2 技巧非常巧妙,但如果文档用于专业打印(但我从未尝试过),我不确定它是否能很好地工作,而且我不知道它对长文本的表现如何。
现在,在您的示例中,您只想为一小段文本着色,因此不需要 ocgx2 方法。这里的主要问题首先是,当您使用ocgcolorlinks
和时,linktoc=all
您已经有 OC 标记,因此您会得到嵌套。其次,要使用该方法打印文本两次,hyperref
您需要将文本捕获到一个框中。因此,您不能简单地执行 \colorPlus{red} 并希望它会影响后面的文本。