如何防止预览丢弃我在序言中定义的 PostScript 常量?

如何防止预览丢弃我在序言中定义的 PostScript 常量?

注意事项:

  • 我必须使用beamer文档类来创建分步教程。
  • 我必须使用preview包装来修剪外面的所有东西pspicture
  • 使用standalone文档类是不可能的,因为我们无法满足上述两个要求。
  • 我必须定义在 TeX 和 PostScript 世界中都可用的常量。
  • 常量声明不能太冗长。单个声明必须同时在两个世界中提供一个常量。

我做了什么:

  • 我在 David Carlisle 的帮助下定义了一个宏,\const[]{}{}用于同时在 TeX 和 PostScript 世界中定义一个常量。请参阅下面的 MWE 了解详细信息。

梅威瑟:

\documentclass{beamer}
\usepackage[nomessages]{fp}
\newcommand\const[3][6]{%
    \edef\temporary{trunc(#3}%
    \expandafter\FPeval\csname#2\expandafter\endcsname
        \expandafter{\temporary:#1)}%
        \pstVerb{/#2 \csname#2\endcsname\space def}%
}

\usepackage{pst-node}

\usepackage[active,tightpage]{preview}
\PreviewEnvironment{pspicture}
\PreviewBorder=12pt

\const{Major}{3}% semi major
\const{Minor}{2}% semi minor

\begin{document}
\begin{frame}
\begin{pspicture}[showgrid](-\Major,-\Minor)(\Major,\Minor)
    \pause
    \psellipse(0,0)(!Major Minor)% produces GhostScript errors
    %\psellipse(0,0)(!\Major\space \Minor)
\end{pspicture}
\end{frame}
\end{document}

问题:

使用 GhostScript 进行编译失败,因为 PostScript 世界中的所有常量都被丢弃了preview

失败的解决方案:

  • 移动

    \const{Major}{3}% semi major
    \const{Minor}{2}% semi minor
    

    从序言到正文pspicture

    \begin{frame}
    \begin{pspicture}[showgrid](-\Major,-\Minor)(\Major,\Minor)
        \const{Major}{3}% semi major
        \const{Minor}{2}% semi minor
        \pause
        \psellipse(0,0)(!Major Minor)% produces GhostScript errors
        %\psellipse(0,0)(!\Major\space \Minor)
    \end{pspicture}
    \end{frame}
    

    是不可能的,因为 TeX 世界中的常量必须是可访问的\begin{pspicture}[showgrid](-\Major,-\Minor)(\Major,\Minor)

糟糕的解决方案:

  • 使用\psellipse(0,0)(!\Major\space \Minor)而不是\psellipse(0,0)(!Major Minor)会使 RPN 表达式变得神秘。

  • 使用\pstheader不方便,因为我必须手动为每个世界声明一个常量。

有前途的想法:

编辑\const[]{}{}实现以创建一个新的头文件(如果不存在)并将每个 PostScript 常量附加到头文件。稍后可以使用\pstheader{}宏加载此头文件。

问题:

如何防止预览在完成我的场景时丢弃我在序言中定义的 PostScript 常量?

答案1

您可以保存您的 ps 定义并将其注入 pspicture 中:

\documentclass{beamer}
\usepackage[nomessages]{fp}
\newcommand\const[3][3]{%
    \edef\temporary{round(#3}%
    \expandafter\FPeval\csname#2\expandafter\endcsname
        \expandafter{\temporary:#1)}%
        \edef\pspicturedefs{\pspicturedefs
            \noexpand\pstVerb{/#2 \csname#2\endcsname\space def}}%
}

\usepackage{pst-node}

\def\pspicturedefs{}

\usepackage[active,tightpage]{preview}
\PreviewEnvironment{pspicture}
\PreviewBorder=12pt

\const{Major}{3}% semi major
\const{Minor}{2}% semi minor

\begin{document}
\begin{frame}
\begin{pspicture}[showgrid](-\Major,-\Minor)(\Major,\Minor)
\pspicturedefs
    \pause
    \psellipse(0,0)(!Major Minor)% produces GhostScript errors
    %\psellipse(0,0)(!\Major\space \Minor)
\end{pspicture}
\end{frame}
\end{document}

相关内容