涉及 pstricks、dvi->ps->pdf 工具链和字母组合 rt 的奇怪问题

涉及 pstricks、dvi->ps->pdf 工具链和字母组合 rt 的奇怪问题

这是一个非常奇怪的错误[编辑]这不是一个错误,问题出在我的代码中。

我花了一个小时把它归结为一个小的可行示例,无法弄清楚它是否最小。

设置:Ubuntu 最新版本,标准更新的 .tex。文件:

\documentclass{beamer}
\usepackage[english]{babel}
\usepackage[latin1]{inputenc}
\usepackage{times}
\usepackage{pst-plot}
\usepackage{pst-math}
\newcommand{\polarWedge}[3]{%
\pstVerb{%
/t #1 def%
}%
}%
\begin{document}
\begin{frame}
\begin{pspicture*}(-3,-1)(1.5,2.3)%
\polarWedge{0}{1}{t 2 div 1 add}%
\end{pspicture*}
rt
\end{frame}
\end{document}

症状:这无法使用 dvi->ps-pdf 工具链正确编译。使用 pdflatex 编译。问题出在字母组合 rt 上。如果将 rt 更改为 rt 或任何其他字母组合,问题就会消失。这是我在 latex 中见过的最奇怪的事情(可能是 rt 字母的处理方式?)

我不确定这个问题的重现程度,如果您的机器上遇到同样的问题,请告诉我!


[编辑]问题现已解决。Herbert 正确地识别了这个问题:发生的情况是 t 被用作内部变量,而我对 t 的重新定义弄乱了一些东西。Herbert 提出的解决方案也是正确的:我需要定义一个本地字典,在其中评估变量 t,然后弹出该字典。我正在发布幻灯片的更正版本。

我必须承认这不是一个错误,而是我对 PostScript 缺乏了解的表现。


[编辑]@cfr:不,您的最小示例没有解决与我的示例相同的问题。在我的示例中,如果您删除 pspicture,幻灯片将使用字母 rt 顺利编译。仅当您使用 pspicture 时才会显示 rt-bug。


@Herbert:是的,我确实认为问题在于字母 t 在多个地方使用,并且使用 \pstVerb 重新定义字母 t。但是,我确实需要为字母 t 分配值来评估我的函数。有没有不使用 \pstVerb 就可以做到这一点?


[编辑] @cfr:我收到的错误来自 ps2pdf 可执行文件。错误报告如下:

进程已启动:ps2pdf“pstricksProblem”.ps

错误:/invalidrestore 在 --restore-- 操作数堆栈:(r) 0.4 --nostringval-- --nostringval-- 执行堆栈:%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1916 1 3 %oparray_pop 1915 1 3 %oparray_pop 1899 1 3 %oparray_pop 1787 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- 1839 3 4 %oparray_pop --nostringval-- 1823 3 4 %oparray_pop --nostringval-- 字典堆栈:--dict:1175/1684(ro)(G)-- --dict:1/20(G)-- --dict:163/200(L)-- --dict:189/300(L)-- 当前分配模式为本地 当前文件位置为 133316 GPL Ghostscript 9.10:无法恢复的错误,退出代码 1

进程因错误而退出


[编辑] 由于有人询问,原始幻灯片如下所示:

