Remarques générales

Ce billet sur IndexMatic² (désormais abrégé comme il se doit iX²) n’est pas une présentation du script (que l’on peut retrouver sur indiscripts, scriptopedia ou plus récemment urbanbike), encore moins un guide d’utilisation qui ne saurait rivaliser, tant sur la forme que sur le fond, avec le manuel « officiel » de 26 pages au format PDF téléchargeable sur indiscripts. L’objet est essentiellement de comprendre l’apport des expressions régulières auxquelles l’on peut recourir dans deux des trois modes de recherche proposés par iX² : Liste de requêtes et Requête unique.

En règle générale, à une entrée d’index correspond un mot indexé identique. Mais il n’est pas rare non plus que, derrière une entrée « générique », soient sous-entendues plusieurs variantes du mot à indexer : le singulier et le pluriel (tribunal/tribunaux ; costume/costumes) ; le masculin et le féminin (conseiller/conseillère ; cheval/jument); les formes susbstantive ou adjective d’un nom propre (Caucasien/caucasien) ; une forme simple ou composée (chirurgien/chirurgien-dentiste) ; des orthographes différentes du mot (mufti/muftī ; maitre/maître). Voire plusieurs mots différents, mais ayant un dénominateur commun, qui soit apparaîtront comme autant de sous-entrées, soit seront fusionnés dans l’entrée d’index. L’une des forces d’IndexMatic² est justement de permettre toutes ces manipulations grâce à la gestion des expressions régulières. Avant de voir quelques-unes de ces manipulations à l’aide d’exemples simples, il convient de présenter un peu plus dans le détail le « langage » utilisé par iX².

A) Comparaison des expressions régulières GREP/IndexMatic²

Tout utilisateur averti d’InDesign et féru de regex pensera immanquablement GREP à la lecture d’« expressions régulières ». Un peu à tort, car il faut dès à présent souligner que iX² ne repose pas sur le moteur GREP d’InDesign, mais sur le langage interne spécifique à JavaScript (cf. p. 19 du manuel). Malgré de très fortes similarités entre les deux langages, il en résulte des différences non négligeables.

1) Les différences

La différence la plus notable – en raison même du langage supporté par le script – est l’absence de plusieurs métacaractères :

Ajoutons à ces opérateurs, l’ensemble des Posix [[: :]] ; et les catégories générales \p{ }.

Pour pallier l’absence du métacaractère \W, il est possible d’utiliser un jeu de caractères négatif, de type [^w]+. Dans iX², \w peut aussi remplacer [\l\u] dans la mesure où il couvre toutes les lettres de l’alphabet latin et reste insensible à la casse (à moins de cocher l’option adéquate).

iX² est par défaut insensible à la casse. Si vous souhaitez inverser cette option, n’oubliez pas de cocher « Respect de la casse » dans les Options de concordance, ou d’utiliser localement le flag /I (cf. plus bas sur l’utilisation de cet opérateur). Une formule de type /[A-Z]\w+/ ne suffirait pas autrement à extraire des mots commençant par une lettre capitale.

L’option « Mot entier » est cochée par défaut dans iX², alors que ce mode est obtenu dans GREP uniquement en entourant le motif des métacaractères \b ou < et >. iX² considère comme un mot entier tout caractère qui n’est pas précédé ou suivi d’un caractère appartenant à l’alphabet. Alors que, dans InDesign, la formule GREP \bsous\b sélectionnerait aussi sous-traitance ou sous-marin, iX² l’exclue si les options « mot entier » et « inclure les traits d’union » sont cochées.

2) Les similitudes

De nombreux opérateurs propres aux expressions régulières sont communs à iX² et GREP :


Quelques subtilités méritent d’être relevées : le métacaractère \w, qui sélectionne dans GREP une lettre et un chiffre quelconques ainsi que l’underscore, se limite dans iX² aux lettres de l’alphabet. Pour obtenir aussi les chiffres, il faut cocher l’option « Inclure les chiffres ».

