Utiliser les variantes stylistiques d’une police (suite)

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}

brill-varsub2

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}

regex

Cette solution a bénéficié de l’aide de LaTeX Stack Exchange.

Ce billet peut être cité de la façon suivante: Thomas Pellard, « Utiliser les variantes stylistiques d’une police (suite) », Cipanglossia, 14 juin 2016, https://cipanglo.hypotheses.org/182.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *