ocgcolorlinks
当我将包的选项hyperref
与包一起使用时ocg-p
(微特克斯+pdflatex),看起来该ocgcolorlinks
选项不再起作用(与软件包的包含顺序无关)。当ocg-p
从代码中排除时,所有链接将再次以默认文本颜色打印。
这个问题在某处有描述吗?或者,也许有人可以建议,我必须做什么才能在一个代码中合并选项ocgcolorlinks
和包ocg-p
?
MWE(由 cyberSingularity 提供):
\documentclass{article}
%\usepackage{ocg-p}% uncomment this, and print preview to see the problem
\usepackage[ocgcolorlinks]{hyperref}
\begin{document}
\section{Test}
See \autoref{next}
\section{Next}
\label{next}
Target.
\end{document}
ocg-p
加载时(左)和未加载时(右)的打印预览:
答案1
这两个包hyperref
和ocg-p
,尝试在彼此不知情的情况下创建可选内容组 (OCG)。这会导致错误的 PDF 文件(更具体地说,重复/OCProperties
和/Properties
条目),从而阻止 OCG 按预期工作。
让这两个包协作并不是特别容易,因为实现是完全独立的。以下代码应该适用于当前版本hyperref v6.83m
和ocg-p v0.4
:
\documentclass{article}
\usepackage{ocg-p}
\usepackage[ocgcolorlinks]{hyperref}
% Fix incompability between ocg-p and the hyperref option ocgcolorlinks
% (http://tex.stackexchange.com/a/104227)
\makeatletter
\Hy@colorlinkstrue
\Hy@ocgcolorlinksfalse
\newcommand*{\reenable@ocglinks@pdftex}{%
\Hy@AtBeginDocument{%
\def\Hy@colorlink##1{%
\begingroup
\def\Hy@ocgcolor{##1}%
\setbox0=\hbox\bgroup\color@begingroup
}%
\def\Hy@endcolorlink{%
\color@endgroup\egroup
\mbox{%
\pdfliteral page{/OC/OCPrint BDC}%
\rlap{\copy0}%
\pdfliteral page{EMC/OC/OCView BDC}%
\begingroup
\expandafter\HyColor@UseColor\Hy@ocgcolor
\box0 %
\endgroup
\pdfliteral page{EMC}%
}%
\endgroup
}%
}%
}
\newcommand*{\reenable@ocglinks@dvipdfm}{%
\Hy@AtBeginDocument{%
\def\Hy@colorlink##1{%
\begingroup
\def\Hy@ocgcolor{##1}%
\setbox0=\hbox\bgroup\color@begingroup
}%
\def\Hy@endcolorlink{%
\color@endgroup\egroup
\mbox{%
\@pdfm@mark{content /OC/OCPrint BDC}%
\rlap{\copy0}%
\@pdfm@mark{content EMC/OC/OCView BDC}%
\begingroup
\expandafter\HyColor@UseColor\Hy@ocgcolor
\box0 %
\endgroup
\@pdfm@mark{content EMC}%
}%
\endgroup
}%
}%
}
\def\Hy@temp{hpdftex}
\ifx\Hy@driver\Hy@temp
\reenable@ocglinks@pdftex
\else
\def\Hy@temp{hdvipdfm}
\ifx\Hy@driver\Hy@temp
\reenable@ocglinks@dvipdfm
\else
\def\Hy@temp{hxetex}
\ifx\Hy@driver\Hy@temp
\reenable@ocglinks@dvipdfm
\fi
\fi
\fi
\@ocgp@newocg{View}{View}{1}{printocg=never,listintoolbar=never}
\@ocgp@newocg{Print}{Print}{0}{printocg=always,listintoolbar=never}
\makeatother
\begin{document}
\section{Test}
See \autoref{next}
\section{Next}
\label{next}
Target.
\end{document}
代码解释
我们特意禁用该ocgcolorlinks
功能以停止对软件包提供的 OCG 管理的干扰ocg-p
:
\Hy@colorlinkstrue
\Hy@ocgcolorlinksfalse
现在我们手动重新启用超链接所需的 OCG 标记。对于当前支持ocgcolorlinks
(pdftex
、dvipdfm
和xetex
)的三个驱动程序,需要不同的代码(参见hpdftex.def
,第 292-318 行,hdvipdfm.def
,第 280-306 行,以及hxetex.def
,第 362-388 行):
\newcommand*{\reenable@ocglinks@pdftex}{%
% see above
}
\newcommand*{\reenable@ocglinks@dvipdfm}{%
% see above
}
\def\Hy@temp{hpdftex}
\ifx\Hy@driver\Hy@temp
\reenable@ocglinks@pdftex
\else
\def\Hy@temp{hdvipdfm}
\ifx\Hy@driver\Hy@temp
\reenable@ocglinks@dvipdfm
\else
\def\Hy@temp{hxetex}
\ifx\Hy@driver\Hy@temp
\reenable@ocglinks@dvipdfm
\fi
\fi
\fi
最后,我们创建可选的内容组View
并Print
设置必要的可见性选项ocg-p
:
\@ocgp@newocg{View}{View}{1}{printocg=never,listintoolbar=never}
\@ocgp@newocg{Print}{Print}{0}{printocg=always,listintoolbar=never}
这样,OCG 就可以正确地引入到 PDF 查看器中,避免误导性的重复定义。
答案2
软件包ocgx2
v0.17 [2016/03/22] 重新实现了hyperref
的ocgcolorlinks
选项,借鉴了 diabonas 的代码。此外,它还将 Layers 和ocgcolorlinks
选项移植到之前不可用的其他引擎。
因此,要同时拥有以周围文本颜色打印的彩色链接和有效的 PDF 图层,只需说
\usepackage{hyperref} % do NOT set [ocgcolorlinks] here!
\usepackage[ocgcolorlinks]{ocgx2}
例子:
\documentclass{article}
\usepackage{hyperref} % Do NOT set [ocgcolorlinks] here!
\usepackage[ocgcolorlinks]{ocgx2}
\begin{document}
\section{Test}
See \autoref{next}
\section{Next}
\label{next}
Target.
\begin{ocg}{some layer}{some_layer}{1}
\noindent Text on a PDF layer
\end{ocg}
\noindent\toggleocgs{some_layer}{\fbox{Click}} to toggle visibility.
\end{document}