Linguistique (gb4e/tipa/avm)

Ce qui rend LaTeX véritablement indispensable dans un article de linguistique, ce ne sont ni les arbres ni les symboles phonétiques, mais la numérotation. « Voir (1) », « à comparer avec (3b) » — les numéros d'exemples sont rappelés sans cesse depuis le texte courant, et insérer un exemple décale tout ce qui suit. Le faire à la main est impossible : c'est ainsi que les linguistes arrivent à gb4e et expex, les paquets dédiés aux exemples numérotés et aux gloses. Cette page s'organise autour de cette mécanique de numérotation et traite des gloses interlinéaires (\gll et \glt), de la transcription API (tipa et Unicode), des tableaux d'OT et des structures de traits. Elle consigne aussi les pièges réellement rencontrés sur TeX Live 2024 : un seul tiret bas dans un nom d'étiquette fait mourir gb4e sans produire le moindre PDF.

Exemples numérotés et sous-exemples : deux façons d'obtenir (1) et (1a)

Deux options seulement sont réellement vivantes : gb4e et expex. Dans gb4e, on aligne des \ex à l'intérieur d'un environnement exe et l'on imbrique un environnement xlist là où des sous-exemples sont nécessaires — sous (1) apparaissent a. et b., et les renvois s'appuient sur les \label / \ref standard de LaTeX. expex procède tout autrement : les exemples sont encadrés par \pex\xe, les sous-exemples prennent \a, et les renvois passent par son propre \getref et non par le \ref de LaTeX. Le choix tient presque entièrement à ceci : voulez-vous vous appuyer sur la mécanique de renvoi de LaTeX ou vous contenter d'une mécanique séparée ? linguex (v4.3) et covington (v2.14) figurent aussi dans TeX Live 2024 ; le premier se distingue par une notation brève, quasi typographique, comme \ex.

