I'm open to correction, but unfortunately, the formulae in your (I'm jealous,) book are expressed in the wrong domain for a renderer like Cycles. They're parametric surfaces.
That is to say, in the book, a surface is expressed as a function of parameters
j in certain ranges. Given
j, a point on the surface (X,Y,Z) is generated.
Cycles starts from the other end. It says: "Hey, I've been given this point P in XYZ space, and told it's interesting. What are its properties? Where should I fire a few more rays?" It will have been told to look at that point because it's an intersection of a ray with a triangle, a set step through a volume, or suchlike. Cycles can't iterate through
j, and generate points in 3D space. You get what you're given.
That's not to say you can't make volumetric pasta. Most pasta is pressed through a die - in those cases, all you have to do is work out how to make a 2D mask in XY that's the shape of the pasta's profile, saying 'Yes' if the point you're given is inside the mask, and 'No' if it's outside.
In the case of your cylindrical Penne, that's just asking if the shading-point is close enough to a given radius in XY with a Compare node, and also that the absolute value of Z is less than where you want to chop it off top and bottom:
All these masks are used to drive the density of Volume shaders thus:
So here's your Penne:
.. but that wouldn't hold much sauce, so you can play with the profile:
.. and cut the ends off with a slant:
.. for Penne Rigate:
Or you can make, say, a cross-shaped mask around the X and Y axes, before rotating the whole space around the Z axis, by the Z height, to get Fusilli:
etc. etc. A great idea for Nodevember.