le métacaractère \s n’est pas vraiment utile dans iX². Préférez-lui l’option « Espace générique » qui couvre toutes les espaces d’InDesign

Comme GREP, les signes spéciaux implémentés dans iX² doivent être échappés pour retrouver leur valeur littérale lorsqu’ils sont utilisés dans une expression régulière : . \ / + * ? [ ^ ] $ ( ) { } = ! < > : - |. À cette différence près qu’ils doivent être échappés dans un jeu de caractère.

Une valeur Unicode s’obtient en écrivant \x{nnnn}n est un chiffre ou une lettre. Si iX² ne couvre que les documents basés sur l’alphabet latin, tous les autres caractères peuvent être recherchés par leur équivalent Unicode. Pour indexer le symbole du signe cœur ♥, il faut écrire la requête /\x{2665}/

À l’image des Touches de modification GREP, il existe les « flags » dans iX² qui agissent localement sur le comportement de la requête : respect de la casse activé [I/(?-i)] / désactivé [i/(?i)] ; w active l’option mot entier, alors que W la désactive ; s active l’espace générique et S la désactive. Plus spécifiquement, un chiffre compris entre 1 et 9 agit sur le page rank (« valeur de 1 à 9 qui représente le nombre minimum d’occurrences d’une expression donnée dans une page donnée », cf. p. 10 du Manuel). Nous verrons plus bas la syntaxe à respecter pour les utiliser.

Le « Trouvé » a son équivalent dans iX² : l’opérateur $n permet aussi de rappeler, dans la partie « terme » de la requête, une chaîne capturée dans la « clé » (cf. ci-dessous la signification de ces deux entités).

3) Les bonus

iX² implémente des métacaractères qui ne relèvent pas du GREP à proprement parler mais sont utilisés dans InDesign : il s’agit essentiellement d’une partie des Symboles, des Césures et tirets, des Espaces, des Guillemets et de deux signes classés dans la catégorie Autres d’InDesign (cf, p. 19 du Manuel).

B) Écrire une expression régulière sous iX²

1) Principes généraux

On peut distinguer deux façons d’utiliser les expressions régulières dans IndexMatic², l’une n’excluant pas l’autre, bien au contraire.

  1. La première sera de formuler, à l’aide des seuls métacaractères, une regex susceptible de décrire un modèle à part entière de chaîne de caractères (par exemple, /[A-Ý]\w+ [IVX]+/, pour trouver tout ce qui s’apparente à des noms de souverains dans leur forme la plus simple, comme Louis XIV, Ferdinand II, Édouard VII, etc.). Cette solution est surtout utile en l’absence de toute liste d’entrées d’index normalement constituée par l’auteur.
  2. La seconde consistera à associer des métacaractères à une liste de mots préétablie pour rendre la recherche et le résultat de l’indexation plus précis et pertinents (par exemple, /voitures?/ ou /cheva(l|ux)/ pour indexer le singulier et le pluriel du mot). C’est sur ce dernier aspect que nous insisterons ci-dessous.

Quelle que soit la méthode choisie, écrire une Requête unique (directement dans le champ prévu à cette effet) ou une Liste de requêtes (dans l’Éditeur de requêtes ou dans un fichier txt que vous importerez ensuite), repose sur un principe fondamental. Il faut distinguer :

  1. ce que vous recherchez (la « clé », composée d’un mot [« vocable »] ou d’une expression [« motif »]) ;
  2. le résultat de la recherche (le « terme »), ce qui figure in fine dans l’index ; les deux parties étant généralement séparées par l’opérateur de réécriture =>

On pourrait tenter cette analogie qui vaut ce qu’elle vaut : la « clé » (mot ou expression) renverrait au champ « Rechercher » ; le « terme » au champ « Remplacer par » du panneau Rechercher/Remplacer InDesign.

