Got it! It took a while for my brain to sharpen up a little bit, but it's making sense. Mostly.
> Multiple pre-processing passes are required... to locate any PDF reference > marks That got me wondering. I use a two-pass scheme to get cross-refs right; the very first time it gets run it might need to be re-run just because it was starting out with blank xref strings. But I rarely if ever see any pagination issues otherwise. Since I already capture heading strings and pages, I replaced the "format interpreter" with one that merely defines PDFHREF.TEXT and PDFHREF.DESC to its arguments and use the text I already have to set the link text. The biggest change I had to make in my processing was to remove the -z option from groff on the first pass and route the output to /dev/null -- without this change, the \O2 output was suppressed as well. This adds some processing time, but it's still a lot faster than FrameMaker. ;-) So the generation process is fairly straightforward: 1) First groff pass: build the "aux" file, containing ToC, Index, cross-refs, and (now) pdfhref information. 2) Extract the various data from the aux file using scripts. 3) Second groff pass: insert the extracted data and create the PS file. 4) ps2pdf to build a PDF with bookmarks and now links! Just wondering about the "multiple passes" thing and if it's going to bite me later. Thanks much for your help, Keith. If I get a chance, I'll try to flesh out some of the pdfmark documentation for you. -- Larry