Suite au billet sur l’utilisation des variantes stylistiques, j’ai réfléchi aux limitations des commandes proposées, et trouvé une solution.
Le code final du billet précédent proposait de procéder à des substitutions automatiques de caractère. Une première limitation était l’impossibilité de mettre des commandes (de mise en forme par exemple) à l’intérieur de la chaîne à transformer.
\documentclass[11pt]{article} \usepackage{fontspec} \usepackage{polyglossia} \setmainfont{Brill} \setotherlanguage[variant=ancient]{greek} \usepackage{xstring} \newcommand{\varphon}{\addfontfeature{StylisticSet=20}} \newcommand{\mysub}[1]{\expandafter\StrSubstitute\expandafter{\myipastring}{#1}{{\varphon #1}}[\myipastring]} \newcommand{\ipa}[1]{% \def\myipastring{#1}% \noexpandarg% \mysub{β}% \mysub{θ}% \mysub{χ}% \expandafter\myipastring% } \begin{document} aɑæœfgɡ \textit{aɑæœfgɡ}\\ βθχ \textit{βθχ} \textgreek{βθχ \textit{βθχ}}\\ \textit{\ipa{aɑæœfgɡ}} \ipa{βθχ} \textit{\ipa{βθχ}} \end{document}
L’autre limitation est que, si on peut appliquer des substitutions à des caractères simples comme à des chaînes, il est impossible de prendre en compte le contexte ou d’appliquer une substitution à une chaîne dont on ne connaît pas la longueur à l’avance. Bref, il manque la possibilité d’utiliser des expressions régulières.
Le module l3regex
de LaTeX est encore au stade expérimental mais est déjà fonctionnel et permet d’utiliser des expressions régulières. Il s’agit d’un module du projet LaTeX3, et sa syntaxe est donc très différente du code LaTeX ordinaire. Le code ci-dessous résout nos deux problèmes et est plus simple. J’ajoute une substitution pour avoir toute suite de barres tonales, quelle que soit sa longueur, en style droit, même à l’intérieur de l’italique.
\usepackage{l3regex} \ExplSyntaxOn \newcommand\ipa[1]{{ \tl_set:Nn \l_temp_tl {#1} \regex_replace_all:nnN {[βθχ]+} {\cB\{\c{varphon}\0\cE\}} \l_temp_tl \regex_replace_all:nnN {[˥˦˧˨˩]+} {\c{textup}\cB\{\0\cE\}} \l_temp_tl \tl_use:N \l_temp_tl }} \ExplSyntaxOff
La syntaxe est un peu obscure:
- la commande
\regex_replace_all:nnN {…} {…}
a deux arguments: une expression régulière, et une chaîne de remplacement - les commandes LaTeX dans la chaîne de remplacement doivent être codés d’une manière particulière:
\c{varphon}
remplace la commande\varphon
, et les accolades s’écrivent respectivement\cB\{
et\cE\}
\0
représente la chaîne capturée par l’expression régulière
Le code complet et le résultat:
\documentclass[11pt]{article} \usepackage{fontspec} \usepackage{polyglossia} \setmainfont{Brill} \newcommand{\varphon}{\addfontfeature{StylisticSet=20}} \usepackage{l3regex} \ExplSyntaxOn \newcommand\ipa[1]{{ \tl_set:Nn \l_temp_tl {#1} \regex_replace_all:nnN {[βθχ]+} {\cB\{\c{varphon}\0\cE\}} \l_temp_tl \regex_replace_all:nnN {[˥˦˧˨˩]+} {\c{textup}\cB\{\0\cE\}} \l_temp_tl \tl_use:N \l_temp_tl }} \ExplSyntaxOff \begin{document} Test \ipa{βθχ\textit{ba˩}\textbf{bɑ˧}ba˥ba˩˥} test \end{document}
Cette solution a bénéficié de l’aide de LaTeX Stack Exchange.
OpenEdition vous propose de citer ce billet de la manière suivante :
Thomas Pellard (14 juin 2016). Utiliser les variantes stylistiques d’une police (suite). Cipanglossia. Consulté le 4 décembre 2024 à l’adresse https://doi.org/10.58079/mtsy