Journal Exemple d'interface en ligne de commande

Posté par (page perso) . Licence CC by-sa
Tags :
49
27
août
2012

Sommaire

Bonjour à tous,

Comme vous le savez peut-être, j'apprécie l'ergonomie de la ligne de commande, en particulier parce qu'elle me permet de travailler dans mon élément : le texte.

Manipuler des textes, c'est ce que je fais à longueur de journée : lire, indexer, citer, écrire… Avec le temps, je me suis créé plusieurs outils pour me faciliter la tâche, et ce journal a pour but de vous présenter l'ergonomie de certains de ces outils, avant que ne vienne le jour de leur publication.

Indexation de livres

Indexation de livres papiers

La chose qu'on indexe, c'est le livre. Comme le livre est rarement numérique, son indexation se fait à la main – travail de lettré, comme au bon vieux temps. En outre, une entrée d'index ne correspond pas forcément à un mot du texte : le sous entendu est fréquent, des tournures complexes se résument parfois en un mot, etc. De fait, un travail d'indexation ne peut éviter la lecture et la prise de note.

La méthode la moins efficace consiste à ajouter le numéro de page à une liste de mots : on passe plus de temps à chercher le mot qu'à noter la page. Mieux vaut indiquer, pour chaque page, la liste des mots qui la compose, par exemple ainsi :

256: différance, ontologie, apparoir, donation
257: différance, Derrida, donation
258: donation, ontologie, manifestation

Cependant, comme ce n'est pas cette organisation qu'on attend d'un index, un petit script awk, nommé idx, permettra de transformer ces données pour obtenir un liste triée de mots :

apparoir: 256
différance: 256-257
donation: 256-258
manifestation: 258
ontologie: 256, 258

Une fois formaté, l'index doit être vérifié, et corrigé. Du coup, il faut le reformater. Il nous faut aussi pouvoir exporter l'index dans un format imprimable, ou obtenir une liste de pages à partir d'une liste de mots. Ainsi, idx accepte plusieurs options :

idx -w  # liste de pages vers liste de mots
idx -p  # liste de mots vers liste de pages
idx -r  # reformate une liste de mots
idx -t  # liste de mots vers un format imprimable (troff) 

Le format d'index est si simple qu'il se consulte avec grep. Dans le répertoire de l'auteur, on créé un index par ouvrage, et grep différance * permet de retrouver les pages où notre auteur discute de la non origine à l'origine de l'origine.

Indexation de documents numérique

idx peut être utilisé pour indexer un document numérique. Avec troff, on utilisera par exemple la macro ix, qui indexe un mot, et la macro index qui imprime l'index en utilisant idx pour le formater – macros que l'on peut résumer ainsi :

.\" macro ix:
.de ix
.   \" enregistre, dans la macro record,
.   \" le premier argument et le numéro de page.
.   am record
\\$1: \\n%
\\..
..
.
.\" macro index:
.de index
.   \" écrit le contenu de record dans un fichier temporaire.
.   open myindex /tmp/myindex
.   writem record
.   close myindex
.   \" formatte ce fichier avec idx
.   \" et ajoute cela au flux du texte
.   pso idx -t /tmp/myindex
..
.
.\" contenu du document:
lorem ipsum
.ix lorem
.index

Si notre troff est groff, on lui passera l'option -U (unsafe) pour activer les macros open, writem et pso. Si notre troff est heirloom troff, on lui passera l'option -x3 pour activer les macros de plus de deux lettres.

Collection de citations

Une base de données

La gestion des citations ne consiste pas seulement à insérer des références bibliographiques dans un document. Il faut aussi manipuler les citations elles-mêmes. Imaginez que notre auteur discute à cent reprises, dans dix ouvrages différents, de la diffférance derridienne. Il faut avoir ces passages sous les yeux pour les lire, les relire, les méditer et les comparer, tout en construisant son raisonnement référencé. On pourra décider d'ouvrir et de fermer les livres à n'en plus finir. On pourra préférer remplacer une des lectures par la numérisation du document.

Une petite base de donnée (sqlite) fait bien l'affaire pour stocker tout ça. Elle n'a que trois tables et une vue qui les coordonne : livres, textes et chapitres (books, texts, heads). La table des chapitres est indispensable, car la norme iso-690 (que nous devons suivre lorsque nous insérons nos références bibliographiques) nous indique qu'il faut indiquer, outre la page, le chapitre d'où la citation est extraite. C'est du reste nécessaire pour retrouver une citation dans une autre édition que celle de l'auteur.

Dans la table texts sont stockés les textes, leur numéro de page, un titre pour le texte, et un lien vers l'entrée de chapitre correspondante. Dans la table heads sont indiqués le titre du chapitre, la page où ce titre apparaît, et un lien vers le livre correspondant. Dans la table books sont indiquées les informations éditoriales. C'est simple et stupide mais ça convient à tous les cas que j'ai rencontrés. Ainsi, un article cité dans un livre prend une entrée de la table books à lui tout seul, même si le livre qui le contient est déjà référencé dans la même table – c'est redondant, mais ça évite bien des complications dans la gestion de la base de donnée.

