使用 latex->dvips 的 PDF 图层 (OCG)

使用 latex->dvips 的 PDF 图层 (OCG)

我想生成一个带图层的 ps 文件。ocg.sty 不支持 ps,所以我想自己写一个简单的例子看看是否可行。我从中获取了一个 pdf 版本这里并尝试改变命令来生成 ps 版本(代码附加在此处)。

嗯,ps 文件生成了,但似乎已损坏。当我使用 ps2pdf 时,会报告错误。如果删除带有“AddToShipoutPicture”的部分,ps2pdf 不会报告任何错误,因此似乎错误就在那里。但也许还有更多错误。也许有人可以帮助制定一个简单的解决方案。

\documentclass{article}
\RequirePackage{eso-pic}
\RequirePackage{ifpdf}

\newcommand{\setupOCG}{
  \special{ps: mark /_objdef {@ocg1} /type/dict /OBJ pdfmark}
  \special{ps: mark {@ocg1} <</Type/OCG /Name (My first layer)>> /PUT pdfmark}
  \special{ps: mark /_objdef {@ocg2} /type/dict /OBJ pdfmark}
  \special{ps: mark {@ocg2} <</Type/OCG /Name (My second layer)>> /PUT pdfmark}

  %register it and configure its default behaviour
  %\special{ps: mark /_objdef {{@ocg1} {@ocg2}} /type/array /OBJ pdfmark}
  \special{ps:mark {Catalog} <<
    /OCProperties <<
      /OCGs [{@ocg1} {@ocg2}]
      /D <</BaseState/ON /Order [{@ocg1} {@ocg2}]  /OFF [{@ocg1}]  >> %first layer invisible
    >>
  >> /PUT pdfmark}

  %add the OCG to the resources of the current page object
  \AddToShipoutPicture{%
    \special{ps:mark {Resources} <<
      /Properties <<
        %this maps the name to the OCG object
        /oc1 {@ocg1} /oc2 {@ocg2}
      >>
    >> /PUT pdfmark}
  }
}

\newcommand{\myocg}[2]{%    
\special{ps: mark /OC /#1 /BDC pdfmark}#2\special{ps: mark /EMC pdfmark}% ok
    %\special{ps: mark {ocgname\the\ocnum} <</OC {/@oc\the\ocnum}>> /PUT pdfmark}
}

\setupOCG

\begin{document}
  \myocg{oc1}{I am NOT visible on the first layer.}
  \myocg{oc2}{I am visible on the second layer.}
\end{document}

答案1

第二次更新

包裹ocgx2, 和Ghostscript发布>=9.15允许使用latex+ dvips+创建 PDF 层 (OCG) ps2pdf

\documentclass{article}

\usepackage{ocgx2}

\begin{document}
\switchocg{a b}{\fbox{Swap visibility}}\\[1ex]

\begin{ocg}{A}{a}{1}
  Some text, initially visible.
\end{ocg}

\begin{ocg}{B}{b}{0}
  Some text, initially \emph{in}visible.
\end{ocg}

\begin{ocg}{A}{a}{0} %initial visibility of re-opened OCG cannot be changed
  Some more text, initially visible.
\end{ocg}

\end{document}

第一次更新(过时的)

封装组合ocgx+fixocgx以及最近Ghostscript发布9.15允许使用latex+ dvips+创建 PDF 层 (OCG) ps2pdf

\documentclass{article}

\usepackage{ocgx}
\usepackage{fixocgx}[2015/01/26]

\begin{document}
\switchocg{a b}{\fbox{Swap visibility}}\\[1ex]

\begin{ocg}{A}{a}{1}
  Some text, initially visible.
\end{ocg}

\begin{ocg}{B}{b}{0}
  Some text, initially \emph{in}visible.
\end{ocg}

\begin{ocg}{A}{a}{0} %initial visibility of re-opened OCG cannot be changed
  Some more text, initially visible.
\end{ocg}

\end{document}

为了使用 OCG(可选内容组)在 PDF 中创建图层,页面流中要设为可选的内容必须括在/OC ... BDC-EMC括号中。

不幸的是,用于此目的的/BDC/EMCpdfmarks 不受 Ghostscript 的支持ps2pdf(根据gdevpdfm.cGhostscript 来源)。

目前,只有 Adob​​e Distiller 支持它们。

从 Ghostscript 开始9.15、 pdfmarks/BDC以及/EMCOCG 均得到全面支持。

原始帖子中使用低级的更正后的代码示例pdfmarklatex通过-> dvips->或 Distiller运行的实施内容ps2pdf如下:

\documentclass{article}

\newcommand{\setupOCG}{
  \special{ps: mark /_objdef {ocg1} /type/dict /OBJ pdfmark}
  \special{ps: mark {ocg1} <</Type/OCG /Name (My first layer)>> /PUT pdfmark}
  \special{ps: mark /_objdef {ocg2} /type/dict /OBJ pdfmark}
  \special{ps: mark {ocg2} <</Type/OCG /Name (My second layer)>> /PUT pdfmark}

  %register it and configure its default behaviour
  \special{ps:mark {Catalog} <<
    /OCProperties <<
      /OCGs [{ocg1} {ocg2}]
      /D <</BaseState/ON /Order [{ocg1} {ocg2}]  /OFF [{ocg1}]  >> %first layer invisible
    >>
  >> /PUT pdfmark}
}

\newcommand{\myocg}[2]{%    
  \special{ps: mark /OC {#1} /BDC pdfmark}#2\special{ps: mark /EMC pdfmark}%
}

\setupOCG

\begin{document}
  \myocg{ocg1}{I am NOT visible on the first layer.}
  \myocg{ocg2}{I am visible on the second layer.}
\end{document}

相关内容