I am trying to learn more about macros and expansion rules in LaTeX, by writing some nested macros to do various math operations.
Here is a small code snippet:
Code: Select all
\documentclass{article}
\usepackage{xfp}
\def\getx(#1,#2,#3){#1}
\def\gety(#1,#2,#3){#2}
\def\getz(#1,#2,#3){#3}
% Vector operations
\def\vsub(#1)(#2){(\fpeval{\getx(#1)-\getx(#2)},\fpeval{\gety(#1)-\gety(#2)},\fpeval{\getz(#1)-\getz(#2)})}
\def\vdot(#1)(#2){\fpeval{\getx(#1)*\getx(#2)+\gety(#1)*\gety(#2)+\getz(#1)*\getz(#2)}}
% #1 = ray origin (point), #2 = ray dir (vect), #3 = sphere center (point), #4 = radius
\def\hitspherediscriminant(#1)(#2)(#3)#4{%
\edef\v{\fpeval{\vsub(#1)(#3)}}%
\edef\a{\fpeval{\vdot(#2)(#2)}}%
\edef\b{\fpeval{2.0 * \expandafter\vdot\v(#2)}}%
\edef\c{\fpeval{\vdot(#1)(#1) - #4*#4}}%
\edef\discriminant{\fpeval{\b*\b - 4.0*\a*\c}}%
\discriminant
}
\begin{document}
% Works fine
\def\res{\hitspherediscriminant(0,0,0)(1,0.5,0)(0,0.5,0)2}%
\res \\
% PROBLEM HERE during expansion
%\edef\res{\hitspherediscriminant(0,0,0)(1,0.5,0)(0,0.5,0)2}%
%\res \\
\end{document}
Code: Select all
! Undefined control sequence.
\GenericError ...
#4 \errhelp \@err@ ...
l.26 ...herediscriminant(0,0,0)(1,0.5,0)(0,0.5,0)2
Thanks in advance for any tips around macros, and debugging them.
