Journal Contre l'oubli du Troff des souvenirs.

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
34
18
juin
2011

Chers libristes, chers développeurs, chers utilisateurs,

Je fais actuellement face à une situation peut-être fréquente dans le monde du logiciel libre, mais qui n'en reste pas moins délicate à gérer, et j'aimerais recueillir vos avis expérimentés ainsi que vos conseils.

Je me suis épris d'un logiciel qui répond parfaitement à mes besoins: Heirloom Troff. Heirloom Troff est le digne descendant du vénérable Troff, dont l'arbre généalogique a été décrit dans une dépêche il y a quelques mois. Pour rappel, il s'agit d'un logiciel qui interprète le langage de formattage de texte Troff pour produire un fichier postscript ou texte brut. Il est fourni avec un ensemble d'outils qui permettent d'écrire proprement des formules mathématiques, de gérer les références bibliographiques, d'inclure des images, ou de tracer des tableaux. Bref, une sorte de mini Tex.

Justement, contrairement à ses cousins (groff, ou le troff de plan9), Heirloom Troff ne souffre pas de la comparaison avec PDFTex ! En effet, il avale l'utf-8 sans broncher, il évite les lézardes dans les paragraphes en calculant la taille des espaces paragraphe par paragraphe et non pas ligne par ligne, il peut jouer sur la taille des glyphes ou l'espace inter-lettres pour améliorer l'homogénéité de l'espace inter-mots, il permet de décaler légèrement certains glyphes hors des marges pour un alignement visuel parfait, et il manie les polices OpenType en toute simplicité... Bref, Heirloom Troff est à Troff ce que PDFTex est à Tex.

Malheureusement Heirloom Troff a deux défauts: il a un petit bug gênant, et il est semble être délaissé par son unique développeur. Le développeur en question a fait un travail magnifique, puisqu'il a sauvé Heirloom Troff de l'oubli en le récupérant des sources de Solaris lorsqu'elles ont été libérées. Il lui a ajouté toutes les fonctions typographiques et micro-typographiques. Et il a partagé ce beau travail.

J'ai envoyé il y a quelques mois un rapport de bug à ce développeur, bug qui concernait non pas Heirloom Troff lui-même, mais un fichier de macro fourni avec. Il m'a gentiment répondu qu'il n'avait pas le temps de s'en occuper, ce que je comprends. De fait, l'activité de la forge de Heirloom Troff est très molle depuis plusieurs années. J'ai donc approfondi la vague connaissance du langage Troff que j'avais alors, et bien m'en a pris, puisque j'ai pu corriger ce bug, et que je crois maintenant maîtriser ce langage. Je lui envoie donc le patch, mais je n'ai pas reçu de réponse en retour.

Je m'aperçois il y a quelques semaines que ce bug en cachait un autre, qui touche cette fois-ci Heirloom Troff lui-même. J'en informe donc le développeur, et j'en profite pour lui renvoyer le patch qu'il avait ignoré quelques mois auparavant. Et je ne reçois toujours pas de réponse. Et là, si je veux corriger le bug moi-même, c'est tout le langage C qu'il me faut apprendre...

Que faire donc ?
- Je pourrais ne pas avoir besoin des fonctions avancées de Heirloom Troff, ou utiliser Tex, ou apprendre le C.
- Je pourrais insister auprès du développeur de Heirloom Troff, mais il me semble que son message est sybillin: il a d'autres préoccupations.
- Je pourrais écrire sur la liste de discussion de Groff, lieu de rendez-vous de tous les amis de la famille Troff, pour leur expliquer la situation et accessoirement faire appel aux bonnes volontés. Cela me semble néanmoins provocateur car le développeur de Heirloom Troff suit de loin cette liste, et les développeurs de Groff pourraient préférer que les efforts de développement se concentrent sur Groff.
- Je pourrais faire appel a une personne ayant occasionnellement proposé un patch à Heirloom Troff (il doit y en avoir deux au monde).
- Je pourrais proposer une rémunération en échange de la correction du bug, mais je ne pourrai vraisemblablement pas payer les heures de travail effectives...
- Je pourrais essayer de lancer un fork : un site, une forge, des outils de développement collaboratif, de la documentation, et faire appel aux bonnes volontés.