Les champs sont constitués de deux lettres : la première définit la table, la seconde le champ. Ainsi ba est le champ auteur dans la table books, tp le champ numéro de page dans la table texts, hh le champ chapitre dans la table heads. Exception aux deux lettres, l'id unique de chaque champ est noté en une lettre, qui correspond au nom de la table: b, t, h v (v dans la vue = t dans la table texts ) – simplement parce que bi est déjà pris (c'est le champ de l'éditeur (issuer)). Dans la table texts, l'id du chapitre correspondant est noté th, et dans la table heads, l'id du livre correspondant est noté tb.

Gestion des citations

Un logiciel, nommé sophia, sert d'interface pour travailler sur la base de donnée. Son interface est assez simple : le premier argument est une commande, il est suivi d'une liste de champs, eux même suivis du contenu dudit champ. Les commandes de base sont : search, print, insert, update :

sophia insert -ba Derrida -bt "De la grammatologie"
sophia print -b 1
sophia search -ba Derrida
sophia update -b 1 -ba "Derrida, Jacques"
sophia insert -hb 1 -hh "Chapitre premier" -hp 25
sophia insert -hb 2 -hh "Chapitre second" -hp 75

En outre, la commande edit indique à sophia d'ouvrir notre éditeur préféré pour insérer confortablement les données.

Maintenant, pour insérer un texte, il faut connaître l'id du chapitre dans lequel il s'insère. C'est fastidieux de chercher cela dans le livre pour chaque texte enregistré. Mieux vaut entrer toute la table des matières d'un coup dans la base de donnée, et utiliser ensuite une commande appropriée, qui renvoie, pour un ouvrage et une page donnés, l'id du chapitre correspondant.

sophia head -hb 1 -tp 76 -tt "Mon texte"
# retourne une ligne de commande
# contenant l'id du chapitre correspondant
# pour compléter le champ th:
sophia insert -th 2 -tp 76 -tt "Mon texte"

Si on fait confiance à sophia, on peut insérer directement les données au bon endroit :

$(sophia head -hb 1 -tp 27 -tt "Mon texte")

On peut aussi utiliser un script pour d'abord vérifier que cette page n'a pas déjà été introduite dans la base :

#!/bin/sh
if [ ! $(sophia search $*) ]; then
    $(sophia head $*)
fi

Enfin, pour lire confortablement les textes insérés, on peut formater les textes avant des les afficher. La commande troff permet d'afficher le contenu de la base dans un format compréhensible par troff. Avec un peu de plomberie, on arrive à un beau résultat :

# on pioche dans la vue pour afficher toutes les données
sophia troff -v 34 | nroff -ms | less
sophia troff -v 12 | groff -ms | ps2pdf - texte.pdf

Pour un résultat optimal, le texte inséré dans la base de donnée doit être lui-aussi mis en forme. sophia n'impose aucun format, l'utilisateur pourra utiliser text2tags ou latex, pour peu que sophia ait un filtre adapté – chose qui n'est pas difficile à coder.

Références bibliographiques

La base de donnée de sophia peut être utilisée pour insérer les références bibliographiques dans le texte qu'on écrit. Il faut alors insérer des marques dans le texte : @ id, où id est l'id du texte qu'on cite. Un logiciel, nommé philia, remplace ces marques par les références correctement formatées pour troff. On imprime son papier ainsi :

philia paper.tr | troff -ms | lpr
philia paper.tr | nroff -mail | mailx someone@example.com
philia paper.tr | nroff -mxml | xsltproc syle.xsl - > paper.html
wput paper.html ftp://example.com

Sauvegarde des modifications