\documentclass{beamer}
\usepackage{etex}
\usepackage[english]{babel}
\usepackage[latin1]{inputenc}
\usepackage{times}
\usepackage{auto-pst-pdf}
\usepackage{pst-plot}
\usepackage{pst-math}
\newcommand{\polarWedge}[3]{%
\pstVerb{%
/t #1 def%
/firstX #1 57.29578 mul cos #3 mul def%
/firstY #1 57.29578 mul sin #3 mul def%
}%
\pstVerb{%
/t #2 def%
/secondX #2 57.29578 mul cos #3 mul def%
/secondY #2 57.29578 mul sin #3 mul def%
}%
\pscustom[fillcolor=cyan, fillstyle=solid, linecolor=blue]{%
\psline(0,0)(! firstX firstY)(! secondX secondY)(0,0)%
}%
}%
\newcommand{\drawPolar}[4]{%
\parametricplot[#4]{#1}{#2}{#3 t 57.29578 mul cos mul #3 t 57.29578 mul sin mul}%
}

\begin{document}
\begin{frame}
\begin{pspicture*}(-3,-1)(3.5,3.3)%
\uncover<2->{%
\polarWedge{0}{0.05}{3 t sub}%
}%
\uncover<3->{%
\polarWedge{0.05}{0.1}{3 t sub}%
}%
\uncover<4->{%
\polarWedge{0.1}{0.15}{3 t sub}%
}%
\uncover<5->{%
\polarWedge{0.15}{0.2}{3 t sub}%
}%
\uncover<6->{%
\polarWedge{0.2}{0.25}{3 t sub}%
}%
\uncover<7->{%
\polarWedge{0.25}{0.3}{3 t sub}%
}%
\uncover<8->{%
\polarWedge{0.3}{0.35}{3 t sub}%
}%
\uncover<9->{%
\polarWedge{0.35}{0.4}{3 t sub}%
}%
\drawPolar{0}{2.5}{3 t sub}{linecolor=red, plotpoints=1000}%
\end{pspicture*}
\uncover<1-10>{}
rt
\end{frame}
\end{document}

[编辑] 我使用的变量称为 t,因为我正在传递函数

3吨级

作为调用 \parametricplot 的函数的参数,parametricplot 使用的变量名称是 t。如果您愿意,我可以创建一个函数,其参数是一个函数。当然,我的设置完全依赖于变量“t”是局部变量的假设。当字母 r 和 t 分开时,上面的幻灯片可以工作,这一事实支持了这种情况。然而,字母 r 和 t 并排的作用是什么,我搞不清楚。

[编辑] 幻灯片的最终修正版本。修正是根据 Herbert 的建议(非常感谢!)和对后记文档的少量阅读做出的。

\documentclass{beamer}
\usepackage{etex}
\usepackage[english]{babel}
\usepackage[latin1]{inputenc}
\usepackage{times}
\usepackage{auto-pst-pdf}
\usepackage{pst-plot}
\usepackage{pst-math}
\newcommand{\polarWedge}[3]{%
\pstVerb{%
/firstX  1 dict begin /t #1 def #1 57.29578 mul cos #3 mul end def%
/firstY  1 dict begin /t #1 def #1 57.29578 mul sin #3 mul end def%
/secondX 1 dict begin /t #2 def #2 57.29578 mul cos #3 mul end def%
/secondY 1 dict begin /t #2 def #2 57.29578 mul sin #3 mul end def%
}%
\pscustom[fillcolor=cyan, fillstyle=solid, linecolor=blue]{%
\psline(0,0)(! firstX firstY)(! secondX secondY)(0,0)%
}%
}%
\newcommand{\drawPolar}[4]{%
\parametricplot[#4]{#1}{#2}{#3 t 57.29578 mul cos mul #3 t 57.29578 mul sin mul}%
}

\begin{document}
\begin{frame}
\begin{pspicture*}(-3,-1)(3.5,3.3)%
\uncover<2->{%
\polarWedge{0}{0.05}{3 t sub}%
}%
\uncover<3->{%
\polarWedge{0.05}{0.1}{3 t sub}%
}%
\uncover<4->{%
\polarWedge{0.1}{0.15}{3 t sub}%
}%
\uncover<5->{%
\polarWedge{0.15}{0.2}{3 t sub}%
}%
\uncover<6->{%
\polarWedge{0.2}{0.25}{3 t sub}%
}%
\uncover<7->{%
\polarWedge{0.25}{0.3}{3 t sub}%
}%
\uncover<8->{%
\polarWedge{0.3}{0.35}{3 t sub}%
}%
\uncover<9->{%
\polarWedge{0.35}{0.4}{3 t sub}%
}%
\drawPolar{0}{2.5}{3 t sub}{linecolor=red, plotpoints=1000}%
\end{pspicture*}
\uncover<1-10>{}
\end{frame}
\end{document}

—托多尔·米列夫

答案1

我完全不清楚您想要显示什么。正如我已经说过的,t它被内部使用beamer,并且也被用作变量\psparametricplot。重新定义它是危险的。告诉我们你想展示什么我们可以提供有用的帮助。但是,以下是您的示例:

\documentclass{beamer}
\usepackage{etex}
\usepackage{pst-plot}
\usepackage{pst-math}
\newcommand\polarWedge[3]{%
  \pstVerb{/t #1 def}
  \pscustom[fillcolor=cyan,fillstyle=solid,linecolor=blue,linewidth=0.2pt]{
    \psline(0,0)(! #1 COS #3 mul #1 SIN #3 mul)
    \parametricplot{#1}{#2}{#3 t COS mul #3 t SIN mul}
    \closepath}}
\newcommand\drawPolar[4]{%
  \parametricplot[#4]{#1}{#2}{#3 t COS mul #3 t SIN mul}%
}

\begin{document}
\begin{frame}
\begin{pspicture*}(-3,-1)(3.5,3.3)%
\multido{\iA=2+1,\rA=0.00+0.05,\rB=0.05+0.05}{16}{%
  \uncover<\iA->{\polarWedge{\rA}{\rB}{3 t sub}}}%
\drawPolar{0}{2.5}{3 t sub}{linecolor=red, plotpoints=100}%
\end{pspicture*}

rt
\end{frame}
\end{document}

最后一张幻灯片的视图:

在此处输入图片描述

相关内容