PaquetDans TeX Live 2024Mécanique des renvoisCe qui demande attention
gb4eoui (son journal des modifications s'arrête en 2010)\label / \ref standard de LaTeXplante fatalement sur un tiret bas ; exige \noautomath
expexoui (v5.1b)ses propres \getref / \getfullref / \nextxle \ref de LaTeX ne s'applique pas, \cref non plus
langsci-gb4eoui (daté 2022-10-21)comme gb4eune révision de gb4e maintenue par Language Science Press
linguexoui (v4.3)LaTeX standardnotation brève, quasi typographique, comme \ex.
covingtonoui (v2.14)LaTeX standardune boîte à outils ancienne pour exemples, gloses et symboles
avmnonle avm.sty de Manning n'est pas fourni ; utiliser langsci-avm

Composer des gloses interlinéaires avec gb4e : \gll et \glt

L'essentiel d'une glose interlinéaire est l'alignement vertical mot à mot, et c'est le travail de \gll. Placez les données sources sur la première ligne, la glose mot à mot sur la deuxième, fermez chacune par \\, et gb4e découpe les deux aux espaces et aligne verticalement les mots correspondants. La traduction libre revient à \glt sur une troisième ligne (pour trois lignes alignées, \glll). Attention : l'unité d'alignement est « un mot séparé par des espaces ». Si un mot source appelle deux mots de glose, reliez-les par un point en un seul jeton, this.one — ce que prescrivent aussi les Leipzig Glossing Rules, et le paquet leipzig fourni avec TeX Live définit les abréviations usuelles comme \Erg et \Pfv. Les marques de grammaticalité se passent entre crochets, comme \ex[*]{...}. Pour un exemple isolé, il existe aussi une forme brève qui se passe de l'environnement exe : l'encadrer par \ea\z.

latex
\documentclass{article}
\usepackage{gb4e}
\noautomath          % see the next section: this line prevents a fatal error
\begin{document}

\begin{exe}
  \ex \label{ex:one}
  \gll Kore wa rei desu.\\
       this TOP example COP\\
  \glt `This is an example.'
  \begin{xlist}
    \ex \label{ex:sub} A sub-example, printed with the label a.
  \end{xlist}
  \ex[*]{ Sleep colorless green ideas furiously. }
\end{exe}

See (\ref{ex:one}) and (\ref{ex:sub}).
\end{document}

Quand gb4e meurt sur ! TeX capacity exceeded, sorry [parameter stack size=20000].

La cause est le tiret bas, et le remède tient en une ligne : \noautomath juste après \usepackage{gb4e}. Un simple \label{ex_one} suffit à faire tomber pdfLaTeX sur TeX Live 2024 ainsi : ! TeX capacity exceeded, sorry [parameter stack size=20000]., avec \gb@ifnextchar dans la trace et une fin sur ==> Fatal error occurred, no output PDF file produced! Pas un octet de PDF n'est produit. Il en va de même avec \cite{smith_2020} — relier l'auteur et l'année par un tiret bas est une clé BibTeX des plus ordinaires, si bien que le document casse à l'instant où l'on ajoute une bibliographie. Avec \noautomath, les deux cas se compilent.

La raison est écrite dans le source même de gb4e. gb4e rend _ et ^ actifs afin que l'on puisse écrire indices et exposants dans le texte courant. L'effet est réellement spectaculaire : avec gb4e chargé, on tape NP_i, t_j et X^0 directement dans un paragraphe. Sans lui, la même saisie donne ! Missing $ inserted. — et pour un article de syntaxe qui écrit des centaines de fois des étiquettes de catégorie indicées, c'est un vrai confort. Le prix en est une collision frontale avec toute autre macro qui utilise _ dans son sens TeX. Une note du source le dit exactement : ce fichier autorise _ et ^ dans le texte courant, il doit donc être chargé après tout fichier qui les emploie dans leur sens TeX, et \noautomath est signalé comme moyen de désactiver la fonction. Voilà la substance du conseil bien connu : « chargez gb4e en dernier dans le préambule ».

\cref imprime ?? 1 : cref reference format for label type 'xnumi' undefined

Le remède tient en deux lignes de préambule : \crefname{xnumi}{example}{examples} et \crefname{xnumii}{example}{examples}. Chargez gb4e avec cleveref et la compilation réussit sans la moindre erreur, mais \cref{ex:one} sort en ?? 1. Dans le .aux on lit \newlabel{ex:one@cref}{{[xnumi][1][]1}...}, et le journal conserve LaTeX Warning: cref reference format for label type 'xnumi' undefined. cleveref garde un nom pour chaque type de compteur, mais il ignore le compteur d'exemples de gb4e, xnumi (les sous-exemples usent de xnumii), et place donc ?? à l'endroit du nom. Comme il s'agit d'un avertissement et non d'une erreur, la compilation passe — c'est ainsi qu'un PDF portant deux cents ?? 1 finit par être déposé. Avec ces deux lignes, \cref{ex:one} imprime example 1 et \cref{ex:sub} imprime example 1a.

En revanche, le conflit avec hyperref, souvent évoqué dans la foulée, ne s'est pas reproduit sur TeX Live 2024. Que \usepackage{hyperref} soit placé avant ou après gb4e, les exemples contenant \gll se composent sans erreur et \ref renvoie correctement (1). Les affirmations en ligne selon lesquelles « gb4e et hyperref sont incompatibles » semblent périmées, au moins pour les versions fournies ici. Le principe de l'ordre de chargement reste toutefois valable : sans \noautomath, chargez gb4e après tout autre paquet qui utilise _.

latex
\documentclass{article}
\usepackage{gb4e}
\usepackage{cleveref}
% Without these two lines \cref prints "?? 1" and the run still succeeds:
%   LaTeX Warning: cref reference format for label type `xnumi' undefined
\crefname{xnumi}{example}{examples}    % top-level examples: (1), (2), ...
\crefname{xnumii}{example}{examples}   % sub-examples: (1a), (1b), ...
\begin{document}
\begin{exe}
  \ex \label{ex:one} A top-level example.
  \begin{xlist}
    \ex \label{ex:sub} A sub-example.
  \end{xlist}
\end{exe}
See \cref{ex:one} and \cref{ex:sub}.   % -> "example 1 and example 1a"
\end{document}

La mécanique de renvoi d'expex : \getref, \getfullref, \nextx

Dans expex, les étiquettes ne s'écrivent pas avec \label mais entre chevrons juste après l'exemple : \pex<top>, et \a<one> pour un sous-exemple. Les renvois passent par \getref{top}, qui donne 1 ; un sous-exemple prend son parent en préfixe, de sorte que \getref{top.one} donne a ; et \getfullref{top.two} donne 1b, combinant le numéro principal et la sous-étiquette. Pour les renvois en avant, \nextx (le numéro de l'exemple suivant) et \lastx (celui du précédent) permettent d'écrire « voir (1) ci-dessous » sans citer de chiffre. Lorsqu'un renvoi ne se résout pas, la sortie porte [one] entre crochets et le journal contient ====> EXPEX WARNING: tag one is called but not defined. — sur ce point, ne pas laisser passer un renvoi non résolu en silence, c'est plus sûr que la combinaison avec cleveref.

latex
\documentclass{article}
\usepackage{expex}     % lives in tex/generic: works under plain TeX too
\begin{document}
Consider (\nextx).     % forward reference to the example below

\pex<top>
  \a<one> \begingl
    \gla Kore wa rei desu.//
    \glb this TOP example COP//
    \glft `This is an example.'//
  \endgl
  \a<two> A second sub-example.
\xe

% \getref{top} -> 1   \getref{top.one} -> a   \getfullref{top.two} -> 1b
See (\getref{top}), (\getref{top.one}) and (\getfullref{top.two}).
\end{document}

expex a été écrit par John Frampton, de la Northeastern University ; le README porte un copyright 2006–2017, la version fournie est la v5.1b, et le guide de l'utilisateur compte 82 pages. Techniquement, son emplacement est instructif : tex/generic/expex/. Ce n'est donc pas un outil propre à LaTeX mais un jeu de macros qui tourne aussi sous plain TeX ; expex.sty n'est qu'une mince enveloppe LaTeX. La syntaxe des gloses diffère elle aussi de gb4e : dans \begingl\endgl, on aligne \gla (données sources), \glb (glose mot à mot) et \glft (traduction libre), et chaque ligne se ferme par //, non par \\. Ce // est la première chose que ratent ceux qui découvrent expex.

La boîte à outils de Language Science Press : langsci-gb4e et langsci-avm

Le coin le plus activement entretenu de l'écosystème LaTeX pour la linguistique est aujourd'hui l'ensemble de paquets publiés par Language Science Press, l'éditeur de linguistique en accès ouvert. langsci-gb4e.sty (daté 2022-10-21) est un gb4e remis en ordre, qui intègre en outre les fonctions de cgloss et de jambox. Le fichier réside dans tex/xelatex/langsci/, mais kpsewhich le trouve quel que soit le moteur, et il se compile de fait sans erreur sous pdfLaTeX comme sous XeLaTeX. Le même répertoire abrite langscibook.cls — la classe réelle avec laquelle la maison compose ses propres ouvrages. Un éditeur qui donne ses livres dépose aussi sur le CTAN la classe qui les fabrique ; un auteur peut donc produire chez lui le même PDF que l'éditeur.

Pour les structures de traits — matrices attribut-valeur —, notez que le paquet avm de Chris Manning, que citent les textes anciens, ne figure pas dans TeX Live 2024. \usepackage{avm} s'arrête sur ! LaTeX Error: File 'avm.sty' not found. Le remplaçant est langsci-avm (Felix Kopecky, v0.3.0, 21 février 2023), dont le README affirme sans détour qu'il « serves the same purpose as Christopher Manning's avm package, but shares no code base with that package ». Sa notation est une commande et non un environnement : \avm{ [ cat & [ head & noun \\ case & nom ] ] }, où & sépare l'attribut de la valeur et \\ les lignes. Crochets, chevrons, parenthèses et accolades composent chacun la paire correspondante. Le manuel comporte une section sur la conversion depuis l'avm de Manning : c'est par là qu'il faut commencer si l'on possède un ancien manuscrit.

Comment composer l'API : tipa, Unicode ou tipauni

pdfLaTeX appelle tipa, XeLaTeX et LuaLaTeX appellent l'Unicode saisi directement, et tipauni fait le pont entre les deux. tipa (de Rei Fukui) écrit l'API au moyen d'une abréviation ASCII : \textipa{[tSi:z]}, où S vaut ʃ, T vaut θ, N vaut ŋ, @ vaut ə et P vaut ʔ. Apprendre cette correspondance est le premier obstacle ; une fois acquise, la saisie est rapide et pdfLaTeX suffit à lui seul. Là où plusieurs transcriptions se suivent, l'environnement IPA englobe tout un passage au lieu de répéter \textipa{...}. Si XeLaTeX ou LuaLaTeX est disponible, la voie directe consiste à choisir avec fontspec une police couvrant l'API et à taper [tʃiːz] littéralement dans l'éditeur. TeX Live 2024 fournit Linguistics Pro (linguisticspro), une famille OpenType dotée des symboles API et des lettres de ton : cette voie est donc ouverte sans rien installer.

Les deux voies ne produisent pourtant pas le même PDF. Extrayez le texte d'un PDF composé avec tipa au moyen de pdftotext et ce qui revient est [tSi:z] — l'abréviation saisie, non l'API. pdffonts montre comme police incorporée TeX-tipa10, une Type 1 dont l'encodage est Builtin ; la couche texte du PDF n'est donc pas de l'Unicode, et copier ou rechercher n'y trouvera pas d'API. Composez le même contenu avec XeLaTeX et Linguistics Pro, et pdftotext renvoie [tʃiːz], [θɔːt], [sɪŋ] et [ma˥˥]. Si vous imaginez un relecteur cherchant une transcription, ou vous-même récupérant vos données depuis le PDF, cette différence ne se balaie pas d'un haussement d'épaules.

C'est ici qu'intervient tipauni (auteur निरंजन, v0.7a, 13 février 2023, GPL v3+) : un paquet qui conserve les commandes TIPA mais émet des caractères Unicode. Remplacer \usepackage{tipa} par \usepackage{tipauni} dans un document, puis compiler avec LuaLaTeX, a fait renvoyer par pdftotext [tʃiːz], [θɔːt], [sɪŋ]. Autrement dit, vingt ans de \textipa{...} peuvent migrer vers un PDF interrogeable sans être réécrits. Son exemple fourni présuppose Charis SIL, mais sur une machine dépourvue de cette police il est retombé sur New Computer Modern et a continué de fonctionner. Frère de tipa, le même ensemble contient vowel, qui trace le quadrilatère vocalique via \putcvowel ; phonrule, pour composer les règles phonologiques, figure aussi dans TeX Live 2024.

latex
% Three routes to IPA, and what pdftotext gets back from each PDF.

% 1. pdfLaTeX + tipa -> text layer is the shorthand, not IPA: "[tSi:z]"
\usepackage{tipa}
\textipa{[tSi:z]}   \textipa{[TO:t]}   \textipa{[sIN]}

% 2. LuaLaTeX + tipauni -> same commands, Unicode output: "[tSiz]" becomes IPA
\usepackage{tipauni}
\textipa{[tSi:z]}

% 3. XeLaTeX/LuaLaTeX + fontspec -> type the IPA directly
\usepackage{fontspec}
\setmainfont{LinguisticsPro-Regular.otf}[
  Path = /usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/]
% then simply: [tʃiːz] [θɔːt] [sɪŋ] [ma˥˥]
SaisieMoteurCe que renvoie pdftotext
tipapdfLaTeX[tSi:z] — l'abréviation ; la police incorporée est TeX-tipa10
tipauniLuaLaTeX / XeLaTeX[tʃiːz] — avec les commandes tipa inchangées
fontspecXeLaTeX / LuaLaTeX[tʃiːz] — les lettres de ton comme ˥˥ passent aussi

Les tableaux de la théorie de l'optimalité : ot-tableau et la place du *!

Les tableaux d'OT viennent du paquet ot-tableau et ne demandent que trois commandes : entrée, contrainte, candidat. \inp{/pat/} donne la forme d'entrée, une suite de \const{NoCoda} dispose les contraintes de gauche à droite, et chaque candidat s'écrit \cand{pa}{}{*}{} — la forme candidate suivie de ses violations pour chaque contrainte. Le gagnant se marque par \cand[\Optimal]{...} et reçoit la main pointée. Une violation fatale se tape simplement *! et s'imprime telle quelle. L'essentiel est que le classement des contraintes n'est rien d'autre que l'ordre dans lequel on écrit \const : reclasser pour une expérience revient donc à réordonner ces lignes plutôt qu'à déplacer des colonnes à la main. L'environnement tableau s'est compilé sans erreur avec la version fournie par TeX Live 2024.

latex
\usepackage{ot-tableau}
...
\begin{tableau}{c|c|c}
  \inp{/pat/}
  \const{NoCoda}\const{Max}\const{Dep}
  \cand[\Optimal]{pa}{}{*}{}
  \cand{pat}{*!}{}{}
  \cand{pati}{}{}{*!}
\end{tableau}

Dessiner des arbres syntaxiques : forest méprend en silence la notation à point de qtree

Les arbres syntaxiques ont ici leur propre page (« Arbres (forest/qtree) ») ; cette section ne consigne donc que le point qui mord lors d'une migration. qtree et tikz-qtree placent un point devant l'étiquette du nœud\Tree [.S [.NP ] [.VP ] ] —, tandis que la notation de forest est [S [NP] [VP]] et n'utilise aucun point. Or, si l'on donne la notation de qtree à forest, aucune erreur n'est levée : [.S [.NP Kim ]] se compose sans broncher en un nœud littéralement nommé .S. Un arbre dont la forme est juste mais dont toutes les étiquettes commencent par un point s'explique par là. Pour la comparaison complète et la mise en page automatique de forest, suivez le lien related.

Enfin, ce que cette page laisse délibérément de côté. Les formules chimiques et schémas réactionnels (mhchem, chemfig) et la composition de loisir relèvent chacun d'une page propre. Du côté linguistique, restent à l'écart la syntaxe de covington et de linguex si votre choix s'y porte, les crochets sémantiques de langsci-avm pour la LFG (l'option lfg, qui exige XeLaTeX) et les glossaires via glossaries — rien de tout cela n'étant central. La première décision dans ce domaine reste, on l'a dit, quelle mécanique de numérotation des exemples adopter. Si c'est gb4e, écrivez dès le départ les trois lignes de \noautomath et \crefname. Si c'est expex, familiarisez-vous avec l'idiome \getref. Changer une fois le manuscrit passé la centaine d'exemples coûte plus cher qu'on ne le croit.