Почему моя строка смещается влево, когда я вызываю \LoadConstants?

Почему моя строка смещается влево, когда я вызываю \LoadConstants?

введите описание изображения здесь

В начале я использую следующий код. Пока все хорошо.

введите описание изображения здесь

\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}

Я передумал использовать Ytвместо \Ytдля следующего. Поскольку Ytэто мир PostScript, мне нужно снова вызвать дополнительный \LoadConstants(см. его в цикле).

введите описание изображения здесь

\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}

К сожалению, вертикальная линия смещается влево. Я пытался найти причину проблемы, но сдался. Вы видите, что я удалил все возможные пробелы, но проблема все еще существует.

Сможете ли вы найти источник проблемы? Это сложная головоломка!

Редактировать:

Я проверил значение Yt using \psPrintValueи они используют ,вместо .в качестве десятичного разделителя. Это нормально?

\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}

решение1

В файле есть незащищенный конец строки fp-exp.sty; добавьте его в преамбулу.

\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

введите описание изображения здесь

Вот полный код для двойной проверки. Есть много %того, что я бы не стал использовать, но я все равно их оставил.

\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}

Незащищенный конец строки находится на строке 444 fp-exp.sty.

Связанный контент