对长度和无量纲宏进行算术运算的正确语法是什么?

对长度和无量纲宏进行算术运算的正确语法是什么?

我想根据 PSTricks 设置来设置纸张大小。PSTricks 设置可以是无维度的值和/或有维度的值。

说实话我因为懒,没有看过 TeXBook,只是看了别人的例子,但不知道其中的原理,简单来说,我有两个问题:

  1. 为什么以下计算不起作用?我应该如何对有维度和无维度的值进行算术运算。
  2. 减少复杂长度和无量纲值计算的舍入误差的最佳做法是什么?
\documentclass{minimal}
\usepackage{pstricks}
\psset
{
    xunit=2cm,
    yunit=1cm
}

\newcommand\Left{-4}
\newcommand\Right{4}
\newcommand\Bottom{-4}
\newcommand\Top{4}
\newcommand\Padding{0}


\topmargin=-72.27pt
\oddsidemargin=-72.27pt
\parindent=0pt
\paperwidth=\dimexpr\Right\psxunit-\Left\psxunit+2\Padding\psxunit\relax
\paperheight=\dimexpr\Top\psyunit-\Bottom\psyunit+2\Padding\psyunit\relax
\special{papersize=\the\paperwidth,\the\paperheight}

\begin{document}
\begin{pspicture}(\Left,\Bottom)(\Right,\Top)
\psframe(\Left,\Bottom)(\Right,\Top)
\end{pspicture}
\end{document}

答案1

您实际上是在计算\psxunit4-(-4)+20 = 28。

\paperwidth=\dimexpr\psxunit*\numexpr(\Right-\Left+2*\Padding)\relax

2\Padding位扩展为“20”。

答案2

因为 egreg 的建议\numexpr不能用于非整数值,所以我必须使用自己的方法,如下所示。它可以工作,但似乎太复杂了,需要进一步简化。

\documentclass{minimal}
\usepackage{pstricks}
\psset
{
    xunit=1cm,
    yunit=1cm
}

\newcommand\Left{-1}
\newcommand\Right{1}
\newcommand\Bottom{-1}
\newcommand\Top{1}
\newcommand\Padding{0.35}

\topmargin=\dimexpr\Padding\psyunit-72.27pt\relax
\oddsidemargin=\dimexpr\Padding\psxunit-72.27pt\relax
\parindent=0pt
\paperwidth=\dimexpr\Right\psxunit-\Left\psxunit+2\dimexpr\Padding\psxunit\relax\relax
\paperheight=\dimexpr\Top\psyunit-\Bottom\psyunit+2\dimexpr\Padding\psyunit\relax\relax
\special{papersize=\the\paperwidth,\the\paperheight}

\begin{document}
\begin{pspicture}[showgrid](\Left,\Bottom)(\Right,\Top)
\psframe(\Left,\Bottom)(\Right,\Top)
\end{pspicture}
\end{document}

相关内容