Annoter une image avec TikZ

S’il vous arrive d’avoir à incorporer des images matricielles dans des documents, peut-être aimeriez-vous pouvoir les annoter directement depuis LaTeX, ce qui assurera le respect des fontes entre la figure et le reste du document, et permettra une certaine flexibilité (pour correction ou traduction par exemple).

Exemple

Annotations d'une image depuis LaTeX
Annotations d’une image depuis LaTeX. On peut aussi l’utiliser pour des choses intéressantes.

Code

Je vous donne donc ici un bout de code qui rempli parfaitement cet office. La technique est sensiblement la même que celle que j’avais utilisée pour afficher les barres d’échelle ou pour donner un effet de zoom.

Dans le préambule :

\usepackage{tikz}
\newenvironment{annotation}[2][]{
	\begin{tikzpicture}[]
		\node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics[#1]{#2}};
		\begin{scope}[x={(image.south east)},y={(image.north west)},style={font=\vphantom{Ag}}]
}{
		\end{scope}
	\end{tikzpicture}
}
\def\AnnoSep{0.02}	% Marge entre les annotations et l'image
\newcommand{\BckImg}[2][]{
	\node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics[#1]{#2}};
}
\newcommand{\annoLeft}[4][->]{
	\draw[->,#1] (0,#2)++(-\AnnoSep,0) node[anchor=east]{#3} -- (#4);
}
\newcommand{\annoRight}[4][->]{
	\draw[->,#1] (0,#2)++(+\AnnoSep+1,0) node[anchor=west]{#3} -- (#4);
}
\newcommand{\annoUp}[4][->]{
	\draw[->,#1] (#2,0)++(0,\AnnoSep+1) node[anchor=south]{#3} -- (#4);
}
\newcommand{\annoDown}[4][->]{
	\draw[->,#1] (#2,0)++(0,-\AnnoSep) node[anchor=north]{#3} -- (#4);
}

C’est maintenant l’environnement annotate qui va nous permettre d’inclure l’image et de l’annoter. Le chemin vers l’image à annoter est à donner en argument de l’environnement. Les annotations sont définies par les commandes \annoLeft, \annoUp, \annoRight et \annoDown suivant que vous voulez les annotations à gauche, en haut, à droite ou en bas de l’image, respectivement. Exemple avec une annotation sur la gauche :

\begin{annotation}[<options de l'image>]{<adresse de l'image>}
	\annoLeft{<position du texte>}{<Texte>}{<Coordonnées du point annoté>}
\end{annotation}

Les options pour l’image sont celles habituellement utilisées pour les \includegraphics (width, heigth, etc.). Les arguments pour les commandes d’annotation sont :

  1. La position du texte le long du bord concerné (entre 0 et 1)
  2. Texte de l’annotation
  3. Coordonnées du point annoté (deux valeurs entre 0 et 1, séparées par une virgule)

Les coordonnées (0,0) correspondent au point inférieur gauche de l’image, tandis que (1,1) correspond au point supérieur droit (voir plus bas).

En option des commandes d’annotation, vous pouvez modifier le style par défaut de flèches et des nodes. Exemple pour obtenir le même rendu qu’illustré plus haut :

\begin{annotation}[width=0.7\textwidth]{Photo.JPG}
	\annoLeft{0.7}{Saint Eynard}{0.23,0.59}
	\annoUp{0.71}{Chamechaude}{0.71,0.71}
	\annoUp{0.94}{La Pinéa}{0.94,0.65}
	\annoUp{0.32}{Le Sapey en Chartreuse}{0.32,0.51}
	\annoRight[red]{0.6}{Bec Charvet}{0.57,0.48}
	\annoDown[draw=yellow]{0.6}{Col du Coq}{0.7,0.15}
\end{annotation}

Afficher une grille d’aide

Si vous voulez positionner précisément vos flèches, vous pouvez temporairement afficher une grille d’aide sur l’image. Dans le préambule, commencez par ajouter :

\newcommand{\help}[1][0.1]{
	\draw[help lines,xstep=#1,ystep=#1] (0,0) grid (1,1);
	\foreach \x in {0,1,...,9} { \node [anchor=north] at (\x/10,0) {0.\x}; }
	\foreach \y in {0,1,...,9} { \node [anchor=east] at (0,\y/10) {0.\y}; }
}

Dans l’environnement annotation, vous disposez maintenant de la commande \help, qui affiche une grille régulière, espacée par défaut de 0,1 :

Grille d'aide pour le placement des annotations
Grille d’aide pour le placement des annotations

Si vous souhaitez raffiner cette grille, vous pouvez spécifier le pas en option de \help.

C’est quoi ce « \vphantom{Ag} » ?

Si vous avez l’œil averti, peut-être vous demandez-vous pourquoi je précise style={font=\vphantom{Ag}} en option du scope. Ou pas.

Quoi qu’il en soit, ceci sert à s’assurer de l’alignement des textes sur la ligne de base, indépendamment des jambages, hampes ou autres majuscules. Le problème vient du fait que TikZ ajuste automatiquement la taille des nodes de façon à ce que le texte tienne toujours dedans ; un node ne comprenant que « manan » sera donc moins haut qu’un autre contenant « Papa ».