Pouvez-vous m'indiquer comment insérer des chiffres romains dans un texte. Merci
Pouvez-vous m'indiquer comment insérer des chiffres romains dans un texte. Merci
Tu écris I pour 1, II pour 2, III pour 3, IV pour 4 etc...
Étrange question... Les chiffres romains étant composés de caractères I,V,X,L,C,D,M, j'aurais envie de dire qu'il suffit de taper ces caractères selon le besoin. Non ?
Ou alors ta question sous-entend un truc plus avancé que je n'ai pas "entendu".
EDIT: ça brûle...
Oui, on peut citer un truc dan le genre de
Qui affiche les chiffres en minuscules
Code : Sélectionner tout - Visualiser dans une fenêtre à part \romannumeral 2010
on peut aussi écrire
Code : Sélectionner tout - Visualiser dans une fenêtre à part \uppercase\expandafter{romannumeral 2010}
Merci Christophe, je t'attendais !
Je m'en vais faire une petite digression sur la primitive \romanumeral. Bien sûr, tout le monde sait qu'elle convertit un nombre en chiffres arabe en nombre écrit en chiffres romains. Mais cette fonction est assez anecdotique. Son utilité pour le développeur en TeX est toute autre. Je me lance, c'est de la programmation vraiment costaude, mais je te sens plein de motivation
Bref, \romannumeral possède la propriété suivante : elle développe au maximum tout ce qu'elle rencontre jusqu'à tomber sur quelque chose qui termine un nombre. C'est la même propriété que l'on rencontre avec les assignations des compteurs TeX. Un espace après un nombre (qui sera avalé, cf texbook) lui suffit pour arrêter le développement et commencer la conversion en chiffres romains.
À part cette propriété qui n'a rien de nouveau, elle possède cette propriété unique : si le nombre qu'elle a rencontré après le développement est nul ou négatif, elle se développe en rien du tout. C'est un truc de ouf pour le programmeur car on peut se servir de cette primitive pour développer tout ce qu'on veut aussi profond qu'on veut, et pour arrêter le développement, il suffira de caser "0 " ou "-1 " (noter l'espace qui suit ces nombres) ou n'importe quel autre nombre négatif.
J'ai bâti un exemple pédagogique : mettons qu'on veuille construire une macro "\essai{<nombre>} qui réagit ainsi :
- si le nombre est > 9, elle affiche "nombre"
- si c'est un chiffre, elle affiche "chiffre pair" ou "chiffre impair" selon la parité du chiffre.
On va se retrouver avec des tests dont les branches vont être déséquilibrées : un seul test pour les nombres et 2 tests pour les chiffres.
La façon la plus naïve de programmer cette macro est la suivante :
Le problème, c'est que lorsqu'on veut 1-développer cette macro, ce 1-développement va dépendre de l'argument et de la branche de test qui est prise (voir exemple final) et en plus, il va rester des \else ou des \fi non encore résorbés du test initial. C'est très ennuyeux (notamment pour les assignations de ce 1-développement vers une séquence de contrôle avec un \def).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 \newcommand\essai[1]{% \ifnum#1>9 nombre% \else \ifodd#1 chiffre impair% \else chiffre pair% \fi \fi}
On peut aussi programmer cette macro de cette façon, nettement plus avancée (ici, je l'appelle \essaiA) :
Ici, le 1-développement de la macro ne dépend plus de la branche du test qui l'on prend puisque \csname...\endcsname développe tout. Par contre, le 1-développement de la macro n'est pas "nombre", "chiffre pair" ou "chiffre impair". Pour obtenir ça, il faudrait procéder au 2-développement. Ennuyeux aussi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 \def\firstofthree#1#2#3{#1} \def\secondofthree#1#2#3{#2} \def\thirdofthree#1#2#3{#3} \newcommand\essaiA[1]{% \csname \ifnum#1>9 first% \else \ifodd#1 second\else third\fi \fi ofthree\endcsname {nombre}{chiffre impair}{chiffre pair}}
C'est là qu'entre en jeu la macro \romannumeral qui va développer pour nous. Voici la macro \essaiB :
On a gagné car le "0 " dans chacune des possibilités va stopper le développement de \romanumeral, qui tout simplement disparaitre. Et on aura bien le 1-développement de \essaiB qui vaudra "nombre", "chiffre pair" ou "chiffre impair".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 \newcommand\essaiB[1]{% \romannumeral \csname \ifnum#1>9 first% \else \ifodd#1 second\else third\fi \fi ofthree\endcsname {0 nombre}{0 chiffre impair}{0 chiffre pair}}
Voici le code complet sous forme d'ECM :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 \documentclass[a4paper,10pt]{article} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage[a4paper,margin=3cm]{geometry} \newcommand\essai[1]{% \ifnum#1>9 nombre% \else \ifodd#1 chiffre impair% \else chiffre pair% \fi \fi} \def\firstofthree#1#2#3{#1} \def\thirdofthree#1#2#3{#3} \def\secondofthree#1#2#3{#2} \newcommand\essaiA[1]{% \csname \ifnum#1>9 first% \else \ifodd#1 second\else third\fi \fi ofthree\endcsname {nombre}{chiffre impair}{chiffre pair}} \newcommand\essaiB[1]{% \romannumeral \csname \ifnum#1>9 first% \else \ifodd#1 second\else third\fi \fi ofthree\endcsname {0 nombre}{0 chiffre impair}{0 chiffre pair}} \begin{document} \parindent0pt Quelques essais avec \string\essai :\par \qquad \verb-\essai{8}- donne : \essai{8}.\par \qquad \verb-\essai{15}- donne : \essai{15}.\par \qquad \verb-\essai{7}- donne : \essai{7}.\par Affichage du 1-développement de \string\essai\{8\} : \detokenize\expandafter\expandafter\expandafter{\essai{8}} \hrulefill Quelques essais avec \string\essaiA :\par \qquad \verb-\essai{8}- donne : \essaiA{8}\par \qquad \verb-\essai{15}- donne : \essaiA{15}\par \qquad \verb-\essai{7}- donne : \essaiA{7}\par Affichage du 1-développement de \string\essaiA\{8\} : \detokenize\expandafter\expandafter\expandafter{\essaiA{8}} \hrulefill Quelques essais avec \string\essaiB :\par \qquad \verb-\essai{8}- donne : \essaiB{8}\par \qquad \verb-\essai{15}- donne : \essaiB{15}\par \qquad \verb-\essai{7}- donne : \essaiB{7}\par Affichage du 1-développement de \string\essaiB\{8\} : \detokenize\expandafter\expandafter\expandafter{\essaiB{8}} \end{document}
Cette façon de procéder est très déroutante pour un développeur qui n'a pas l'habitude du monde TeX dont je fais d'ailleurs partie.
La solution essai est celle que j'aurais codée instinctivement.
Dans la solution essaiB on voit bien le 1-developpement dont tu parles mais je ne suis pas sûr dans saisir la finalité. Dans ce cas TeX réalise quand même trois tests même s'il ne va pas au bout de chacun!
Bien sûr, c'est la plus immédiate, mais elle a des défauts. Pour l'affichage, elle ne pose pas de problème, mais si on voulait sauvegarder son 1-développeemnt dans une séquence de contrôle, on le pourrait mais la séquence de contrôle ainsi définie ferait planter TeX lors de son appel puisqu'elle contiendrait des \fi ou des \else en trop.
Sinon, je comprends ta déroute, surtout que tu ne maîtrises pas le développement, qui est une chose extrêmement puissante et propre à TeX.
Les façons de programmer que l'on voit dans ces 3 exemples sont très différentes (au moins entre \essai et \essaiA). C'est ce qui fait le charme fou de TeX, c'est un langage qui stimule la créativité, on peut emprunter des chemins très différents (et parfois très élégants) pour arriver au même résultat.
Non, dans \essaiB, TeX réalse 2 tests seulement, et il va au bout de chacun d'entre eux puisque \romannumeral force le développement maximal.Dans ce cas TeX réalise quand même trois tests même s'il ne va pas au bout de chacun!
L'intérêt d'avoir le 1-développement de la macro qui contient le résultat final est que l'on pourrait écrire :
et la macro \resultat contiendrait "nombre", "chiffre pair" ou "chiffre impair", ce qui ne serait pas le cas avec \essai ou \essaiA.
Code : Sélectionner tout - Visualiser dans une fenêtre à part \expandafter\def\expandafter\resultat\expandafter{\essaiB{8}}
Partager