Et vous, chers libristes, développeurs et utilisateurs, que feriez-vous, que me conseillez-vous de faire ?

  • # Pistes

    Posté par  . Évalué à 2.

    Si la liste de diffusion n'est pas morte, la première chose est de parler de ton patch dessus (sans dire que tu l'as déjà proposé). Si des gens sont intéressés proposent leur de le tester avec un lien pour qu'il le récupère. Puis commence à parler du bug en question et regardes si des gens sont prêt à mettre la main à la pâte.

    • [^] # Re: Pistes

      Posté par  (site web personnel) . Évalué à 2.

      Il n'y a pas de liste de discussion réservée à Heirloom troff. C'eut été trop simple. :-(

  • # Question bête....

    Posté par  . Évalué à 3.

    C'est quoi le bug ?

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

      Posté par  (site web personnel) . É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.

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

        Posté par  . Évalué à 10.

        Tout à coup, je trouve LaTeX moins compliqué qu’avant...

        Une façon plus abordable de corriger le bug : si le programme ne fait pas ce qui est indiqué dans le manuel, il suffit de modifier le manuel pour qu’il indique ce que fait le programme. ;-)

        « Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone

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

          Posté par  (site web personnel) . Évalué à 2.

          Sacré troll...

          S'il fallait comparer, ce ne serait ni avec LaTeX, ni même avec Plain-Tex, mais avec le langage Tex.

          Et justement, à partir de rien, créer une macro troff, qui fasse tout ce qu'il faut (mise en page, notes, index, sommaire, table des matières, etc.) n'est pas si difficile. Je crois sincèrement que c'est plus simple que Tex.

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

        Posté par  . Évalué à 3.

        Ça va pas être simple, un petit exemple pour les nostalgiques :

        t2:
        		tbreak();
        		if (nc || wch)
        			goto rtn;
        		un += spcnt * sps + k;
        		spcnt = 0;
        		setnel();
        		if (trap)
        			goto rtn;
        		if (nlflg)
        			goto t1;
        	}
        t3:
        	if (spread && !brpnl)
        		goto t5;
        

        C'est une manière de coder qui me rappelle le BASIC, mais c'était il y a 25 ans....

        Le saut culturel est grand pour un programmeur d'aujourd'hui.

        Si tu as un document qui montre le bug, je regarderais, j'ai moi même beaucoup d'affection pour PIC, présent aussi dans heirloom-doctools, mais je doute fortement de pouvoir être utile en un temps fini.

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

          Posté par  (site web personnel) . Évalué à 2.

          Oui, j'ai un exemple qui montre le bug, soit le fichier file suivant:

          .do xflag 3
          .\" ajustement par paragraphe:
          .padj
          .\" bas de page dès la deuxième ligne de la page:
          .wh 2v pagetrap
          .de pagetrap
          .bp
          ..
          .\" afficher les variables dans le terminal.
          .de linetrap0
          .tm situé page \\n%, ligne \\n(nl
          ..
          .de linetrap1
          .tm 1
          ..
          .de linetrap2
          .tm 2
          ..
          .de linetrap3
          .tm devrait être p 1, ligne 24000, mais est  page \\n%, ligne \\n(nl
          ..
          .\" c'est parti:
          Trap0\P[linetrap0], trap1\P[linetrap1], trap2\P[linetrap2].
          .br
          Trap3\P[linetrap3],
          .br
          Trap0\P[linetrap0].
          

          troff -z file devrait suffire, car la sortie du terminal est explicite.
          Sinon, faire troff file | dpost > file.ps

          Veux-tu que j'explique plus précisément l'exemple? As tu besoin d'autres informations? Je suis, de toute évidence, à ta disposition, même si tu ne peux que jeter un rapide coup d'œil au problème.

          P.S.: Elle vient d'où cette affection pour pic?

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

            Posté par  . Évalué à 3.

            Bon, ben ça va pas être jouable, au moins pas par moi. Le code est vraiment compliqué par rapport au temps que j'ai à y consacrer. De plus, je suis un peu gêné par la CDDL, surtout par le fait que visiblement le .ps que je produis avec les doctools est soumis à cette licence.

            Pour PIC, je l'ai découvert grâce à notre maître à tous (encore un) W. Richard Stevens, qui s'en est servi pour les figures de ses livres, puis utilisé pour la documentation d'un projet il y a longtemps, et je l'ai trouvé bien pratique, surtout dans le cas où on versionne la doc avec le code. Aucun autre format ne permet de suivre les changements faits à une figure avec un cvs diff.

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

              Posté par  (site web personnel) . Évalué à 3.

              Merci d'avoir essayé!

              Je crois en effet que ce n'est pas une petite affaire de toucher à ce code. C'est triste que ce logiciel si vieux et efficace à sa manière soit abandonné...

              Je vais essayer de contacter les rares personnes ayant d'ores et déjà proposé des patchs, on ne sait jamais.

              Si la CDDL est incluse dans le postscript, ce n'est pas le fait d'une clause de cette licence, mais est à mon avis simplement lié au fait que certaines macro troff (et vraisemblablement aussi dpost) fonctionnent en produisant des macros postscript. Ces macros sont sous licence, la licence doit donc les accompagner. De la même manière, tu peux te créer une macro troff qui ajoute dans le fichier postscript la licence adaptée à ton contenu.

              Pour ce que j'ai rapidement lu de la CDDL, elle ne me semble ni pire ni meilleure que les autres licence libres: moins permissive que BSD, mais plus libérale que GPL.

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

          Posté par  (site web personnel, Mastodon) . Évalué à 3.

          C'est une manière de coder qui me rappelle le BASIC, mais c'était il y a 25 ans....

          Ça ressemble surtout furieusement à une sortie de Lex/Yacc !

  • # Alors...

    Posté par  . Évalué à 1.

    Alors, mon voisin de bureau, quand il vient me voir avec une question de cet acabit, je lui réponds « Oh la la ! T’es foutu, il ne te reste plus qu’à te jeter par la fenêtre de ton bureau ! ».

    En même temps, ça concerne le boulot pour lequel il est payé, il a moins d’excuses pour ne pas être compétent...

    Bon, et puis on est au rez-de-chaussée.

    Sinon, si tu es très motivé, le plan, c’est :
    – apprendre le C (voire la programmation),
    – comprendre le code de Heirloom Troff,
    – corriger le bug,
    – faire un patch,
    – proposer au développeur s’il n’a plus le temps de maintenir Heirloom Troff, de reprendre la maintenance à sa place.

    Bon courage !

    « Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone

    • [^] # Re: Alors...

      Posté par  . Évalué à 9.

      Tu bosses chez France Telecom ?

      • [^] # Re: Alors...

        Posté par  . Évalué à 1.

        Même pas, je travaille juste avec un boulet (il faut dire qu’il s’est retrouvé accidentellement sur un poste qui ne lui correspond pas du tout).

        Alors quand il me pose une question qui amène une réponse de deux minutes, c’est une chose, mais quand la seule réponse serait trois semaines de boulot...

        « Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone

        • [^] # Re: Alors...

          Posté par  . Évalué à 2.

          Je faisais juste allusion à :
          Alors, mon voisin de bureau, quand il vient me voir avec une question de cet acabit, je lui réponds « Oh la la ! T’es foutu, il ne te reste plus qu’à te jeter par la fenêtre de ton bureau ! ».

  • # Hallucination

    Posté par  (site web personnel) . Évalué à 2.

    C'est là que je me rends compte que la lettre f est vraiment très proche de la lettre l.

    Commentaire sous licence LPRAB - http://sam.zoy.org/lprab/

  • # Miracle!

    Posté par  (site web personnel) . Évalué à 10.

    Mille miracles !
    Mille milliard de miracles !
    &$#* !

    Le développeur m'a répondu!
    Il a corrigé le bug!
    Vive les journaux de linuxfr!
    Longue vie à Heirloom Troff et à Gunnar Ritter!

    Le changelog est ici, le fichier corrigé est ici, et voici un diff pour les curieux :

    36c36
    <  * Sccsid @(#)n7.c	1.180 (gritter) 8/7/10
    ---
    >  * Sccsid @(#)n7.c	1.181 (gritter) 6/19/11
    721,727d720
    < 	if (nolt && dip == d) {
    < 		for (i = 0; i < nolt; i++)
    < 			trap |= control(olt[i], 0);
    < 		nolt = 0;
    < 		free(olt);
    < 		olt = NULL;
    < 	}
    744a738,744
    > 	}
    > 	if (nolt && dip == d) {
    > 		for (i = nolt - 1; i >= 0; i--)
    > 			trap |= control(olt[i], 0);
    > 		nolt = 0;
    > 		free(olt);
    > 		olt = NULL;
    

    Priez sur dlfp, vous serez exaucé.

  • # sybillin

    Posté par  . Évalué à 3.

    Tu pensais qu'en inversant le i et le y ça inversait aussi le sens ? Sibyllin signifie "mystérieux, obscur, dont le sens est difficile à comprendre."

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.