Enfin, un texte est un fichier qui évolue beaucoup, et dont on souhaite généralement conserver les états précédents. Les logiciels de contrôle de révisions sont connus ici, mais ceux qui sont connus sont très orientés développement. Pour un usage local, on peut préférer des outils moins connus, tels rcs, dont il existe deux versions: gnu rcs (gpl), et openrcs (bsd). Il permet d'archiver les évolutions d'un fichier dans le répertoire même du fichier (ou dans le sous-répertoire RCS s'il existe). En voici les commandes les plus fréquentes:

ci paper.tr
rlog paper.tr
rcsdiff paper.tr
co paper.tr

C'est un outil précieux lorsqu'on manipule beaucoup de textes. Il justifie à lui-seul l'utilisation d'un format texte brut pour écrire du texte.

Conclusion

La ligne de commande ne sert pas qu'à administrer son système d'exploitation. Elle est aussi utile pour créer et manipuler des textes. Parce qu'elle a le langage pour interface, son ergonomie est adaptée au travail du texte. En outre, parce qu'elle extensible, elle permet à l'utilisateur avancé, pour un effort raisonnable, de créer des outils à la mesure de ses besoins.

Et vous, que pensez-vous de l'ergonomie des outils présentés ici ? Y voyez-vous des erreurs grossières ou des améliorations possibles ?

  • # papa, tu fais quoi au travail ?

    Posté par . Évalué à  3 .

    Manipuler des textes, c'est ce que je fais à longueur de journée : lire, indexer, citer, écrire…

    Forcément ça attire la curiosité.

    • [^] # Re: papa, tu fais quoi au travail ?

      Posté par . Évalué à  10 . Dernière modification : le 28/08/12 à 00:15

      C'est le bot de http://books.google.fr ;)

      En tout cas, c'est très intéressant de voir le raisonnement depuis le données brutes jusqu'à la finalité dans un domaine aussi pointu qu'est l'indexation des données textes "humaines", avec toutes leurs variabilités, différences si loin des données produites par des machines.
      N'importe quel développeur qui a été confronté au stockage et la restitution pertinente de données textuelles à toute de suite aperçu l'ampleur de la tache.
      Bravo pour avoir réalisé un tel "pipeline" avec des outils de ligne de commandes. Cela m'encourage à persister dans l'approfondissement de mes connaissance en sed, grep et autre awk.

      J'ai une petite question : comment ce fait le choix des mots pour peupler l'index, y-a-t-il des listes prédéfinies, automatisées (pour les mots les plus communs et dans le cas des livres numériques) et/ou cela dépend-t-il que du lecteur ("le travail de lettré") ?

      Sinon, +1 pour la question de stopspam, je suis curieux moi aussi

      • [^] # Re: papa, tu fais quoi au travail ?

        Posté par (page perso) . Évalué à  2 .

        comment ce fait le choix des mots pour peupler l'index ?

        À mon avis, et même s'il existe un vocabulaire appartenant spécifique à chaque champ théorique, la liste des mots doit se déduire de l'ensemble de l'œuvre d'un auteur. Il a un vocabulaire qui évolue, et c'est ce vocabulaire qu'il faut indexer. Un mot peut paraître anodin dans un ouvrage, et être très fréquent dans d'autres, ce qui justifie l'indexation de l'occurrence anodine.

        Ce qui est compliqué, ce sont les mots qui reviennent tout le temps. Soit on indexe chaque occurrence, et finalement l'index perd de sa pertinence. Soit on n'indexe que les occurrences significatives (mais quelles sont-elles?), au risque de passer à côté de beaucoup de nuances

        • [^] # Re: papa, tu fais quoi au travail ?

          Posté par . Évalué à  3 . Dernière modification : le 28/08/12 à 22:39

          et ton boulot c'est vraiment bibliothéquaire, ou bien tu travailles dans une université ? Beau journal en tout cas.

          Le format texte vaincra !

          Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

          • [^] # Re: papa, tu fais quoi au travail ?

            Posté par (page perso) . Évalué à  5 .

            Ai la chance d'être employé pour ma thèse de doctorat. Mon domaine de recherche doit pouvoir se déduire du journal.

            • [^] # Re: papa, tu fais quoi au travail ?

              Posté par (page perso) . Évalué à  2 .

              J'étais à Paris X Nanterre il y a quelques années (enfin beaucoup quand même), et n'appréciant guère le verbiage de Jacques Derrida (faut dire que François Laruelle en pleine invention de la non-philosophie était un de mes profs), j'avais facétieusement remplacé la couverture d'un livre dans la vitrine des PUF par des boites de Debrida…
              J'ai un peu changé d'opinion depuis (grâces soient rendues à Emmanuel Lévinas et Nicolas Bancel).

              "La liberté est à l'homme ce que les ailes sont à l'oiseau" Jean-Pierre Rosnay

              • [^] # Re: papa, tu fais quoi au travail ?

                Posté par . Évalué à  3 .

                astuce : ne pas rechercher "Debrida" sur google images pour savoir ce que c'est…

                Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

              • [^] # Re: papa, tu fais quoi au travail ?

                Posté par (page perso) . Évalué à  2 .

                Je ne travaille pas directement sur l'œuvre de Derrida, et je ne connais de lui que ses premiers livres, majoritairement consacrées à la phénoménologie. C'est vrai qu'il ne faut pas ménager sa peine… Mais je trouve que c'est très cohérent – jusque dans la façon d'écrire justement.

                Quoi qu'on en pense, la «différance» a au moins pour elle de fournir le meilleur exemple de mot clef qui puisse être trouvé !

  • # Génial !

    Posté par . Évalué à  8 . Dernière modification : le 27/08/12 à 23:58

    j'adore ce journal ! :)

    Sinon faudrait que j'en fasse un quand j'ai le temps pour présenter les outils adhoc que mets en place pour la manipulation de texte.

    En tous cas Merci pour ton retour d'expérience

  • # troff

    Posté par . Évalué à  1 .

    Je suis toujours surpris de voir troff dont la syntaxe me rebute au plus au point alors que celle de Tex et à fortiori celle de Latex me semble plus agréable à utiliser. Je pense que si j'avais à faire ce genre de chose, soit je passerais par Latex soit j'utiliserais un markup langage pour ensuite convertir mon document soit en HTML soit en (la)tex puis pdf.

    Je suis dans ma tour d'ivoire (rien à foutre des autres, dites moi un truc pour moi), si je ne pose pas explicitement une question pour les 99%, les kévin, les Mm Michu alors c'est que je ne parle pas d'eux.

    • [^] # Re: troff

      Posté par (page perso) . Évalué à  5 .

      Ça me rappelle quelque chose ;-)

      Elle est très bien la syntaxe de troff: une commande, une ligne. Que demande le peuple?

      LaTex ne tient pas une seconde la comparaison avec troff quant à la maniabilité (manipulabilité, hackabilité, ou quelque autre nom que cela ait).

      Tex, peut-être, mais le pavé de Knuth m'a découragé – surtout qu'au moment où j'essayais de m'y mettre, je découvrais les soixante pages du manuel de troff… La flegme a été plus forte que tous les autres arguments.

      Il faut comprendre que troff c'est le shell du formattage de texte. De même qu'on apprend ce que signifient tar, ls, cd, pwd, et while, on apprend ce que signifient in (indent), sp (space), po (page offset), ll (line length), et on est vite productif.

      Quant aux syntaxes intermédiaires, je les utilisais avant de connaître troff. Et lorsque j'ai commencé à utiliser troff, je les ai abandonnées, car cela simplifie les flux.

      • [^] # Re: troff

        Posté par . Évalué à  2 .

        Ça me rappelle quelque chose ;-)

        N'ayant pas touché à troff depuis (mais ayant par contre continué à utiliser Latex), le manque d'évolution de mon point de vu est compréhensible.

        Elle est très bien la syntaxe de troff: une commande, une ligne. Que demande le peuple?

        Plusieurs commande par ligne ? Des noms de commandes compréhensibles ? Des balises ? ^

        LaTex ne tient pas une seconde la comparaison avec troff quant à la maniabilité (manipulabilité, hackabilité, ou quelque autre nom que cela ait).

        La dernière dépêche sur troff m'a donné envie d'y regarder de plus près (notamment la citation de Eric Raymond), mais je n'ai pas encore eu le temps ou le courage. Ça viendra.

        Tex, peut-être, mais le pavé de Knuth m'a découragé – surtout qu'au moment où j'essayais de m'y mettre, je découvrais les soixante pages du manuel de troff… La flegme a été plus forte que tous les autres arguments.

        Tex et Latex sont extrêmement complets, mais tu trouve une quantité incroyable de plus petites documentations sur le net (de différentes qualité). D'un point de vu utilisateur, tu as un wikibook qui est pas mal par exemple.

        Il faut comprendre que troff c'est le shell du formattage de texte. De même qu'on apprend ce que signifient tar, ls, cd, pwd, et while, on apprend ce que signifient in (indent), sp (space), po (page offset), ll (line length), et on est vite productif.

        Tu as un howto ou une doc que je puisse me mettre sous la dent pour que je crée un document vite fais, juste histoire de toucher à la syntaxe et à l'outillage pour produire un PS.

        Je suis dans ma tour d'ivoire (rien à foutre des autres, dites moi un truc pour moi), si je ne pose pas explicitement une question pour les 99%, les kévin, les Mm Michu alors c'est que je ne parle pas d'eux.

        • [^] # Re: troff

          Posté par (page perso) . Évalué à  4 .

          D'un point de vu utilisateur, tu as un wikibook qui est pas mal par exemple

          Je l'avais lu quand j'apprenais à utiliser Latex. Et tu as raison, distinguons l'utilisateur du créateur de macro pour discuter sérieusement.

          Point de vue utilisateur

          Latex est plus complet, mieux documenté, et par défaut le résultat est de meilleure qualité. Par contre, du point de vue utilisateur, je ne vois pas ce que la syntaxe de troff a de si abscons:

          .NH 1
          Le titre numéroté de niveau 1
          .NH 2
          Le titre numéroté de niveau 2
          .PP
          Un paragraphe
          .QP
          Une citation
          .FS
          Une note, entre FS et FE.
          .FE
          
          

          C'est la syntaxe de la macro ms, qui est un bon choix pour essayer troff et produire vite fait un postscript. Elle est documentée dans man groff_ms. On peut préférer la macro mom, plus complète, qui utilise des mots entiers comme mots clefs (je trouve cela trop verbeux).

          Pour mes macros, j'ai choisi de noter les titre sur une ligne:

          .H1 Le titre de niveau 1
          .H2 Le titre de niveau 2
          .H3 Le titre de niveau 3
          
          
          point de vue créateur de macro

          On compare maintenant paper.dtx avec s.tmac

          Je veux bien croire que la syntaxe de troff est absconse, mais j'avoue trouver que la syntaxe de Tex n'est guère plus lumineuse.

          Le texte de référence pour apprendre à programmer avec troff fait 70 pages, à comparer avec le TexBook.

          mon point de vue

          Maintenant que je connais troff, l'avantage est indéniable: je suis totalement autonome, je n'utilise que mes macros. Peut-être que je pourrais arriver au même résultat avec Tex, mais j'ai l'impression que cela aurait été plus long…

          Et toi, avec Tex, serais-tu capable de créer une macro (pour mettre en page un livre par exemple) de A à Z ?

          • [^] # Re: troff

            Posté par . Évalué à  2 .

            Point de vue utilisateur

            Groff :

            .NH 1
            Le titre numéroté de niveau 1
            .NH 2'
            Le titre numéroté de niveau 2
            .PP
            Un paragraphe
            .QP
            Une citation
            .FS
            Une note, entre FS et FE.
            .FE
            
            

            et à comparer avec la version Latex :

            \section{Le titre numéroté de niveau 1}
            \subsection{Le titre numéroté de niveau 2}
            Un paragraphe
            \quote{Une citation}
            % La note je sais pas ce que c'est :) Une note, entre FS et FE.
            
            

            Il me semble que le second est plus lisible (je n'aurais pas eu besoin de dire que c'est des titres par exemple pour qu'on sache que c'en est). Par contre avec latex viens l'entête (celle qui défini la classe, l'encodage, la taille des marges etc) qui n'est pas simple. D'ailleurs comme on défini les marges en roff ?

            Point de vue créateur de macro

            Je veux bien croire que la syntaxe de troff est absconse, mais j'avoue trouver que la syntaxe de Tex n'est guère plus lumineuse.

            Je suis tout à fait d'accord.

            Mon point de vue

            Je n'ai jamais eu à créer de macro. J'ai toujours trouvé des modules qui convenaient à mes besoins (probablement moins bien que si j'avais créé mes propres macro). Par contre j'ai régulièrement utilisé Tikz qui permet de faire des dessins (associé à beamer on crée un dessin qui s'affiche slide par slide), c'est très pratique est facile d'utilisation.

            Et toi, avec Tex, serais-tu capable de créer une macro (pour mettre en page un livre par exemple) de A à Z ?

            Non clairement pas. Par contre j'ai plusieurs fois créé des macro de macro ce qui est simple à faire en Latex. Voir : http://www.tuteurs.ens.fr/logiciels/latex/macros.html (tout ce qui n'est pas des « tâche complexes »).

            Il faut vraiment que je m'y mette un peu plus pour voir (surment ce week end). Merci pour les liens :)

            Je suis dans ma tour d'ivoire (rien à foutre des autres, dites moi un truc pour moi), si je ne pose pas explicitement une question pour les 99%, les kévin, les Mm Michu alors c'est que je ne parle pas d'eux.

            • [^] # Re: troff

              Posté par (page perso) . Évalué à  3 .

              Il me semble que le second est plus lisible

              Je suis d'accord (entre FS et FE, il s'agit d'une note de bas de page).

              D'ailleurs comme on défini les marges en roff ?

              En troff pur, on utilise les commandes po (page offset = marge de gauche) et ll (line length). Avec la macro ms on définit les variables numériques (number register) PO et LL – on place ces définitions en entête, et de fait, l'entête d'un fichier ms n'est pas non plus très simple (j'oublie tout le temps les noms corrects):

              .\" troff pur:
              .po 4c
              .ll 13c
              .\" macro ms:
              .nr PO 4c
              .nr LL 13c
              
              

              Pour une mise en page à deux colonnes, on définit une première fois po, lorsqu'on arrive en bas de la page, on remonte en haut, et on redéfinit po, pour que le texte s'affiche à côté de la première colonne :

              .\" groff f.tr > f.ps
              .de init
              .\" initialisation des variables
              .po 4c
              .ll 6c
              .\" on place une trape en bas de page
              .\" (trois ligne avant la fin)
              .\" quand le texte rejoint la trape,
              .\" la macro colonne2 est déclenchée
              .wh -3v colonne2
              ..
              .de colonne2
              .\" on remonte à la troisième ligne
              .\" | indique une valeur absolue
              .\" car sp fait par défaut un mvt relatif
              .sp |3v
              .\" on agrandit la marge de gauche
              .po 10.5c
              .\" on enlève la trape pour éviter la boucle infinie
              .ch colonne2
              .\" on met à la place la macro basdepage
              .wh -3v basdepage
              ..
              .de basdepage
              .\" on change de page 
              .bp
              .\" on replace la trape pour la deuxième colonne 
              .wh -3v colonne2
              .\" on ré-initialise la marge
              .po 4c
              ..
              .\" c'est parti!
              .init
              Ici, il faut insérer un long \fIlorem ipsum\fP.
              
              

              J'ai toujours trouvé des modules qui convenaient à mes besoins

              J'ai eu des soucis pour les notes de bas de page de mon premier mémoire, qui n'étaient pas aux normes demandées. J'avais essayé de modifier le fichier de style bibtex et les fichiers latex sans grand résultat. C'est à ce moment que j'ai essayé d'apprendre Tex, pour finalement choisir troff.

        • [^] # Re: troff

          Posté par (page perso) . Évalué à  4 . Dernière modification : le 03/09/12 à 22:13

          Plusieurs commande par ligne ? Des noms de commandes compréhensibles ? Des balises ? ^

          En programmeur TeX invétéré et ex programmeur en assembleur, j'ai adopté la tradition du une instruciton par ligne pour mes programmes TeX.

          Contrairement à ce qu'on pourrait croire en lisant des macros “modernes” pour TeX, apréhender TeX comme une machine à registres permet de réaliser des programmes assez complexes sans trop se casser la bobines.

          J'ai publié une macro getoptspec dans le TuG boat (publiée sous forme de package getoptk pour plain TeX) qui permet d'écrire des commandes qui prennent leurs arguments comme les primitives TeX hbox, hrule etc., càd sous la forme:
          TeX
          \hbox width 12pt{…}

          En y allant tranquillement ce n'est pas si difficile. Comme apparemment certains ici s'intéressent à la programmation TeX j'en profite pour faire de la pub pour mon Bhrid TeX, qui a une sorte de manuel du programmeur.

          http://download.gna.org/bhrid/bhridman.pdf

          La macro getoptspec est décrite pages 62–69 (Listes de spécifications).

          • [^] # Re: troff

            Posté par (page perso) . Évalué à  3 .

            Quel boulot quand même !

            J'imagine que quand on vient de l'assembleur, c'est un jeu d'enfant. J'imagine aussi que comme le C, on doit apprécier maîtriser le bas niveau. Mais je comprends qu'on ait ajouté la surcouche LaTex à Tex…

            Dans quelle conditions as-tu été amené à produire Bhrid Tex ?

            Pourrais-tu présenter un petit exemple où ressortent un peu clairement les outils de Tex dédiés à la mise en page – comme ci-dessus sur le texte à deux colonnes, ou, si c'est trop complexe, un simple pied de page? Ce serait pour moi un bon moyen de prendre quelques repères dans le langage Tex.

            • [^] # Re: troff

              Posté par (page perso) . Évalué à  3 .

              Quel boulot quand même !

              Tu l'as dit! Bon en fait j'ai commencé il y a 10 ans quand je suis entré en licence de maths et comme tu peux le voir je ne balance pas 600 commits par semaine…

              J'imagine que quand on vient de l'assembleur, c'est un jeu d'enfant. J'imagine aussi que comme le C, on doit apprécier maîtriser le bas niveau. Mais je comprends qu'on ait ajouté la surcouche LaTex à Tex…

              Ce qui fait la difficulté de TeX par rapport à un autre langage de programmation c'est notamment le fait que pour programmer, il faille écrire la suite de son programme (il faut choisir quel tokens mettre à la suite du flot de traitement). Une fois qu'on a compris ce problème et le fait qu'il est résolu par l'emploi des registres, programmer en TeX n'est pas plus compliqué qu'avec n'importe quel autre langage impératif. C'est un peu bavard, mais cela passe encore.

              Par exemple voilà un calendrier perpétuel, qui détermine le jour de la semaine correspondant à une date donnée:

              http://svn.gna.org/viewcvs/bhrid/trunk/src/calendar.nw?revision=35

              Dans quelle conditions as-tu été amené à produire Bhrid Tex ?

              Après avoir lu The Advanced TeXbook de David Salomon, je me suis mis à coder en TeX pour le plaisir… je ne connaissais pas encore LaTeX.

              Ceci dit je trouve LaTeX tout à fait inadapté à la saisie du texte. Si on veut un marquage propre il faut définir ses macros soi-même est c'est vite casse -bonbons parceque LaTeX est assez difficile à programmer, toutes les fonctions ont des noms à la con, la doc est imbuvable, etc.

              J'aime bien le marquage minimal et le côté machine à écrire de plain TeX, conventions détruites par LaTeX. Voir par exemple:

              http://svn.gna.org/viewcvs/bhrid/trunk/example/mg_letter/example.tex?revision=116

              Un exemple de lettre au marquage assez minimal.

              Une autre différence de point de vue est que les formats (ensembles des macros préchargées en TeX) jouent un rôle plus important en Bhrìd TeX. (D'après moi le chargement des fontes et le choix du codage d'entrée doit avoir lieu dans le format.)

              • [^] # Re: troff

                Posté par (page perso) . Évalué à  3 .

                J'aime bien le marquage minimal et le côté machine à écrire de plain TeX.

                C'est marrant, c'est ce que j'aime aussi dans troff. Il y a un côté artisanal qui me plait beaucoup, et j'ai plaisir à acquérir un savoir faire et à l'utiliser pour résoudre chaque petit problème. J'ai même l'étrange impression de manipuler de la matière plus que des concepts.

                Ce qui fait la difficulté de TeX par rapport à un autre langage de programmation c'est notamment le fait que pour programmer, il faille écrire la suite de son programme (il faut choisir quel tokens mettre à la suite du flot de traitement).

                Je ne comprends pas ça, mais j'imagine qu'il suffirait que je pratique pour Tex pour comprendre. Qu'importe pour l'instant.

            • [^] # Re: troff

              Posté par (page perso) . Évalué à  3 .

              Pourrais-tu présenter un petit exemple où ressortent un peu clairement les outils de Tex dédiés à la mise en page – comme ci-dessus sur le texte à deux colonnes, ou, si c'est trop complexe, un simple pied de page? Ce serait pour moi un bon moyen de prendre quelques repères dans le langage Tex.

              PS. J'ai pas très bien compris ce que tu cherches. Un exemple des macros de la „domain structure” pour parler comme groff_mdoc(7) ?

              • [^] # Re: troff

                Posté par (page perso) . Évalué à  3 .

                Oui, en quelque sorte, une macro qui donne son format à une page, et non pas seulement à un paragraphe: entête ou pied de page, seconde colonne, qu'importe.

                C'est parce que je me demande quel mécanisme correspond aux pièges de troff (macro appelées lorsque le curseur atteint un endroit de la page), et comment il fonctionne.

                Ce n'est peut-être pas clair. Les commandes de troff sont très proches de la réalité de la page. Il y a trois mécanismes qui correspondent aux évènements qui surviennent à un flux de texte dans une page: l'environnement, qui encloisonne une partie du texte et lui donne un style, la diversion, qui extrait une partie du texte de son flux (une fourche quoi), et les pièges qui surviennent lorsque le curseur atteint un endroit de la page.

                Pour faire une note de bas de page, par exemple, on dévie la note du flux du texte par une diversion, on encloisonne le texte de la note dans un environnement, et on pose un piège en pied de page qui affiche la note lorsqu'il se déclenche.

                Ce sont les mécanismes similaires que je voudrais voir fonctionner dans un petit exemple. Si c'est possible et pas trop casse tête.

                • [^] # Re: troff

                  Posté par (page perso) . Évalué à  4 .

                  Ce sont les mécanismes similaires que je voudrais voir fonctionner dans un petit exemple. Si c'est possible et pas trop casse tête.

                  En TeX ces mécanismes s'appelent output routine, OTR (OR faisait certainement trop indécis).

                  Le principe est que TeX assemble des paragraphes dans la main vertical list, parallèlement à l'assemblage des paragraphes on peut demander de la place pour des réserves (par exemple les notes de bas de page ou les illustrations). Lorsque la hauteur cumulée de la main vertical list est des réserves dépasse une certaine hauteur (en gros la hauteur attendue de la page), une routine utilisateur est appelée (la fameuse OTR) sa mission est d'écrire une page dans un fichier. Elle peut prérarer cette page comme elle le veut à partir des informations qui lui sont données. L'OTR la plus simple est effectivement le mode machine à écrire mais on peut faire des choses plus complexes, comme un mode deux colonnes ou des maquettes plus élaborées.

                  Tes explications me donnent l'impression que troff affiche les notes de bas de page “hors page” dans le blanc sous le texte, c'est ça?

                  • [^] # Re: troff

                    Posté par (page perso) . Évalué à  3 .

                    Tes explications me donnent l'impression que troff affiche les notes de bas de page “hors page” dans le blanc sous le texte, c'est ça?

                    À peu près: troff assemble le flux de texte de la page, et parallèlement, il assemble le flux de texte des diversions (les notes par exemple). Quand le flux de texte de la page atteint le piège, le mécanisme se déclenche, et affiche les diversions au bon endroit.

                    Au début on place le piège en bas de page, et on le remonte petit à petit de la taille des notes de bas de page. Si on affiche une très longue note, le piège peut-être déclenchée en haut de la page.

                    Tu veux bien me donner un exemple simple de code d'OTR ?

                    • [^] # Re: troff

                      Posté par (page perso) . É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).

                      • [^] # Re: troff

                        Posté par (page perso) . Évalué à  3 .

                        Enfin une introduction à Tex digne de ce nom!

                        Il est très bien ton exemple – ça me donne presque envie d'apprendre Tex.

                        • [^] # Re: troff

                          Posté par (page perso) . Évalué à  2 .

                          Il est très bien ton exemple – ça me donne presque envie d'apprendre Tex.

                          Je ne peux que t'encourager à apprendre Bhrìd TeX :D

                          Les deux livres biens que je connais pour la programmation en TeX sont le TeXbook de Knuth et le Advanced TeXbook de Salomon.

                          N'hésite pas à poser toutes tes questions!

                          J'en profite pour faire de la pub pour METAPOST un programme de dessin pas très intéractif, compagnon de TeX (et au passage pour mes macros BSD Make):

                          http://home.gna.org/bsdmakepscripts/tex.html

                          Dans la page (in inglishe, car je suis trop international!) il y a un petit paragraphe sur METAPOST.

          • [^] # Re: troff

            Posté par . Évalué à  2 .

            En programmeur TeX invétéré et ex programmeur en assembleur, j'ai adopté la tradition du une instruciton par ligne pour mes programmes TeX.

            J'entendais pouvoir faire ça :

            Ma \it{phrase} avec \underline{pleins} de \bf{mots}.
            
            

            ou

            Ma {\it phrase} avec {\underline pleins} de {\bf mots}.
            
            

            Je suis dans ma tour d'ivoire (rien à foutre des autres, dites moi un truc pour moi), si je ne pose pas explicitement une question pour les 99%, les kévin, les Mm Michu alors c'est que je ne parle pas d'eux.

            • [^] # Re: troff

              Posté par (page perso) . Évalué à  3 .

              Il y a tout un ensemble de formatages en troff qui peuvent se faire en ligne (les fontes, la taille des fontes, les variables, les déplacements du curseur, les dessins et j'en oublie probablement):

              On peut écrire
              ma \fIphrase\fP avec \*[underline pleins] de \fBmots\fP,
              ou 
              ma \*[it phrase] avec \*[underline pleins] de \*[bf mots],
              à condition que les variables it, underline et bf aient été définies.
              
              

              Mais les commandes et les macros ne peuvent pas être appelées de cette façon – ce qui soulève d'ailleurs des difficultés concernant le placement de la ponctuation lorsque celle-ci doit être accolée à la fin d'une macro. On doit alors placer la ponctuation en argument à la macro, ce qui, pour le coup, est très peu ergonomique.

  • # Bon, faut arrêter maintenant...

    Posté par (page perso) . Évalué à  4 .

    Sérieux, à chaque fois que tu parles de troff, ça me donne envie de m'y mettre (ce qui n'est pas raisonnable vu le temps qu'il m'a fallu pour être à peu près à l'aise avec LaTeX)… tu as déjà songé à écrire des tutoriels pour maîtriser roff ? vu ton enthousiasme pour ce langage, ça aiderait sûrement à le populariser.

    Sinon, quelques questions :

    1. comment se passe la cohabitation de heirloom troff avec groff ? j'avais déjà envisagé de remplacer groff par celui-ci, mais sans surprise il plante sur pas mal de pages de manuel (les mdocs en particulier). Il faut donc arriver à faire cohabiter les deux implémentations. Comment tu fais, tu édites ton /usr/lib/man.conf pour le "groffiser" ou tu installes le heirloom dans un path dédié ?
    2. comment ça se passe niveau police ? j'avais lu que c'était facile d'utiliser tout un tas de police, mais qu'en est-il vraiment (par exemple je me sers pas mal de Text Companion, c'est facile d'avoir l'équivalent) ?
    3. il me semble qu'on ne peut obtenir que du PostScript en sortie, pas du PDF directement. Ça ne dégrade pas trop la sortie "écran" de devoir passer par ps2pdf ? j'imagine qu'on ne peut pas avoir d'hyperliens dans les documents avec ce système…

    Et vous, que pensez-vous de l'ergonomie des outils présentés ici ? Y voyez-vous des erreurs grossières ou des améliorations possibles ?

    Sans voir le code, c'est difficile. Pour idx, la seule chose que j'aurais à dire, c'est que awk n'est pas vraiment adapté pour faire des commandes, car il n'y a pas de moyen standard de séparer les options de l'interpréteur des options du script (le -Wexec de Gawk). De plus si un jour tu veux ajouter de la recherche de regex donnée en entrée, évaluer et insérer la regex en dur dans le code awk via le shell peut-être bien plus efficace qu'utiliser des regex dynamique en pur awk.

    « La racine carrée de la vérité, c'est l'amour. » A.D Sakharov

    • [^] # Re: Bon, faut arrêter maintenant...

      Posté par (page perso) . Évalué à  5 .

      tu as déjà songé à écrire des tutoriels pour maîtriser roff ?

      J'y songe oui, mais c'est à la fin de ma todo list. J'ai d'abord des macros et des scripts à publier. Et suite à notre précédente discussion, je me suis décidé à utiliser troff lui-même pour ça, ce qui demande un peu de boulot. Enfin, pour le tutoriel, il m'a fallu trouver et adapter un colorateur syntaxique… Tout ça est long.

      comment se passe la cohabitation de heirloom troff avec groff ?

      J'ai installé heirloom troff dans /opt, il s'occupe des pages de manuel heirloom, et laisse groff s'occuper des pages de manuel du système. Comme je me sers surtout de heirloom troff pour mes textes, je me suis fait un petit script, h, que j'appelle avant chaque commande heirloom, et qui modifie le path pour l'occasion.

      sans surprise il plante sur pas mal de pages de manuel (les mdocs en particulier).

      Je n'ai pas essayé, mais voici quelques pistes:
      - activer les macros de plus de deux lettres avec l'option -x3 (troff -x3),
      - activer la compatibilité avec groff en appelant la macro g (troff -mg),
      - utiliser la macro fournie avec groff plutôt que l'historique macro doc (les bsd eux-mêmes utilisent maintenant la macro de groff, qui est du reste sous licence bsd).
      - dans le tuyau appelant troff , utiliser les pré-processeurs heirloom, et compléter la commande avec ul et col.

      Mais parfois, groff reste meilleur que heirloom troff, en particulier lorsque pic est utilisé.

      comment ça se passe niveau police ?

      Les polices sont une bonne raison de préférer heirloom troff à groff, car il comprend tous (?) les formats, y compris l'opentype, sans modification. Il faut les mettre dans $TROFFONTS (2 F et un S), et suivre le manuel pour apprendre à les monter:

      .\" fp numéro raccourci nom type
      .fp 12 K mafonte_regular otf
      \fKtexte écrit avec mafonte\fP
      
      

      Ça ne dégrade pas trop la sortie "écran" de devoir passer par ps2pdf ?

      Je n'ai pas remarqué, mais je n'ai pas forcément l'œil.

      J'imagine qu'on ne peut pas avoir d'hyperliens dans les documents avec ce système…

      Si, métadonnées, liens internes et liens externes avec heirloom troff (potentiellement aussi avec groff, mais je ne sais pas bien comment):

      .\" troff f.tr | dpost | ps2pdf - f.pdf
      .\" métadonnées:
      \X'PDFMark: Author Sygne'
      \X'PDFMark: Title Tutoriel troff'
      \X'PDFMark: Subject Métadonnées et liens'
      \X'PDFMark: Keywords troff lien pdf heirloom'
      .\" table des matières pdf
      .\" (à placer au bon endroit dans le document):
      \X'PDFMark: Bookmark 0 Grand titre'
      \X'PDFMark: Bookmark 1 sous titre'
      \X'PDFMark: Bookmark 0 Autre grand titre'
      \X'PDFMark: Bookmark 1 Autre sous titre'
      .\" les couleurs:
      \X'SetLinkColor: .2 .1 .9 rgb'
      \X'SetLinkBorder: .2 .1 .9 rgb'
      \X'SetULinkColor: .7 .1 .1 rgb'
      \X'SetULinkBorder: .7 .1 .1 rgb'
      .\" Ancres et liens
      \A'ancre1'Ancre 1.
      .bp
      \T'ancre1'Lien vers l'ancre1\T,
      \T'ancre2'lien vers l'ancre2\T,
      \W'http://example.com'example.com\W.
      .bp
      \A'ancre2'Ancre 2.
      
      

      C'est un peu fastidieux à écrire, il faut se faire des macros raccourcis.

      awk n'est pas vraiment adapté pour faire des commandes […] évaluer et insérer la regex en dur dans le code awk via le shell peut-être bien plus efficace.

      En fait, idx est un script shell composé de fonctions en awk. Quand je serai prêt pour la publication, j'en parlerai ici pour avoir des retours sur le code lui-même.

      Je suis heureux de voir que troff peut faire des émules!

      • [^] # Re: Bon, faut arrêter maintenant...

        Posté par (page perso) . Évalué à  2 .

        Merci d'avoir pris le temps de répondre. J'ai téléchargé le manuel PDF du heirloom troff, je vais sûrement l'imprimer pour pouvoir potasser ça à l'occasion.

        En tous les cas, j'ai hâte de voir ton projet se monter (aussi bien pour son contenu que pour son mode de publication :).

        « La racine carrée de la vérité, c'est l'amour. » A.D Sakharov

Suivre le flux des commentaires

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