OK, I'll put up a few of the basic steps, and not in a lot of detail. You smart guys can figure it out form here. This is for port matching, not gasket matching.
First I have to put the heads on a block...I have to know the customer's deck height to do this right. I mark the left and right sides of the ports, and the bottom and top. I also make a reference mark on the head near one of the bolt holes.
Next I set the intake on the engine (both heads installed) and I use an intake gasket as a spacer only to get the intake in the right orientation to the heads. I have used just pieces of a gasket on the four corners. Same difference. With a flashlight, I look into the ports and orient the intake on the heads as good as possible. Then I transfer two critical lines; bottom of the ports, and the vertical reference line.
From there, those two critical lines get transferred to the face of the intake flange and from there, I use a machinist scale to make measurements and transfer the dimensions from the head to the intake. This establishes the port "layout".
In the case above I used a gasket to make the port shapes, lining up the openings with my bottom/left/right scribe marks. Here I'm using AFR's smaller gasket for a set of 357's. The gasket is identical to the port opening. Normally I can't use a gasket since they're typically bigger than the port. When that's the case, I scribe the sides of the ports, and the tops and bottoms, and I use a circle template to draw in the corner radii.
This is Dal's intake:
Gaskets can be terribly inaccurate and inconsistent even from one port to the other. This way I have an exact (within .010") reproduction of the ports just as they are on the head, transferred directly to the intake. Also, using the gasket to match the intake and head usually means making them both fit the gasket and I very seldom, if ever, want to make the port opening in the head any bigger, at least on big blocks. Sometimes an as-cast head -especially a small block- needs a little "squaring up" and in some cases enlarging, but this method works no matter what you do.