我正在从 pdflatex 切换到 xelatex,但找不到如何在 pdf 中制作图层的替代方法。到目前为止,我一直在使用 ocg.sty 将相关内容与视觉效果内容(背景图像、插图)分开,以便读者可以在打印时隐藏后者。
但是,由于缺乏对 pdfobj 的支持,ocg.sty 无法与 xelatex 配合使用。较新的 CTAN ocgtools 包也存在此问题,可以与 pdflatex 配合使用,但不能与 xelatex 配合使用。
目前有没有办法使用 xelatex 生成 ocg 层?或者有没有其他方法可以在打印之前隐藏/禁用 PDF 中的某些部分(不一定只是图像)?
答案1
原则上,这是可能的。但是,有人必须将对 xetex 的支持添加到包中。您可以尝试使用 xetex 编译以下文本。第二行是可选的 OCG,可以关闭。从以下位置窃取这里。
%create new OCG
\special{pdf:obj @ocg <</Type/OCG /Name (myocg)>>}
%register it and configure its default behaviour
\special{pdf:put @catalog <<
/OCProperties <<
/OCGs [@ocg]
/D <</BaseState/ON /Order [@ocg]>>
>>
>>}
This is a minimal OCG example.
%add the OCG to the resources of the current page object
\special{pdf: put @resources <<
/Properties <<
%this maps the name ``oc1'' to the OCG object
/oc1 @ocg
>>
>>}
%mark someting of the page content as optional
\special{pdf: content /OC /oc1 BDC} %optional content follows
This text is optional.
\special{pdf: content EMC} %end of optional content
\bye
答案2
我扩展了 robert.marik.cz 的出色答案,以便我有一个可创建多个图层的设置命令和一个可在文档中使用的简单宏。
在我的样式文件中,我这样做:
\newcommand{\setupOCG}{
\special{pdf:obj @ocg1 <</Type/OCG /Name (My first layer)>>}
\special{pdf:obj @ocg2 <</Type/OCG /Name (My second layer)>>}
%register it and configure its default behaviour
\special{pdf:put @catalog <<
/OCProperties <<
/OCGs [@ocg1 @ocg2]
/D <</BaseState/ON /Order [@ocg1 @ocg2]>>
>>
>>}
%add the OCG to the resources of the current page object
\AddToShipoutPicture{%
\makeatletter%
\special{pdf: put @resources <<
/Properties <<
%this maps the name to the OCG object
/oc1 @ocg1
/oc2 @ocg2
>>
>>}
\makeatother%
}
}
\newcommand{\myocg}[2]{%
\special{pdf: content /OC #1 BDC}#2\special{pdf: content EMC}%
}
这需要eso-pic
包。我的第一层和我的第二层将成为 PDF 阅读器中的可见名称。通过添加 @ocg3 和 /oc3 等,可以轻松添加更多层。
然后在我的文档中我执行以下操作:
...
\setupOCG
\begin{document}
\myocg{/oc1}{I am visible on the first layer.}
\myocg{/oc2}{I am visible on the second layer.}
...
奇迹般有效。
答案3
幸运的是ocgx2也适用于 XeLaTeX。