[Beamer] Erreur de compilation suivant argument macro

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux membres inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
tnnico
Utilisateur confirmé
Utilisateur confirmé
Messages : 79
Inscription : jeudi 25 juin 2009, 14:06

[Beamer] Erreur de compilation suivant argument macro

Message non lu par tnnico »

Bonjour à tous,

j'essaie de créer des macros pour générer un diaporama de calcul mental.

J'arrive à obtenir ce que je veux ou presque, mais lorsque la partie "consigne" (deuxième argument) contient une figure tikz, la compilation produit une erreur que je ne comprends pas (mais le fichier pdf généré est conforme à ce que j'attends).

Il y a aussi une erreur avec la première diapo si la partie consigne contient un mode maths \(...\) qui disparaît avec $...$.

J'ai essayé de supprimer le plus de choses possible pour rendre le code lisible.

Merci d'avance à ceux qui voudront bien regarder.

Code : Tout sélectionner

\documentclass[10pt,a4paper,serif]{beamer}
\usepackage[latin1]{inputenc}
\usepackage{xspace}
\usepackage[french]{babel}
\usepackage{fourier}
\usepackage{frame}
\usepackage{tikz}

\usepackage{multido}
\usepackage{ifthen}

\newcounter{quest}
\setcounter{quest}{0}

\newcounter{fin}

\newcommand{\rebours}[1]{
\setcounter{fin}{#1}
\addtocounter{fin}{-1}
{\centering
\begin{overlayarea}{20pt}{20pt}
\multido{\ii=#1+-1,\ij=1+1}{\value{fin}}{%
	\only<\ij>{
		\begin{tikzpicture}[very thick]
			\draw (0,0) circle (14pt);
			\draw (0,0) circle (12pt) node{\LARGE\ii};
		\end{tikzpicture}
	}
	\transduration{1}
}
\only<#1>{
	\begin{tikzpicture}[very thick,red]
		\draw (0,0) circle (14pt);
		\draw (0,0) circle (12pt) node{\LARGE 1};
	\end{tikzpicture}
	\transduration{1}
}
\addtocounter{fin}{2}	
\only<\value{fin}>{
	\begin{tikzpicture}[very thick,red]
		\draw (0,0) circle (14pt);
		\draw (0,0) circle (12pt) node{\LARGE 0};
	\end{tikzpicture}
	\transduration{.2}
}	
\end{overlayarea}
}

\vspace{2cm}
}

