J'ai un souci avec un code qui fait exactement ce que j'en attends... mais qui produit plein de messages d'erreur, et j'aimerais bien comprendre pourquoi.

J'ai besoin de tracer plusieurs courbes (ce que j'ai fait avec gnuplot ; je les ai sorties au format .eps, pas inclues ici car ne posant pas de problème) et je me suis fait des « markers » à la main avec TikZ pour les inclure dans la légende (caption).

Ouvrir dans l'éditeur Overleaf
\documentclass[12pt,a4paper]{article}
\usepackage{subfig} 
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,decorations.pathmorphing,calc,decorations.pathreplacing}
\usepackage{todonotes}

% markers for plot caption 
\newcommand{\rond}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture 
\draw [draw=#1,fill=#1](0,0) circle (#2);
\endtikzpicture
}}
\newcommand{\diam}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture
\node[draw=#1,fill=#1,scale=#2,diamond,draw]{}; %offset={-1ex},
\endtikzpicture
}}
\newcommand{\pentag}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture 
\node[draw=#1,fill=#1,scale=#2,regular polygon,draw]{};
\endtikzpicture
}}
\newcommand{\carre}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture[scale=#2] 
\node[draw=#1,fill=#1,scale=#2,regular polygon,regular polygon sides=4,draw]{};
\endtikzpicture
}}
\newcommand{\triL}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture[scale=#2] 
\node[draw=#1,fill=#1,scale=#2,rotate=90,regular polygon,regular polygon sides=3,draw]{};
\endtikzpicture
}}
\newcommand{\triR}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture[scale=#2] 
\node[draw=#1,fill=#1,scale=#2,rotate=-90,regular polygon,regular polygon sides=3,draw]{};
\endtikzpicture
}}
\newcommand{\triU}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture[scale=#2] 
\node[draw=#1,fill=#1,scale=#2,regular polygon,regular polygon sides=3,draw]{};
\endtikzpicture
}}
\newcommand{\triD}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture[scale=#2] 
\node[draw=#1,fill=#1,scale=#2,rotate=180,regular polygon,regular polygon sides=3,draw]{};
\endtikzpicture
}}

\begin{document}

\begin{figure}[htbp]
\centering
\subfloat[(\rond{blue}{5pt}) compound A and (\diam{red}{0.8}) compound B]{\label{fig:subA}\missingfigure{Remplace la sous-figure a}}

\subfloat[(\pentag{{rgb,255:red,0; green,0; blue,128}}{1}) compound C, (\carre{{rgb,255:red,0; green,102; blue,153}}{0.9}) compound D, (\triU{blue}{0.7}) compound E and (\rond{cyan}{5pt}) compound F]{\label{fig:subB}\missingfigure{Remplace la sous-figure b}}

\subfloat[(\rond{{rgb,255:red,51; green,102; blue,0}}{5pt}) compound G, (\pentag{{rgb,255:red,51; green,204; blue,0}}{1}) compound H, (\carre{{rgb,255:red,102; green,204; blue,102}}{1}) compound I, (\triU{{rgb,255:red,102; green,255; blue,0}}{0.7}) compound J]{\label{fig:subC}\missingfigure{Remplace la sous-figure c}}
\caption{Evolution of the reaction mixture composition during the course of a typical experiment}
\end{figure}

\end{document}

Le paquetage subfig ne semble pas être en cause car en séparant en 3 figures indépendantes et successives, j'obtiens les mêmes erreurs, de type :

! Argument of \pgfutil@in@@ has an extra }. ! Undefined control sequence.

Désolé pour cet exemple qui n'est peut-être pas tout à fait minimal.

Si on peut m'expliquer pourquoi ces erreurs sont générées (et accessoirement comment les éviter avec le même résultat) lors de l'inclusion de commandes à base de TikZ dans des « captions », je serais ravi, sinon je ferai avec puisque le résultat obtenu me satisfait.

Posée 19 Jan '17, 12:46

DRI's gravatar image

DRI
5321615
Taux d'acceptation : 18%

Modifiée 08 Aoû '17, 02:09

Pathe's gravatar image

Pathe ♦♦
7.4k29197245

