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 :
\bibeall{passage1}{passage2}{passagen}J’avais affaire à deux problèmes :
- Techniquement une commande LaTeX ne peut prendre que 9 arguments au maximum.
- 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 :
\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.
\newcommand*{\bibleall}[1]{%
%#1 : passage
\footnote{\emph{Cf}. \bibleref{#1}}%
}Ceci permet d’appeler \bibleref depuis une autre commande \bible :
\newcommand*{\bible}[2]{%
%#1 : passage
%#2 : texte
\emph{#2}\footnote{\bibleref{#1}}%
}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.
J’ai déjà mis des commentaires, qui devraient permettre de comprendre l’essentiel. Mais complétons un peu.
- l. 3 : la commande
\passageest une commande TeX et non pas LaTeX comme le prouve sa définition par\defet 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\passagedans\biblerefexplique 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 paretoolboxpour constituer une liste que nous pourrons manipuler. - l. 6. Nous définissons un nombre
\nbpassagesqui 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\nbpassageset il est impossible d’avoir accès à la valeur de\nbpassagesen dehors de\bibleref - Un nombre est plus facile à manipuler avec
etoolboxqu’un compteur.
- Un nombre peut avoir une portée locale, alors qu’un compteur est global. Autrement dit, à chaque fois que nous appelons
- l. 7 : nous indiquons que la commande
\trouvepassagesva 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\passagesindique 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
#1mais sur la liste\passages. - L. 11 : nous avons besoin d’un autre nombre,
\cptpassagepour 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
\cptpassaged’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\passageen 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 styleIs|1:1. Dans ce cas, nous appelons\passageen 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||.
- L. 15 : si c’est le cas, nous avons affaire à quelque chose du style
- Grâce au test de la ligne 14, nous pouvons indifféremment préciser ou non la version.
- L. 17 : nous testons si
\cptpassageest é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
\dopour chaque élément de la liste\passages.
- L. 13 : incrémenter
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.
Commandes à arguments illimités