我想为 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
- 不要在纯数值后添加单位。
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 编程来制作涉及浮点运算的任何动画都是“容易的”。