新颜色命令 \colorPlus[][} 在查看和打印时表现不同

新颜色命令 \colorPlus[][} 在查看和打印时表现不同

目的是定义新命令 \colorPlus[<color-when-printed>]{<color-in-PDF>}

  • 当不带可选参数使用时,其工作方式与通常完全相同,\color{<color-in-PDF-and-print>}例如\colorPlus{<color-in-PDF}
  • 当给出可选参数时,执行一些osgx2-type 魔法。例如,\colorPlus[black]{red}将使文本在 PDF 中显示为红色,但在打印时显示为黑色。

根据 2015 年的一些旧评论(12) 经过马里亚诺·苏亚雷斯-阿尔瓦雷斯和 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 中查看时,章节页码为红色(但在这种情况下,打印时也是如此)。

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} 并希望它会影响后面的文本。

相关内容