Journal rétrospective sur la mise en page en console

50
5
fév.
2022

Sommaire

'jour 'nal.

Dans une enfilage sur le clavier, j'avais avoué ma passion pour l'histoire des systèmes et matériels informatiques ; et dans diverses autres discussion, ici et ailleurs, j'ai souvent évoqué l'influence des télescripteurs (en tant que périphériques d'entrée-sortie) sur le système Unix, un processeur de textes commandé textuellement
C'est cet aspect que j'aimerais rappeler à travers quelques commandes oubliées.

intro au kilomètre

J'ai souvenir qu'on enseignait à une certaine époque (j'ai l'impression que ce n'est plus vrai quand je regarde autour de moi) que dans la création de documents textes (lettre, rédaction, roman, etc.) il y a deux étapes distinctes : la saisie (dite au kilomètre) d'une part, et la mise en forme d'autre part. Un éditeur comme Vi permet d'observer cette règle facilement : on est en mode insertion pour la partie de saisie, et en mode commandes pour la partie édition avant mise en forme…

Lors de cette phase de saisie brute, les traitements de texte moderne nécessitent de distinguer le simple saut de ligne du changement de paragraphe (qui est associé à la touche Entrée). Dans un éditeur de texte, que ce soit pour avec un balisage ou directement pour l'imprimante comme dans le cas présent, c'est plus simple : la touche Entrée permet de juste passer à la ligne (ce qui est rarement nécessaire), et il faut sauter au moins une ligne pour indiquer un nouveau paragraphe.

Une fois son texte saisi (input mode) et corrigé (command mode), il faut le mettre en forme pour l'impression (ou l'affichage sur le terminal…) Les systèmes Unix offrent quelques outils pour cela.

replis sur bord de lignes

Le premier, peu connu, est le filtre POSIX "fold", apparu dans 1BSD en 1977 (sortie officielle de la distribution en mars 1978). On lui indique la largeur voulue avec l'option "-w" (par défaut c'est du 80 caractères…) Il va être utile pour adapter la largeur du texte, en particulier lorsqu'on l'envoie vers une imprimante (sans retour de ligne, les lignes trop longues sont juste tronquées…) On peut l'utiliser aussi pour voir le résultat du même texte avec une largeur d'écran différente. Exemple :

$ echo "The _fold_ utility is a filter that shall fold lines from its\
input files, but breaking the lines to have a maximum of _width_\
column position (or bytes, if the *-b* option is specified)." | fold
The _fold_ utility is a filter that shall fold lines from its input files, but b
reaking the lines to have a maximum of _width_ column position (or bytes, if the
 *-b* option is specified).

$ echo "The _fold_ utility is a filter that shall fold lines from its\
input files, but breaking the lines to have a maximum of _width_\
column position (or bytes, if the *-b* option is specified)." | fold -w 75
The _fold_ utility is a filter that shall fold lines from its input files,
but breaking the lines to have a maximum of _width_ column position (or byt
es, if the *-b* option is specified).

$ echo "The _fold_ utility is a filter that shall fold lines from its\
input files, but breaking the lines to have a maximum of _width_\
column position (or bytes, if the *-b* option is specified)." | fold -w 60
The _fold_ utility is a filter that shall fold lines from it
s input files, but breaking the lines to have a maximum of _
width_ column position (or bytes, if the *-b* option is spec
ified).

Le fonctionnement est un peu simplet : noter la coupe abrupt des mots …sauf si on utilise l'option "-s" qui demande de couper aux espaces !

$ fold wrap.txt | tr ' ' '~'
The~_fold_~utility~is~a~filter~that~shall~fold~lines~from~its~input~files,~but~b
reaking~the~lines~to~have~a~maximum~of~_width_~column~position~(or~bytes,~if~the
~*-b*~option~is~specified).
Use~*-s*~option~to~split~at~latest~space~before~maximum~_width_.

The~_fmt_~utility~is~a~filter~that~shall~reformat~each~paragraph~from~its~input~
files,~but~break~the~lines~to~have~a~maximum~of~_width_~column~position.

$ fold -s wrap.txt | tr ' ' '~'
The~_fold_~utility~is~a~filter~that~shall~fold~lines~from~its~input~files,~but~
breaking~the~lines~to~have~a~maximum~of~_width_~column~position~(or~bytes,~if~
the~*-b*~option~is~specified).
Use~*-s*~option~to~split~at~latest~space~before~maximum~_width_.

The~_fmt_~utility~is~a~filter~that~shall~reformat~each~paragraph~from~its~input~
files,~but~break~the~lines~to~have~a~maximum~of~_width_~column~position.

$ fold -s -w 75 wrap.txt | tr ' ' '~'
The~_fold_~utility~is~a~filter~that~shall~fold~lines~from~its~input~files,~
but~breaking~the~lines~to~have~a~maximum~of~_width_~column~position~(or~
bytes,~if~the~*-b*~option~is~specified).
Use~*-s*~option~to~split~at~latest~space~before~maximum~_width_.

The~_fmt_~utility~is~a~filter~that~shall~reformat~each~paragraph~from~its~
input~~files,~but~break~the~lines~to~have~a~maximum~of~_width_~column~
position.

$ fold -w 60 -s wrap.txt | tr ' ' '~'
The~_fold_~utility~is~a~filter~that~shall~fold~lines~from~
its~input~files,~but~breaking~the~lines~to~have~a~maximum~
of~_width_~column~position~(or~bytes,~if~the~*-b*~option~is~
specified).
Use~*-s*~option~to~split~at~latest~space~before~maximum~
_width_.

The~_fmt_~utility~is~a~filter~that~shall~reformat~each~
paragraph~from~its~input~files,~but~break~the~lines~to~have~
a~maximum~of~_width_~column~position.

J'utilise cette commande dans mes scripts pour des traitements caractère par caractère :

# from variable
for char in $(echo "$var" | fold -w 1); do stuff; done
# from file
for char in $(fold -w 1 "$filepath"); do stuff; done

…chose qu'on peut faire aussi à l'aide de grep :

# from variable
for char in $(echo "$var" | grep -os '.'); do stuff; done
# from file
for char in $(grep -os '.' "$filepath"); do stuff; done

ajustement des paragraphes à une largeur

Il existe un autre filtre, apparu dans 2BSD en 1978 et vite adopté par d'autres distributions. Il porte le nom de "fmt" pour "ForMat Text"… (En dehors du système, c'est un sigle qui peut avoir plusieurs sens en français comme en anglais et ailleurs. Dans de nombreux langages de programmation, c'est souvent le nom de la bibliothèque pour faire du formatage de données —textes/nombres/etc., cousin de "printf"/"sprintf" anciennement connu sous le nom de "cppformat" et est utilisé par exemple dans Go et dans Java EE en tant que JSTL etc.) On lui indique aussi la largeur voulue avec l'option "-w" (qui est de 75 caractères par défaut …parce que conçu avec la nétiquette et les RFC du courriel en tête)

$ fmt wrap.txt | tr ' ' '~'
The~_fold_~utility~is~a~filter~that~shall~fold~lines~from~its~input~files,
but~breaking~the~lines~to~have~a~maximum~of~_width_~column~position~
(or~bytes,~if~the~*-b*~option~is~specified).~~Use~*-s*~option~to~split
at~latest~space~before~maximum~_width_.

The~_fmt_~utility~is~a~filter~that~shall~reformat~each~paragraph~from
its~input~ files,~but~break~the~lines~to~have~a~maximum~of~_width_
column~position.

$ fmt -w 80 wrap.txt | tr ' ' '~'
The~_fold_~utility~is~a~filter~that~shall~fold~lines~from~its~input~files,
but~breaking~the~lines~to~have~a~maximum~of~_width_~column~position~(or~bytes,
if~the~*-b*~option~is~specified).~~Use~*-s*~option~to~split~at~latest~space
before~maximum~_width_.

The~_fmt_~utility~is~a~filter~that~shall~reformat~each~paragraph~from~its
input~files,~but~break~the~lines~to~have~a~maximum~of~_width_~column~position.

$ fmt -w 60 wrap.txt | tr ' ' '~'
The~_fold_~utility~is~a~filter~that~shall~fold~lines~from
its~input~files,~but~breaking~the~lines~to~have~a~maximum
of~_width_~column~position~(or~bytes,~if~the~*-b*~option
is~specified).~~Use~*-s*~option~to~split~at~latest~space
before~maximum~_width_.

The~_fmt_~utility~is~a~filter~that~shall~reformat~each
paragraph~from~its~input~files,~but~break~the~lines~to
have~a~maximum~of~_width_~column~position.

