![如何防止预览丢弃我在序言中定义的 PostScript 常量?](https://linux22.com/image/265390/%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%E9%A2%84%E8%A7%88%E4%B8%A2%E5%BC%83%E6%88%91%E5%9C%A8%E5%BA%8F%E8%A8%80%E4%B8%AD%E5%AE%9A%E4%B9%89%E7%9A%84%20PostScript%20%E5%B8%B8%E9%87%8F%EF%BC%9F.png)
注意事项:
- 我必须使用
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}