• [^] # Re: troff

    Posté par (site web personnel) . En réponse au journal Exemple d'interface en ligne de commande. Évalué à 4.

    Voilà celle de plain TeX avec mes annotations et une petite simplification:

    % Notre OTR est plainoutput
    \output{\plainoutput}
    % La commande cruciale est ici shipout qui écrit
    % une page (une vbox) dans le fichier de sortie
    \def\plainoutput{%
     \shipout\vbox{%
     \makeheadline % On prépare le haut,
     \pagebody % le corps,
     \makefootline % et le pied
     }%
     \advancepageno % Màj compteur de page
    }
    % Préparation du corps de la page,
    % approche érotique de pagecontents
    \def\pagebody{%
     \vbox to\vsize{%
     \boxmaxdepth\maxdepth
     \pagecontents
     }
    }
    % Prépration du haut de page,
    % \z@ est un autre nom de zéro
    \def\makeheadline{%
     \vbox to\z@{%
     \vskip-22.5\p@ % Recule de 22.5 pt dans le blanc de page
     \line{%
     \vbox to8.5\p@{}% Calibre de 8,5 pt de haut
     \the\headline % La headline (enfin)!
     }%
     \vss % Padding
     }\nointerlineskip % Pas d'extra-interligne*
    }
    % Préparation du pied de page,
    % je zappe un peu les détails
    \def\makefootline{%
     \baselineskip24\p@
     \lineskiplimit\z@
     \line{\the\footline}%
    }
    % Alors voilà,
    % c'est finalement cette routine la plus importante,
    % elle prépare le contenu de la page
    \def\pagecontents{%
     % Ici \topins est une boîte verticale contenant
     % les inserts à placer au haut de la page
     % comme une table ou une image p.ex.
     %
     % Si cette boîte n'est pas vide,
     % on copie son contenu
     \ifvoid\topins\else
     \unvbox\topins
     \fi
     % Mainentant on ajoute le contenu
     % de la main vertical list
     % \dimen@=\dimen0 (registre de dimension 0)
     % \@cclv = \box255 (registre de boîte 255)
     \dimen@=\dp\@cclv
     \unvbox\@cclv
     % Enfin, on regarde si on a des notes de bas
     % de page, un peu pareil que pour topins
     % mais on décore avec une footnoterule.
     \ifvoid\footins\else % footnote info is present
     \vskip\skip\footins
     \footnoterule
     \unvbox\footins
     \fi
     % Si un certain paramètre est actif,
     % on tasse tout notre beau monde vers le haut…
     \ifr@ggedbottom \kern-\dimen@ \vfil \fi
    }
    % Et voilà la footnoterule
    \def\footnoterule{%
     \kern-3\p@
     \hrule width 2truein \kern 2.6\p@
    }
    
    

    *: Dans l'empilement habituel des boîtes verticales il y a un extra-interligne (les cas typique est celui des lignes d'un paragraphe).