
次のコードに示すように、マクロ出力を渡すにはどうすればよいでしょうか\X{Tpeak}
?\FPeval\Ypeak
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pstricks-add}
\usepackage[nomessages]{fp}
\newcommand\const[3][3]{%
\expandafter\FPeval\csname#2\endcsname{round(#3:#1)}%
\pstVerb{/#2 \csname#2\endcsname\space def}%
}
\const{Vinit}{10}
\const{Theta}{75/180*pi}
\const{Gravity}{10}
\def\X#1{Vinit*cos(Theta)*#1}
\def\Y#1{Vinit*sin(Theta)*#1-Gravity*pow(2,#1)/2}
\const{Tpeak}{Vinit*sin(Theta)/Gravity}
\const{Ypeak}{\X{Tpeak}}
\const{Xpeak}{pow(2,Vinit)*sin(2*Theta)/(2*Gravity)}
\begin{document}
\begin{pspicture}[showgrid=bottom](2\dimexpr\Xpeak\psxunit\relax,\Ypeak)
\end{pspicture}
\end{document}
答え1
式は\X{Tpeak}
、 に渡す前に、まず展開される必要があります\const
。
\edef\next{%
\noexpand\const{Ypeak}{\X{Tpeak}}%
}\next
最初は\X
完全に展開されていますが、\const
のためではありません\noexpand
。 次に\next
以下が含まれます。
\const {Ypeak}{Vinit*cos(Theta)*Tpeak}
マクロ\next
は一時的にのみ使用されます。したがって、典型的なパターンはこれをグループに入れることです。
\begingroup
\edef\next{\endgroup
\noexpand\const{Ypeak}{\X{Tpeak}}%
}\next
その後、以前に定義されたもの\next
は変更されず、\const
グループ外でも呼び出されます。