Ceci posé, une expression régulière dans iX² doit obligatoirement commencer par une barre oblique / et optionnellement se clore par une autre barre oblique /. Si la première est absente, les métacaractères seront interprétés comme des caractères littéraux et il est peu probable, par exemple, que \w+ trouve un mot quelconque, alors que /\w+/ fonctionnera.

À la différence des modificateurs GREP InDesign (qui peuvent être placés au début ou dans la regex), les flags se placent toujours à la fin de l’expression régulière et doivent eux-mêmes être précédés d’une barre oblique : /poisson/i recherche le mot « poisson » quelle que soit la casse (flag i) ; /poisson/3 indexe le mot « poisson » uniquement lorsqu’il est présent au moins trois fois dans une page. Les flags peuvent être combinés : /poisson/wi3 recherche le mot entier (w), quelle que soit la casse (i), et lorsque le page rang est égal à trois (3).

Les flags influencent localement le comportement d’une requête. Ils seront vraiment pertinents dans une Liste de requêtes pour créer au cas par cas des conditions de recherche différentes des Options par défaut choisies à partir du panneau (Mot entier, Respect de la casse, Espace générique et Page Rank).

Voyons désormais quelques cas pratiques.

2) Exemples d’expressions dans la « clé »

Répétons-le : la « clé » est le(s) mot(s) ou expression(s) à indexer. Si, en toute logique, à une clé correspond bien souvent une forme unique (il n’y a pas trente-six façons d’écrire « Paris », « gaz », « InDesign » ou « Nathalie »), rechercher des variantes sera parfois nécessaire pour l’exhaustivité de l’index.

Soulignons aussi que, pour un résultat donné, plusieurs solutions peuvent être trouvées. Selon le choix du métacaractère, certaines options seront à activer parmi les « Options par défaut » et « Alphabet », qui précisent comment interpréter les requêtes.

Le singulier et le pluriel

Selon les situations, deux métacaractères peuvent convenir : — le métacaractère « Zéro ou une fois » ? conviendra pour trouver un mot au singulier et au pluriel (obtenu par l’ajout du s ou du x) : /chiens?/ recherchera « chien » et « chiens » ; /escabeaux?/, « escabeau » et « escabeaux » ; – pour les autres formes, l’« alternative » | dans une requête de type /cheva(l\|ux)/ indexera « cheval » et « chevaux » ; /cora(il|ux)/, « corail » et « coraux ».

Le féminin et le masculin

Là encore, les métacaractères ? et | sont utiles. — placé après un groupe de caractères entre parenthèses, ? permettra d’identifier les formes masculine et féminine : /chirurgien(ne)?/ pour « chirurgien » et « chirurgienne » ; /tigre(sse)?/ pour « tigre » et « tigresse ». – en revanche, l’alternative /act(eur|rice) sera préférée pour « acteur » et « actrice », et plus encore dans un cas de type /cheval|jument/ !

Toutes les variantes en genre et en nombre

La combinaison des deux métacaractères déjà vus conviendront pour trouver toutes les variantes d’un mot en genre et en nombre : /chirurgien(ne)?s?/ ; /cheva[l|ux]|juments?/ Dans d’autres cas, on pourra recourir aux métacaractères . (Caractère quelconque) ou \w (Mot quelconque), associés au quantificateur * (Zéro ou plusieurs fois) : /tigre.*/  /tigre\w*/ pour « tigre », « tigres », « tigresse » et « tigresses ».

Orthographes différentes d’un même mot

Une fois encore, les combinaisons sont nombreuses avec le métacaractère Zéro ou une fois ?, le jeu de caractère [], l’alternative |. On cherchera /pop-?corn/ pour « pop-corn » ou « popcorn » ; /év[éè]nement pour « événement » ou « évènement »  /cuill[èe]re?/ pour « cuiller » ou « cuillère ». On pourrait aussi écrire /cuill(ère|er)/

