在 PSTricks 中有没有更简单的方法进行算术运算?

在 PSTricks 中有没有更简单的方法进行算术运算?

我想为 PSTricks 图表制作动画,因此大量使用循环。我有 3 个全局变量,,\START应该在序言中声明。主体中的其余变量将使用这 3 个全局变量。\STOP\DELTA

循环宏\multido需要一个整数来表示必须重复给定作业的次数。不幸的是,这个值没有明确给出,但可以通过\STOP-\START除以的简单公式获得\DELTA。我需​​要一种简单的方法来以整数而不是浮点数找到这个数字。

\INITIAL我认为利用\dimexpr和来寻找变量\strip@pt也不是那么自然。

以下编码流程看起来太复杂,我需要更流畅的方法。

\documentclass{minimal}
\parindent=0pt
\usepackage{multido}

\newcommand\START{-1}
\newcommand\STOP{1}
\newcommand\DELTA{0.01}


% to do division only, but the result in floating point
\pstFPdiv\TempTimes
{
        \the
        \dimexpr
        \STOP pt
        -\START pt
        \relax
}
{\DELTA}

\makeatletter
\newcommand\INITIAL
{
        \strip@pt
        \dimexpr
        \START pt
        +\DELTA pt
        \relax
}

% to make it an integer
\newcommand\TIMES
{
        \strip@pt
        \dimexpr
        \TempTimes pt
        \relax
}
\makeatother

\begin{document}
\multido
{
        \nx=\START+\DELTA,
        \ny=\INITIAL+\DELTA
}
{\TIMES}
{
    (\nx,\ny)\endgraf
}
\end{document}

答案1

无需加载的解决方案fp。如果你不需要正好两位数,那么你不需要\StripDecimals

\documentclass{minimal}
\parindent=0pt
\usepackage{pst-func,multido}
\def\StripDecimals#1{\expandafter\SD#10!}
\def\SD#1.#2#3#4!{%
  \ifx\relax#2\relax#1.\else#1.#2#3\fi}

\newcommand\START{-1.00}
\newcommand\STOP{1.00}
\newcommand\DELTA{0.01}

\pstFPsub\Temp\STOP\START 
\pstFPDiv\TIMES\Temp\DELTA
\pstFPadd\Temp\START\DELTA
\pstFPstripZeros\Temp\INITIAL

\begin{document}

\multido{\rx=\START+\DELTA,
         \ry=\INITIAL+\DELTA}{\TIMES}
  {(\StripDecimals{\rx0},\StripDecimals{\ry0})\endgraf}
\end{document}

答案2

我对 PStricks 的浮点运算不是特别熟悉(通过pst-func),所以我倾向于使用fp包裹

\documentclass{minimal}
\parindent=0pt
\usepackage{multido}
\usepackage[nomessages]{fp}%

\newcommand\START{-1}
\newcommand\STOP{1}
\newcommand\DELTA{0.01}
\FPupn\INITIAL{\START{} \DELTA{} add 2 trunc}% floating point truncation
\FPupn\TIMES{\STOP{} \START{} sub \DELTA{} div 0 trunc}% integer truncation

\begin{document}
\multido
{
  \nx=\START+\DELTA,
  \ny=\INITIAL+\DELTA
}
{\TIMES}
{
  (\nx,\ny)\endgraf
}
\end{document}

在执行需要的计算时四舍五入 您可以使用表示小数点后位数的n round地方。n

答案3

  1. 不要在纯数值后添加单位。
  2. fp该软件包提供了进行复杂算术计算的全部能力。

该代码实际上与 PSTricks 无关:

\documentclass{minimal}
\usepackage{fp}
\usepackage{multido}

\newcommand\START{-1}
\newcommand\STOP{1}
\newcommand\DELTA{0.01}
\FPeval\INITIAL{round((START + DELTA):2)}
\FPeval\TIMES{round((STOP-START)/DELTA:0)}
\parindent=0pt
\begin{document}
\multido{\nx=\START+\DELTA, \ny=\INITIAL+\DELTA}{\TIMES}
{
  (\nx,\ny)\endgraf
}
\end{document}

答案4

我向大家道歉,但我想重新讨论这个旧话题。看到对原始问题的回答集中在 LaTeX 的fp软件包上,我有点惊讶。TeX 不能进行浮点运算是有充分理由的,但 PostScript 绝对可以做到。

http://www.tug.org/TUGboat/tb23-3-4/tb75beccreal.pdf

我的理解pstricks是,这是一种将原始 PostScript 代码放入 TeX 文件的用户友好方式(请注意,我只是一个非常低级别的pstricks用户)。这里有一个不太用户友好的方法来实现相同的目的。

下面这行将图片输入到 TeX 代码中,水平偏移量为 72,垂直偏移量为 -150。水平和垂直输出详细的原因是命令 special 将图片放在默认大小为 0 的框中的文本后面。

\special{psfile=my_PostScript_file.ps hoffset=72 voffset=-150 hscale=90 
vscale=90}
\bye

当然my_PostScript_file.ps是手工编程的。例如

%!PS-Adobe-2.0 EPSF-2.0
%%Title: tata.fig
%%Creator: Predrag
%%CreationDate: Sun Dec 25 23:29:18 2011
%%For: [email protected] (Predrag Punosevac)
%%BoundingBox: 0 0 110 101
%Magnification: 1.0000
%%EndComments
%%BeginProlog
%%EndProlog
/Times_Roman findfont
15 scalefont

setfont
50 50 moveto
(Some text)show
newpath
5 5 moveto
10 45 lineto
stroke
showpage
%EOF

现在可以清楚地看到,通过原始 PostScript 编程来制作涉及浮点运算的任何动画都是“容易的”。

相关内容