Il met en œuvre la notion de mots comme suite de caractères séparés par des blancs, et reconnait la notion de paragraphe comme étant séparés par une ou plusieurs lignes vides (comme vi hé hé). Du coup, il peut appliquer un retrait à la première ligne du paragraphe (option "-p" de l'implémentation BSD) …ou carrément l'inverse (option "-t" de l'implémentation GNU). Eh oui, la typographie n'a pas attendu les traitements de texte… (voir ci et ou par exemple.)

On notera qu'il connait aussi la notion de phrase comme étant terminées par une ponctuation de fin (point… final, d'interrogation, d'exclamation, en fait comme dans vi hé hé) et peuvent alors appliquer la règle typographique anglophone d'espacement (datant de l'époque des machines à écrire et devant faciliter la lecture) : un seul espace entre les mots et deux espaces entre les phrases. (BSD "-s" ou GNU "-u") Noter que la commande "J" de Ed/Ex/Vi procède normalement ainsi…
D'autres implémentations peuvent offrir de centrer le texte sur la ligne ou d'autres options sympathiques, comme de conserver les lignes dans les paragraphes (GNU "-s")

OpenBSD/FreeBSD GNU/Linux Sun Solaris Plan 9 IBM AIX
-w Ⅰ -w Ⅰ -w Ⅰ -w Ⅰ -w Ⅰ use width output (default goal is around 93% of width)
-Ⅰ -Ⅰ -Ⅰ -l Ⅰ -Ⅰ use width output
-g Ⅰ goal is (and max width is Ⅰ+10 unless specified)
Ⅰ Ⅼ -g Ⅰ -w Ⅼ goal is and max width is
-c Center
-d Ⅹ sentence ending Delimiters are
-l Ⅰ replace spaces with tabs at beginning of line
-m try to format Mail headers too
-n disable Nroff compatibility so not skip lines starting with '.'
-p indent Paragraph first line
-t Tagged paragraph (indent lines but first)
-s -u Uniformize white spaces by Single one/two between words/sentences
-t Ⅰ replace Tabs with spaces instead of 1
-p Ⅹ reformat only lines beginning with Prefix
-c -c preserve indentation of first two lines = Crown margin
-s -s -j Split/fold only long lines but do not refill (i.e. Join short lines)
-i Ⅰ Indent each line with spaces

Ceci dit, il ne faut se limiter qu'à une option, "-w…" (voire même juste "-…" puisque d'anciennes implémentation AIX ne connaissent que ce dernier mais que cette dernière forme n'est pas reconnue sur Plan 9…)

Pour le travail de base, "fmt" est quasiment équivalent à "fold -s". Ainsi, fold reste intéressant quand il faut respecter les sauts de lignes, tandis que fmt va formater un paragraphe en essayant d'avoir un texte homogène…

expansion au taquet

Pour les tabulations, il existe des filtres POSIX qu'il vaut mieux utiliser en amont ; ça rend les scripts plus portables.

BSD fmt alternative POSIX
-t _ expand -t _
-l _ unexpand -t _

Les filtres dédiés permettent d'ailleurs de faire beaucoup plus…

$ cat -T taquets.txt
Fournitures^IQuantité^IPrix
Crayons^I12^I15,76
Feuilles A4^I1000^I137,5
Correcteurs^I10^I18

$ # par défaut on positionne en colonne modulo 8...
$ echo "1------.-1-------.-2-------.-3" ; cat taquets.txt
1------.-1-------.-2-------.-3-------.-
Fournitures     Quantité        Prix
Crayons 12      15,76
Feuilles A4     1000    137,5
Correcteurs     10      18
$ echo "1------.-1-------.-2-------.-3" ; cut -f 1-3 taquets.txt
1------.-1-------.-2-------.-3-------.-
Fournitures     Quantité        Prix
Crayons 12      15,76
Feuilles A4     1000    137,5
Correcteurs     10      18

$ # cas par défaut de la commande qui remplace TAB par 8
$ echo "1------.-1-------.-2-------.-3" ; expand taquets.txt
1------.-1-------.-2-------.-3-------.-
Fournitures     Quantité        Prix
Crayons 12      15,76
Feuilles A4     1000    137,5
Correcteurs     10      18

$ # mais on peut spécifier une autre largeur de TAB comme 7
$ echo "1------.-1-------.-2-------.-3" ; expand -t 7 taquets.txt
1------.-1-------.-2-------.-3-------.-
Fournitures   Quantité     Prix
Crayons       12      15,76
Feuilles A4   1000    137,5
Correcteurs   10      18

$ # On peut mettre des Taquets par exemple en colonnes 17 et 33
$ echo "1------.-1-------.-2-------.-3" ; expand -t 17,33 taquets.txt
1------.-1-------.-2-------.-3-------.-
Fournitures      Quantité      Prix
Crayons          12             15,76
Feuilles A4      1000           137,5
Correcteurs      10             18

$ # On peut mettre des Taquets par exemple en colonnes 13 et 23
$ echo "1------.-1-------.-2-------.-3" ; expand -t 13,23 taquets.txt
1------.-1-------.-2-------.-3-------.-
Fournitures  Quantité Prix
Crayons      12        15,76
Feuilles A4  1000      137,5
Correcteurs  10        18

$ # On peut redefinir les taquets pour le terminal
$ # (profite à tous les programmes)
$ tabs 13,23 ; echo "1------.-1-------.-2-------.-3" ; cat taquets.txt ; tabs -8
1------.-1-------.-2-------.-3-------.-
Fournitures  Quantité Prix
Crayons      12        15,76
Feuilles A4  1000      137,5
Correcteurs  10        18

On savait déjà faire tout cela en ligne de commande dans ces années là (pour la petite histoire, expand est apparue avec 1BSD en mars 1978, et tabs est apparu dans PWB/UNIX publié en juillet 1977.) Encore une fois, pas eu besoin d'attendre la machinerie moderne (voir ici et ou par exemple.)

$ # attention a bien les enchaîner....
$ fold -w 60 taquets.txt
Fournitures     Quantité        Prix
Crayons 12      15,76
Feuilles A4     1000    137,5
Correcteurs     10      18
$ fmt -w60 taquets.txt
Fournitures     Quantité        Prix Crayons 12      15,76
Feuilles A4     1000    137,5 Correcteurs     10      18
$ fmt -s -w 60 taquets.txt
Fournitures     Quantité        Prix
Crayons 12      15,76
Feuilles A4     1000    137,5
Correcteurs     10      18
$ expand -t 13,23 taquets.txt | fmt -s -w 60
Fournitures  Quantité Prix
Crayons      12        15,76
Feuilles A4  1000      137,5
Correcteurs  10        18

Pour la route, si on n'est pas préoccupé par la portabilité, il y a d'autres alternatives à expand :

paragraphes au large

Il semble qu'il y a matière à améliorations, surtout dans le cadre du courriel, ce qui a conduit Adam M. Costello à produire "par" en 1993 (juste l'abréviation de « PARagraph » je crois, mais c'aurait pu être le sigle de « Paragraphs Alternative Reformater » aussi.) Je ne maitrise pas sa syntaxe peu évidente ; mais il sait traiter :

  • les mails (option "q" ajustable avec "Q..." et combinable avec "i" et "e")
  • les marges (options "p" et "s" pouvant être combiné avec "t" ou "f")
  • les imbrications de commentaires et messages cités (options "d")
  • la préservation des espaces initiaux (option "r")
  • les justification (option "j") et la dernière ligne (option "l")
  • le remplissage quasi complet (option "f") sans justification
  • l'expansion de la tabulation (option "T...")
  • et le retrait des lignes superflues (option "e")
  • et d'autres choses (options "c" et "h" et "g" par exemple)

le tout en gérant l'Unicode (en UTF-8) ! La largeur est aussi indiquée avec "-w ..." (on peut utiliser juste "w..." ou "...") et est par défaut 72

$ # attention par n'opère que comme filtre...
$ par -w 60 wrap.txt
par error:
bad argument: wrap.txt

options for par:

help       print option summary        ---------- Boolean parameters. ---------
version    print version number        b<body>   let non-trailing body chars in
B<op><set> as <op> is =/+/-                      prefix, non-leading in suffix
           replace/augment/diminish    c<cap>    count all words as capitalized
           body chars by <set>         d<div>    use indentation as a delimiter
P<op><set> ditto for protective chars  E<Err>    send messages to stderr
Q<op><set> ditto for quote chars       e<expel>  discard superfious lines
-------- Integer parameters: --------  f<fit>    narrow paragraph for best fit
h<hang>    skip IP's 1st <hang> lines  g<guess>  preserve wide sentence breaks
           in scan for common affixes  i<invis>  hide lines inserted by <quote>
p<prefix>  prefix length               j<just>   justify paragraphs
r<repeat>  if not 0, force bodiless    l<last>   treat last lines like others
           lines to length <width>     q<quote>  supply vacant lines between
s<suffix>  suffix length                        different quote nesting levels
T<tab>     tab stops every <tab> cols  R<report> print error for too-long words
w<width>   max output line length      t<touch>  move suffixes left

See par.doc or par.1 (the man page) for more information.

$ # ...il lit l'entrée standard et écrit sur la sortie standard
$ echo "_par_ is a filter which reformates each paragraph from its input
to its output" | par
_par_ is a which reformates each paragraph from its input to its
output

$ # donc envoyer d'abord le fichier sur l'entrée standard...
$ cat wrap.txt | par -w 60 | tr ' ' '~'
The~_fold_~utility~is~a~filter~that~shall~fold~lines~from~~.
its~input~files,~but~breaking~the~lines~to~have~a~maximum~~.
of~_width_~column~position~(or~bytes,~if~the~*-b*~option~is.
specified)~Use~*-s*~option~to~split~at~latest~space~before~.
maximum~_width_~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.

The~_fmt_~utility~is~a~filter~that~shall~reformat~each
paragraph~from~its~input~files,~but~break~the~lines~to~have
a~maximum~of~_width_~column~position.

$ # les points systématiques à la fin de ligne sont reproduits
$ # ...donc lui signaler qu'il n'y a pas de délimiteur de fin
$ cat wrap.txt | par -w 60 -s 0 | tr ' ' '~'
The~_fold_~utility~is~a~filter~that~shall~fold~lines~from
its~input~files,~but~breaking~the~lines~to~have~a~maximum
of~_width_~column~position~(or~bytes,~if~the~*-b*~option~is
specified)~Use~*-s*~option~to~split~at~latest~space~before
maximum~_width_.

The~_fmt_~utility~is~a~filter~that~shall~reformat~each
paragraph~from~its~input~files,~but~break~the~lines~to~have
a~maximum~of~_width_~column~position.

$ # ...ou ajouter le point dans la liste des caractères normaux
$ cat wrap.txt | par -w 60 -B+. | tr ' ' '~'
The~_fold_~utility~is~a~filter~that~shall~fold~lines~from
its~input~files,~but~breaking~the~lines~to~have~a~maximum
of~_width_~column~position~(or~bytes,~if~the~*-b*~option~is
specified)~Use~*-s*~option~to~split~at~latest~space~before
maximum~_width_.

The~_fmt_~utility~is~a~filter~that~shall~reformat~each
paragraph~from~its~input~files,~but~break~the~lines~to~have
a~maximum~of~_width_~column~position.

$ # essayons d'avoir des lignes plus équilibrées, comme fmt...
$ cat wrap.txt | par -w60fs0 | tr ' ' '~'
The~_fold_~utility~is~a~filter~that~shall~fold~lines~from
its~input~files,~but~breaking~the~lines~to~have~a~maximum
of~_width_~column~position~(or~bytes,~if~the~*-b*~option~is
specified)~Use~*-s*~option~to~split~at~latest~space~before
maximum~_width_.

The~_fmt_~utility~is~a~filter~that~shall~reformat~each
paragraph~from~its~input~files,~but~break~the~lines~to
have~a~maximum~of~_width_~column~position.

$ # on peut carrément vouloir justifier les lignes...
$ cat wrap.txt | par -w60j | tr ' ' '~'
The~_fold_~utility~~is~a~filter~that~shall~~fold~lines~from.
its~input~files,~~but~breaking~the~lines~to~~have~a~maximum.
of~_width_~column~position~(or~bytes,~if~the~*-b*~option~is.
specified)~Use~*-s*~option~to~~split~at~latest~space~before.
maximum~_width_~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.

The~~_fmt_~utility~~is~~a~filter~~that~~shall~reformat~~each
paragraph~from~its~input~files,~~but~break~the~lines~to have
a~maximum~of~_width_~column~position.

$ # ...sans oublier de combiner le reste...
$ cat wrap.txt | par 60js0 | tr ' ' '~'
The~_fold_~utility~~is~a~filter~~that~shall~~fold~lines~from
its~input~files,~but~breaking~the~lines~to~have~a~maximum~of
_width_~column~~position~(or~~bytes,~if~the~~*-b*~~option~is
specified).~Use~*-s*~option~to~~split~at~latest~space~before
maximum~_width_.

The~~_fmt_~utility~~is~~a~filter~~that~~shall~reformat~~each
paragraph~from~its~input~files,~~but~break~the~lines~to have
a~maximum~of~_width_~column~position.

par est aussi bien pour reformater des mails (format texte) ! Mais dans beaucoup de cas, il est assez compliqué à mon avis… À réserver donc aux rares cas où les autres ne satisfont pas.

$ # comme "fmt" mais les tabulations deviennent un espace...
$ cat taquets.txt | par -w 60
Fournitures Quantité Prix Crayons 12 15,76 Feuilles A4 1000
137,5 Correcteurs 10 18

$ # je ne suis pas parvenu à utiliser cette option
$ cat taquets.txt | par -w 60 -T 8
Fournitures Quantité Prix 12 5,76 A4 137,5 urs 10 8

$ # on peut au moins arriver à préserver les sauts de ligne...
$ par -w 60 -d  < taquets.txt
Fournitures Quantité Prix
Crayons 12 15,76
Feuilles A4 1000 137,5
Correcteurs 10 18

$ # on peut demander de préserver les 23 premiers caractères...
$ expand -t 13,23 taquets.txt | par w60p23
Fournitures  Quantité Prix
Crayons      12        15,76
Feuilles A4  1000      137,5
Correcteurs  10        18

Il a le mérite d'exister et d'être présent dans de plus en plus de distributions, sinon se porte facilement. À surveiller.

balle au centre et égalisation

Pour le centrage, il faut hélas recourir à "printf" (ou "perl" ou "sed" ou autre) puis boucler sur toutes les lignes (ce qui peut se faire avec "awk" qui est mon filtre favori dans ce cas ci…)
Nota : Vim a la commande ":center" qui fait bien cela ; ainsi que ":right" et ":left", et tous les trois peuvent s'abréger à 2 caractères et on peut indiquer ensuite la largeur voulue (80 sinon).

Concernant la pleine justification, c'est un processus plus couteux qui se fait en répartissant astucieusement des espaces entre les mots (chose que savent faire Emacs et Nano ; et sinon ça se scripte dans un langage un peu avancé.) Ce procédé est bien connu, mais le résultat n'est pas toujours des plus heureux et se retrouve facilement avec des fleuves qui sillonnent le texte…

Idéalement, pour faire de la justification, il faut certes ajouter des blancs ci et là, mais arriver à limiter le nombre de ceux-ci et jouer également avec la césure des mots (ou « hyphenation » en anglais, qui se fait avec le trait d'union…) dont les règles varient selon les langues. On peut par exemple s'appuyer sur un « dictionnaire » dédié. C'est d'ailleurs l'approche des logiciels pionniers : Justify, puis TJ-1 et enfin TJ-2 en 1963, pour la machine PDP-1, ne traitent que l'anglais en utilisant un dictionnaire de césures… On le considère parfois comme le premier « processeur de texte » (ou « traitement de texte », buzzword du NY Times en 1971) en tant que machine dédiée (comme Dorsey) et non logiciel (comme Vydec)…

impressions standards

Voyons maintenant une dernière commande, apparue avec la première version officielle distribuée aux universités vers 1971 mais déjà utilisé au Bell Labs (en fait il nait en août 1969 mais son état civile est enregistré pour le 1er janvier de 1970 ha-ha …et dès le début le système est utilisé en interne entre par les secrétaires) Du nom de "pr", elle prépare la « mise en page » pour l'impression papier… (est-ce que son nom est l'abréviation de « print » ou le sigle de « print request » est une des questions qui me turlupinent…)

Cette mise en page va consister surtout en la « pagination » (i.e. le découpage en « page ») comme le font les éditeurs plein écran ("vi", "emacs", "nano", etc.) et visualiseurs de texte ("pager", "pg", "more", "less", "most", etc.) Sauf qu'eux raisonnent par rapport à l'écran tandis que "pr" raisonne par rapport à la page papier.

Tout comme l'écran du terminal ou de la console a un certain nombre de lignes × colonnes (par exemple 25×80) la page aussi. Ces dimensions (longueur × largeur de papier, par défaut 66×72) peuvent être spécifiées respectivement avec les options "-l" (pour « page length ») et "-w" (pour « page Width »).

Mais pour le papier, il y aussi la notion de « marge interne » (nulle par défaut, et à ne pas confondre avec la marge technique ou le débord qui s'ajoute), qui est retiré de la largeur, avec l'option "-o" (pour « line Offset »)


Comme il s'agit de document à imprimer, "pr" rajoute un en-tête de 5 lignes (prises dans la longueur totale…) et y place au milieu (troisième ligne)  : la date de génération (à gauche), le numéro de page (à droite), et le nom du fichier (au milieu) ou titre du document… Il prend également 5 lignes pour le pied de page

Ce n'est certainement pas parfait, mais moins prise de tête àmha.

$ # noter la belle entête faite toute seule
$ expand -t 13,23 taquets.txt | pr -w 50 | head


2017-10-30 13:27                           Page 1


Fournitures  Quantité Prix
Crayons      12        15,76
Feuilles A4  1000      137,5
Correcteurs  10        18

$ # ajouter un décalage de 2 espaces à gauche
$ expand -t 13,23 taquets.txt | pr -o 2 -w 50 | head


  2017-10-30 13:33                         Page 1


  Fournitures  Quantité Prix
  Crayons      12        15,76
  Feuilles A4  1000      137,5
  Correcteurs  10        18

$ # pr mange 5 lignes en haut et autant en bas
$ expand -t 13,23 taquets.txt | pr -l 12 -w 50 | cat -n
    1
    2
    3 2017-10-30 13:43                           Page 1
    4
    5
    6 Fournitures  Quantité Prix
    7 Crayons      12        15,76
    8 Feuilles A4  1000      137,5
    9
   10
   11
   12
   13
   14
   15
   15
   16 2017-10-30 13:43                           Page 2
   17
   18
   19 Correcteurs  10        18
   20
   21
   22
   23
   24

$ # pr mange 10 lignes et pagine automatiquement
$ expand -t 13,23 taquets.txt | pr -l 13 -w 50 | cat -n
    1
    2
    3 2017-10-30 13:43                           Page 1
    4
    5
    6 Fournitures  Quantité Prix
    7 Crayons      12        15,76
    8 Feuilles A4  1000      137,5
    9
   10
   11
   12
   13
   14
   15
   15
   16 2017-10-30 13:43                           Page 2
   17
   18
   19 Correcteurs  10        18
   20
   21
   22
   23
   24
   25
   26

Le pied de page n'est pas utilisé et je trouve que c'est un gâchis ces cinq lignes. Mais c'est très utile pour les sociétés, qui impriment sur du papier avec un certain nombre de mentions qui sont plus ou moins obligatoires dans cette zone… On en rencontre qui utilisent l'en-tête du document pour des informations autre que leur logo et leur nom.

L'option "-t" permet de désactiver les en-têtes et pieds de page ajoutés automatiquement, comme souvent requis sur les sorties papier. Noter que ceux-ci sont automatiquement désactivés quand le nombre de lignes n'est pas supérieur à dix !

Question : Est-ce que les commandes déjà évoquées sont utiles ici ?

Réponse : Oui, "-w" positionne le numéro de page sans adapter le texte, et la largeur minimale utilisée est de 24 (en dessous pas pris en compte.)

L'implémentation GNU offre en plus l'option "-W" qui permet d'appliquer un effet « truncate »… Cette implémentation offre également l'option "-T" qui fait comme "-t" mais envoie le code de saut saut de page au lieu de plusieurs saut de ligne : c'est normalement plus rapide car l'imprimante éjecte la page au lieu de la dérouler ligne par ligne. Il est à noter que la norme propose "-F" et "-f" pour ce faire (donc "-T" a pour forme portable "-tF" simplement.)

$ # plus d'entête et pied de page avec "`-t`"
$ expand -t 13,23 taquets.txt | pr -t | head
Fournitures  Quantité Prix
Crayons      12        15,76
Feuilles A4  1000      137,5
Correcteurs  10        18

$ # plus d'entête et pied de page quand l<=10
$ expand -t 13,23 taquets.txt | pr -l 5
Fournitures  Quantité Prix
Crayons      12        15,76
Feuilles A4  1000      137,5
Correcteurs  10        18

$ # "-w" ne tronque pas (utile ici)
$ expand -t 13,23 taquets.txt | pr -w 26 | head


2017-10-30 13:27    Page 1


Fournitures  Quantité Prix
Crayons      12        15,76
Feuilles A4  1000      137,5
Correcteurs  10        18

$ # "-w" ne s'applique pas au text
$ echo "ceci est une ligne de 30 car." | pr -l 2 -w 20
ceci est une ligne de 30 car.
$ echo "ceci est une ligne de 30 car." | pr -l 2 -W 20
ceci est une ligne d
$ echo "ceci est une ligne de 30 car." | fold -s -w 20 | pr -l 2 -w 20
ceci est une ligne
de 30 car.

$ # "-w" utilise une valeur minimale de 24...
$ # (juste ce qu'il faut pour l'horodatage et la pagination)
$ expand -t 13,23 taquets.txt | pr -w 10 | head


2017-10-30 13:27  Page 1


Fournitures  Quantité Prix
Crayons      12        15,76
Feuilles A4  1000      137,5
Correcteurs  10        18

$ # "-F" si on ne veut pas enregistrer dans un fichier
$ # mais envoyer directement à l'imprimante
$ expand -t 13,23 taquets.txt | pr -w 10 | wc
     66      17     196
$ expand -t 13,23 taquets.txt | pr -w 10 -F | wc
      9      17     140

On ne le voit pas dans les précédents exemples, mais dans l'entête il y a le nom du fichier centré. Du moins, par défaut, car on peut mettre un texte personnalisé en utilisant l'option "-h" (pour « personalized Header »)

L'implémentation GNU propose en plus l'option "-D" pour personnaliser le champ de date par son propre texte… (on peut bien entendu utiliser "$(date +...)" pour changer le format de la date si on le désire.)

$ # préparons notre fichier...
$ expand -t 13,23 taquet.txt > formated1

$ # faisons notre impression
$ pr -w 40 -l 15 formated1 | head | cat -n
    1
    2
    3 2017-10-30 13:45    formated1    Page 1
    4
    5
    6 Fournitures  Quantité Prix
    7 Crayons      12        15,76
    8 Feuilles A4  1000      137,5
    9 Correcteurs  10        18
   10

$ # changeons le titre tant qu'à faire
$ pr -w 40 -l 15 -h "liste d'achats" formated1 | head | cat -n
    1
    2
    3 2017-10-30 13:47  liste d'achats  Page 1
    4
    5
    6 Fournitures  Quantité Prix
    7 Crayons      12        15,76
    8 Feuilles A4  1000      137,5
    9 Correcteurs  10        18
   10

$ # vérifions pour la largeur minimale...
$ pr -w 30 -l 15 -h "liste d'achats" formated1 | head | cat -n
    1
    2
    3 2017-10-30 13:47 liste d'achats Page 1
    4
    5
    6 Fournitures  Quantité Prix
    7 Crayons      12        15,76
    8 Feuilles A4  1000      137,5
    9 Correcteurs  10        18
   10

$ # changeons le champ de date aussi...
$ pr -w 20 -l 15 -h "liste d'achats" -D "now" formated1 | head | cat -n
    1
    2
    3 now liste d'achats Page 1
    4
    5
    6 Fournitures  Quantité Prix
    7 Crayons      12        15,76
    8 Feuilles A4  1000      137,5
    9 Correcteurs  10        18
   10

$ # gardons juste la date
$ # (obligatoire sinon utiliser cat au lieu de pr)
$ pr -w 20 -l 15 -h "" -D "" formated1 | head | cat -n
    1
    2
    3                    Page 1
    4
    5
    6 Fournitures  Quantité Prix
    7 Crayons      12        15,76
    8 Feuilles A4  1000      137,5
    9 Correcteurs  10        18
   10

On voit au passage, que la largeur minimale n'est pas 24 mais (10+1+5)+1+N+1+(4+1+1) = 17+N+7 avec :

  • champ de gauche : 10+1+5 est le nombre de caractères pour la date (10) et l'horaire (5) conformément aux normes
  • champ de droite : 4+1+1 est le nombre de caractères pour le numéro de page (<10 sinon augmenter en conséquence)
  • champ du milieu : N est le nombre de caractères composant le titre

On n'a certes pas le choix pour l'emplacement des différents éléments, mais cela correspond bien aux pratiques en vigueur que l'on bafoue avec les traitement de texte en s'improvisant typographe.

C'est beau n'est-ce pas ? Mais cette commande peut faire plus !
Dans notre exemple, il peut être intéressant de numéroter les lignes du tableau, et il sait le faire avec l'option "-n" ; pas besoin de passer par "nl" au préalable (mais ce filtre a ses petits plus…)
Par défaut, elle utilise une colonne de 5 caractères, mais on peut ajuster cela en accolant un entier à l'option.

Le contenu est séparé du numéro par une tabulation, ce qui le fait commencer en huitième colonne. On peut aussi changer ce caractère par un autre accolé à l'option.

$ # numéroter les lignes du tableau
$ pr -n -l 5 formated1
     1   Fournitures  Quantité Prix
     2   Crayons      12        15,76
     3   Feuilles A4  1000      137,5
     4   Correcteurs  10        18

$ # numéroter sur 3 colonnes
$ pr -n3 -l 5 formated1
   1     Fournitures  Quantité Prix
   2     Crayons      12        15,76
   3     Feuilles A4  1000      137,5
   4     Correcteurs  10        18

$ # il faut acoller l'argument...
$ pr -n 3 -l 5 formated1
pr: 3: No such file or directory
     1   Fournitures  Quantité Prix
     2   Crayons      12        15,76
     3   Feuilles A4  1000      137,5
     4   Correcteurs  10        18

$ # utiliser le point au lieu de la tabulation
$ pr -n. -l 5 formated1
       1.Fournitures  Quantité Prix
       2.Crayons      12        15,76
       3.Feuilles A4  1000      137,5
       4.Correcteurs  10        18

$ # utiliser l'espace au lieu de la tabulation
$ pr -n\   -l 5 formated1
    1 Fournitures  Quantité Prix
    2 Crayons      12        15,76
    3 Feuilles A4  1000      137,5
    4 Correcteurs  10        18

$ # toujours le point et sur deux colonnes
$ pr -n.2 -t -l 5 formated1
 1.Fournitures  Quantité Prix
 2.Crayons      12        15,76
 3.Feuilles A4  1000      137,5
 4.Correcteurs  10        18

$ # l'ordre importe ici...
$ pr -n3. -t -l 5 formated1
pr: `-n' extra characters or invalid number in argument: `3.'
Try `pr --help' for more information

Il peut, de la même façon convertir des espaces successifs en un seul caractère (par défaut la tabulation, comme "unexpand"), avec l'option "-i" et son corolaire avec (par défaut la tabulation en espaces, comme "expand") avec l'option "-e". Ces deux options s'utilisent comme "-n" : il y a des paramètres par défaut (espace/tabulation et huit) mais on peut indiquer son caractère et son nombre (de blanc ou espacement des taquets.)

$ # quand il y a plus de 2 espaces remplacer par 1 tab
$ # taquet en position muliple de 8 (8, 16, 24, 32, etc.)
$ echo "Quatre    Trois   Deux  Un Zero" | pr -l 1 -i | cat -t
Quatre^I    Trois^I Deux^IUn Zero

$ # quand il y a plus de 2 espaces remplacer par 1 tab
$ # taquet en position muliple de 2 (2, 4, 6, 8, 10, 12, etc.)
$ echo "Quatre    Trois   Deux  Un Zero" | pr -l 1 -i2 | cat -t
Quatre^I^ITrois^I^IDeux^IUn Zero

$ # quand il y a plus de 2 espaces remplacer par 1 tab
$ # taquet en position muliple de 12 (12, 24, 32, 64, etc.)
$ echo "Quatre    Trois   Deux  Un Zero" | pr -l 1 -i2 | cat -t
Quatre    Trois   Deux^IUn Zero

$ # quand il y a plus de 2 espaces remplacer par 1 point
$ # taquet en position muliple de 8 (8, 16, 24, 32, etc.)
$ echo "Quatre    Trois   Deux  Un Zero" | pr -l 1 -i. | cat -t
Quatre.   Trois.  Deux.Un Zero

$ # quand il y a plus de 2 espaces remplacer par 1 point
$ # taquet en position muliple de 6 (6, 12, 18, 24, etc.)
$ echo "Quatre    Trois   Deux  Un Zero" | pr -l 1 -i.6 | cat -t
Quatre    Trois.Deux.Un Zero

$ # chez moi, Ctrl+V puis Tab, sinon utiliser un fichier
$ echo "tab    tabtab        stop" | cat -t
tab^Itabtab^I^Istop

$ # remplacer les tabulations par 4 espaces
$ # en fait on positionne aux taquets multiples de 8...
$ echo "tab    tabtab        stop" | pr -l 1 -e | tr ' ' '~'
tab~~~~~tabtab~~~~~~~~stop

$ # remplacer les tabulations par 3 espaces
$ # en fait on positionne aux taquets multiples de 3...
$ echo "tab    tabtab        stop" | pr -l 1 -e3 | tr ' ' '~'
tab~~~tabtab~~~~~~stop

$ # remplacer les underscores par 3 espaces
$ # en fait on positionne aux taquets multiples de 3...
$ echo "tab_tabtab__stop" | pr -l 1 -e_3 | tr ' ' '~'
tab~~~tabtab~~~~~~stop

$ # remplacer les underscores par 4 espaces
$ # en fait on positionne aux taquets multiples de 8...
$ echo "tab_tabtab__stop" | pr -l 1 -e_ | tr ' ' '~'
tab~~~~~tabtab~~~~~~~~stop

Il y a peu de cas où cela sert vraiment, d'après mon expérience, mais la possibilité existe ; et je n'ai pas pu retrouver la cause historique.

impressions en rang et/ou partielles

Une des possibilités incontournables est le multi colonage ! Les lignes du texte qui est passé à la commande, sont divisées en autant de colonnes que demandées par l'option numérique (qui est donc "-1" par défaut, et on utilisera "-2" pour faire une double colonne et "-3" pour une triple, etc.), puis ces colonnes sont juxtaposées horizontalement (comme avec "paste" ou "rs" par exemple.)
Le séparateur entre colonnes est l'espace, que l'on peut changer avec l'option "-s" auquel on accole le caractère voulu (mais contrairement au "-d" de "paste" on ne peut pas alterner plusieurs séparateurs)
L'implémentation GNU propose l'option "-S" qui ici ne change rien… (tout comme "-W" ne change rien dans le cas présent) on y reviendra.

$ # GNU/Linux: quelle est la plus longue ligne?
$ # et on voit qu'une largeur de 30 convient
$ wc -L formated1
28 formated1

$ # cat formated1
$ pr -l 4 -w 30 formated1
Fournitures  Quantité Prix
Crayons      12        15,76
Feuilles A4  1000      137,5
Correcteurs  10        18

$ # sur 2 colonnes de 30/2
$ # lignes "Fourn..." et "Crayo..." d'une part
$ # lignes "Feuil..." et "Corre..." d'autre part
$ pr -2 -l 4 -w 30 formated1
Fournitures  Q Feuilles A4  1
Crayons             1 Correcteurs  1

$ # sur 2 colonnes de 60/2
$ # lignes "Fourn..." et "Crayo..." d'une part
$ # lignes "Feuil..." et "Corre..." d'autre part
$ pr -l 4 -w 60 -2 formated1
Fournitures  Quantité Prix     Feuilles A4  1000      137,5
Crayons             12        5,76   Correcteurs  10        18

$ # sur 2 colonnes de 60/2
$ # avec le point au lieu d'espace
$ pr -l 4 -2 -w 60 -s. formated1
Fournitures  Quantité Prix    .Feuilles A4  1000      137,5
Crayons             12        5,76  .Correcteurs  10        18

$ # attention à bien le coller...
$ pr -l 4 -2 -w 60 -s . formated1
pr: .: Is a directory

$ # sur 2 colonnes de 30/2
$ # avec rien au lieu d'espace
$ pr -l 4 -2 -w 30 -s formated1
Fournitures  QuFeuilles A4  1
Crayons             12Correcteurs  1

$ # sur 2 colonnes de 30/2
$ # avec point au lieu d'espace
$ # et en numérotant (on voit la répartition des lignes)
$ pr -l 4 -2 -w 30 -s. -n formated1
    1  Fourni.    3   Feuill
    2  Crayon.    4   12Corr

J'avoue que cet exemple n'est pas le mieux, mais ça montre toute la difficulté de la chose et la nécessité d'avoir une commande dédiée pour « mettre en page » avant d'imprimer. Prenons un autre exemple, qui va nous permettre de mettre en évidence l'option "-a" (change le sens de colonage) qui peut être utile dans certains rares cas :

$ # préparons notre fichier...
$ # pour être à 28 comme formated1
$ fold -s -w 28 wrap.txt > formated0

$ # imprimons en 2 colonnes de 60/2
$ # remplissage normal, en N par page: P1C1, P1C2, P2C1, P2C2
$ pr -2 -w 60 -l 15 -f formated0 | cat -n
    1
    2
    3 2017-11-01 13:05             formated0             Page 1
    4
    5
    6 The _fold_ utility is a      column position (or bytes.
    7 filter that shall fold       if the *-b* option is
    8 lines from its input files,  espicified).
    9 but breaking the lines to    Use *-* option to split at
   10 have a maximum of _width_    latest space before maximum
   11 ^L
   12
   13 2017-11-01 13:05             formated0             Page 2
   14
   15
   16 _width_.                     input files, but break the
   17                              lines to have a maximum of
   18 The _fmt_ utility is a       _width_ column position.
   19 filter that shall reformat
   20 each paragraph from its
   21 ^L


$ # imprimons en 2 colonnes de 60/2
$ # remplissage alternatif, en Z par lignes successives...
$ pr -2 -w 60 -l 15 -f formated0 | cat -n
    1
    2
    3 2017-11-01 13:05             formated0             Page 1
    4
    5
    6 The _fold_ utility is a      filter that shall fold
    7 lines from its input files,  but breaking the lines to
    8 have a maximum of _width_    column position (or bytes,
    9 if the *-b* option is        specified).
   10 Use *-s* option to split at  latest space before maximum
   11 ^L
   12
   13 2017-11-01 13:05             formated0             Page 2
   14
   15
   16 _width_.
   17 The _fmt_ utility is a       filter that shall reformat
   18 each paragraph from its      input files, but break the
   29 lines to have a maximum of   _width_ column position.
   20
   21 ^L

$ # imprimons en 2 colonnes de 60/2
$ # remplissage alternatif, en Z par lignes successives...
$ pr -2 -w 60 -l 12 -f formated1 | cat -n
    1
    2
    3 2017-11-01 13:09             formated1             Page 1
    4
    5
    6 Fournitures Quantité Prix     Crayons     12      15,75
    7 Feuilles A4 10000     137,5  Correcteurs  10      18
    8 ^L

Je n'ai eu à utiliser ce truc qu'une seule fois, pour imprimer un index de noms (à raison d'un par ligne dans le fichier) triés (par "sort")
Il y a aussi l'option "-d", sans paramètre, que j'invite à tester.

Il y une autre option un peu étrange qu'il peut être utile de connaître : "+" qui permet de commencer à partir d'une page donnée… L'implémentation GNU permet permet en plus d'indiquer une s'arrêter à une page donnée…
Avec cette option, l'implémentation GNU propose une option "-N" pour réinitialiser le compteur quand on utilise l'option "-n" et c'est pas mal.

$ # par défaut, toutes les 4 pages
$ # (de la première à la dernière donc)
$ pr -w 30 -l 15 -f formated0 | cat -n
    1
    2
    3 2017-10-30 13:54 formated0 Page 1
    4
    5
    6 The _fold_ utility is a
    7 filter that shall fold
    8 lines from its input files,
    9 but breaking the lines to
   10 have a maximum of _width_
   11 ^L
   12
   13 2017-10-30 13:54 formated0 Page 2
   14
   15
   16 column position (or bytes,
   17 if the *-b* option is
   18 specified).
   19 Use *-s* option to split at
   20 latest space before maximum
   21 ^L
   22
   23 2017-10-30 13:54 formated0 Page 3
   24
   25
   26 _width_.
   27
   28 The _fmt_ utility is a
   29 filter that shall reformat
   30 each paragraph from its
   31 ^L
   32
   33 2017-10-30 13:54 formated0 Page 4
   34
   35
   36 input files, but break the
   37 lines to have a maximum of
   38 _width column position.
   39
   40
   41 ^L

$ # possible seulement à partir de la 3ème...
$ # (de la 3ème à la dernière page donc)
$ pr -w 30 -l 15 -f +3 formated0 | cat -n
    1
    2
    3 2017-10-30 13:54 formated0 Page 3
    4
    5
    6 _width_.
    7
    8 The _fmt_ utility is a
    9 filter that shall reformat
   10 each paragraph from its
   11 ^L
   12
   13 2017-10-30 13:54 formated0 Page 4
   14
   15
   16 input files, but break the
   17 lines to have a maximum of
   18 _width column position.
   19
   20
   21 ^L

$ # il n'y a pas de 5ème page...!
$ # (j'utilise l'astuce avec 999
$ # pour avoir le nombre de pages)
$ pr -w 40 -l 17 +5 formated0
pr: starting page number 5 exceeds page count 4

$ # GNU pr permet de la 2ème à la 3ème...
$ pr -w 30 -l 15 -f +2:3 formated0 | cat -n
    1
    2
    3 2017-10-30 13:54 formated0 Page 2
    4
    5
    6 column position (or bytes,
    7 if the *-b* option is
    8 specified).
    9 Use *-s* option to split at
   10 latest space before maximum
   11 ^L
   12
   13 2017-10-30 13:54 formated0 Page 3
   14
   15
   16 _width_.
   17
   18 The _fmt_ utility is a
   19 filter that shall reformat
   20 each paragraph from its
   21 ^L

$ # GNU pr permet juste la 3ème...
$ pr -w 30 -l 15 -f +3:3 formated0 | cat -n
    1
    2
    3 2017-10-30 13:54 formated0 Page 3
    4
    5
    6 _width_.
    7
    8 The _fmt_ utility is a
    9 filter that shall reformat
   10 each paragraph from its
   11 ^L

$ # pour juste les 2 premières bien indiquer 1:2
$ pr -w 30 -l 15 -f +:2 formated0
pr: invalid + argument `:2'

$ # quand on numérote la page 4
$ pr -w 30 -l 15 -f +4 -n formated0 | cat -n
    1
    2
    3 2017-10-30 13:54 formated0 Page 4
    4
    5
    6    16   input files, but break the
    7    17   lines to have a maximum of
    8    18   _width column position.
    9    19
   10    20
   11 ^L

$ # GNU nous permet de dire qu'on commence
$ # à la 4ème ligne (du second paragraphe)
$ pr -w 30 -l 15 -f +4 -n -N 4 formated0 | cat -n
    1
    2
    3 2017-10-30 13:54 formated0 Page 4
    4
    5
    6     4   input files, but break the
    7     5   lines to have a maximum of
    8     6   _width column position.
    9     7
   10     8
   11 ^L

On remarque au passage (première ligne du texte ou sixième imprimée, à la troisième page) que "pr" ne connait pas la notion de paragraphes, ou en tout cas ne gère pas le difficile problème de veuvage et d'orphelinage des lignes (lignes creuses/isolées/désolidarisées.)

impressions de livrets

Tout comme "fold" et "fmt", "pr" peut prendre plusieurs fichiers en entrée. Sans l'utilisation de l'option "-h" chaque fichier se voit indiqué car les fichiers sont parcourus séquentiellement de sorte que chacun commence sur une nouvelle page. Mieux, les fichiers suivants commencent toujours sur une page impaire (c'est pratique quand chaque fichier représente un chapitre de votre manuscrit par exemple) ce qui est top ! Par contre, il recommence la pagination (ce qui est pratique si on imprime des documents séparés mais pas génial si on imprime un livre éclaté en plusieurs fichiers) et peut produire des pages vides (l'algorithme est relativement simple et correspond à la plupart des cas courants.) En tout cas, tout cela est fait automatiquement…

$ # préparons notre fichier...
$ fold -w 40 -s wrap.txt > formated2

$ # faisons notre impression 1 colonne
$ # c'est séquentiel, normal.
$ pr -w 40 -l 17 formated2 formated1 | cat -n
    1
    2
    3 2017-10-30 13:45    formated2    Page 1
    4
    5
    6 The _fold_ utility is a filter that
    7 shall fold lines from its input files,
    8 but breaking the lines to have a
    9 maximum of~ width ~column position (or
   10 bytes, if the *-b* option is specified)
   11 Use *-s* option to split at latest
   12 space before maximum _width_.
   13
   14
   15
   16
   17
   18
   19
   20 2017-10-30 13:45    formated2    Page 2
   21
   22
   23
   24 The _fmt_ utility is a filter that
   25 shall reformat each paragraph from its
   26 input files, but break the lines to
   27 have a maximum of _width_ column
   28 position.
   29
   30
   31
   32
   33
   34
   35
   36
   37 2017-10-30 13:45    formated2    Page 3
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54 2017-10-30 13:45    formated1    Page 1
   55
   56
   57 Fournitures  Quantité Prix
   58 Crayons      12        15,76
   59 Feuilles A4  1000      137,5
   60 Correcteurs  10        18
   61
   62
   63
   64
   65
   66
$ pr -w 40 -l 17 -f formated2 formated1 | cat -n
    1
    2
    3 2017-10-30 13:47    formated2    Page 1
    4
    5
    6 The _fold_ utility is a filter that
    7 shall fold lines from its input files,
    8 but breaking the lines to have a
    9 maximum of~ width ~column position (or
   10 bytes, if the *-b* option is specified)
   11 Use *-s* option to split at latest
   12 space before maximum _width_.
   13 ^L
   14
   15 2017-10-30 13:47    formated2    Page 2
   16
   17
   18
   19 The _fmt_ utility is a filter that
   20 shall reformat each paragraph from its
   21 input files, but break the lines to
   22 have a maximum of _width_ column
   23 position.
   24
   25 ^L
   26
   27 2017-10-30 13:47    formated2    Page 3
   28
   29
   30
   31 ^L
   32
   33 2017-10-30 13:47    formated1    Page 1
   34
   35
   36 Fournitures  Quantité Prix
   37 Crayons      12        15,76
   38 Feuilles A4  1000      137,5
   39 Correcteurs  10        18
   40 ^L

$ # il n'y a pas de 4ème page...
$ pr -w 40 -l 17 +4 formated1 formated2
pr: starting page number 4 exceeds page count 1
pr: starting page number 4 exceeds page count 3

$ # faisons notre impression 2 colonnes
$ # c'est toujours séquentiel.
$ pr -w 60 -l 17 -2 formated0 formated1 | cat -n

Il y a cependant une option sympathique quand on imprime plusieurs fichiers : "-m" qui va faire autant de colonnes que de fichiers, et c'est incompatible avec l'option de colonage.

$ # mettre côte à côte les 2 fichiers
$ pr -w 60 -l 15 -f -m formated0 formated1 | head
    1
    2
    3 2017-10-30 13:54                                    Page 1
    4
    5
    6 The _fold_ utility is a       Fournitures Quantité Prix
    7 filter that shall fold        Crayons     12        15,76
    8 lines from its input files,   Feuilles A4 10000     137,5
    9 but breaking the lines to     Correcteurs 10        18
   10 have a maximum of _width_

$ # mettre côte à côte les 2 fichiers
$ pr -w 60 -l 15 -f -m formated0 formated2 | cat -n
    1
    2
    3 2017-10-30 13:55                                     Page 1
    4
    5
    6 The _fold_ utility is a       The _fold_ utility is a filte
    7 filter that shall fold        shall fold lines from its inp
    8 lines from its input files,   but breaking the lines to hav
    9 but breaking the lines to     maximum of _width_ column pos
   10 have a maximum of _width_     bytes, if the *-b* option is
   11 ^L
   12
   13 2017-10-30 13:55                                     Page 2
   14
   15
   16 column position (or bytes,    Use *-s* option to split at l
   17 if the *-b* option is         space before maximum _width_.
   18 specified).
   19 Use *-s* option to split at   The _fmt_ utility is a filter
   20 latest space before maximum   shall reformat each paragraph
   21 ^L
   22
   23 2017-10-30 13:55                                     Page 3
   24
   25
   26 _width_.                      input files, but break the li
   27                               have a maximum of _width_ col
   28 The _fmt_ utility is a        position.
   29 filter that shall reformat
   30 each paragraph from its
   31 ^L
   32
   33 2017-10-30 13:55                                     Page 4
   34
   35
   36 input files, but break the
   37 lines to have a maximum of
   38 _width column position.
   39
   40
   41 ^L

$ # mettre côte à côte les 3 fichiers
$ pr -w 70 -l 15 -m formated0 formated1 formated2 | head
    1
    2
    3 2017-10-30 13:54                                               Page 1
    4
    5
    6 The _fold_ utility is  Fournitures  Quantité P  The _fold_ utility is
    7 filter that shall fold Crayons      12          shall fold lines from
    8 lines from its input f Feuilles A4  10000       but breaking the lines
    9 but breaking the lines Correcteurs  10          maximum of _width_ col
   10 have a maximum of _wid                          bytes, if the *-b* opt

$ # ce n'est pas compatible avec le colonnage forcé...
$ pr -w 70 -l 15 -m -4 formated0 formated1 formated2
pr: cannot specify number of columns when printing in parallel

$ # ...pareil pour le format alternatif (Z au lieu de W)...
$ pr -w 70 -l 15 -m -a formated0 formated1 formated2
pr: cannot specify printing accross and printing in parallel

$ # ...mais le changement de séparateur fonctionne
$ pr -w 70 -l 15 -m -s\| formated? | head
    1
    2
    3 2017-10-30 13:56                                               Page 1
    4
    5
    6 The _fold_ utility is |Fournitures  Quantité P |The _fold_ utility is
    7 filter that shall fold|Crayons      12         |shall fold lines from
    8 lines from its input f|Feuilles A4  10000      |but breaking the lines
    9 but breaking the lines|Correcteurs  10         |maximum of _width_ col
   10 have a maximum of _wid|                        |bytes, if the *-b* opt

C'est une variante intéressante de "diff -y"…

Noter qu'aucun nom de fichier n'est privilégié et qu'il n'y a pas de « mix » particulier. Mais on peut utiliser "-h" pour ajouter son propre titre.

L'implémentation GNU propose aussi une option "-J" qui avec annule la troncature des lignes qui dépassent la largeur spécifiée par "-w".

chasse fixe

L'utilitaire "pr" permet diverses mises en pages plus ou moins avancées pour une impression brute/directe (i.e. sans passer par un pilote, l'imprimante pouvant gérer du pur texte et étant dans le mode qui va bien, on y reviendra.) Elle a pléthore d'options pour satisfaire la plupart des caprices. Elles n'ont pas toutes été évoquées ici, et j'invite à parcourir le « man page » associé dans la distribution qu'on utilise.

OpenBSD/FreeBSD GNU AIX POSIX
+Ⅰ +Ⅰ +Ⅰ +Ⅰ begin output at page number
+Ⅰ:Ⅼ output pages from number to
-Ⅰ -Ⅰ -Ⅰ -Ⅰ produce columns wide
-a -a -a -a fill columns Across the page in a round robin order
-c show Control chars
-d -d -d -d produce Double spaced output
-D Ⅹ use as header Date format
-eⅭⅠ -eⅭⅠ -eⅭⅠ -eⅭⅠ Expand each input (default tab) to n×Ⅰ+1 (default 8)
-F -F -F -F use Form feed char. for new pages, not multiple newline
-f -f -f -f same as -F plus pause on stdout
-h _ -h Ⅹ -h Ⅹ -h Ⅹ use instead of filename as centered Header
-iⅭⅠ -iⅭⅠ -iⅭⅠ -iⅭⅠ replace multiple blanks by char. (default tab) at n×Ⅰ+1 (default 8) in output
-J Join lines, i.e. merge full lines and turn off -W truncation
-l Ⅰ -l Ⅰ -l Ⅰ -l Ⅰ set page Length to lines
-m -m -m -m Merge contents of multiple files (lines side by side)
-nⅭⅠ -nⅭⅠ -nⅭⅠ -nⅭⅠ print line Number separated by char. (default tab) using width column (default 5)
-N Ⅰ first line Number printed with +Ⅰ
-o Ⅰ -o Ⅰ -o Ⅰ -o Ⅰ precede each line of output with space as Offset
-p -p Pause before each page on TTY
-r -r -r -r no diagnostic Reports on file open failure
-sⅭ -sⅭ -sⅭ -sⅭ Separate text columns with char. (default tab) instead of spaces, turn off truncation when no -s
-SⅭ Separate text columns with char, (default space with -J or tab), but no effect on columns
-t -t -t -t omit five+five lines of header+Trailers on each page
-T omit headers+Trailers and pagination by form feed in input
-w Ⅰ -w Ⅰ -w Ⅰ -w Ⅰ set the Width of the line to instead of 72 (when not -s) or 512 (when -s)
-W Ⅰ set page Width to instead of 72, truncate except -J but no interference with -s or -S

Avant de finir, revenons sur les largeurs par défaut :

  • 80 fold
  • 75 fmt
  • 72 par
  • 72 pr

Cela va faire bizarre aujourd'hui à ceux qui n'ont pas connu les « polices à chasse fixe » —comme Consolas, Courier New, DejaVu Sans Mono, Droid Sans Mono, Inconsolata, Menlo, Lucida Console, Monaco, Terminal, etc.— et les fontes qui caractérisent les imprimantes à impacts :

Les limites (entre 70 et 80 caractères) sont historiques, adaptées aux consoles (plus exactement les moniteurs) standards comme le IBM 3270 et ses variantes et compatibles (80 caractères) ainsi que les téléscripteurs (72 caractères) même s'il y a eu rapidement des équipements pouvant atteindre 132 caractères… Il se trouve, que pour pour une petite fonte lisible (soit une taille de caractère standard de 10 pitch ou ~20 CPI —environ ⅙ᵉ pouce ou un pica—) on a bien 72 CPL …qui correspond au format standard de papier américain « letter de 8.5×11 pouces ».
Cependant, certains suggèrent de faire moins (entre 50 et 70 CPL), ce qu'on obtient avec une plus grande fonte (soit une taille de caractère standard de 12 pitch ou ~17 CPI —alias un elite pour les IBM Selectric—).
 Selectric iii balls
Les journaux ne s'y sont pas trompé en privilégiant le multi colonage (avec un optimum entre 40 et 50 par colonne…) !

Alors, à l'heure des polices proportionnelles (qui posent des soucis très différents et où il faut raisonner en « pixels » et non plus en caractères), est-ce que tout ceci est dépassé ? Pas vraiment. D'une part la chasses fixe peut s'utiliser avec le matériel récent réglé comme il se doit, d'autre part il y a encore pas mal de machines pro qui sont matricielles dont beaucoup utilisent de très petites largeurs de papier
Twitter receipt printer
(Parmi les principaux fabricants, on trouve Sharp, Casio, et bien d'autres. Ceci dit, comme toujours, il n'est pas obligatoire que l'imprimante et le clavier et le logiciel ne fassent qu'un —les uns et les autres aiment vendre des solutions tout-en-un mais dont on se retrouve prisonnier…) Ces dernières sont souvent des imprimantes thermiques (nombreux direct ou à transfert et quelques uns à sublimation) ou à diodes, connectable par USB ou sans fil, fonctionnant sur secteur, etc.

J'ai eu pendant quelques temps la HP 82240B qui est une imprimante de poche connectée par IR que je n'ai pu utiliser (en dehors de ma calculatrice) qu'avec Linux ! Comme le rappelle Sylvain cote sur HPMuseum, elle a 2 jeux de caractères et 3 fontes (6 et 7 points de haut ainsi qu'une moins connue de 5 points) permettant d'avoir 24 et 32 CPL ainsi que 48 !

Mis à part le packaging vraiment bien fichu et l'électronique très bien maîtrisé par l'équipe de Corvallis, on peut faire la même chose avec d'autres composants ou en faire d'autres usages (suffit d'avoir un adaptateur IR…)

hp-82240b
Sur cette note de nostalgie, j'arrête ce qui n'est plus loin de devenir un roman. À bientôt peut-être pour la suite de cette exploration, et si des points t'ont interpelé ou paru peu clair, n'hésite pas : ça se passe en commentaires.

  • # Ça ferait une bonne dépêche je trouve

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

    Et ça donnerait plus visibilité au contenu :-).

    « Tak ne veut pas quʼon pense à lui, il veut quʼon pense », Terry Pratchett, Déraillé.

    • [^] # Re: Ça ferait une bonne dépêche je trouve

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

      Arf… Faut croire que je n'ai toujours pas bien compris la charte éditoriale de LinuxFr :-( Comme il s'agit de redécouverte de commandes (en fait j'ai recyclé d'anciens cours que je donnais) mêlé à des réflexions perso (pour une dépêche, il y a des passages que j'aurais clairement reformulé autrement) et que ça parlait pas d'un produit particulier ou d'une techno particulière (en fait je présente la chose comme un voyage dans l'état d'esprit des adeptes de la ligne de commandes jusque dans les années 1980 ou 1990 au plus) bah voilà (je n'ai pas jugé pertinent de faire autre chose qu'un journal, encore que j'ai hésité à partager plutôt sur developpez.com ou zestedesavoir.com mais ce n'étais pas organisé pour ces plateformes et il y avait surtout trop d'avis subjectifs) :/

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

    • [^] # Re: Ça ferait une bonne dépêche je trouve

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

      La suite est presque prête. Ce sera une dépêche si plus de gens le signifient en plussant ton commentaire. La valeur à atteindre est 16 (parce-que 0xF simplement)

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

  • # Liens

    Posté par  . Évalué à 2.

    Merci pour ton journal qui donne envie de s'intéresser aux technos abordées. J'ai repéré deux liens qui marchent pas : http://coin.des.experts.pagesperso-orange.fr/reponses/faq9_33.html renvoie vers un 404 et https://www.industrie-techno.com/l-imprimante-matricielle-est-elle-l-avenir.1146 renvoie vers une autre page du même domaine.

    • [^] # Re: Liens

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

      Rhaa…! Bonne pioche ! Je pensais avoir vérifié tous les liens retenus (j'en ai viré d'autres pour ne pas faire doublon) mais j'en ai visiblement oublié. Merci pour la relecture attentive ; je me sens vraiment minable pour ces erreurs désagréables.

      Pour le premier, c'est une faute d'attention de ma part : j'ai vu le site aficher une page mais n'ai pas pris le temps de me rendre compte que c'est une page qui n'existe plus…

      Pour la seconde, je vais devoir solliciter la modération pour remplacer par celui-ci : http://www.ordinateur.cc/Mat%C3%A9riel/Imprimantes/26180.html
      J'ai visiblement gardé le mauvais et viré le bon (mais en vrai je ne me souviens pas d'avoir vérifié industrie-techno car occupé à me battre avec le MarkDown.)

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

      • [^] # Re: Liens

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

        Corrigé, merci.

        • [^] # Re: Corrections modération

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

          Merci beaucoup.

          Je viens de voir un truc qui ne m'avait pas sauté aux yeux :

          not skip lines matching '^.'

          qu'il faudrait plutôt remplacer par :

          not skip lines starting with '.'

          ou corriger (en tenant compte du MD de LinuxFr) en :

          not skip lines matching '\^\\.'

          Ça me tue ces glitches… Dans le même esprit, j'ai un certain nombre de double ou triple espaces en fin de ligne qu'il faudrait virer : ça rajouter visiblement une ligne vide alors que l'intention était juste de passer à la ligne (en restant dans le même paragraphe)

          Et sinon je n'ai toujours pas répondu pour le premier lien : il faut le virer (je n'ai pas de lien de lien de substitution et ne me rappelle pas le contenu de la page pour en trouver un équivalent.)

          “It is seldom that liberty of any kind is lost all at once.” ― David Hume

        • [^] # Re: Autres corrections

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

          C'est fou le nombre d'erreurs qu'il reste après avoir publié ; faut que je trouve un workflow qui limite cela (i.e. pouvoir catch certains problèmes avant publication) ; si des gens ont des suggestions je prends.


          Dans mon introduction, il y a une parenthèse qui s'est barrée… même si la virgule permet de comprendre… Le source (sans saut de ligne) devrait ressembler à :

          l'influence des
          [télescripteurs](https://fr.wikipedia.org/wiki/T%C3%A9l%C3%A9scripteur) (en
          tant que [périphériques
          d'entrée-sortie](https://fr.wikipedia.org/wiki/P%C3%A9riph%C3%A9rique_informatique#Types_de_p%C3%A9riph%C3%A9riques))
          sur le [système Unix](https://fr.wikipedia.org/wiki/UNIX_System_V), un
          [processeur de textes commandé
          textuellement](https://linuxfr.org/users/mrspackman/journaux/l-esprit-unix-une-culture-des-mots)…

          Je note que les doubles espaces en fin de ligne ont été corrigés et remercie pour cela.


          Il y l'avant-dernier paragraphe de la partie « ajustement des paragraphes à une largeur », juste après le tableau, dont un guillemet s'est évadé (source suivant sans saut de ligne)

          Ceci dit, il ne faut se limiter qu'à une option, "`-w…`", 
          voire même juste "`-…` (puisque

          Par ailleurs, la parenthèse n'a de sens que si je n'oublie pas l'option dans le tableau… mais passons. Je note surtout le saut de ligne dans le lien… (le Markdown de LinuxFr traite tout passage à la ligne comme un saut de ligne)
          Enfin, il y a bout après le lien, ce qui fait qu'on devrait avoir (sans les sauts de lignes)

          Ceci dit, il ne faut se limiter qu'à une option, "`-w…`" (voire même 
          juste "`-…`" puisque [d'anciennes implémentation AIX ne connaissent que ce
          dernier](https://stackoverflow.com/a/17225565/1699311) mais que cette dernière
          forme n'est pas reconnue sur Plan9…)

          Des broutilles mais on se creuse moins la tête pour comprendre.

          Dans cette même partie, une ligature a échappé à ma vigilance pendant la rédaction : il faut lire « œuvre » et non « oeuvre » …même si ça semble être du chipotage hahaha.


          Au début de la partie « balle au centre et égalisation », cette fois-ci c'est un crochet ouvrant qui s'est fait la malle… Le source devrait ressembler à :

          (ce qui peut se faire avec "[`awk`](https://superuser.com/a/915899/161454)" qui est

          J'espère que je n'en ai pas d'autres comme ça qui ont échappé à la prévisualisation avant publication.


          Dans la partie « impressions en rang et/ou partielles » j'ai introduit deux commandes, que je pense sont connues de beaucoup, mais ai oublié de mettre un lien qui va bien dessus. C'est parce-que dans les cours elles sont vues longtemps avant cette partie qui est en plus survolée (malgré l'exhaustivité de mes notes on ne chipote pas autant et on essaye surtout de voir les exemples plus ou moins dans l'ordre.) Donc voici ce à quoi devrait ressembler le code source (sans les sauts de lignes rajoutés pour ne pas faire déborder l'affichage ici) :

          puis ces colonnes sont justaposées horizontalement (comme avec
          "[`paste`](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/paste.html)"
          ou "[`rs`](https://manpagez.com/man/1/rs/)" par exemple.)

          Pareil vers la fin de la partie « impressions de livrets » où je mentionne la commande diff que je pense que la majorité connaît ici.

          C'est une variante intéressante de 
          "[`diff -y`](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/diff.html)"…

          Je pense (et espère) que c'est tout.

          “It is seldom that liberty of any kind is lost all at once.” ― David Hume

          • [^] # Re: Autres corrections

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

            Je pense (et espère) que c'est tout.

            Que nenni…

            On me fait remarquer que cette partie

            Avant de finir, revenons sur les largeurs par défaut :
            
              - 80 fold
              - 75 fmt
              - 72 par
              - 72 pr

            devrait être plutôt

            Avant de finir, revenons sur les largeurs par défaut :
            
              - 80 fold
              - 75/[72](http://publib16.boulder.ibm.com/doc_link/en_US/a_doc_lib/cmds/aixcmds2/fmt.htm)/[70](https://manpages.debian.org/wheezy/9base/plan9-fmt.1.en.html) fmt
              - 72 par
              - 72 pr

            Je note aussi un saut de ligne oublié par ici

            le tout en gérant l'Unicode (en UTF-8) ! La largeur est aussi indiquée avec
            "`-w ...`" (on peut utiliser juste "`w...`" ou "`...`") et est par défaut `72`

            (et j'avais en plus oublié l'espace insécable avant le point d'exclamation)
            ainsi que, bien plus haut, par ici

            J'utilise cette commande dans mes scripts pour des traitements caractère par
            caractère :

            “It is seldom that liberty of any kind is lost all at once.” ― David Hume

            • [^] # Re: Autres corrections

              Posté par  (site web personnel, Mastodon) . Évalué à 2. Dernière modification le 18 février 2022 à 00:43.

              up… :-)

              Je me rend compte que je n'ai que des titres de niveau 2 …qui sont donc sous le sommaire (unique niveau 1) :-o Si des modos passent par là, j'aimerais :

              D'une part augmenter le premier titre d'un niveau, soit

              # intro au kilomètre

              Je me demande s'il ne faut pas faire la même chose pour le dernier titre aussi

              # chasse fixe

              D'autre part, j'aimerais ajouter un titre avant le paragraphe « Une fois son texte saisi (input mode) et corrigé (command mode), il faut le mettre en forme pour l'impression (ou l'affichage sur le[…] »

              # reflux au large

              (l'ajout de ce titre intermédiaire m'a paru plus simple et plus rapide que de devoir décaler tous les autres titres)

              Merci.

              “It is seldom that liberty of any kind is lost all at once.” ― David Hume

  • # Très, très intéressant

    Posté par  (Mastodon) . Évalué à 2.

    Un grand merci, donc. Et vivement une suite :)

    Pour rebondir sur un aspect secondaire (quoique ?): j'avoue que ces mini-imprimantes dont tu parles m'ont toujours attiré l’œil. Je n'ai jamais fait l'effort de me renseigner sur la possibilité de les utiliser pour çà, mais je me suis parfois demandé comment on pourrait les utiliser pour diffuser des textes dans d'autres formats (le rouleau, ça n'aurait rien de révolutionnaire pour diffuser des textes ;)). Et comment ce format différent impacterait l'écriture: un autre rythme, une autre lecture ? Bref.

    • [^] # Re: Très, très intéressant

      Posté par  . Évalué à 5.

      J'en avais utilisé dans un projet artistique (pour faire tomber des citations littéraires du plafond d'une médiathèque, avec la fonction "coupe de papier automatique" intégrée à l'imprimante). De mémoire, sous Linux c'était quand même pas gagné, c'est souvent des drivers un peu moisis et proprio, avec une doc minimaliste.

      J'en ai aussi vu dans des expos d'art contemporain de temps en temps, en écriture automatique par exemple.

    • [^] # Re: Très, très intéressant

      Posté par  (site web personnel, Mastodon) . Évalué à 5. Dernière modification le 06 février 2022 à 17:21.

      Pour ce qui est de diffuser des textes dans d'autres formats, je crois que c'est déjà fait en ce qui concerne l'usage de petites largeurs …avec la démocratisation des smartphones et les nouvelles générations (dites « digital native ») qui ne touchent plus du bois en dehors des ouvrages scolaires. Le succès de plateformes comme Wattpad, qui n'est utilisé que sur smartphone (je le précise parce-que j'ai cru comprendre qu'il y a une interface web), confirme la lecture étroite de récits non ? D'un autre côté, on note une forte consommation de PDF et similaires sur ces petits appareils qui ont de plus en plus de diagonales : du coup, on a une vision qui s'adapte plus aux pattes de mouches et/ou on développe l'aptitude à zoomer et scroller des doigts ?

      Pour en revenir aux mini-imprimantes, il faut faire gaffe à mon enthousiasme : je pense que de moins en moins utilisent des fontes et surtout peuvent recevoir du texte brut… Or comme le fait remarquer le commentaire de cg, dès qu'il faut passer par un pilote c'est une autre paire de manche (et ces petits bijoux ne comprennent pas PS ou PCL) ; même quand ce n'est pas le tout-en-un des caisses que je dénonce, c'est du matériel fermé avec des pilotes tout autant ouverts. C'est dommage pour l'exploration et l'expression.

      Bon, je m'attèle à la suite rapidement.

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

      • [^] # Re: Très, très intéressant

        Posté par  (Mastodon) . Évalué à 3.

        Pour ce qui est de diffuser des textes dans d'autres formats, je crois que c'est déjà fait en ce qui concerne l'usage de petites largeurs …avec la démocratisation des smartphones et les nouvelles générations (dites « digital native »)

        Oui, c'est certain. Et c'est très intéressant d'essayer de suivre leurs (nouveaux) usages, leurs (nouvelles) façons de consommer et de produire des contenus qui y soient adaptés (ou, de ce que j’en ai vu, pas toujours vraiment bien adaptés).

        Cela dit, je reste curieux de voir ce qu'il serait possible de faire avec ces petits formats imprimés que sont, en gros, ces tickets de caisse qu l’on trouve partout. Autant pour les auteurs que pour les lecteurs.

        Après tout, des caisses enregistreuses aux distributeurs de billets de banque, en passant par les terminaux de paiements, on trouve chaque fois cette mini imprimante qui te sort ce petit bout de papier que la plupart va rouler en boule sans le lire, avant de le jeter (à la poubelle, pas par terre merci). Une imprimante qui, au lieu d'un morne ticket de caisse, pourrait délivrer de la poésie ou de courts textes, le dernier paragraphe de tel ou tel feuilleton ou d’un (bout de) discours, d’une propagande pro/anti-gouvernementale, ou encore des messages des hackers (au nom de tel mouvement revendicatif ou de justice sociale, ou autre), ou encore des prières, un horoscope (et comment il connaîtrait le signe de la personne ou sa croyance? Ou alors, il y aurait pas le choix ?), un billet de loterie (avec quels gains potentiels? Qu'est-ce qui ferait rêver la masse de ces citoyens?), etc. Ou des images aussi, bien entendu.

        On va dire que l'amateur de SF en moi s'étonne de ne pas voir plus de détournements (dans le genre de ce que ta vidéo dans ton autre réponse montre bien, merci d'ailleurs), que ce soit dans des fictions ou dans notre quotidien le plus réel, de ces outils d'impression qui sont pourtant omniprésents au point que plus personne ne les remarque, et dont un bon paquet sont connectés…

        Le pessimiste en moi se dit parfois que ce désintérêt pour cet outil (dont le simple fait d'avoir osé imaginer son existence, il n’y a pas si longtemps que ça encore, ici même en Europe (France comprise), aurait pu te valoir si pas le bûcher au minimum de sérieuses emmerdes avec les autorités politiques et religieuses). Ce désintérêt, donc, serait peut-être un indice de plus que le texte, les mots imprimés, ne sont plus porteurs de ce pouvoir qu'on leur a si longtemps associé : informer, éduquer pour (faire) changer les choses ou pour (pouvoir) leur résister ?

        Mais bon, c'est seulement le pessimiste en moi qui se dit ça et il se trompe. Il doit se tromper.

        • [^] # Re: Très, très intéressant

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

          Ce désintérêt, donc, serait peut-être un indice de plus que le texte, les mots imprimés, ne sont plus porteurs de ce pouvoir qu'on leur a si longtemps associé : informer, éduquer pour (faire) changer les choses ou pour (pouvoir) leur résister ?

          L'imprimerie a été une révolution …parce-que on pouvait dupliquer plus vite et plus fidèlement qu'avec les scribes/copistes (moines ou pas.) Et pouvoir faire du volume va permettre une plus grande diffusion…
          On a enfin libéré l'écrit, et poursuivi sur cette lancée en démocratisant et simplifiant les procédés de création (en passant par la machine à écrire pour arriver à l'ordinateur avec traitement de texte présent un peu partout de nos jours) et de presse (pensons aux imprimantes devenues accessibles aux particuliers et donc les qualités vont en s'améliorant —contrairement aux coûts des cartouches mais c'est un autre débat) ou diffusion au plus large (aujourd'hui la publication sur la toile Internet, avec son foisonnement de blogs persos à une époque d'avant la main mise des réseaux asociaux…) Mais si si on a libéré l'écrit, il faut une étape en plus qui ne prend toujours pas à mon avis. On a cru que si tout le monde passait par la case école (pour d'autres raisons que celle-là mais ce n'est pas le sujet) et apprenait à lire alors ça irait de soi. Mais faut se rendre compte que tout le monde n'a pas le goût de la lecture si je peux dire.

          Le développement en parallèle (bien que démarré plus tard) de la communication de voix (je pense aux postes radios jusqu'à la révolution des radios FM pirates puis libres, mais aussi aux supports physiques de musique et à la téléphonie) et d'images (je pense surtout à la télévision puis aux plateformes de sreaming) ne fait que renforcer le constat : en général les gens vont préférer qu'on parle directement à leurs sens (ouïe et vue ici) plutôt que de faire le détour que nécessite l'écrit/lecture.
          Oui, l'écrit est en perte de vitesse (mais pas d'intérêt car il y en a et il y en aura toujours que cette forme satisfait) ; la chose n'est malheureusement pas surprenante.

          “It is seldom that liberty of any kind is lost all at once.” ― David Hume

    • [^] # Re: Très, très intéressant

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

      Pour le plaisir des yeux : diffusion de grande image par le rouleau après avoir hacké le protocole de communication de la calculatrice TI) https://youtu.be/W_mZ7smIz3U

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

  • # Super utile !

    Posté par  . Évalué à 5.

    Nom d'un·e petit·e cheval·jument !
    C'est un des articles les plus utiles du moment, pour moi. Développeur logiciel, faisant énormément de traitements et de générations de trucs divers par script, mais hélas pas assez de réflexe "ça existe forcément déjà en outil de base dans toutes les distros" pour éviter de se palucher le formatage des sorties.
    Et merci pour tous les exemples :-)

    • [^] # Re: Super utile !

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

      Attention que tout ce qui est cité ici n'est pas « de base » : dans le cas présent, "par" n'est pas présent par défaut partout, mais je l'ai mentionné parce-qu'il peut être facilement disponible presque partout en plus d'être intéressant bien qu'un peu complexe.
      Sinon oui, il y a de quoi faire quand on triture du « pure texte » mais difficile de savoir parfois par quel bout prendre (même en ayant la liste de toutes les commandes du système, on ne sait pas qui fait quoi et/ou l'impact de certaines options selon la chaîne de traitement retenu.) L'autre souci est la portabilité qui peut faire s'arracher les cheveux.

      Pas de quoi pour les exemples. J'ai ressorti des éléments de cours que je donnais (et donc des exemples sur lesquels je faisais travailler.) J'aurais pu ne pas juste dépoussiérer et proposer du texte en français… mais mettre en forme pour LinuxFr m'a pris pas mal d'énergie.

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

  • # Lenght ou Length ?

    Posté par  (site web personnel) . Évalué à 2. Dernière modification le 07 février 2022 à 17:30.

    Bonjour,

    J'ai vu plusieurs occurrences de "lenght" alors que j'ai l'habitude de voir "length".

    C'est une coquille ou pas ?

    Autrement, merci pour l'article !

    • [^] # Re: Lenght ou Length ?

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

      oiu coquille (ou tic) courante chez moi : j'appuie souvent sur deux touches en même temps, surtout quand comme là c'est une danse de trois doigts.

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

      • [^] # Re: Lenght ou Length ?

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

        Corrigé, merci.

        • [^] # Merci les modo

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

          Ça m'épate toujours.
          Petit hors-sujet : Vous (la modération) lisez vraiment tout ? Et trouvez le temps de dormir ?

          “It is seldom that liberty of any kind is lost all at once.” ― David Hume

          • [^] # Re: Merci les modo

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

            Les canaux de communication sont variés pour la modération/l'administration du site: contenus, commentaires, flux Atom, tribunes, IRC, Signal, listes de diffusion… Pour le site en lui même, l'affichage nouveaux contenus / nouveaux commentaires aide bien.

            Donc lire tout, ça dépend des gens dans l'équipe, mais perso je dirais quasi. Après, souvent lecture en diagonal quand le sujet ne m'intéresse pas : si la discussion semble posée, que le rendu n'a pas de souci, que personne n'interpelle la modération, ça va vite. Par contre les journaux avec cent commentaires / heure, pas tous palpitants, c'est longuet.

  • # Super journal… que je lirai plus tard

    Posté par  . Évalué à 2.

    Vu la taille du journal… je pense qu'il me faudra une petite heure pour tout lire. Merci pour toutes ces informations… que je verrai plus tard. :D

    • [^] # Re: Super journal… que je lirai plus tard

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

      Merci à toi, sans qui je n'aurais pas eu le courage de ce boulot.

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

      • [^] # Re: Super journal… que je lirai plus tard

        Posté par  . Évalué à 3.

        Wow. C'est trop d'honneur que tu me fais. Je n'ai fait que parler d'un sujet qui m'intéressait et qui mérite de l'attention, selon moi.

        Bon, à part ça, j'ai quelques notes rapides.

        Taille des lignes dans les mails

        (qui est de 75 caractères par défaut …parce-que conçu avec la nétiquette et les RFC du courriel en tête)

        Est-ce que par défaut on ne devrait pas écrire des mails avec une longueur de 72 caractères plutôt que 75 ? Cela laisse l'espace pour 2 réponses (72 + 2*2 = 76, soit 80 caractères moins les 4 pour CR + LF, la limite décrite dans les documents que tu as partagé).

        Valeur par défaut pour fmt

        Quand j'utilise fmt il coupe à 72 par défaut (je viens de tester pour être sûr :D).

        À part ça

        J'ai lu en diagonale l'article. Il est très dense et il y a énormément de choses dont je ne me servirai pas. J'utilise spécifiquement roff pour ne pas avoir à gérer tout ça ! Le besoin semble très très proche des matériels très limités que tu as présenté, mais cela semble réellement historique, ou au moins, plus du adapté à nos jours. Sauf éventuellement pour écrire des mails (je coupe à 72 caractères avec fmt, et c'est bien suffisant, àmha).

        Je note que l'usage de tableaux est pas terrible étant donné la largeur imposée. Il est difficile de distinguer le changement de ligne de tableau dans la dernière colonne. C'est une limitation de linuxfr, malheureusement, et j'aurai bien vu ça dans un PDF (on en revient à roff, décidément ! :p).

        En tout cas, très bon travail ! Je mets ce journal dans mes marque-pages au cas où ça pourrait me servir un jour.

        • [^] # Re: Super journal… que je lirai plus tard

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

          Voir un journal sur roff et qui succite de l'intérêt (on se sent moins seul) m'a ôté les réticences à se jeter à l'eau (même si je ne parle pas de roff), enfin, pas encore
          C'est aussi l'occasion de publier quelque chose de long en Markdown, et ce n'est pas concluant pour moi… Quand on n'a pas l'interface de rédaction des dépêches (et je ne peux pas rester en ligne des plombes à jouer de l'aperçu, je dois pouvoir rédiger hors-ligne et) j'ai beau faire du Markdown depuis des années sur divereses plateformes (StackOverflow, Github, Bitbucket, Medium, DevTo, etc.) j'ai toujours du mal avec les différents dialectes et leurs effets de bord. Pour ce contenu, il me manquait certains concepts et tu verras que pas mal de corrections ont été demandées après publication. Bref, je continue à trouver que c'est génial pour les commentaires, bien mieux que BBCode ; mais c'est assez limité pour faire de longues docs où les formats Wiki et RestructuredText s'en sortent mieux.


          En effet, pour les implémentations BSD :

          with lines as close to the goal length as possible without exceeding the maximum.
          The goal length defaults to 65 and the maximum to 10 more than the goal length.

          …ce qui fait un max de 75.
          Et l'implémentation GNU aussi :

          maximum line width (default of 75 columns)

          Par contre, AIX lui :

          Specifies the line length. The default value for Width is 72 characters.

          Et pour Plan9 :

          Output line length is n, including indent (default 70).

          Ouch…
          Pour en revenir au propos, il y a de tout et cette commande n'est pas POSIX… J'aurais du indiquer « 75/72/70 » au lieu de « 72 » ; ou alors « 75 » qui est la valeur des implémentations les plus couramment rencontrées ?


          Du coup, pour en revenir au mails, d'après la terminologie de fmt, 75 ou 75 est le maximum et 72 le goal …pour permettre de répondre sans reformater :-)


          Avec roff, quand on n'utilise pas de système de macros, on gère autant et parfois plus de détails de bas niveaux…

          Ce journal a en effet un côté historique (d'où la « rétrospective » du titre et le tag « nostalgie » qui est clairement exprimé à la fin, sur les imprimantes à impacts) Les périphériques d'impression actuelle ont toujours des limitations (les dimensions des feuilles ne sont pas infinies) mais fonctionnent autrement (c'est ce que j'appelle le monde des polices proportionnelles contre les chasses fixes, et c'est aussi pour ça l'allusion au raisonnement en pixels et non plus en nombre de caractères.) On est encore un peu confronté à cet aspect quand on travaille en console et avec des trucs (comme l'e-mail) dont l'histoire remonte à ces époques.
          Ce journal, à sa façon, en remettant certaines commandes en contexte, participe à la réflexion sur le langage et la diffusion des écrits

          “It is seldom that liberty of any kind is lost all at once.” ― David Hume

          • [^] # Re: Super journal… que je lirai plus tard

            Posté par  . Évalué à 3. Dernière modification le 10 février 2022 à 03:26.

            Markdown c'est tout nul pour les gros documents.

            Je suis bien d'accord !

            Après, vu la taille de ce que je publie, j'écris tout dans un fichier texte avant de poster pour ne rien perdre au cas où il y ait un plantage ou que je doive attendre avant de poster (pour faire des corrections, par exemple). Ça me fait faire plein de copier-coller, c'est assez pénible, mais c'est indépendant de Markdown.


            Pour en revenir au propos, il y a de tout et cette commande n'est pas POSIX… J'aurais du indiquer « 75/72/70 » au lieu de « 72 » ; ou alors « 75 » qui est la valeur des implémentations les plus couramment rencontrées ?

            Je ne sais pas. En tout cas, à l'usage, je vois que fmt coupe à 72 et pas avant. Si j'ai une ligne de 80 caractères ou plus, c'est au caractère 72 qu'il coupe. Si le goal est de 65, il pourrait couper avant, je lui en laisse l'occasion.

            Donc soit il y a un problème dans la page de manuel, soit je n'ai pas compris ce que sont le goal et le maximum.


            Ce journal remet certaines commandes en contexte.

            Ça fait du bien de savoir d'où viennent les commandes disponibles sur nos systèmes. Je ne connais que trop peu la très grande majorité des commandes qui me sont disponibles, et encore moins leur utilité initiale. Je compte 2724 programmes sur mon système, c'est colossal et je n'ai pas la moindre idée de ce à quoi servent peut-être la moitié d'entre eux.

            Je suis d'accord avec l'article que tu as cité, ainsi qu'avec les articles que lui-même cite, Unix était très lié au langage lui-même. Nos systèmes actuels sont très fortement liés, encore aujourd'hui, au langage et c'est un élément un peu trop oublié de nos jours.

            Je m'explique. Dans Unix et ses dérivés plus modernes, un paquet de commandes introduisent leur propre langage : dc, bc, sed, awk… la liste est longue. À chaque fois, c'est un nouveau langage qu'il faut apprendre, mais c'est également un langage adapté à ce qu'on cherche à faire, lié à un usage. Et ça, c'est magnifique. Pour moi c'est toute la beauté de l'approche Unix : une tâche = un outil, voire un langage. Ce n'est malheureusement pas assez exprimé de cette façon dans les explications sur Unix, pourtant cela fait sens.

            Et quand on comprend ça, ça fait d'autant plus détester les outils modernes qui veulent tout réduire à quelques langages de programmation, là où la diversité des approches permettaient de ne manipuler que la complexité inhérente à la tâche à laquelle on s'attaquait. Autrement dit, pourquoi vouloir tout résoudre avec Javascript, Java ou Python, quand on a accès à des langages plus pertinents dans bien des cas ?

            Et là, on pourrait parler de plein de dérives actuelles, la liste n'en est que trop longue. Le JavaScript dans le navigateur n'était pas suffisamment ridicule qu'on a voulu l'intégrer au système : pouf, node ! Python n'apporte strictement rien de neuf par rapport à Perl, mais allons-y pour le développer jusqu'à l'intégrer à plein d'outils systèmes pour avoir une forte dépendance à ce langage alors qu'il sert à rien. Deux langages qui ont une base de code de plus d'un million de lignes chacun, c'est parfaitement raisonnable
            Pendant ce temps-là, awk a été implémenté dans toybox en 2700 lignes.

            Je pense sincèrement qu'on dérive. Nos usages sont de moins en moins raisonnables. Les langages créés pour l'occasion dans Unix servaient un usage, une fonction bien particulière. De nos jours, nous inventons des langages qui se veulent génériques, pour résoudre tout type de problème, et nous les intégrons à nos machines sans plus de considération. C'est une erreur que de rejeter la simplicité en faveur de l'unicité des langages. Je préfère connaître 3 langages simples appris en 1h chacun, qu'un langage qui évolue jusqu'à nécessiter des compilateurs (ou interpréteurs) de plusieurs centaines de milliers de lignes de code.

            Bref, fin de la digression.

            • [^] # Re: Super journal… que je lirai plus tard

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

              Donc soit il y a un problème dans la page de manuel, soit je n'ai pas compris ce que sont le goal et le maximum.

              Je ne me suis pas attardé sur cet aspect parce-que la syntaxe varie d'une implémentation à une autre et que pour des raisons de portabilité il vaut mieux rester au dénominateur commun : -w Mais s'il y a beaucoup de demandes de précisions (auxquelles je tenterai de répondre sans prétendre avoir la maîtrise ultime vu que je n'utilise pas toutes les options) je compulserai dans un épisode (journal) complémentaire.

              Pour en revenir à la question, le maximum est le mur infranchissable… (dans le contexte des quotas c'est l'équivalent du « hard limit » je dirai.) D'après les manpages, quand on indique max seul, le programme doit en déduire le goal (semble que BSD utilise la même valeur, tandis que GNU calcule que ça fait 93%.)
              Par contre, le goal est la limite désirée, désirable mais légèrement déspassable… (donc l'équivalent du « soft limit » quand on fait l'analogie avec la gestion des quotas.) De même, quand on indique goal seul, le programme doit en déduire le max (BSD fait plus dix et GNU fait plus sept pour cent.)
              Quand on spécifie les deux, le programme va essayer de couper un peu après (ou juste à) goal et toujours avant max !
              Test avec une forme commune du Lorem (il faudra tester plusieurs valeurs pour trouver celles qui sont les plus parlantes)

              $ fmt -v
              fmt: illegal option -- v
              usage:   fmt [-cmps] [-d chars] [-l num] [-t num]
                           [-w width | -width | goal [maximum]] [file ...]
              Options: -c     center each line instead of formatting
                       -d <chars> double-space after <chars> at line end
                       -l <n> turn each <n> spaces at start of line into a tab
                       -m     try to make sure mail header lines stay separate
                       -n     format lines beginning with a dot
                       -p     allow indented paragraphs
                       -s     coalesce whitespace inside lines
                       -t <n> have tabs every <n> columns
                       -w <n> set maximum width to <n>
                       goal   set target width to goal
              # mon fichier de test
              $ wc lorem
                     1      69     446 lorem
              ## soft 52 (soit max vers 62?)
              # BSD: fmt 52    lorem
              # GNU: fmt -g 52 lorem
              #        1         2         3         4         5 G       6 m
              #23456789012345678901234567890123456789012345678901234567890123456789
              $ fmt 52 lorem
              Lorem ipsum dolor sit amet, consectetur adipiscing
              elit, sed do eiusmod tempor incididunt ut labore et
              dolore magna aliqua. Ut enim ad minim veniam, quis
              nostrud exercitation ullamco laboris nisi ut aliquip
              ex ea commodo consequat. Duis aute irure dolor in
              reprehenderit in voluptate velit esse cillum dolore
              eu fugiat nulla pariatur. Excepteur sint occaecat
              cupidatat non proident, sunt in culpa qui officia
              deserunt mollit anim id est laborum.
              ## soft 47 (soit max vers 57?)
              #        1         2         3         4      G  5      m  6
              #23456789012345678901234567890123456789012345678901234567890123456789
              $ fmt 47 lorem
              Lorem ipsum dolor sit amet, consectetur adipiscing
              elit, sed do eiusmod tempor incididunt ut labore
              et dolore magna aliqua. Ut enim ad minim veniam,
              quis nostrud exercitation ullamco laboris nisi
              ut aliquip ex ea commodo consequat. Duis aute
              irure dolor in reprehenderit in voluptate velit
              esse cillum dolore eu fugiat nulla pariatur.
              Excepteur sint occaecat cupidatat non proident,
              sunt in culpa qui officia deserunt mollit anim
              id est laborum.
              ## hard 65 (soit but vers 55?)
              # BSD: fmt -w 65 lorem
              # GNU: fmt -w 65 lorem
              #        1         2         3         4         5    g    6    M
              #23456789012345678901234567890123456789012345678901234567890123456789
              $ fmt -w 65 lorem
              Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
              eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
              enim ad minim veniam, quis nostrud exercitation ullamco laboris
              nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
              reprehenderit in voluptate velit esse cillum dolore eu fugiat
              nulla pariatur. Excepteur sint occaecat cupidatat non proident,
              sunt in culpa qui officia deserunt mollit anim id est laborum.
              ## hard 57 (soit but vers 47?)
              #        1         2         3         4      g  5      M  6
              #23456789012345678901234567890123456789012345678901234567890123456789
              $ fmt -w 57 lorem
              Lorem ipsum dolor sit amet, consectetur adipiscing elit,
              sed do eiusmod tempor incididunt ut labore et dolore
              magna aliqua. Ut enim ad minim veniam, quis nostrud
              exercitation ullamco laboris nisi ut aliquip ex ea
              commodo consequat. Duis aute irure dolor in reprehenderit
              in voluptate velit esse cillum dolore eu fugiat nulla
              pariatur. Excepteur sint occaecat cupidatat non proident,
              sunt in culpa qui officia deserunt mollit anim id est
              laborum.
              ## intervalle 48--52
              # BSD: fmt 48 52 lorem
              # GNU: fmt -w 52 -g 48 lorem
              # GNU: fmt -g 48 -w 52 lorem
              #        1         2         3         4       G 5 M       6
              #23456789012345678901234567890123456789012345678901234567890123456789
              $ fmt 48 52 lorem
              Lorem ipsum dolor sit amet, consectetur adipiscing
              elit, sed do eiusmod tempor incididunt ut labore
              et dolore magna aliqua. Ut enim ad minim veniam,
              quis nostrud exercitation ullamco laboris nisi ut
              aliquip ex ea commodo consequat. Duis aute irure
              dolor in reprehenderit in voluptate velit esse
              cillum dolore eu fugiat nulla pariatur. Excepteur
              sint occaecat cupidatat non proident, sunt in culpa
              qui officia deserunt mollit anim id est laborum.
              ## intervalle 47--54
              #        1         2         3         4      G  5   M     6
              #23456789012345678901234567890123456789012345678901234567890123456789
              $ fmt 47 54 lorem
              Lorem ipsum dolor sit amet, consectetur adipiscing
              elit, sed do eiusmod tempor incididunt ut labore
              et dolore magna aliqua. Ut enim ad minim veniam,
              quis nostrud exercitation ullamco laboris nisi
              ut aliquip ex ea commodo consequat. Duis aute
              irure dolor in reprehenderit in voluptate velit
              esse cillum dolore eu fugiat nulla pariatur.
              Excepteur sint occaecat cupidatat non proident,
              sunt in culpa qui officia deserunt mollit anim
              id est laborum.

              Bon, il y a quand même des lignes où il se permet de descendre un ou deux caractères en dessous de goal ici.

              “It is seldom that liberty of any kind is lost all at once.” ― David Hume

        • [^] # Re: Super journal… que je lirai plus tard

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

          Je note que l'usage de tableaux est pas terrible étant donné la largeur imposée. Il est difficile de distinguer le changement de ligne de tableau dans la dernière colonne.

          Signalé à l'instant.
          https://linuxfr.org/suivi/ameliorer-l-affichage-des-tableaux

          C'est une limitation de linuxfr, malheureusement, et j'aurai bien vu ça dans un PDF

          Le PDF devrait faire pareil, vu que ça n'ajoute pas d'information sémantique qui serait rendue différemment. D'ailleurs, me fait penser que je ne l'ai pas précisé, que la correction proposée devrait s'appliquer aussi à la feuille de styles d'impression…

          “It is seldom that liberty of any kind is lost all at once.” ― David Hume

          • [^] # Re: Super journal… que je lirai plus tard

            Posté par  . Évalué à 3.

            En fait je pensais au PDF parce qu'on peut assez facilement changer la taille des colonnes (avec roff et tbl ou hdtbl, LaTeX, etc.). Cela rend le tout plus clair, même sans séparateur de lignes plus imposant.

            Et ce serait possible de faire également avec le HTML, c'est un élément de style, mais pour ça il faut outrepasser le Markdown et écrire le code HTML et CSS directement.

            La proposition reste intéressante, je pense.

  • # Mon petit grain de sel

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

    Salut, merci pour ton travail!

    J'ai deux petits grains de sel à mettre. Le plus pertinent est que certains des sujets dont tu parles sont abordés dans le TeXbook. Ce livre se trouve ici

    https://ctan.org/pkg/texbook?lang=en

    la distribution sous forme de PDF n'est pas autorisée mais celle du source bel et bien.

    La méthode de justification de TeX est décrite au chapitre 14 “How TeX breaks paragraphs into lines.” En très bref, l'idée est de trouver tous les points de césure possible, de leur associer une mesure de laideur (par exemple c'est moins laid de casser sur une espace que dans l'intérieur d'un mot) puis quand on a un candidat de paragraphe, ajouter à ce score de laideur une valeur qui dépend de la dilatation ou compression des espaces sur les lignes consécutives (c'est horrible d'avoir une ligne très compressée suivie d'une ligne très dilatée).

    La méthode qu'utilise TeX pour trouver les points de césure est décrite dans l'appendice H. Elle est basée sur un modèle un peu compliqué basé sur des n-grammes et des valeurs numériques qui indiquent les bons ou mauvais points de césures… par exemple u1pe et 2id Quoiqu'il en soit Liang, dont parle Knuth dans son livre, arrive à construire 4447 de ces n-grammes qui permettent de couper correctement 89.3% des 115000 mots de la langue anglaise de son dictionnaire des césures, c'est à dire trouver 89,3% de tous les points de césure du dictionnaire, sans en créer de faux. On peut ensuite parfaire l'algorithme en ajoutant un petit dictionnaire d'exceptions. L'avantage de cette méthode (par rapport au dictionnaire) est qu'elle s'adapte bien aux évolutions de langue comme les néologismes ou les emprunts, surtout si la langue de l'emprunt est proche de l'anglais (comme le français par exemple). Il y a des dictionnaires de ngrammes pour beaucoup de langues, et ils sont tous dans TeXlive.

    Mon grain de sel un peu moins dans le sujet est que le shell n'aime pas trop les boucles du genre

    for letter in $(print_many_letters); dodone

    alors que

    print_many_letters | {
      while read letter; dodone
    }

    est plus robuste.

    Il y a aussi les petits cat … | grep par exemple qui s'écrivent mieux grep < …. (Oui j'ai déjà eu le message d'erreur ssh: fork failed, cannot create process :-) )

    • [^] # Re: Mon petit grain de sel

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

      Merci beaucoup pour l'information concernant le TeXbook : je n'étais pas au frais de la distribution. Mais bon, je préfère la version papier quand c'est possible (c'est pas très écologique mais j'ai l'excuse d'être vieux-jeu ?) et j'ai commencé la lecture de la version française (merci Tanguy)
      Pour la césure, j'ai mentionné dans une future partie à partager (n'est-ce pas yal ?) que TeX a une approche algorithmique …mais que l'approche par dictionnaire semble encore la norme (c'est en tout cas ce que j'ai cru comprendre avec OpenOffice ainsi que de certaines évolutions de Troff)

      Merci pour le grain de sel. Je me note d'appliquer ta correction dans mes dépôts ce week-end. Pour l'instant, je n'ai jamais eu de problème bien qu'ayant testé différents shell sur les scripts en question et les exécutant surtout avec Ash/Dash. Ceci dit, je suis souvent dans un contexte maîtrisé et le seul cas où ça peut mal se passer à ma connaissance est quand on a trop de valeurs (raison d'être de commandes comme xargs par exemple)

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

      • [^] # Re: Mon petit grain de sel

        Posté par  (site web personnel) . Évalué à 4. Dernière modification le 10 février 2022 à 11:32.

        Ceci dit, je suis souvent dans un contexte maîtrisé et le seul cas où ça peut mal se passer à ma connaissance est quand on a trop de valeurs (raison d'être de commandes comme xargs par exemple)

        Oui je chipote un peu mais c'est mon grain de sel moins pertinent. ;-) Il y a en fait deux problèmes en fait avec le for whatever in $(…); do Le premier et le plus important est que si il y a beaucoup de résultats ça casse le script, le second est que ça utilise l'IFS pour couper la ligne en mots. (En général quand on touche à IFS on est prudent, cependant. :-) )

        En général xargs est mieux que la boucle while mais on ne peut pas l'utiliser tout le temps: cela ne marche qu'avec des programmes externes. Si on veut itérer avec une commande complexe ou une fonction on est obligé de passer par une boucle while.

        Pour le cat, parfois l'usage légitime dans un pipe est si on a filtre configurable:

        datasource()
        {
           case "$1" in
             ''|everything)
               cat FILE
               ;;
             sample)
               head -n 20 FILE
               ;;
          esac
        }
        
        datasource sample | grep …
        
        • [^] # Re: Mon petit grain de sel

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

          Oui, c'est pour la longueur (ou nombre de résultats) que je précisais que le bout (snipet) pointé est utilisé dans un contexte maitrisé. C'est vrai que sur le coup, je n'ai pas pensé à l'IFS (qui justement n'est pas touché dans l'extrait) parce-que mon contexte ne le nécessitait pas.

          Pour cat je l'utilise quand je dois passer le contenu d'un fichier qui attend ses données de stdin (coucou tr entre autres.) Mais pour les commandes qui lisent directement les fichiers (comme grep et fold dans ces exemples) bah je n'ai pas de raison de rajouter un process inutile en plus.

          “It is seldom that liberty of any kind is lost all at once.” ― David Hume

Suivre le flux des commentaires

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