Ajoute une paire de crochets vides [] après chaque appel à \subfloat pour avoir quelque chose du genre \subfloat[][(\rond{...

(19 Jan '17, 13:13) jerome dequeker jerome%20dequeker's gravatar image

@jerome dequeker, Effectivement, il n'y a plus d'erreur, merci. Il faudra que je relise plus attentivement la notice de subfig. Si tu transformes le commentaire en réponse, je pourrais l'accepter.

Mais par contre si on sépare en figures indépendantes (donc plus de subfig, ni de \subfloat), le problème demeure. \begin{figure}[htbp] \centering \missingfigure{Remplace sous-figure a} \caption{(\rond{blue}{5pt}) compound A and (\diam{red}{0.8}) compound B} \label{fig:A} \end{figure}

(19 Jan '17, 13:44) DRI DRI's gravatar image

@DRI merci pour avoir remarqué que le problème persistait lorsque l'on n'utilise pas le package subfig, ça m'a aidé à trouver la raison du problème.

(19 Jan '17, 14:40) jerome dequeker jerome%20dequeker's gravatar image

Remarque générale : Pourquoi ne pas utiliser la légende fournie par gnuplot ?

(19 Jan '17, 14:42) jerome dequeker jerome%20dequeker's gravatar image

@jerome dequeker, je prèfère utiliser la figure seule fournie par gnuplot et contrôler le titre ou la légende via LaTeX, ce qui m'a conduit à générer des marqueurs reproduisant ceux de gnuplot, mais je maîtrise cela maintenant !

(19 Jan '17, 15:46) DRI DRI's gravatar image

Je suppose que les illustrations réalisées avec tikz dans la légende sont problématiques lorsque l'on veut mettre les légendes dans une liste des figures.

Il faut donc que la légende courte, qui est par défaut identique à la légende longue, ne contienne pas de commandes tikz. Je propose ici de mettre des légendes courtes vides (donc à modifier si tu fais par exemple une liste des figures).

Rappel : \caption[legende-courte]{legende-longue}

En utilisant subfig :

Ouvrir dans l'éditeur Overleaf
\documentclass[12pt,a4paper]{article}
\usepackage{subfig} 
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,decorations.pathmorphing,calc,decorations.pathreplacing}
\usepackage{todonotes}

% markers for plot caption 
\newcommand{\rond}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture 
\draw [draw=#1,fill=#1](0,0) circle (#2);
\endtikzpicture
}}
\newcommand{\diam}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture
\node[draw=#1,fill=#1,scale=#2,diamond,draw]{}; %offset={-1ex},
\endtikzpicture
}}
\newcommand{\pentag}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture 
\node[draw=#1,fill=#1,scale=#2,regular polygon,draw]{};
\endtikzpicture
}}
\newcommand{\carre}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture[scale=#2] 
\node[draw=#1,fill=#1,scale=#2,regular polygon,regular polygon sides=4,draw]{};
\endtikzpicture
}}
\newcommand{\triU}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture[scale=#2] 
\node[draw=#1,fill=#1,scale=#2,regular polygon,regular polygon sides=3,draw]{};
\endtikzpicture
}}

\begin{document}

\begin{figure}[htbp]
\centering
\subfloat[][(\rond{blue}{5pt}) compound A and (\diam{red}{0.8}) compound B]{\label{fig:subA}\missingfigure{Remplace la sous-figure a}}

\subfloat[][(\pentag{{rgb,255:red,0; green,0; blue,128}}{1}) compound C, (\carre{{rgb,255:red,0; green,102; blue,153}}{0.9}) compound D, (\triU{blue}{0.7}) compound E and (\rond{cyan}{5pt}) compound F]{\label{fig:subB}\missingfigure{Remplace la sous-figure b}}

\subfloat[][(\rond{{rgb,255:red,51; green,102; blue,0}}{5pt}) compound G, (\pentag{{rgb,255:red,51; green,204; blue,0}}{1}) compound H, (\carre{{rgb,255:red,102; green,204; blue,102}}{1}) compound I, (\triU{{rgb,255:red,102; green,255; blue,0}}{0.7}) compound J]{\label{fig:subC}\missingfigure{Remplace la sous-figure c}}
\caption{Evolution of the reaction mixture composition during the course of a typical experiment}
\end{figure}

\end{document}

Sans utiliser subfig :

Ouvrir dans l'éditeur Overleaf
\documentclass[12pt,a4paper]{article}
%\usepackage{subfig} 
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,decorations.pathmorphing,calc,decorations.pathreplacing}
\usepackage{todonotes}

% markers for plot caption 
\newcommand{\rond}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture 
\draw [draw=#1,fill=#1](0,0) circle (#2);
\endtikzpicture
}}
\newcommand{\diam}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture
\node[draw=#1,fill=#1,scale=#2,diamond,draw]{}; %offset={-1ex},
\endtikzpicture
}}

\begin{document}

\begin{figure}[htbp] 
\centering 
\missingfigure{Remplace sous-figure a} 
\caption[]{(\rond{blue}{5pt}) compound A and (\diam{red}{0.8}) compound B}
\label{fig:A} 
\end{figure}

\end{document}

EDIT Complément de réponse

Après une petite recherche sur internet, je suis tombé sur cette question. Il est possible de garder les deux légendes identiques (la courte et la longue) contenant des éléments tikz. Il faut utiliser la commande \protect, qui permet d'avoir, par exemple, des symboles dans les légendes de la liste des figures.

Ouvrir dans l'éditeur Overleaf
\documentclass[12pt,a4paper]{article}
%\usepackage{subfig} 
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,decorations.pathmorphing,calc,decorations.pathreplacing}
\usepackage{todonotes}

% markers for plot caption 
\newcommand{\rond}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture 
\draw [draw=#1,fill=#1](0,0) circle (#2);
\endtikzpicture
}}
\newcommand{\diam}[2]{%
\raisebox{-0.5ex}{%
\tikzpicture
\node[draw=#1,fill=#1,scale=#2,diamond,draw]{}; %offset={-1ex},
\endtikzpicture
}}

\begin{document}
\listoffigures
\begin{figure}[htbp] 
\centering 
\missingfigure{Remplace sous-figure a} 
\caption{(\protect\rond{blue}{5pt}) compound A and (\protect\diam{red}{0.8}) compound B}
\label{fig:A} 
\end{figure}

\end{document}
Lien permanent

Publiée 19 Jan '17, 14:37

jerome%20dequeker's gravatar image

jerome dequeker
836714
Taux d'acceptation : 65%

Modifiée 08 Aoû '17, 02:09

Pathe's gravatar image

Pathe ♦♦
7.4k29197245

Merci pour ces explications. Je n'utilise quasiment jamais les légendes courtes et je n'avais pas connaissance de ce problème. J'essaierai de m'en souvenir pour une prochaine fois.

(19 Jan '17, 15:41) DRI DRI's gravatar image

Ah \protect ! Je me doutais un peu que cette commande finirait par apparaître dans une solution, mais je n'avais aucune idée de l'endroit et de la forme que cela prendrait. Merci pour cette recherche que je n'ai pas eu l'idée d'entreprendre.

(19 Jan '17, 16:21) DRI DRI's gravatar image
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.