Je suis allé chercher un peu dans les entrailles de LaTeX et voilà ce que j'observe au niveau de la définition des pieds de page (voir ma question concernant if@mainmatter) :

Ce qui fonctionne :

Ouvrir dans l'éditeur
\def\@oddfoot{
\if@mainmatter
\hfil\textcolor{red}{\thepage}\hfil
\else
\hfil\textcolor{blue}{\thepage}\hfil
\fi}

Ce qui aurait pu fonctionner mais non :

Ouvrir dans l'éditeur
\if@mainmatter
\def\@oddfoot{\hfil\textcolor{red}{\thepage}\hfil}
\else
\def\@oddfoot{\hfil\textcolor{blue}{\thepage}\hfil}
\fi

J'ai décidé de me passer de fancyhdr... mais c'est sans doute une mauvaise idée.

Posée 02 Mai '16, 00:49

pluton's gravatar image

pluton
1.2k22937
Taux d'acceptation : 34%

Modifiée 01 Nov '16, 01:39

Pathe's gravatar image

Pathe ♦♦
7.5k42204251

1

On ne comprend pas exactement quelle est la question posée. On ne peut pas non plus se rendre compte du problème que vous rencontrez puisqu'il n'y a pas d'ECM.

On dit « développement », même si ce n'est ce dont il est question ici.

(02 Mai '16, 01:00) unbonpetit ♦♦ unbonpetit's gravatar image

Le premier code le test sera fait à chaque appel de \@oddfoot

Le deuxième code \@oddfoot est défini immédiatement (soit bleu soit rouge) suivant le test (vrai ou faux)

(02 Mai '16, 01:08) touhami touhami's gravatar image

@unbonpetit J'ai rebondit sur la réponse de @Le TeXnicien de surface qui a utilisé le terme "développé". En fait, je suis en train de comprendre que, lors d'une compilation, certaines "quantités" sont mises à jour et d'autres non. Ça semble évident mais bon. Désolé pour l'imprécision de mes questions, mais je suis dans le brouillard. Il faudrait que je lise une fois pour toutes les livres appropriés.

(02 Mai '16, 01:50) pluton pluton's gravatar image

@pluton : ce dont il est question ici ne concerne pas tex ou latex mais d'algorithmique en général.

Si vous définissez une macro contenant un test (votre 1er code), alors le test sera exécuté à chaque fois que la macro sera appelée.

En revanche, si vous écrivez un test qui définit, selon son issue, une macro de deux façons différentes (comme votre 2e code), alors le test ne sera effectué qu'une seule fois et lorsque la macro sera exécutée, aucun test ne sera fait.

(02 Mai '16, 10:19) unbonpetit ♦♦ unbonpetit's gravatar image
1

J'ai décidé de me passer de fancyhdr... mais c'est sans doute une mauvaise idée. Pourquoi donc ? On dirait que pour beaucoup d'utilisateurs, fancyhdr est indispensable. Personnellement, je me sers de titleps, beaucoup plus maniable selon moi.

(02 Mai '16, 12:43) Bernard Bernard's gravatar image

@unbonpetit en effet, c'est un peut évident mais en première lecture, comme tout cela est un peu brumeux, j'avais l'impression que la version 2 pouvait fonctionner, ce qui est bien bête.

(02 Mai '16, 16:04) pluton pluton's gravatar image

@Bernard oui, bonne idée, surtout que ce que propose J. Bezos est de très bonne qualité il me semble. Il connait bien l'algorithmique, lui.

(02 Mai '16, 16:05) pluton pluton's gravatar image
Affichage de 5 parmi 7 Afficher 2 commentaire(s) en plus

Le premier code :

Ouvrir dans l'éditeur
\def\@oddfoot{
\if@mainmatter
\hfil\textcolor{red}{\thepage}\hfil
\else
\hfil\textcolor{blue}{\thepage}\hfil
\fi}

À chaque fois LaTeX rencontre \@oddfoot (i.e. la composition du pied de page) il fait le test et décide.

Le deuxième code :

Ouvrir dans l'éditeur
\if@mainmatter
\def\@oddfoot{\hfil\textcolor{red}{\thepage}\hfil}
\else
\def\@oddfoot{\hfil\textcolor{blue}{\thepage}\hfil}
\fi

LaTeX fait le test et selon le résultat \@oddfoot est défini... définitivement.

Edit - Exemple :

Ouvrir dans l'éditeur
\documentclass{article}
\newif\ifmytest
\mytesttrue
%% comme \mytesttrue donc  \cmd est toujours T
\ifmytest % c'est vrai
\def\cmd{T}
\else  % LaTeX sautera la suite jusqu' à \fi
\def\cmd{bla bla} 
\fi

\mytestfalse
%% comme \mytestfalse donc \cmdd  n'est pas définie du tout
\ifmytest% ce n'est pas vrai % LaTeX sautera la suite jusqu' à \fi
\def\cmdd{D}
\fi

\begin{document}
\mytesttrue
\cmd***%\cmdd

\mytestfalse
\cmd***%\cmdd
\end{document}

Exemple avec mainmatter :

Ouvrir dans l'éditeur
\documentclass{book}
\makeatletter
\if@mainmatter% c'est vrai
\def\mt{T}
\else% tout qui suit (jusqu à \fi) n'est pas vu par LaTeX
\documentclass{article}
\begin{document}
\chapter{Foo}
\section{Bar}
\end{document} 
\fi
\makeatother

\begin{document}
\frontmatter
1) bla bla \mt

\mainmatter
2) bla bla \mt
\end{document}
Lien permanent

Publiée 02 Mai '16, 01:18

touhami's gravatar image

touhami
9.7k410
Taux d'acceptation : 51%

Modifiée 01 Nov '16, 01:43

Pathe's gravatar image

Pathe ♦♦
7.5k42204251

1

Et pourquoi la définition est-elle définitive ? J'ai l'impression d'avoir déjà vu des \def mis à jour dans des boucles : ai-je rêvé ?

(02 Mai '16, 01:52) pluton pluton's gravatar image

@pluton vous pouvez penser à \if@mainmatter \def\@oddfoot{\hfil\textcolor{red}{\thepage}\hfil}\else quelque chose d'autre qui n'a rien avoir avec pagestyle \fi

(02 Mai '16, 02:13) touhami touhami's gravatar image

@touhami oui mais ça ne me dit pas vraiment pourquoi lors de la compilation de chaque page, ce test n'est pas réalisé, ou autrement dit pourquoi il n'est fait qu'une fois au tout début?

(02 Mai '16, 02:18) pluton pluton's gravatar image

@pluton normalement (La)TeX est linéaire. Donc il test, il décide et définie la commande, maintenant la commande est définie (indépendamment) et lorsque il rencontre par la suite elle est bien définie pour lui et rien ne lui demande de refaire un test (pour lui la commande n' a rien avoir avec cette condition dans mon commentaire j'ai noté que vous pouvez faire n'importe quoi par exemple si la condition n'est pas vraie, donc il peut que pour LaTeX la commande soit indéfinie)

(02 Mai '16, 02:28) touhami touhami'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.