IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Ecrire des chiffres romains

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut Ecrire des chiffres romains
    Pouvez-vous m'indiquer comment insérer des chiffres romains dans un texte. Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tu écris I pour 1, II pour 2, III pour 3, IV pour 4 etc...

  3. #3
    Membre chevronné
    Inscrit en
    Mai 2010
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 357
    Par défaut
    É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...

  4. #4
    Membre émérite
    Avatar de c-top
    Profil pro
    Turu
    Inscrit en
    Septembre 2003
    Messages
    972
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Turu

    Informations forums :
    Inscription : Septembre 2003
    Messages : 972
    Par défaut
    Oui, on peut citer un truc dan le genre de
    Qui affiche les chiffres en minuscules
    on peut aussi écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \uppercase\expandafter{romannumeral 2010}

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par c-top Voir le message
    Oui, on peut citer un truc dan le genre de
    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 :
    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}
    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).

    On peut aussi programmer cette macro de cette façon, nettement plus avancée (ici, je l'appelle \essaiA) :
    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}}
    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.

    C'est là qu'entre en jeu la macro \romannumeral qui va développer pour nous. Voici la macro \essaiB :
    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}}
    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".

    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}

  6. #6
    Membre émérite
    Avatar de c-top
    Profil pro
    Turu
    Inscrit en
    Septembre 2003
    Messages
    972
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Turu

    Informations forums :
    Inscription : Septembre 2003
    Messages : 972
    Par défaut
    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!

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par c-top Voir le message
    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.
    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.

    Dans ce cas TeX réalise quand même trois tests même s'il ne va pas au bout de chacun!
    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.

    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \expandafter\def\expandafter\resultat\expandafter{\essaiB{8}}
    et la macro \resultat contiendrait "nombre", "chiffre pair" ou "chiffre impair", ce qui ne serait pas le cas avec \essai ou \essaiA.

  8. #8
    Membre émérite
    Avatar de c-top
    Profil pro
    Turu
    Inscrit en
    Septembre 2003
    Messages
    972
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Turu

    Informations forums :
    Inscription : Septembre 2003
    Messages : 972
    Par défaut
    Citation Envoyé par unbonpetit Voir le message
    Merci Christophe, je t'attendais !
    Grand fou, tu m'as tendu un piège et je suis tombé dedans comme un débutant

Discussions similaires

  1. [WD-2003] Ecrire des chiffres en lettres
    Par FCL31 dans le forum VBA Word
    Réponses: 10
    Dernier message: 23/10/2009, 08h51
  2. Numérotation de la table des matières en chiffre romain
    Par McRich dans le forum Mise en forme
    Réponses: 3
    Dernier message: 16/07/2009, 09h46
  3. Chiffre romains dans grande table des matieres
    Par jeremysme dans le forum Mise en forme
    Réponses: 2
    Dernier message: 09/09/2008, 11h21
  4. Ecrire des chiffres en toutes lettres
    Par ali_Imouzzer dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/02/2007, 18h44
  5. [Débutant] Ecrire un nombre en chiffres romains !
    Par kriskikout dans le forum Ada
    Réponses: 2
    Dernier message: 05/12/2006, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo