Zu Beginn verwende ich den folgenden Code. Soweit, so gut.
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{multido}
\usepackage[nomessages]{fp}
\def\LoadConstants{}
\newcommand\const[3][3]{%
\edef\temporary{round(#3}%
\expandafter\FPeval\csname#2\expandafter\endcsname
\expandafter{\temporary:#1)}%
\edef\LoadConstants{\LoadConstants
\noexpand\pstVerb{/#2 \csname#2\endcsname\space def}}%
}
\const[1]{G}{9.8}
\const[1]{Tfinal}{2.0}
\def\y(#1){-G/2*#1^2}
\const[1]{Yfinal}{\y(Tfinal)}
\SpecialCoor
\usepackage{siunitx}
\begin{document}
\begin{pspicture}[showgrid=false](3.5,\Yfinal)
\LoadConstants
\psline(1.5,0)(1.5,\Yfinal)
\multido{\n=0.0+0.5}{5}
{
\const[1]{Yt}{\y(\n)}%
\rput[r](*1.25 {\y(\n)}){$\SI{\Yt}{\meter}$}
\psline(1.4,\Yt)(1.6,\Yt)
\rput[l](*1.75 {\y(\n)}){$t=\SI{\n}{\second}$}
\pscircle*(*3.5 {\y(\n)}){5pt}
}
\end{pspicture}
\end{document}
Ich habe meine Meinung geändert und verwende Yt
stattdessen \Yt
für Folgendes. Da Yt
es sich um eine PostScript-Welt handelt, muss ich \LoadConstants
erneut ein Extra aufrufen (siehe die Schleife).
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{multido}
\usepackage[nomessages]{fp}
\def\LoadConstants{}
\newcommand\const[3][3]{%
\edef\temporary{round(#3}%
\expandafter\FPeval\csname#2\expandafter\endcsname
\expandafter{\temporary:#1)}%
\edef\LoadConstants{\LoadConstants
\noexpand\pstVerb{/#2 \csname#2\endcsname\space def}}%
}
\const[1]{G}{9.8}
\const[1]{Tfinal}{2.0}
\def\y(#1){-G/2*#1^2}
\const[1]{Yfinal}{\y(Tfinal)}
\SpecialCoor
\usepackage{siunitx}
\begin{document}
\begin{pspicture}[showgrid=false](3.5,\Yfinal)%
\LoadConstants%
\psline(1.5,0)(!1.5 Yfinal)%
\multido{\n=0.0+0.5}{15}%
{%
\const[1]{Yt}{\y(\n)}%
\LoadConstants%This is needed to provide Yt in PostScript world.
\rput[r](*1.25 {\y(\n)}){$\SI{\Yt}{\meter}$}%
\psline(!1.4 Yt)(!1.6 Yt)%
\rput[l](*1.75 {\y(\n)}){$t=\SI{\n}{\second}$}%
\pscircle*(*3.5 {\y(\n)}){5pt}%
}%
\end{pspicture}%
\end{document}
Leider wird die vertikale Linie nach links verschoben. Ich habe versucht, die Ursache des Problems zu finden, aber ich habe es aufgegeben. Sie können sehen, dass ich alle möglichen Leerzeichen entfernt habe, aber das Problem besteht weiterhin.
Konnten Sie die Ursache des Problems finden? Es ist ein schwieriges Rätsel!
Bearbeiten:
Ich habe den Wert von Yt
using geprüft \psPrintValue
und sie verwenden ,
anstelle von .
als Dezimaltrennzeichen. Ist das in Ordnung?
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{multido}
\usepackage[nomessages]{fp}
%\def\LoadConstants{}
%\newcommand\const[3][3]{%
%\edef\temporary{round(#3}%
%\expandafter\FPeval\csname#2\expandafter\endcsname
%\expandafter{\temporary:#1)}%
%\edef\LoadConstants{\LoadConstants\ignorespaces
%\noexpand\pstVerb{/#2 \csname#2\endcsname\space def}\ignorespaces}\ignorespaces%
%}
\newcommand\const[3][3]{%
\edef\temporary{round(#3}%
\expandafter\FPeval\csname#2\expandafter\endcsname
\expandafter{\temporary:#1)}%
\pstVerb{/#2 \csname#2\endcsname\space def}%
}
\const[1]{G}{9.8}
\const[1]{Tfinal}{2.0}
\def\y(#1){-G/2*#1^2}
\const[1]{Yfinal}{\y(Tfinal)}
\SpecialCoor
\usepackage{siunitx}
\usepackage{pst-tools}
\begin{document}
\begin{pspicture}[showgrid=false](5,\Yfinal)%
%\LoadConstants%
\psline(1.5,0)(!1.5 Yfinal)%
\multido{\n=0.0+0.5}{15}%
{%
\const[1]{Yt}{\y(\n)}%
%\LoadConstants%
\rput[r](*1.25 {\y(\n)}){$\SI{\Yt}{\meter}$}%
\psline(!1.4 Yt)(!1.6 Yt)%
\rput[l](*1.75 {\y(\n)}){$t=\SI{\n}{\second}$}%
\pscircle*(*3.5 {\y(\n)}){5pt}%
\rput(*4 {\y(\n)}){\psPrintValue{Yt}}
}%
\end{pspicture}%
\end{document}
Antwort1
Es gibt ein ungeschütztes Zeilenende in fp-exp.sty
; fügen Sie dies Ihrer Präambel hinzu
\makeatletter
\def\FP@pow#1#2#3{% <---- This was unprotected
% #1 macro, which gets the result
% #2 base
% #3 exponent
%
\FP@beginmessage{POW}%
%
{\def\FP@beginmessage##1{}%
\def\FP@endmessage##1{}%
%
\FPifzero{#2}%
\FP@pow@zero{#3}%
\else%
\FPln\FP@tmpd{#2}%
\FPmul\FP@tmpd\FP@tmpd{#3}%
\FPexp\FP@tmp\FP@tmpd%
\fi%
%
\global\let\FP@tmp\FP@tmp%
}%
%
\FP@endmessage{}%
%
\let#1\FP@tmp%
}
\makeatother
Hier ist der vollständige Code zur doppelten Kontrolle. Es gibt viele %
, die ich nicht verwenden würde, aber ich habe sie trotzdem gelassen.
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{multido}
\usepackage[nomessages]{fp}
\def\LoadConstants{}
\newcommand\const[3][3]{%
\edef\temporary{round(#3}%
\expandafter\FPeval\csname#2\expandafter\endcsname
\expandafter{\temporary:#1)}%
\edef\LoadConstants{\LoadConstants
\noexpand\pstVerb{/#2 \csname#2\endcsname\space def}}%
}
\const[1]{G}{9.8}
\const[1]{Tfinal}{2.0}
\def\y(#1){-G/2*#1^2}
\const[1]{Yfinal}{\y(Tfinal)}
\SpecialCoor
\usepackage{siunitx}
\makeatletter
\def\FP@pow#1#2#3{%
% #1 macro, which gets the result
% #2 base
% #3 exponent
%
\FP@beginmessage{POW}%
%
{\def\FP@beginmessage##1{}%
\def\FP@endmessage##1{}%
%
\FPifzero{#2}%
\FP@pow@zero{#3}%
\else%
\FPln\FP@tmpd{#2}%
\FPmul\FP@tmpd\FP@tmpd{#3}%
\FPexp\FP@tmp\FP@tmpd%
\fi%
%
\global\let\FP@tmp\FP@tmp%
}%
%
\FP@endmessage{}%
%
\let#1\FP@tmp%
}
\makeatother
\begin{document}
\begin{pspicture}[showgrid=false](3.5,\Yfinal)%
\LoadConstants%
\psline(1.5,0)(!1.5 Yfinal)%
\multido{\n=0.0+0.5}{15}%
{%
\const[1]{Yt}{\y(\n)}%
\LoadConstants%This is needed to provide Yt in PostScript world.
\rput[r](*1.25 {\y(\n)}){$\SI{\Yt}{\meter}$}%
\psline(!1.4 Yt)(!1.6 Yt)%
\rput[l](*1.75 {\y(\n)}){$t=\SI{\n}{\second}$}%
\pscircle*(*3.5 {\y(\n)}){5pt}%
}%
\end{pspicture}%
\end{document}
Das ungeschützte Zeilenende befindet sich in Zeile 444 von fp-exp.sty
.