Chemin principal : Accueil > LaTeX > Commande > Commandes à arguments illimités

Autre chemin : (Aller directement au contenu de l'article)

Commandes à arguments illimités

dimanche 21 avril 2013, par Maïeul
Suivre la vie du site RSS 2.0 Forum

J’ai eu récemment besoin de créer une commande dont le nombre d’arguments serait illimité. Il s’agissait de permettre d’indiquer une série de référence biblique associée à un passage. Voici comment, sur conseil du TeXnicien de surface.

Problème

Le texte que j’étudie fait allusion par moment à des passages bibliques. Je souhaite ajouter une note de bas de page indiquant :

Cf. Passage 1 ; Passage 2 ; Passage n. etc

Évidemment, je pourrais le faire à la main, mais utiliser une commande spécifique permet d’uniformiser les styles. C’est pourquoi j’ai voulu créer une commande :

  1. \bibeall{passage1}{passage2}{passagen}

J’avais affaire à deux problèmes :

  • Techniquement une commande LaTeX ne peut prendre que 9 arguments au maximal.
  • Pour chaque passage, je devais indiquer le livre séparément du chapitre, afin de pouvoir utiliser les possibilités de bibleref-french. En outre, je souhaitais pouvoir préciser la version entre parenthèse (LXX, Vulgate, BHS etc.). Ce qui faisait que j’étais réduit à au mieux 3 passages.

Solution : principe

La solution consiste alors à proposer une commande à un seul argument, mais qui pourrait se décomposer sous forme de liste. J’ai choisi d’utiliser le + comme séparateur d’élément de liste, car la , a un sens spécifique lorsque l’on utilise bibleref-french [1]

Pour séparer le livre du passage et le passage de la version, j’ai décidé d’utiliser le symbole | (pipe).

Ainsi, si je souhaite faire référence à Isaïe, livre 1 chapitre 1, dans la version LXX et BHS, je met :

  1. \bibleall{Is|1:1|BHS+Is|1:1|LXX}

Et j’obtiens en note de note de bas de page :

Cf. Is 1,1 (BHS) ; Is 1,1 (LXX).

Mise en œuvre

Je crée une commande \bibleall qui se contente pour l’essentiel d’appeler une commande \bibleref.

  1. \newcommand*{\bibleall}[1]{%
  2. %#1 : passage
  3. \footnote{\emph{Cf}. \bibleref{#1}}%
  4. }

Télécharger

Ceci permet d’appeler \bibleref depuis une autre commande \bible :

  1. \newcommand*{\bible}[2]{%
  2. %#1 : passage
  3. %#2 : texte
  4. \emph{#2}\footnote{\bibleref{#1}}%
  5. }

Télécharger

La commande \bibleref va se servir des outils du package etoolbox pour parcourir les listes. On se sert également du package xstring, qui nous permet de savoir le nombre de | dans chaque élément de la liste :

  • 1 si on n’indique pas la version.
  • 2 si on indique la version.
  1. \newcommand{\bibleref}[1]{
  2. %Commande pour afficher un passage biblique, c'est elle qui est appellée par tt les autres
  3. \def\passage##1|##2|##3|{\bibleverse{##1}(##2)\ifstrempty{##3}{}{ (##3)}}% L'affichage de chaque passage : ##1) livre ##2) passage ##3) version
  4. % On commence par faire une liste des passages
  5. \def\passages{}% Liste des passages
  6. \numdef\nbpassages{0}% Nbr total de passages
  7. \DeclareListParser*{\trouvepassages}{+}% Le + est un séparateur
  8. \trouvepassages{\numdef\nbpassages{\nbpassages+1}\listadd\passages}{#1}% On remplit la liste des passage
  9. %
  10. % On la parcourt ensuite
  11. \numdef\cptpassage{0}% Le nombre de passage courant
  12. \renewcommand{\do}[1]{% Ce qu'on effectue à chaque boucle
  13. \numdef\cptpassage{\cptpassage+1}% Incrémenter le compteur du passage courant
  14. \IfSubStr[2]{##1}{|}% Tester si on a 2 ou 3 élèments dans le passage
  15. {\passage##1|} % Si 3 élèments, donc 2 |
  16. {\passage##1||}% Si 2 élèments, donc 1 |
  17. \ifnumequal{\nbpassages}{\cptpassage}{.}{ ; }% y a t'il encore des passages ensuite?
  18. }%
  19. \dolistloop{\passages}% Boucler sur tt les passages
  20. %
  21. }

Télécharger

J’ai déjà mis des commentaires, qui devraient permettre de comprendre l’essentiel. Mais complétons un peu.

  • l. 3 : la commande \passage est une commande TeX et non pas LaTeX comme le prouve sa définition par \def et non par \newcommand. Voici quelques précisions sur sa définition :
    • ##1|##2|##3| signifie que ces arguments sont passés immédiatement après le nom de la commande, chaque argument étant suivi d’une pipe. Ainsi on appelle la commande de la forme suivante : \passage Is|1:1|LXX.
    • Cependant cette commande ne peut être appelée directement dans le corps du fichier. En effet, nous l’avons définie à l’intérieur de la commande \bibleref : sa portée, c’est à dire l’endroit où il est appellable, se limite donc à l’intérieur de \bibleref. Le fait que nous ayons défini \passage dans \bibleref explique que nos arguments aient 2 # et non un seul.
    • Nous passons les deux premiers arguments à la commande \bibleverse, selon la syntaxe de celle-ci. Puis si le troisième argument n’est pas vide, nous le mettons entre parenthèse.
  • l. 5. Nous définissons une commande vide \passages. Cette commande sera remplie par etoolbox pour constituer une liste que nous pourrons manipuler.
  • l. 6. Nous définissons un nombre \nbpassages qui nous servira à compter le nombre de passages. Un nombre est une sorte de compteur propre au passage etoolbox. L’avantage d’utiliser un nombre plutôt qu’un compteur est double :
    • Un nombre peut avoir une portée locale, alors qu’un compteur est global. Autrement dit, à chaque fois que nous appelons \bibleref, nous réinitialisons \nbpassages et il est impossible d’avoir accès à la valeur de \nbpassages en dehors de \bibleref
    • Un nombre est plus facile à manipuler avec etoolbox qu’un compteur.
  • l. 7 : nous indiquons que la commande \trouvepassages va nous permettre de manipuler un liste dont les éléments sont séparés par des +.
  • l. 8 : nous parcourons le texte passé en argument à \bibleref (#1), pour déterminer les éléments de la liste. Pour chaque élément de la liste : -
    • \numdef\nbpassages{\nbpassages+1} indique que nous augmentons d’une unité la valeur de \nbpassages.
    • \listadd\passages indique que nous ajoutons l’élément courant à la liste \passages.
  • Après la l. 10 nous allons désormais travailler non plus sur la liste #1 mais sur la liste \passages.
  • L. 11 : nous avons besoin d’un autre nombre, \cptpassage pour savoir combien d’éléments nous avons parcourus.
  • L. 12 à 18, nous définissons ce que nous ferons pour chaque élément de la liste :
    • L. 13 : incrémenter \cptpassage d’une unité.
    • L. 14 : tester le nombre | présent dans l’élément courant (##1) est au moins égal à 2 :
      • L. 15 : si c’est le cas, nous avons affaire à quelque chose du style Is|1:1|LXX. Dans ce cas, nous appelons \passage en lui passant une chaîne constitué de l’élément courant (##1) suivi de |. Dans notre exemple, c’est comme si nous faisions \passage Is|1:1|LXXL.
      • L. 16 : s’il y a moins de deux |, nous avons affaire à quelque chose du style Is|1:1. Dans ce cas, nous appelons \passage en lui passant une chaîne constitué de l’élément courant (##1) suivi de ||. Dans notre exemple, c’est comme si nous faisions \passage Is|1:1||.
    • Grâce au test de la ligne 14, nous pouvons indifféremment préciser ou non la version.
    • L. 17 : nous testons si \cptpassage est égal à \nbpassages, c’est à dire si nous avons affaire au dernier élément de la liste. Si tel est le cas, nous mettons un point final, sinon un ;.
    • L. 19 : nous exécutons ce que nous avons défini dans \do pour chaque élément de la liste \passages.

Ouf, ça y est. Le commentaire est fini. Il peut paraître un peu « lourd », mais mieux vaut être trop précis que pas assez.

Notes

[1Elle sert à indiquer la sélection de plusieurs versets discontinus.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

À propos

Titulaire d’un master en sciences religieuses de l’Université de Strasbourg, je suis depuis août 2012 assistant-diplômé en histoire du christianisme antique et littérature apocryphe chrétienne à l’Université de Lausanne, où je prépare une thèse sous la direction de Frédéric Amsler.

Dans le cadre de la rédaction de mon mémoire de master, j’ai été emmené à utiliser LaTeX, et j’ai donc décider de partager mes techniques. En effet, au cours de mes premiers apprentissages, j’ai découvert que les ressources indiquant les outils pour l’utilisation de LaTeX en sciences humaines étaient rares.

Par ailleurs, je suis membre actif de la communauté SPIP, au sein de laquelle j’administre le site Spip-Contrib. Je propose sur ce site quelques notes sur SPIP, en général à destination de webmestre.

Il m’arrive également de faire un petit peu de Python, de temps en temps.

Enfin, je tiens un blog de réflexions politiques et religieuses.

Maïeul