Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Détection de la première ligne de la page

1 view
Skip to first unread message

thibault...@yahoo.fr

unread,
May 23, 2008, 8:38:23 AM5/23/08
to
Bonjour à tous. J'ai un petit problème tout simple à exposer (peut-
être pas à résoudre gniark gniark ) :

Je veux faire une nouvelle commande exemple qui trace automatiquement
une ligne horizontale avant mais je ne veux pas que cette ligne soit
tracée si je suis sur la première ligne de la page. Le petit ECM
suivant vous aidera à comprendre ce que je veux dire :

%----------------------------------

%%%%%%%%%%%%% PREAMBULE
\documentclass [a4paper,10pt] {article}
\usepackage [latin1]{inputenc}
\usepackage [T1]{fontenc}


%%%%%%%%%%%%%Nouvelles commandes

% Ex
\newcommand{\ex}[1]{
\noindent \hrulefill \par % cette ligne ne doit pas être
exécutée si on est en première ligne de page !!
\noindent \textbf{Exemple} : \textit{#1}
\par
}

% Baratin
\def\baratin{Du baratin, encore du baratin et moult baratin.}
\edef \baratin{\baratin\ \baratin\ \baratin\ \baratin\ \baratin\
\baratin\ \par}
\def \rebaratin{\baratin \vspace{2.5cm} \baratin \vspace{2cm}
\baratin}

%%%%%%%%%%%%%% DOCUMENT

\begin{document}
\ex{Un exemple}
\rebaratin

\ex{Un autre exemple}
\rebaratin

\ex{encore un autre exemple}
\rebaratin

\end{document}

%----------------------------------

Avec ce code, le trait est bien tracé mais je voudrais qu'il ne se
trace pas pour le premier et le troisième exemple car ils sont en haut
de page.

Une petite idée ?
Peut-être à coup de if then else mais peut on détecter la première
ligne d'une page ?

Merci d'avance.

-------------------------
Thibault

Thomas vO

unread,
May 23, 2008, 9:30:11 AM5/23/08
to
bonjour,

À (at) Fri, 23 May 2008 05:38:23 -0700 (PDT),
thibault...@yahoo.fr nous disait (told us):


> Bonjour à tous. J'ai un petit problème tout simple à exposer (peut-
> être pas à résoudre gniark gniark ) :
>
> Je veux faire une nouvelle commande exemple qui trace automatiquement
> une ligne horizontale avant mais je ne veux pas que cette ligne soit
> tracée si je suis sur la première ligne de la page. Le petit ECM
> suivant vous aidera à comprendre ce que je veux dire :
>

> Avec ce code, le trait est bien tracé mais je voudrais qu'il ne se
> trace pas pour le premier et le troisième exemple car ils sont en haut
> de page.
>
> Une petite idée ?

les commandes \vspace et \hspace fonctionnent un peu de cette façon
(la version étoilée permet de mettre l'espace même en début de
page/ligne).

mais j'arrive pas à retrouver la définition de ces commandes pour
pomper honteusement ce mécanisme...

--
Alors là, c'est vendredi++... ou plutôt \addcounter{vendredi} pour
rester en charte !
-+- Paul in fr.comp.text.tex -+-

Paul Gaborit

unread,
May 23, 2008, 10:06:43 AM5/23/08
to

À (at) Fri, 23 May 2008 15:30:11 +0200,
Thomas vO <vanoud...@rf.camitsne.invalid> écrivait (wrote):

> À (at) Fri, 23 May 2008 05:38:23 -0700 (PDT),
> thibault...@yahoo.fr nous disait (told us):
>> Une petite idée ?
>
> les commandes \vspace et \hspace fonctionnent un peu de cette façon
> (la version étoilée permet de mettre l'espace même en début de
> page/ligne).
>
> mais j'arrive pas à retrouver la définition de ces commandes pour
> pomper honteusement ce mécanisme...

La macro \vspace (étoilée ou non) est définie dans latex.ltx mais
c'est en fait \vskip qui fait vraiment le boulot (la version etoilée
de \vspace ne fait qu'ajouter une boite horizontale de taille nulle
avant d'appeler \vskip pour forcer l'insertion de l'espace verticale).

\vskip est une commande TeX. Le mécanisme à pomper est donc mieux
caché que prévu. ;-)

Les spécialistes du Livre devraient donc pouvoir nous en dire plus sur
la bonne manière de faire.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>

