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
À (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 -+-
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/>
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
> 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'