• [^] # Re: Question bête....

    Posté par (site web personnel) . En réponse au journal Contre l'oubli du Troff des souvenirs.. Évalué à 3.

    Le manuel indique ceci:

    Une ligne peut contenir plusieurs trappes d'impression de ligne, elles sont invoquées dans l'ordre où elles apparaissent. Si une trappe de page est effective au même endroit, elles est invoquée immédiatement après les trappes d'impression de ligne.

    Or, dans les faits les trappes d'impression de ligne sont invoquées dans l'ordre inverse où elles apparaissent, et les trappes de pages sont invoquées avant les trappes d'impression de ligne apparaissant au même endroit.

    Concrètement, c'est un peu plus compliqué à expliquer pour qui ne connaît pas le logiciel, mais voici:
    - Pour des raisons typographiques, les paragraphes sont construits paragraphes par paragraphes, et non pas lignes par lignes (selon une variante de l'algorythme de Knuth-Plass), puis imprimés ligne après ligne.
    - Toutes les macros sont exécutées lors de la construction du paragraphe, et non pas lors de son impression.
    - De ce fait, lors de l'exécution des macros, la position finale d'un mot n'est pas connue avec précision: il peut se retrouver sur la page suivante. Ceci est par exemple gênant pour placer les notes de bas de page sur la bonne page.
    - Pour résoudre ce problème, une «trappe d'impression de ligne» est proposée: \P[macro] exécute macro lors de l'impression de la ligne. L'utilisation de cette trappe permet de placer les notes de bas de page au bon endroit.
    - Mais la trappe est exécutée après que la ligne la contenant soit imprimée, soit au début de la ligne suivante.
    - Si la ligne suivante contient une «trappe de position», une trappe exécutée lorsque le texte atteint un certain point sur la page, celle-ci est exécutée avant la trappe d'impression de ligne.
    - Comme les marges de bas de page sont construites via une trappe de position, les potentielles trappes d'impressions de la dernière ligne de la page ne sont exécutées qu'après le bas de page, soit sur la page suivante.
    - Concrètement, une note de bas de page appelée sur la dernière ligne d'une page ne sera affichée que sur la page suivante.

    Il est possible de contourner ce bug en récoltant les trappes de lignes exécutées sur la page suivant leur apparition dans un fichier, et en lisant ce fichier lors d'une seconde passe du logiciel pour afficher les notes sur la bonne page. Amha, c'est monstrueusement laid comme solution.