Bonjour, le code suivant ne compile pas

\documentclass{article}
\usepackage{etoolbox}
\usepackage{tikz}
\begin{document}
\foreach \note in {AA,BB} {
  %\global% ne change rien
  %\expandafter% fait compiler, mais le résultat affiche AB, mais ni Oui ni Non
  \newbool\note
}
\ifbool{AA}{Oui}{Non}
\end{document}

Tout se passe comme si newbool ne fonctionnait pas correctement dans un foreach, alors qu'en dehors il fait son taf. Est-ce que quelqu'un a la clef de ce mystère ?

Posée 03 Oct, 00:59

MiQ75's gravatar image

MiQ75
313
Taux d'acceptation : 0%

1

\foreach \note in {AA,BB} {\newbool\note \global\boolfalse{\note}} vous convient-il?

(03 Oct, 08:37) touhami touhami's gravatar image

Oui, cela a bien le comportement escompté. Pourquoi dans un foreach le global ne fonctionne pas avec newbool (qui est censé initialiser le bool à false) alors qu'il semble fonctionner avec boolfalse reste un mystère, mais cette solution me conviendra à défaut. Merci !

(03 Oct, 23:47) MiQ75 MiQ75's gravatar image

Avec l'extension pgfplots et \pgfplotsforeachungrouped :

\documentclass{article}
\usepackage{etoolbox}
\usepackage{pgfplots}
\usepackage{tikz}
\begin{document}
\pgfplotsforeachungrouped \note in {AA,BB} {
  \newbool{\note}
  \booltrue{\note}
}
\ifboolexpr{ bool {AA} }{true}{false}
\end{document}
Lien permanent

Publiée 03 Oct, 02:48

samcarter's gravatar image

samcarter
8.8k2817
Taux d'acceptation : 57%

Modifiée 03 Oct, 02:49

Merci. L'initialisation par défaut du bool à false m'arrange, mais c'est en effet plus propre de passer par pgfplotsforeachungrouped newbool que par un foreach newbool global boolfalse ... C'est juste bizarre que le foreach global newbool ne fonctionne pas.

(04 Oct, 00:11) MiQ75 MiQ75's gravatar image

Voici une réponse de la question pourquoi.

La documentation de l'extension etoolbox précise clairement qu'on peut appliquer \global à \booltrue, \boolfalse, \setbool, mais elle ne dit rien du tout pour \newbool... Donc soit c'est pas prévu, soit c'est un oubli. 😄

Plus sérieusement, la commande primitive \global permet de rendre une affectation ou une définition globale, c'est-à-dire valable en dehors du groupe dans lequel elle est effectuée.

Normalement, une définition ou assignation effectuée à l'intérieur d'un groupe { ... } est locale: ne s'applique que dans ce groupe, et est oubliée à sa fermeture. En utilisant \global avant la commande d'assignation, on indique à TeX que cette action doit s'appliquer jusqu'à la fin du document ou jusqu'à une redéfinition ultérieure.

La commande \newbool{mybool} vérifie d'abord si \ifmybool est déjà défini ou non. Cette vérification est basée sur la primitive \edef, ce qui signifie que si \newbool est précédé par \global, alors le préfixe \global s'applique à \edef et son effet passe dans le vide.

\documentclass{article}
\usepackage{etoolbox}

\begin{document}
Exemple 1.
{\global\ifnum1=1\def\x{TeXnique.fr}\else\def\x{NON}\fi}

\x

Exemple 2.
\makeatletter
{\global\newbool{FOO}}

\reserved@a
\makeatother

\end{document}
Lien permanent

Publiée 04 Oct, 12:11

touhami's gravatar image

touhami
10.3k410
Taux d'acceptation : 52%

Effectivement si il y a des vérifications avant, ça doit capter le global. Du coup j'ai essayé avec providebool, mais ça ne fonctionne pas non plus. Mais merci pour les explications, je comprends mieux d'ou venait mon problème.

(Il y a 2 jours) MiQ75 MiQ75'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.