对 pstricks 中的 yunit 存在误解,或者存在错误,或者极度不精确?

对 pstricks 中的 yunit 存在误解,或者存在错误,或者极度不精确?

喂养latex

\documentclass{article}
\pagestyle{empty}
\usepackage{pstricks}
\begin{document}
{1:
\begin{pspicture}(-.1,-1)(.1,5)
  \psline(0,0)(0,5)
\end{pspicture}}
{$10^{-4}$: \psset{yunit=.0001}%
\begin{pspicture}(-.1,-10000)(.1,50000)
  \psline(0,0)(0,50000)
\end{pspicture}}
{$10^{-5}$: \psset{yunit=.00001}%
\begin{pspicture}(-.1,-100000)(.1,500000)
  \psline(0,0)(0,500000)
\end{pspicture}}
{$10^{-6}$: \psset{yunit=.000001}%
\begin{pspicture}(-.1,-1000000)(.1,5000000)
  \psline(0,0)(0,5000000)
\end{pspicture}}
\end{document}

然后将其应用于dvips生成的 DVI 文件并打开生成的 Postscript 文件gv,在我看来,应该会显示四个垂直的 5 厘米长的线段,其最低点在基线上方 1 厘米处。但是,我们只得到三个线段,它们的长度和最低点都不同:

latex-dvips-gv 的输出

LaTeX 和 PSTricks 真的所以不精确,还是有 bug(例如,静默溢出/下溢)隐藏在某个地方?日志和控制台没有警告我们。

答案1

TeX 使用定点算法,并\psset{yunit=.000001}%保存为内部 dimen 寄存器,\psyunit=0.000001cm相当于将其设置为 0pt。最终结果是最终的pspicture高度为 0pt(并且所有高度基本上都是任意的,仅取决于舍入误差)

\tracingall\psset{yunit=.0001}\tracingnone

节目

\psyunit=\dimen166
...
{into \dimen166=0.00304pt}

所以yunit已经处于合理 tex 值的极限,你的最终设置

\tracingall\psset{yunit=.000001}\tracingnone

节目

{into \dimen166=0.0pt}

所以yunit设置为0pt。

答案2

在 PS-Level 上进行所有计算,并让 TeX 框(pspicture)处于 TeX 友好单元中:

\DocumentMetadata{}
\documentclass{article}
\pagestyle{empty}
\usepackage{pstricks}
\def\myLine(#1,#2)(#3,#4){%
  \psline(#1,#2)(!#3 #4 yunit mul)}

\begin{document}
{1:
    \begin{pspicture}(-.1,-1)(.1,5)
        \psline(0,0)(0,5)
\end{pspicture}}
{$10^{-4}$: \pstVerb{/yunit 0.0001 def}%
    \begin{pspicture}(-.1,-1)(.1,5)
        \myLine(0,0)(0,50000)
\end{pspicture}}
{$10^{-5}$: \pstVerb{/yunit 0.00001 def}%
    \begin{pspicture}(-.1,-1)(.1,5)
        \myLine(0,0)(0,500000)
\end{pspicture}}
{$10^{-6}$: \pstVerb{/yunit 0.000001 def}%
    \begin{pspicture}(-.1,-1)(.1,5)
        \myLine(0,0)(0,5000000)
\end{pspicture}}
\end{document}

在此处输入图片描述

相关内容