thibault...@yahoo.fr

unread,
May 26, 2008, 9:52:12 AM5/26/08
to
Merci messieurs pour ces idées... Je pense que c'est une très bonne
piste mais malheureusement, je n'ai pas les compétences pour la
suivre.

Si un spécialiste peut éclairer notre lanterne, je lui serais très
reconnaissant.

Je résume le problème : comment créer une commande qui a un effet
différent en première ligne de page qu'en cours de page ?

Merci d'avance.

-------------------------------
Thibault

Jose Grimm

unread,
May 26, 2008, 11:07:56 AM5/26/08
to
Paul Gaborit wrote:
> À (at) Fri, 23 May 2008 15:30:11 +0200,
> Thomas vO <vanoud...@rf.camitsne.invalid> écrivait (wrote):
>> À (at) Fri, 23 May 2008 05:38:23 -0700 (PDT),
>> thibault...@yahoo.fr nous disait (told us):
>>> Une petite idée ?
>> les commandes \vspace et \hspace fonctionnent un peu de cette façon
>> (la version étoilée permet de mettre l'espace même en début de
>> page/ligne).

> Les spécialistes du Livre devraient donc pouvoir nous en dire plus sur


> la bonne manière de faire.
>

Je me rappelle avoir dit il n'y a pas très longtemps que TeX ignore les
espaces
en début de page; si on tient absolument à en mettre, on peut utiliser
\vspace*
qui va mettre un trait invisible.

Supposons que \trait mette un trait sur la page
par exemple \def\trait{\noindent\hrulefil\noindent}

La commande \ex serait de la forme
\newcommand{\ex}[1]{\trait


\textbf{Exemple}: \textit{#1}\par}

La question est : comment est ce qu'on peut remplacer \trait par \traitopt
de telle sorte que rien n'apparaisse en début de page ?

Soit L1 la ligne qui apparait avant le \ex, L2 la ligne contenant
exemple, T le trait.
On veut produire L1 T L2, sauf s'il y a un changement de page entre L1
et T, cas où
on ne veut que L1.

La première chose que doit faire \traitopt, c'est \par; ca termine le
paragraphe courant.
Si le paragraphe remplit la page, alors \pagetotal vaut 0pt.
dans le cas contraire \pagetotal est la place occupée sur la page et
\pagegoal la
place disponible pour le texte (hauteur de la page moins notes en bas de
page etc).

Supposons \pagetotal non nul. Si on essaie de mettre un trait et qu'il
n'y a pas assez de place, le trait va se retrouver sur la page d'après.
On peut mettre dans la page courante un \vskip X\penalty Y\vskip -X.
Après le \penalty, TeX regarde s'il peut changer de page.
Si TeX change de page sur le \vskip X, la page suivante commencera avec
deux espaces qui s'annulent (et il n'y aura pas de changement de page
sur le \penalty).
Si TeX change de page sur le \penalty, il y aura un espace X à la fin de
la première page
et le \vskip-X sur la deuxième page sera ignoré.
Les règles interdisent à TeX de couper sur le \vskip-X.

Donc après le \vskip, on est en haut de la page, ou il y a assez de
place pour mettre un
objet de hauteur X. On peut donc faire un
\ifdim\pagetotal=0pt\else\trait\fi.
La définition de \hrulefill est
\def\hrulefill{\leavevmode\leaders\hrule\hfill\kern\z@}

A la place de
\def\trait{\noindent\hrulefil\noindent}
je mettrais plutot
\def\trait{%\par
\vskip3pt\hrule\vskip3pt\noindent}

J'ai mis le \par en commentaire, car \traitopt appelle \trait uniquement
en mode vertical.
La commande \hrulefill passe en mode horizontal, elle ajoute un espace
vertical
(valeur de \parskip), alors que ma solution met un espace vertical
explicite.

L'espace X indiqué plus haut doit correspondre à la hauteur du trait et
des \vskip qui vont avec.
Si tu ne veux pas de trait en fin de page, il faut rajouter à X au moins
la hauteur d'une ligne de texte.
Je n'ai pas testé le code, mais l'idée y est.

Jose'


thibault...@yahoo.fr

unread,
May 27, 2008, 4:03:38 AM5/27/08
to
Merci beaucoup Jose Grimm pour ces explications très détaillées.
Cela fonctionne au poil :)
0 new messages