Ceci est une ancienne révision du document !


Comment utiliser un tiret bas dans le texte hors du mode mathématique ?

Problème

Par défaut, le tiret bas (_) se voit attribuer le catcode 8, qui introduit les indices en mode mathématique. Si vous l'utilisez tel quel dans votre document, il est fort probable que vous obteniez une erreur ''Missing $ inserted''.

Exceptions

Le tiret bas est considéré par défaut comme un caractère normal dans les arguments de :

  • \label
  • \ref
  • \input
  • \include
  • \includegraphics
  • \begin et \end
  • compteurs
  • paramètres de placement (comme [t]).

Par exemple:

\documentclass{article}
\begin{document}
\section{Hello World}
\label{sec_hello}
See section \ref{sec_hello}.
\end{document}

\documentclass{article}
\pagestyle{empty}
\begin{document}
\section{Hello World}
\label{sec_hello}
See section \ref{sec_hello}.
\end{document}

Même le package babel, qui utilise des substitutions de symboles pour rendre des caractères actifs, ne pose pas de problème, car il patche les commandes du système \label/\ref pour supporter les substitutions.

\documentclass{article}
\usepackage[french]{babel}
\begin{document}
\section{Bonjour tout le monde}
\label{sec_bonjour}
Voir section \ref{sec_bonjour}.
\end{document}

\documentclass{article}
\usepackage[french]{babel}
\pagestyle{empty}
\begin{document}
\section{Bonjour tout le monde}
\label{sec_bonjour}
Voir section \ref{sec_bonjour}.
\end{document}

Si vous rencontrez quand même le message d'erreur indiqué quand vous utilisez un tiret bas dans un de ces cas, vous utilisez sans doute une extension qui modifie le comportement du tiret bas. Dans ce cas, vous devez appliquer l'une des solutions suivantes.

Comment faire pour le tiret bas soit traité comme un caractère normal

Solution simple et généralement suffisante

L'extension underscore redéfinit le tiret bas comme un caractère actif qui a le comportement suivant :

  • En mode mathématique, pas de changement (introduit un caractère en indice) ;
  • Dans le corps du texte, affiche un tiret bas ;
  • S'il est précédé du caractère '\', affiche un tiret bas après lequel il est possible de faire une coupure de mots.

Dans la plupart des cas, cela correspond à l'effet souhaité. Cependant, la redéfinition du tiret bas par underscore a pour conséquence qu'il n'est plus considéré comme un caractère normal dans les cas où il devrait être considéré comme tel. Ce problème est résolu en grande partie si vous chargez babel, ou de manière plus limitée en utilisant l'options [strings] de underscore. Pour plus de détails, veuillez vous référer à la documentation, particulièrement p. 2.

\documentclass{article}
 
\usepackage[french]{babel}
\usepackage{underscore}
 
\begin{document}
 
\section{Le fichier test_tiret-bas.pdf}
\label{sec_tiret}
Nous étudions ici le fichier test_tiret-bas.pdf.
 
\section{Autre section}
Voir section \ref{sec_tiret}.
 
\end{document}

\documentclass{article}

\usepackage[french]{babel}
\usepackage{underscore}

\pagestyle{empty}
\begin{document}
\section{Le fichier test\string_tiret-bas.pdf}
\label{sec_hello}
Nous étudions ici le fichier test\string_tiret-bas.pdf.

\section{Autre section}
Voir la section 1.
\end{document}

Solution plus souple et plus complexe

Si les effets du tiret bas ont été redéfinis par d'autres extensions avec lesquelles l'extension underscore interfère, on peut, au lieu de charger l'extension 'underscore, utiliser ponctuellement la commande \string, qui indique que le caractère qui suit immédiatement doit être traité comme un caractère normal (plus précisément, de la catégorie 12).

\label{sec\string_hello}
\ref{sec\string_hello}

Comme le nom de l'étiquette est également écrit dans le fichier .aux, il faut assigner au tiret bas la catégorie (catcode) 12 lors de la lecture de ce fichier :

\usepackage{atveryend}
\AfterLastShipout{\catcode`\_=12\relax}

Si l'extension en question rend le tiret bas actif avant le \begin{document}, alors il faut qu'il soit inactif pendant la lecture du fichier .aux à la fin du préambule.

\ifnum\catcode`\_=\active
  \catcode`\_=12\relax
  \AtBeginDocument{\catcode`\_=\active}%
\fi

Voici le code complet de l'exemple:

\documentclass{article}
 
\catcode`\_=\active
\def_{\textunderscore}
 
\usepackage{atveryend}
\AfterLastShipout{\catcode`\_=12\relax}
\ifnum\catcode`\_=\active
  \catcode`\_=12\relax
  \AtBeginDocument{\catcode`\_=\active}%
\fi
\begin{document}
\section{Hello World}
\label{sec\string_hello}
See section \ref{sec\string_hello}.
\end{document}

\documentclass{article}
\pagestyle{empty}
\begin{document}
\section{Hello World}
\label{hello}
See section 1.
\end{document}

Source: https://tex.stackexchange.com/questions/121416/putting-an-underscore-in-a-label, documentation de l'extension underscore

3_composition/texte/renvois/underscore_dans_un_label.1611685098.txt.gz · Dernière modification: 2021/01/26 19:18 par bdumont
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0