Majuscule ou minuscule

Dans une configuration, par défaut, insensible à la casse, les flags seront particulièrement appropriés. S’il vous faut distinguer « allemand » (la langue) d’un « Allemand », plutôt que de cocher l’option « Sensible à la casse » qui risquerait de trop étendre vos recherches, la formule /Allemand/I n’indexera que le mot avec la capitale initiale. De même, /assemblée/I permettra de ne conserver que le mot en bas de casse.

Pour conserver les deux orthographes (/Allemand/I et /allemand/I) mais en les différenciant comme deux entrées distinctes, choisissez l’option « [À l’identique] » parmi les différentes mises en forme de sortie.

Groupe de mots différents

L’alternative est incontournable pour regrouper un ensemble de mots différents ayant un point commun quelconque : /(aulne|chêne|bouleau|châtaigner|hêtre)/ permettra d’indexer chacun des arbres appartenant à la famille des « feuilles simples ». /(dalmatien|caniche|berger (belge|allemand)|lévrier)/ recherchera ces différentes races de chiens.

Un peu différemment, la requête /InDesign (\d(.\d)?|CS\d(.\d)?)?/ indexera toutes les versions du logiciel depuis InDesign 1.0 jusqu’à InDesign CS5.5, InDesign seul compris (en désactivant l’option « Mot entier) »). D’autres requêtes, plus simples, pourront servir, comme /InDesign ([CS\d.]+)?/.

Mots simples et composés avec trait d’union

Plutôt que d’écrire toutes les formes (avec une alternative), pour les mots composés avec trait d’union au moins une option s’offre à nous : Le métacaractère « Caractère de mot quelconque » \w suivi du quantificateur « Une ou plusieurs fois » + associés au « mot racine », avec l’option « Inclure le trait d’union », permettront de trouver toutes les occurrences associées. Par exemple, /chirurgie\w+/ indexera chirurgien, chirurgiens, chirurgienne, chirurgiennes, chirurgien-dentiste, chirurgiens-dentistes, chirurgienne-dentiste, chirurgien-major, etc.

Mots simples et composés détachés

La situation est un peu plus complexe en présence des mots composés détachés comme, par exemple, les noms d’organisme, titres d’œuvres, etc. Les solutions seront à adapter en fonction du texte.

La première solution, et certainement la plus sûre, consistera à indiquer en long toutes les variantes possible : /Assemblée( nationale| constituante| parlementaire| du peuple)?/.

La seconde pourra être d’indiquer le premier mot commun aux suivants : /Assemblée( \w+)?/ pour « Assemblée nationale », « Assemblée constituante », « Assemblée parlementaire ». Mais cette solution trouvera aussi « Assemblée » suivie de n’importe quel autre mot. Donc à utiliser avec précaution.

La troisième sera, si le formatage du texte le permet, d’associer l’option « Style de caractère » à la requête. [ \w]+ avec le style approprié indexera, par exemple, tous les mots ou expressions en italique. Pour restreindre la recherche aux expressions commençant par une majuscule (titres d’œuvres), l’on pourra écrire : /[A-Z][ \w]+.

Exclure un mot

Les regex dans InDesign permettent de sélectionner un mot s’il n’est pas suivi d’un autre mot, grâce au lookbehind négatif. iX² n’offre pas cette possibilité. Mais s’il est impossible d’indexer uniquement « ministre » et non « Premier ministre », on peut contourner le problème.

La formule /(Premier )?ministre/ permettra de distinguer l’entrée « ministre » de l’entrée « Premier ministre » qu’il suffira de supprimer. Sur le même principe, /(Assemblée |régime )?parlementaire/ distinguera trois entrées.

Avec ces quelques exemples, nous avons couvert la partie en amont du processus d’indexation. Voyons comment quelques opérateurs permettent d’organiser le résultat.

3) Expressions dans le « terme »

