Your observation is right. This is how groff is designed to do.
The x-axis for input is on the first usable line for the output medium and that is one text baseline below the upper border of the physical output medium (paper, screen). Meaning: y coordinate for the this (first) baseline is one vee (1v) (vee: name of the letter v V). See with (using the -Z option for groff shows the vertical (V) coordinate of the baseline) .sp |0c Text If .sp |<page length> Text the "Text" is put below the bottom border by 1v. So .sp |(<page length>-1v) Text puts the text on the bottom border. To get the same distance of the text baseline at the bottom as at the upper border move the line 1v up or .sp |(<page length>-1v-1v) N.B. The "top of a page" is not the same as the "top of a paper (screen)" Macro packages have header and footer macros. Get the "Troff User's Manual (CSTR #54)" from "https://troff.org/54.pdf". The "|" is explained in paragraph 1.3.
