bclogo est un package qui permet de faire des cadres personnalisables facilement

Je crée une commande avec un argument (\bareme) pour une compilation conditionnelle à partir d'une variable définie dans le préambule avec la commande \ChoixDeVersion.

Ouvrir dans l'éditeur Overleaf
\def\ChoixDeVersion{AB} %AB=Avec Barème 
\newcommand{\bareme}[1] {\ifthenelse{\equal{\ChoixDeVersion}{AB}}{#1\ignorespaces}{\ignorespaces}}

Si je mets AB dans \def\ChoixDeVersion{AB}, j'aurai une compilation qui mettra l'argument de \bareme là où je l'utilise et si j'ai autre chose que AB dans \def\ChoixDeVersion{AB}, je n'aurai rien là où j'utilise \bareme

Ca marche bien et tout va bien si j'utilise ma commande \bareme dans le cadre ou en dehors du cadre créé par bclogo. Par contre j'ai des erreurs à la compilation que je ne comprends pas lorsque j'utilise \bareme dans l'argument de bclogo (là où sont définis les caractéristiques du cadre et son titre)

A priori c'est le \ifthenelse de la commande qui semble poser problème, mais je peux me tromper. Voici un fichier minimal avec les packages que j'utilise par ailleurs pour le reste de mon fichier.

Ouvrir dans l'éditeur Overleaf
\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[french]{babel}
\usepackage[tikz]{bclogo} 
\usepackage{xcolor}
%\usepackage[autolanguage]{numprint}
\usepackage{numprint}
%numprint sans la gestion de langue pour le rendre personnalisable
%ici on personnaise le produit de numprint pour les puissances de 10
\npproductsign{\times}
%Pour écrire des nombres par exemple avec separateur et unités
\usepackage{multirow}
%Pour faire plusieurs lignes dans un tableau
\usepackage{amsmath}
%Définit entre autre l'environnement split
\usepackage{graphicx}
%Pour inclure des images
\graphicspath{{Illustrations/}}
% chemin pour trouver les graphiques a incorporer

%définition de variable texte pour compilation conditionnelle
\def\ChoixDeVersion{AB} %AB=Avec Barème

\newcommand{\bareme}[1] {\ifthenelse{\equal{\ChoixDeVersion}{AB}}{#1\ignorespaces}{\ignorespaces}}
%Commande barème pour compilation conditionnelle
%Si on veut un blanc après le texte ou le rien, mettre le blanc A LA FIN DE L'ARGUMENT(avant l'accolade de fermeture}. Les blancs qui suivent la commande seront ignorés (\ignorespaces) pour éviter le DOUBLE BLANC quand compilation sans barème.

\begin{document}

\part{Questions de cours}

Mon texte \bareme{toto }suite du texte

\begin{bclogo}[epBord=2,logo=\bcquestion,ombre=true,couleur=blue!10]{Question 1 Complétez la phrase  \bareme{titi}}
Texte du cadre \bareme{tata}
\end{bclogo}

\end{document}

Source d'erreur :

Ouvrir dans l'éditeur Overleaf
\bareme{toto} et \bareme{tata} ne posent pas de problème

\bareme{titi} fait planter la compilation

Posée 22 Oct '17, 18:31

idefix's gravatar image

idefix
95594051
Taux d'acceptation : 14%

Modifiée 24 Oct '17, 12:41

@idefix Attention ! Les contre-obliques (\) saisies telles quelles dans les contributions ne sont visibles que si elles sont insérées en tant que ⟨code⟩. Pour insérer du ⟨code⟩, notamment des commandes LaTeX, cf. la FAQ Comment mettre en forme ma contribution ?. Merci de corriger votre contribution si cela n'a pas déjà été fait.

(22 Oct '17, 20:26) denis ♦♦ denis's gravatar image

Merci pour avoir mis en forme ma question. Je l'ai fait ensuite sur la réponse suivante.

(22 Oct '17, 21:54) idefix idefix's gravatar image

C'est bien ifthenelse qui coince. Je n'utilise pas cette extension et je n'ai pas envie d'aller voir dans le code ce qui se passe. En remplaçant par un \newif de plainTeX la commande \bareme fonctionne.

Ouvrir dans l'éditeur Overleaf
\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[tikz]{bclogo}

\newif\ifAB
\ABtrue
%\ABfalse

\newcommand{\bareme}[1]{%
        \ifAB%
            #1\ignorespaces%
        \else%
            \ignorespaces%
        \fi}

\begin{document}

\part{Questions de cours}

Mon texte \bareme{toto } suite du texte

\begin{bclogo}[epBord=2,logo=\bcquestion,ombre=true,couleur=blue!10]{Question 1 Complétez la phrase  \bareme{titi }
}
Texte du cadre \bareme{tata } 
\end{bclogo}

\end{document}

EDIT : Suite aux commentaires du PO, je propose une solution qui permet de pas devoir mettre d'espace dans le nom d'une macro (ce qui ne me parait pas être l'idéal). \@bsphack et \@esphack sont des macros définies par LaTeX pour gérer les espaces.

Ouvrir dans l'éditeur Overleaf
\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[tikz]{bclogo} 
\usepackage{xspace}

\newif\ifAB
\ABtrue
%\ABfalse
\makeatletter
\def\bareme#1{\@bsphack%
        \ifAB%
            #1\xspace%
        \fi\@esphack%
        }
\makeatother
\begin{document}
Texte du cadre et du texte\par
Texte du cadre \bareme{tata} et du texte \par
Texte du cadre \bareme{tata}et du texte \par
\end{document}
Lien permanent

Publiée 22 Oct '17, 19:40

Nikopol's gravatar image

Nikopol
1.0k614
Taux d'acceptation : 42%

Modifiée 23 Oct '17, 00:10

Ca marche très bien, mais du coup on ne peut plus coller un texte derrière si par hasard on le désirait. Genre rajouter un chiffre qui numérote. C'est possible de conserver cette capacité ? Dans mon bricolage en ne mettant pas d'espace en fin de commande on peut le faire. Mais je suis d'accord que ce n'est pas l'idéal

(23 Oct '17, 00:26) idefix idefix's gravatar image

Une solution très simple avec l'extension etoolbox : on définit un nouveau booléen avec \settoggle{AB} et on utilise la commande \iftoggle{AB}{vrai}{faux} pour définir \bareme.

Ouvrir dans l'éditeur Overleaf
   \documentclass[a4paper, french ]{article}
    \usepackage[utf8]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage{lmodern}
    \usepackage{babel}
    \usepackage[tikz]{bclogo}
    \usepackage{xcolor}
    %\usepackage[autolanguage]{numprint}
    \usepackage{numprint}
    %numprint sans la gestion de langue pour le rendre personnalisable
    %ici on personnaise le produit de numprint pour les puissances de 10
    \npproductsign{\times}
    %Pour écrire des nombres par exemple avec separateur et unités
    \usepackage{multirow}
    %Pour faire plusieurs lignes dans un tableau
    \usepackage{amsmath}
    %Définit entre autres l'environnement split
    \usepackage{graphicx}
    \usepackage{etoolbox}
    \newtoggle{AB}
    \settoggle{AB}{true}

    %Pour inclure des images
    \graphicspath{{Illustrations/}}
    % chemin pour trouver les graphiques a incorporer

    \newcommand{\bareme}[1]{\iftoggle{AB}{#1}{}\ignorespaces}

    \begin{document}

    \part{Questions de cours}

    \verb|\settoggletrue | :

    Mon texte \bareme{toto }suite du texte

    \begin{bclogo}[epBord=2,logo=\bcquestion,ombre=true,couleur=blue!10]{Question 1 Complétez la phrase \bareme{titi}
    }
    Texte du cadre \bareme{tata} Lalala
    \end{bclogo}

    \verb|\settogglefalse| :

    \settoggle{AB}{false}
    Mon texte \bareme{toto }suite du texte
    \begin{bclogo}[epBord=2,logo=\bcquestion,ombre=true,couleur=blue!10]{Question 2 Complétez la phrase \bareme{titi}
    }
    Texte du cadre \bareme{tata} Lalala
    \end{bclogo}

    \end{document}

alt text

Lien permanent

Publiée 23 Oct '17, 05:12

Bernard's gravatar image

Bernard
4.6k15
Taux d'acceptation : 35%

Modifiée 23 Oct '17, 14:42

Pathe's gravatar image

Pathe ♦♦
7.5k42203251

Comment faites-vous pour mettre le résultat de la compilation dans le post ?

(25 Oct '17, 04:18) idefix idefix's gravatar image

Je ne m'attendais pas à une réponse aussi rapide.

Apparemment on pouvait aussi protéger la commande \bareme dans le titre du cadre (\protect\bareme{titi}).

Ouvrir dans l'éditeur Overleaf
\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[tikz]{bclogo}

%définition de variable texte pour compilation conditionnelle
\def\ChoixDeVersion{AB} %AB=Avec Barème

\newcommand{\bareme}[1]{%
     \ifthenelse{\equal{\ChoixDeVersion}{AB}}%
     {#1\ignorespaces}%
     {\ignorespaces}%
}

% BONNE ALTERNATIVE NE NÉCESSITANT PAS DE PROTECTION      
%\newif\ifAB
%\ABtrue
%\ABfalse
%
%\newcommand{\bareme}[1]{%           
%    \ifAB%
%        #1\ignorespaces%
%    \else%
%        \ignorespaces%
%    \fi}
%

\begin{document}

\part{Questions de cours}

Mon texte \bareme{toto } suite du texte

%Protection nécessaire pour \bareme (avec \ifthenelse) dans l'argument de bclogo            
\begin{bclogo}[epBord=2,logo=\bcquestion,ombre=true,couleur=blue!10]%
       {%
       Question 1 Complétez la phrase  \protect\bareme{titi }%
       }
Texte du cadre \bareme{tata }
\end{bclogo}

\end{document}

Cela fonctionne alors également avec \ifthenelse, mais je préfère votre méthode avec \newif, elle est me semble plus propre et plus carrée.

La mise en forme du code est aussi très propre. C'est un standard d'édition ?

Lien permanent
Cette réponse est marquée comme « Wiki ».

Publiée 22 Oct '17, 21:45

idefix's gravatar image

idefix
95594051
Taux d'acceptation : 14%

Modifiée 24 Oct '17, 12:59

La solution définitive est de protéger avec \protect. En effet vous ne pouvez pas et surtout vous ne voulez pas redéfinir toutes les commandes fragiles.

(23 Oct '17, 02:20) touhami touhami's gravatar image

Pour les « blancs » (les espaces), l'extension xspace gère l'espace horizontale qui suit la commande dans le cas ou l'on utilise la commande sans les accolades {}. Quand une commande a un (ou plusieurs) argument(s), elle finit nécessairement par une accolade et donc xspace ne sert plus à rien. Et c'est le cas ici.

Par contre si je fais une compilation avec \ABfalse au lieu de \ABtrue, la commande \bareme ne génère « rien » ({}). Mais apparemment « rien » n'est pas tout à fait « rien » pour LaTex. Il n'y aura pas d'espace mise par la commande, mais s'il y a une espace avant la commande et une autre après la commande, la commande entre les deux empêche le compilateur de voir les deux espaces comme consécutives et par conséquent il ne les fusionne pas et on se retrouve avec deux espaces au lieu d'une seule entre le mot d'avant la commande et le mot d'après la commande (dans ce cas de compilation).

Pour éviter que cela arrive, je mets un \ignorespaces dans la commande, et du coup même si on met des espaces entre la commande et le mot suivant on aura au final une seule espace.

On pourrait penser qu'après tout il suffit de ne pas mettre de blanc après la commande, et que ça irait aussi bien comme ça. Mais alors dans le cas de la compilation \ABtrue, le mot suivant la commande serait systématiquement collé à la fin du mot de la commande, sans espace entre les deux.

... bref pour avoir toujours un seule espace entre la commande et les mots d'avant et d'après, quel que soit le cas de compilation, il suffit de penser à mettre une espace la fin de l'argument de la commande \protect\bareme{tata ESPACE_ICI}.

Il y a sûrement d'autres façons de faire, mais celle-là semble fonctionner.

Lien permanent

Publiée 22 Oct '17, 22:43

idefix's gravatar image

idefix
95594051
Taux d'acceptation : 14%

Modifiée 23 Oct '17, 14:45

Pathe's gravatar image

Pathe ♦♦
7.5k42203251

J'ai édité ma réponse avec une proposition pour la gestion des espaces verticales (au féminin ici).

(22 Oct '17, 23:51) Nikopol Nikopol's gravatar image

makeatletter et makeatother c'est pour le @ ? A quoi sert ce @ ??

(23 Oct '17, 00:10) idefix idefix's gravatar image

J'ai féminisé l'espace dans ma réponse

(23 Oct '17, 00:14) idefix idefix's gravatar image

Ca marche très bien, mais du coup on ne peut plus coller un texte derrière si par hasard on le désirait. Genre rajouter un chiffre qui numérote. C'est possible de conserver cette capacité ?

(23 Oct '17, 00:24) idefix idefix's gravatar image

Oui, il faut supprimer \xspace mais il faudra rajouter {} ou\ si on veut une espace après.

(23 Oct '17, 00:42) Nikopol Nikopol's gravatar image

Je n'y parviens pas pour le coup. Un fois supprimé le \xspace dans la commande où dois-je mettre {} ou \. Après la commande à l'utilisation cela ne fonctionne pas on dirait

(23 Oct '17, 00:56) idefix idefix's gravatar image
Affichage de 5 parmi 6 Afficher 1 commentaire(s) en plus
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.