Dans iX², le « terme » est le résultat de la requête, l’entrée sous laquelle apparaît le mot (clé) indexé. Là encore, clé et terme concorderont dans la majorité des cas. Autrement dit, au mot indéxé « Tournier » (c’est moi) correspondra l’entrée d’index « Tournier » (toujours moi). Dans un tel cas, la partie « terme » ne sera pas précisée et il sera même superflu de recourir aux expressions régulières dans la « clé », une requête de type Tournier suffisant pour l’indexation.

Mais iX² permet d’aller bien au-delà, et autorise au moins deux manipulations intéressantes grâce à la réécriture explicite du terme ou au recours à la variable de type $n (équivalent du « Trouvé » dans GREP).

Mots ou expressions fondus dans l’entrée d’index

Si l’on peut avoir besoin d’indexer les variantes d’un mot, comme nous l’avons vu, l’on pourra vouloir les fusionner en une entrée d’index unique. Il suffit, pour ce faire, de réécrire explicitement le « terme » souhaité La requête /Grecques?|Grecs?/=>Grec donnera dans le fichier .txt de sortie :

De même /InDesign|Illustrator|Photoshop/=>Logiciels fusionnera les trois mots dans l’entrée « Logiciels ».

Mots ou expressions comme sous-entrées

Le plus intéressant est de rattacher le(s) mot(s) clé(s) à un terme générique, autrement dit d’en faire autant de sous-entrées. Deux niveaux peuvent être détaillés. Une requête de type /InDesign|Illustrator|Photoshop=>Adobe $0 donnera :

En revanche, la requête /InDesign|Illustrator|Photoshop/=>Adobe > $0 donnera :

Dans ce dernier cas, l’opérateur > doit être intercallé entre l’entrée réécrite et la variable qui reprend chacun des mots clés.

Dans les deux exemples ci-dessus, il est indispensable de séparer les mots clés par une alternative. La variable $0 renvoit à l’ensemble des mots ou expressions de la clé. Si nous avions regroupé les mots clés dans une sous-expression, $1 aurait été la variable correspondante pour les rappeler.

Manipulations diverses avec la variable $n

Dans InDesign, $n permet de rappeler, dans le champ « Remplacer par » une chaîne de caractères contenue dans une sous-expression marquante (entre parenthèses) dans le champ « Rechercher ». C’est exactement le même principe dans iX²). La variable placée dans la partie « terme » rappelle une sous-expression de la partie « clé ».

Comme dans InDesign, iX² implémente jusqu’à dix variables $n correspondant à autant de sous-expressions (comptez le nombre de parenthèses ouvrantes).

Quelques manipulations sont donc possibles :

/(Marc) (Autret)/=>Scripteurs > $2 ($1) donnera en entrée d’index Marc Autret. Nous avons permuté le prénom et le nom et mis le premier entre parenthèses, le tout sous l’entrée d’index “Scripteurs”.

La sortie de /(Marc) (Autret)|(Loic) (Aigon)/=>Scripteurs > $2 $1$4 $3 sera :

Si nous souhaitons indexer des URL (même écrites dans leur intégralité, c’est-à-dire parfois sur plusieurs lignes), mais n’en conserver que le nom, une requête de type /(http\:\/\/)?(www.)?([^\s]+(com|fr))/=>$3 donnera

indexmatic-url.png

Conclusion

Nous avons insisté ici uniquement sur l’apport des expressions régulières dans IndexMatic², conscient néanmoins que des subtilités nous ont sûrement échappées (Je laisse la parole à Marc qui ne manquera pas de préciser, voire corriger, quelques-uns de mes propos.) Sachez que ce script offre encore une multitude d’autres options qui permettent d’affiner davantage l’indexation d’un document. Si IndexMatic² nécessite une période de prise en main, c’est le script indispensable pour tout travail d’indexation. L’essayer c’est l’adopter.