\newcommand{\calcu}[3]{
	\addtocounter{quest}{1}
	\setlength{\fboxsep}{9pt}
	\setlength{\fboxrule}{3pt}
	\begin{frame}
		\begin{center}
			\textcolor{gray}{Question \thequest}
		\end{center}

		\bigskip
		\ifthenelse{\equal{#2}{}}
		{% Le deuxième argument peut contenir une consigne
		}
		{
			\begin{center}
			#2
			\end{center}
		}

		\fcolorbox{blue}{blue!8}{\parbox{.95\linewidth}{
		\begin{large}
			#3
		\end{large}
		}}
		
		\vfill
		\rebours{#1}
	\end{frame}
}

\begin{document}

\calcu{2}
{Calculer $\vec{u} \cdot \vec{v}$}
%{Calculer \(\vec{u} \cdot \vec{v}\)}  %%% Renvoie une erreur
{
	\[
		\left\|\vec{u}\right\| = 3\:;\;
		\left\|\vec{v}\right\| = 2\:;\;
		\left(\vec{u},\vec{v}\right) = \frac{\pi}{6}
	\]
}

\calcu{2}
{
	\begin{tikzpicture}
		\draw (0,0) -- (4,2) ;
	\end{tikzpicture}
}
{
	Ma consigne
}

\end{document}
MB
Administrateur
Administrateur
Messages : 7768
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par MB »

Bonjour,

J'ai tenté de regarder un peu mais il me semble que c'est assez loin d'être un ECM. Il faudrait encore élaguer un peu pour qu'on puisse y voir plus clair. Le message d'erreur est bien le suivant ?

Code : Tout sélectionner

! Undefined control sequence.
<argument>  \begin {tikzpicture} \draw 
                            (0,0) -- (4,2) ; \end {tikzpicture} 
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
tnnico
Utilisateur confirmé
Utilisateur confirmé
Messages : 79
Inscription : jeudi 25 juin 2009, 14:06

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par tnnico »

Oui, c'est bien le message que j'ai.
J'ai déjà beaucoup simplifié, je vais voir si je peux en enlever encore.
Merci !
tnnico
Utilisateur confirmé
Utilisateur confirmé
Messages : 79
Inscription : jeudi 25 juin 2009, 14:06

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par tnnico »

Je viens d'enlever le compte à rebours.
Et le numéro de question.
Je laisse la première diapo car je pense que l'erreur provoquée par \(...\) est du même acabit que celle due à tikzpicture.

Code : Tout sélectionner

\documentclass[10pt,a4paper,serif]{beamer}
%éèàù
\usepackage[latin1]{inputenc}
\usepackage{xspace}
\usepackage[french]{babel}
\usepackage{fourier}
\usepackage{frame}
\usepackage{tikz}
\usepackage{multido}
\usepackage{ifthen}

\newcounter{fin}

\newcommand{\calcu}[2]{
	\setlength{\fboxsep}{9pt}
	\setlength{\fboxrule}{3pt}
	\begin{frame}
		\ifthenelse{\equal{#1}{}}
		{% Le deuxième argument peut contenir une consigne
		}
		{
			\begin{center}
			#1
			\end{center}
		}

		\fcolorbox{blue}{blue!8}{\parbox{.95\linewidth}{
		\begin{large}
			#2
		\end{large}
		}}
	\end{frame}
}

\begin{document}

\calcu
{Calculer $\vec{u} \cdot \vec{v}$}
%{Calculer \(\vec{u} \cdot \vec{v}\)}  %%% Renvoie une erreur
{
	\[
		\left\|\vec{u}\right\| = 3\:;\;
		\left\|\vec{v}\right\| = 2\:;\;
		\left(\vec{u},\vec{v}\right) = \frac{\pi}{6}
	\]
}

\calcu
{
	\begin{tikzpicture}
		\draw (0,0) -- (4,2) ;
	\end{tikzpicture}
}
{
	Ma consigne
}

\end{document}
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 949
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par un bon petit »

tnnico a écrit : vendredi 25 mars 2022, 15:42 Je laisse la première diapo car je pense que l'erreur provoquée par \(...\) est du même acabit que celle due à tikzpicture.
Non, l'erreur est due à l'emploi de \ifthenelse et que vous ne comprenez pas ce que fait cette macro (moi non plus d'ailleurs et je m'en porte très bien).

Mais bon sang, les gens qui codent en TeX et LaTeX : il ne faut PAS utiliser le package ifthenelse comme une boite noire qui tôt ou tard va vous péter à la gueule, mais utiliser à la place les primitives de TeX dédiées au tests, au moins on comprend ce qu'on fait.

Bref, vous remplacez la ligne où se trouve \ifthenelse par la ligne suivante, et tout devrait aller normalement.

Code : Tout sélectionner

\csname @\if$\detokenize{#1}$first\else second\fi oftwo\endcsname
MB
Administrateur
Administrateur
Messages : 7768
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par MB »

Exact, il restait un certain nombre de paquets inutiles et le problème est effectivement lié à l'usage de ifthenelse.

J'allais proposer le code suivant.

Code : Tout sélectionner

\documentclass[10pt,a4paper]{beamer}
\usepackage{tikz}

\newcommand{\calcu}[2]{%
    \setlength{\fboxsep}{9pt}
    \setlength{\fboxrule}{3pt}
    \def\tmp{#1}
    \begin{frame}
        \ifx\tmp\empty\else\center\tmp\endcenter\fi%
        \fcolorbox{blue}{blue!8}{\parbox{.95\linewidth}{\large#2}}
    \end{frame}}

\begin{document}

\calcu{Calculer $\vec{u} \cdot \vec{v}$}{blabla}
\calcu{\tikz \draw (0,0) -- (4,2);}{blabla}

\end{document}
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
tnnico
Utilisateur confirmé
Utilisateur confirmé
Messages : 79
Inscription : jeudi 25 juin 2009, 14:06

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par tnnico »

Merci à tous les deux.
Le problème quand on est un TeXeur du dimanche (enfin un n'importe quoi du dimanche), c'est qu'on ne connaît pas les bons outils.
J'avais cherché un moyen de mettre des conditions et j'étais tombé sur ifthenelse.
Comme je ne connais pas vraiment TeX, et que je suis toujours à courir après le temps, je n'ai pas creusé.

Encore une fois merci !
tnnico
Utilisateur confirmé
Utilisateur confirmé
Messages : 79
Inscription : jeudi 25 juin 2009, 14:06

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par tnnico »

C'est encore moi,
je viens de tester les deux codes, ça fonctionne très bien avec celui de MB.
Mais celui proposé par "un bon petit", n'affiche plus du tout la consigne qui posait problème (mais il n'y a aucune erreur de compilation).
Comme je ne comprends absolument pas comment elle fonctionne, je ne suis pas capable de la corriger.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 949
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par un bon petit »

tnnico a écrit : vendredi 25 mars 2022, 19:25 Mais celui proposé par "un bon petit", n'affiche plus du tout la consigne qui posait problème (mais il n'y a aucune erreur de compilation).
Ah bon ? Et vous pourriez donner le code complet afin que je constate par moi-même ce qui ne fonctionne pas ?

Ceci dit, la ligne que je vous ai suggérée est un test (connu, documenté, fiable et éprouvé) qui permet de tester si l'argument #1 est vide. Je vois assez mal comment il ne pourrait pas fonctionner correctement.
tnnico
Utilisateur confirmé
Utilisateur confirmé
Messages : 79
Inscription : jeudi 25 juin 2009, 14:06

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par tnnico »

Je mets le code ci-dessous.
Comme je n'y connais pas grand chose, j'ai supposé que je devais mettre quelque chose à la place de first et second, mais ce que j'ai tenté n'a pas fonctionné.
Vous me dites que ce test est connu et documenté mais quand je fais des recherches je ne trouve aucune doc me permettant de débuter.

Code : Tout sélectionner

\documentclass[10pt,a4paper,serif]{beamer}
\usepackage[latin1]{inputenc}
\usepackage{xspace}
\usepackage[french]{babel}
\usepackage{fourier}
\usepackage{frame}
\usepackage{tikz}

\newcommand{\calcu}[2]{
	\setlength{\fboxsep}{9pt}
	\setlength{\fboxrule}{3pt}
	\begin{frame}
		\csname @\if$\detokenize{#1}$first\else second\fi oftwo\endcsname

		\fcolorbox{blue}{blue!8}{\parbox{.95\linewidth}{
		\begin{large}
			#2
		\end{large}
		}}
	\end{frame}
}

\begin{document}

\calcu
{Calculer $\vec{u} \cdot \vec{v}$}
{
	\[
		\left\|\vec{u}\right\| = 3\:;\;
		\left\|\vec{v}\right\| = 2\:;\;
		\left(\vec{u},\vec{v}\right) = \frac{\pi}{6}
	\]
}

\calcu
{
	\begin{tikzpicture}
		\draw (0,0) -- (4,2) ;
	\end{tikzpicture}
}
{
	Ma consigne
}

\end{document}
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 949
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par un bon petit »

tnnico a écrit : samedi 26 mars 2022, 08:31 Comme je n'y connais pas grand chose, j'ai supposé que je devais mettre quelque chose à la place de first et second, mais ce que j'ai tenté n'a pas fonctionné.
Vous n'avez pas fait ce qui était demandé : de remplacer une ligne par une autre et ne rien changer par ailleurs (ne pas enlever de parenthèses, ne pas créer de ligne vide, etc).
Si vous aviez correctement effectué cette opération, votre code fonctionnerait.
tnnico
Utilisateur confirmé
Utilisateur confirmé
Messages : 79
Inscription : jeudi 25 juin 2009, 14:06

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par tnnico »

Effectivement, j'avais modifié tout le \ifthenelse.
J'avais mal lu la consigne ! Moi qui répète à mes élèves de lire et relire les consignes, j'ai honte !
Merci beaucoup d'avoir répondu, comme ça je comprends aussi comment fonctionne votre commande.
J'ai réussi à modifier mon code pour obtenir presque ce que je veux.
Si vous connaissez un tutoriel ou un site permettant de prendre en main ces commandes TeX, j'aimerais beaucoup le connaître.

Une nouvelle fois, merci à vous deux !
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 949
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par un bon petit »

tnnico a écrit : samedi 26 mars 2022, 11:07 Merci beaucoup d'avoir répondu, comme ça je comprends aussi comment fonctionne votre commande.
Sauf que j'ai dit n'importe quoi, ce n'est pas le test \if qu'il faut ici avec les tokens $, mais le test \ifcat. Mes plus plates excuses, si je commence à confondre \if et \ifcat, je n'ai plus qu'à me convertir au basic...

Si on utilise \ifcat, la ligne en question doit donc être

Code : Tout sélectionner

\csname @\ifcat$\detokenize{#1}$first\else second\fi oftwo\endcsname
et si on veut utiliser \if, il faut écrire

Code : Tout sélectionner

\csname @\if\relax\detokenize{#1}\relaxfirst\else second\fi oftwo\endcsname
Je précise que les tests \if et \ifcat testent les charcodes pour le premier et les catcodes pour le 2e, avec le comportement commun de développer au maximum pour obtenir 2 tokens non développables à comparer.
tnnico
Utilisateur confirmé
Utilisateur confirmé
Messages : 79
Inscription : jeudi 25 juin 2009, 14:06

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par tnnico »

J'ai du pain sur la planche...
J'avais seulement compris la structure du test (ce qu'étaient first et second) !
MB
Administrateur
Administrateur
Messages : 7768
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par MB »

Sur le sujet, quelques interventions intéressantes ici ou ici.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 949
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par un bon petit »

tnnico a écrit : samedi 26 mars 2022, 16:10 J'ai du pain sur la planche...
J'avais seulement compris la structure du test (ce qu'étaient first et second) !
Le test (archi connu, je répète) est de la forme

Code : Tout sélectionner

\ifcat<x>\detokenize{argument}<x><vrai>\else<faux>\fi
<x> est un token de catcode différent de 10 ou 12 (par exemple X ou $ ou ^ ou autre).
Le test est vrai si argument est vide : le développement maximal du test est alors <vrai>. Sinon, le développement est <faux>.

Comme le tout est mis entre la paire \csname \endcsname, tout ce qui résulte du développement sert à former le nom d'une macro. Ainsi, si le test est vrai, le tout se transforme en la macro \@firstoftwo et sinon en \@secondoftwo. Ces 2 macros sont définies dans le noyau LaTeX et prennent les 2 arguments qui suivent : \@firstoftwo exécute le 1er code entre accolade qui suit (et ignore le 2e) tandis que \@secondoftwo exécute le 2e code (et ignore le 1er).
tnnico
Utilisateur confirmé
Utilisateur confirmé
Messages : 79
Inscription : jeudi 25 juin 2009, 14:06

Re: [Beamer] Erreur de compilation suivant argument macro

Message non lu par tnnico »

Merci pour ces précisions !