Post by BriCaMatHIl y a 3 tests «\if...» il doit donc y avoir 3 «\fi» !
Rhâa, pour une fois je suis pas d'accord, Christian. Tout le sel est
justement que selon les circonstances, TeX s'attend à voir un \fi ou trois.
Post by BriCaMatHDe toutes façons, vous vous y prenez mal
Là je suis à nouveau d'accord.
Post by BriCaMatHcar \iftrue n'est pas une
séquence de contrôle qui vaut quelque chose comme «true» et qui peut
être comparée à un autre test via un \ifx.
Là plus.
Là d'accord :-)
Post by BriCaMatHManuel nous expliquera sans doute
pourquoi, je suis curieux de connaître l'explication moi aussi ;)
Ça m'ennuierait de te faire mentir, voilà donc les détails :-)
Déjà, \ifx\iftrue\***@openright est un test parfaitement valide : \iftrue a
un \meaning comme toute séquence de contrôle qui se respecte (et comme
toute primitive qui se respecte, son \meaning, c'est elle-même à savoir
\iftrue). \***@openright a aussi un \meaning (fut-il undefined) et comme
\ifx compare les \meaning des deux lexèmes qui le suivent, tout va pour le
mieux dans le meilleur des mondes.
Maintenant en effet, si on est sûr que \***@openright est définit (et que
c'est bien un \if dans le sens où il vaut bien \iffalse ou \iftrue), alors
il vaut bien écrire : \***@openright que \ifx\iftrue\***@openright.
Concernant l'équilibrage, c'est là que ça se gâte. En temps normal
(c'est-à-dire quand il n'est pas en train de « sauter » une branche d'un
\if), TeX s'attend à trouver autant de \fi qu'il a développé de \if.
Toujours en temps normal, quand TeX examine \ifx\iftrue\***@openright, il
commence par développer le \ifx, ce qui consomme les deux lexèmes suivants,
qui en particulier ne seront pas développés. Donc il li suffit d'un \fi
après pour revenir à l'équilibre.
Par contre, quand il est en train de « sauter » la branche à ignorer d'un
\if, TeX n'exécute ni ne développe quoi que ce soit. Il lit les lexèmes, et
regarde juste leur \meaning un par un. Et il compte les lexèmes qui dont le
\meaning est un \if quelconque, et vérifie qu'il sont équilibrés avec ceux
dont le \meaning est \fi. C'est là que ça se gâte : dans le deuxième
exemple, \ifx\iftrue\***@openright est examiné dans ce mode, donc les deux
derniers \if ne sont pas avalés par le développement du précedant (pour
cause : il n'est pas développé), et TeX compte bien 3 \if, pour seulement
un \fi, et c'est le drame.
C'est pour parer à ce genre de problème que l'on a inventé ce qu'on appelle
souvent les if à la LaTeX : les deux branches sont des arguments. Ici :
\@ifundefined{chapter}{%
\relax
}{%
\def\sideoption{\ifx\iftrue\***@openright openright\else openany\fi}%
}
ne pose pas de souci.
Une autre astuce de sioux pour gérer ses problèmes d'équilibrage de \if est
de jouer du \csname et de \expandafter :
\expandafter\ifx
\csname iftrue\expandafter\endcsname
\csname ***@openright\endcsname
marche dans les deux cas.
Manuel.