ocg-p 包与 hyperref 包的 ocgcolorlinks 选项不兼容

ocg-p 包与 hyperref 包的 ocgcolorlinks 选项不兼容

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加载时(左)和未加载时(右)的打印预览:

ocg-p 已加载 ocg-p 未加载

答案1

这两个包hyperrefocg-p,尝试在彼此不知情的情况下创建可选内容组 (OCG)。这会导致错误的 PDF 文件(更具体地说,重复/OCProperties/Properties条目),从而阻止 OCG 按预期工作。

让这两个包协作并不是特别容易,因为实现是完全独立的。以下代码应该适用于当前版本hyperref v6.83mocg-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 标记。对于当前支持ocgcolorlinkspdftexdvipdfmxetex)的三个驱动程序,需要不同的代码(参见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

最后,我们创建可选的内容组ViewPrint设置必要的可见性选项ocg-p

\@ocgp@newocg{View}{View}{1}{printocg=never,listintoolbar=never}
\@ocgp@newocg{Print}{Print}{0}{printocg=always,listintoolbar=never}

这样,OCG 就可以正确地引入到 PDF 查看器中,避免误导性的重复定义。

答案2

软件包ocgx2v0.17 [2016/03/22] 重新实现了hyperrefocgcolorlinks选项,借鉴了 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}

相关内容