Forum Programmation.autre LaTeX : définition d'une macro avec \def

Posté par  .
Étiquettes : aucune
0
8
oct.
2010
bonjour um,

je cherche à créer des macros dans LaTex. Le problème c'est que je veux nommer ces macros avec des noms "lisibles", c'est à dire éviter de coller les mots entre eux, genre \def\masupermacropaslisible. J'avais donc dans l'idée d'écrire les espaces avec des _ (underscore). Le problème c'est qu'on dirait que seul le premier mot est pris en compte, par exemple si je définis :

\def\DEFAULT_FONT_SIZE{14}
\def\DEFAULT_AUTRE_TRUC{5}

j'obtiens ensuite à la compilation:

! Use of \DEFAULT doesn't match its definition.

Savez-vous si on peut changer ce comportement, dans un style par exemple ?
  • # catcode

    Posté par  . Évalué à 5.

    Il faut que tu te penches sur les catcodes. Dans LaTeX tous les caractères n'ont pas le même code, Le caractère _ a le code 8 qui correspond au subscript en mode mathématique. Alors que les caractères alphabétiques on un catcode de 11. Tu peux changer le catcode de _ avec la commande:

    \catcode‘_=11

    Par contre je pense que ça va mettre pas mal de bazar si tu utilise des mathèmatiques.

    Sinon il faudrait que tu appelles tes macros en utilisant:

    \catcode‘_=11
    \DEFAULT_AUTRE_TRUC
    \catcode‘_=8

    Ce qui est mal pratique (c'est un doux euphémisme).

    Je te conseilles la lecture du TeX by topic de VICTOR EIJKHOUT.
    • [^] # Re: catcode

      Posté par  . Évalué à 2.

      merci de l'idée.

      On dirait qu'il faut l'écrire plutôt :

      \catcode`\_=11

      mais une fois ceci fait, cela me fait des erreurs à chaque utilisation de _ dans une macro.
      Je vais regarder de ce côté, qui devrait sans doute être la meilleure façon de procéder.

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

      • [^] # Re: catcode

        Posté par  . Évalué à 1.


        On dirait qu'il faut l'écrire plutôt :

        \catcode`\_=11


        C'est possible, ce n'est pas une manip que j'utilise souvent sauf via les appels \makeatletter et \makeatother qui font quasiment la même chose pour le symbol @.


        mais une fois ceci fait, cela me fait des erreurs à chaque utilisation de _ dans une macro.


        quels utilisation de _? Pour des maths? Pour appeler d'autres macro?


        Je vais regarder de ce côté, qui devrait sans doute être la meilleure façon de procéder.


        Je ne suis pas un TeXpert (loin de là) mais je ne pense sincèrement pas que ce soit une bonne idée de changer le catcode de _. Dès que tu vas utiliser des maths ça risque de partir en sucette.

        Je pense par contre que tu devrais pouvoir faire quelque chose avec un autre caractère inutilisé (genre @ (dans ce cas attention, tu exposes toutes les «macros internes» des différents packages))
        • [^] # Re: catcode

          Posté par  . Évalué à 2.

          je n'utilise pas de math, c'est pour écrire du texte uniquement (même si on peut quand même inclure quelques formules de math). J'utilise @ pour d'autres choses, et l'avantage de _ c'est que cela donne quelque chose de lisible (les utilisateurs n'ont qu'à modifier le fichier de style, autant que cela reste écrit en anglais plutôt qu'en CamelCase ou en collant les mots).

          Après, s'il y a moyen d'écrire quelque chose dans le genre \def\"DEFAULT FONT SIZE"{14} à la place de \def\DEFAULT_FONT_SIZE{14} pourquoi pas...

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

          • [^] # Re: catcode

            Posté par  . Évalué à 2.

            Est ce que tu au pensé à regarder du coté de xkeyval ou pgfkeys (voir la doc de pgf paragraphe 43)? D'après ta description rapide, je pense que ça peut coller à ce que tu cherche. Tu peux faire des trucs dans le genre:

            \configurateur{default font size = 12}

            et ça te configure une macro avec la valeur que tu passe (tu peux faire plein d'autre choses avec).
            • [^] # Re: catcode

              Posté par  . Évalué à 2.

              grosse doc :)
              A l'occasion je regarderai si j'ai un peu de temps, mais il faut déjà assimiler le truc (heureusement pgfkeys semble indépendant de pgf d'après la doc)

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

  • # [HS] LaTeX ou Tex ?

    Posté par  . Évalué à 2.

    Je ne connaissais même pas \def, qui est en fait l’équivalent de \newcommand, après un peu de recherche je suis tombé sur ça qui dit que cette dernière est « plus mieux » :

    « Define macros with \newcommand. Use \renewcommand sparingly if at all, and avoid \def completely unless you really know what you are doing
    "\newcommand" is the Latex way of defining macros; "\def" is the old, plain TeX style, definition. Using "\newcommand" is far preferable, since \newcommand checks against existing definitions and generates an error message if a macro name is in use. By contrast, "\def" happily overwrites any existing definition; this may cause unexpected errors that are often hard to track down. »


    http://www.math.uiuc.edu/~hildebr/tex/tips-macros.html

    Question subsidiaire : où as-tu vu cette commande pour l’utiliser à ton tour ? Parce que pour le coup le old est un euphémisme de préhistorique…
    • [^] # Re: [HS] LaTeX ou Tex ?

      Posté par  . Évalué à 2.

      La command \newcommand est défini en utilisant \def.

      \newcommand est une macro LaTeX qui permet de faire des choses facilement (comme le test sur les macros déjà existantes ou bien de définir facilement un paramètre facultatif). Toutes ces choses sont faisable en TeX pur bien entendu mais demande plus de travail qu'avec leur version TeX \def.

      Par contre \def est bien plus puissant, par exemple il est facile d'avoir une macro avec des appels de parametre bizarre genre:

      \macro(param1)(param2,param3)=param4/param5;

      Ce n'est qu'un exemple de la puissance de \def. Il y a beaucoup (trop) d'autres choses possibles (voir là aussi le "TeX by topic" par exemple).

      En fait, en général \newcommand suffit, mais parfois il faut sortir \def, sans parler des cas ou les deux sont plus ou moins équivalents (dans ce cas là, la flemme me porte à utiliser \def, c'est plus court à écrire).

      Et puis il faut se souvenir qu'il n'y a pas que LaTeX, mais aussi ConText et autres. Pour faire un package portable il faut éviter les LaTeXeries.
    • [^] # Re: [HS] LaTeX ou Tex ?

      Posté par  . Évalué à 2.

      effectivement, on dirait que newcommand peut faire la même chose (ni mieux, ni moins bien) dans le cas qui m'intéresse. Par contre il y a toujours le problème de _ qui n'est pas reconnu, et si j'essaye la modification proposée plus haut, ça ne passe plus. Je pense donc supprimer les espaces, tant pis.

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

Suivre le flux des commentaires

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