Test de haut de page

Bonjour,

Je crois me souvenir qu’il y a un moyen de tester si on est en haut d’une page (comprendre un saut de page vient d’avoir lieu et on n’a encore rien écrit dans la nouvelle page). Mais cela ne me revient pas…

Une idée ?


Michel Bovani
xyz@xyz.tld
https://mathriochka.net

17 janvier 2023 14:03 “Michel Bovani” <xyz@xyz.tld (mailto:xyz@xyz.tld?to=%22Michel%20Bovani%22%20xyz@xyz.tld)> a écrit:
Bonjour,

Je crois me souvenir qu’il y a un moyen de tester si on est en haut d’une page (comprendre un saut de page vient d’avoir lieu et on n’a encore rien écrit dans la nouvelle page). Mais cela ne me revient pas…
(…)
Bonjour,

Regarde du côté de pagegoal et pagetotal si ces commandes peuvent te tirer d’affaire. Sinon, tu peux aussi utiliser TiKZ. Bien à toi,

J.-M.

Le 17 janv. 2023 à 16:50, xyz@xyz.tld a écrit :

17 janvier 2023 14:03 “Michel Bovani” <xyz@xyz.tld mailto:xyz@xyz.tld?to=“Michel%20Bovani”%20%xyz@xyz.tld>> a écrit:
Bonjour,
Je crois me souvenir qu’il y a un moyen de tester si on est en haut d’une page (comprendre un saut de page vient d’avoir lieu et on n’a encore rien écrit dans la nouvelle page). Mais cela ne me revient pas…
(…)

Bonjour,

Regarde du côté de \pagegoal et \pagetotal si ces commandes peuvent te tirer d’affaire.

En tout cas, c’est bien ce qu’il y avait dans mes vagues souvenirs. Merci !

J’ai par conséquent relu le chapitre 15 du Texbook qui m’a donné d’autres idées. Je mets en page une pièce de théâtre et j’ai donc une commande \pers que j’emploie comme ceci.

%%%%%
\pers{Don Diègue}

Rodrigue, as-tu du cœur ?

\pers{Don Rodrigue}

\phantom{Rodrigue, as-tu du cœur ?}Tout autre que mon père

L’éprouverait sur l’heure.
%%%%%

La commande \pers était à l’origine définie comme ceci

%%%%%
\newcommand{\pers}[1]{%
\vspace{0.5\baselineskip}\par%
{\centering #1i\par}\vspace{0.5\baselineskip\par}
%%%%%

La chose occupe donc deux lignes : une demi-ligne, la ligne avec le nom du personnage, puis une demi-ligne. Mais il y a un problème : lorsque le nom du personnage tombe en haut de page, le premier saut n’a pas lieu et le registre est décalé d’une demi-ligne, ce dont je ne veux pas. J’ai donc finalement fait :

%%%%%
\newcommand{\pers}[1]{%
\addtolerngth{\topskip}{0.5\baselineskip}
\vspace{0.5\baselineskip}\par%
{\centering #1i\par}\vspace{0.5\baselineskip
\addtolength{\topskip}{-0.5\baselineskip}
\par}
%%%%%

Qui fonctionne très bien, si ce n’est que je dois ajouter à chaque fois que le rejet à la page se produit un \pagebreak explicite avant la commande \pers. Je n’ai pas encore bien compris pourquoi, mais je pense que c’est parce que, sinon, avant que le coupe des pénalités ne déborde Tex a placé l’ensemble des instructions de la commande dans la liste verticale et que lors du saut de page effectif, les motifs du \topskip ne sont pas récupérées dans la liste de la nouvelle page (pas sûr que cette explication soit la bonne).

En l’occurence, le principe du \pagebreak explicite ne me dérange pas ou pas trop, mais je vais peut-être essayer de gagner en automatisation (peut-être mettre un \goodbreak dans la commande).

Michel

Bonjour,

Est-ce que utiliser \vskip au lieu de \vspace nd réglerait pas le problème ? D’après TeX in a nutshell, l’espacement vertical inséré par \vskip en haut d’une page est ignoré. Je n’ai pas retrouvé le passage correspondant dans le TeXBook, mais il me semble l’avoir observé il y a peu de temps.

Bien à vous,

Bastien Dumont

Le Wednesday 18 January 2023 à 11:54:12AM, Michel Bovani a écrit :

Le 17 janv. 2023 à 16:50, xyz@xyz.tld a écrit :

17 janvier 2023 14:03 "Michel Bovani" <[1]xyz@xyz.tld> a
écrit:

    Bonjour,
    Je crois me souvenir qu’il y a un moyen de tester si on est en haut
    d’une page (comprendre un saut de page vient d’avoir lieu et on n’a
    encore rien écrit dans la nouvelle page). Mais cela ne me revient pas…
    (...)


Bonjour,

Regarde du côté de \pagegoal et \pagetotal si ces commandes peuvent te
tirer d'affaire.

En tout cas, c’est bien ce qu’il y avait dans mes vagues souvenirs. Merci !

J’ai par conséquent relu le chapitre 15 du Texbook qui m’a donné d’autres
idées. Je mets en page une pièce de théâtre et j’ai donc une commande \pers que
j’emploie comme ceci.

%%%%%
\pers{Don Diègue}

Rodrigue, as-tu du cœur ?

\pers{Don Rodrigue}

\phantom{Rodrigue, as-tu du cœur ?}Tout autre que mon père

L’éprouverait sur l’heure.
%%%%%

La commande \pers était à l’origine définie comme ceci

%%%%%
\newcommand{\pers}[1]{%
\vspace{0.5\baselineskip}\par%
{\centering #1i\par}\vspace{0.5\baselineskip\par}
%%%%%

La chose occupe donc deux lignes : une demi-ligne, la ligne avec le nom du
personnage, puis une demi-ligne. Mais il y a un problème : lorsque le nom du
personnage tombe en haut de page, le premier saut n’a pas lieu et le registre
est décalé d’une demi-ligne, ce dont je ne veux pas. J’ai donc finalement fait
:

%%%%%
\newcommand{\pers}[1]{%
\addtolerngth{\topskip}{0.5\baselineskip}
\vspace{0.5\baselineskip}\par%
{\centering #1i\par}\vspace{0.5\baselineskip
\addtolength{\topskip}{-0.5\baselineskip}
\par}
%%%%%

Qui fonctionne très bien, si ce n’est que je dois ajouter à chaque fois que le
rejet à la page se produit un \pagebreak explicite avant la commande \pers. Je
n’ai pas encore bien compris pourquoi, mais je pense que c’est parce que,
sinon, avant que le coupe des pénalités ne déborde Tex a placé l’ensemble des
instructions de la commande dans la liste verticale et que lors du saut de page
effectif, les motifs du \topskip ne sont pas récupérées dans la liste de la
nouvelle page (pas sûr que cette explication soit la bonne).

En l’occurence, le principe du \pagebreak explicite ne me dérange pas ou pas
trop, mais je vais peut-être essayer de gagner en automatisation (peut-être
mettre un \goodbreak dans la commande).

Michel

References:

[1] mailto:xyz@xyz.tld?to=%22Michel%20Bovani%22%20%xyz@xyz.tld%3E

Bonjour,

Le mercredi 18 janvier 2023 à 11:54:12, Michel Bovani écrivit :

M> J’ai donc finalement fait :

M> \addtolerngth{\topskip}{0.5\baselineskip}

M> Qui fonctionne très bien,

ça m’étonne quand même un peu, à moins que tu aies une définition perso de \addtolerngth !

Si je comprends bien, tu te moques de savoir si tu es en haut de page ou pas, tu veux toujours ton décalage d’une demi-ligne, mais alors pourquoi ne pas remplacer
\vspace{0.5\baselineskip}
par
\vspace*{0.5\baselineskip}

plus éventuellement des \nobreak pour pas que la coupure intervienne au milieu de tes lignes ?

Th.

Le 18 janv. 2023 à 11:54, Michel Bovani xyz@xyz.tld a écrit :

En l’occurence, le principe du \pagebreak explicite ne me dérange pas ou pas trop, mais je vais peut-être essayer de gagner en automatisation (peut-être mettre un \goodbreak dans la commande).

Bon finalement, ma solution, agrémentée d’un \goodbreak ne fonctionne pas si mal (bien sûr, il faudra toujours gérer les orphelines à la main…)

\documentclass[a4paper,draft]{article}
\parindent=12pt
\parskip=0pt
%%%%
\newcommand{\perso}[1]{%
\addtolength{\topskip}{0.5\baselineskip}
\vspace{0.5\baselineskip}
\par\goodbreak {\centering #1\par}
\par\vspace{0.5\baselineskip}\addtolength{\topskip}{-0.5\baselineskip}
}
%%%%
\begin{document}

\null\clearpage

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\perso{Don Rodrigue}
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\perso{Chimène}
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\perso{Don Rodrigue}
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\perso{Chimène}
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\perso{Don Rodrigue}
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\perso{Chimène}
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\perso{Don Rodrigue}
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\end{document}

Michel

Le 18 janv. 2023 à 16:08, Thierry Bouche xyz@xyz.tld a écrit :

Bonjour,

Le mercredi 18 janvier 2023 à 11:54:12, Michel Bovani écrivit :

M> J’ai donc finalement fait :

M> \addtolerngth{\topskip}{0.5\baselineskip}

M> Qui fonctionne très bien,

ça m’étonne quand même un peu, à moins que tu aies une définition perso de \addtolerngth !

#Mauvaise foi on
Ben en fait, depuis toujours, je fais \let\addtolrength\addtolength juste après le \begin{document}
#Mauvaise foi off

Si je comprends bien, tu te moques de savoir si tu es en haut de page ou pas, tu veux toujours ton décalage d’une demi-ligne, mais alors pourquoi ne pas remplacer
\vspace{0.5\baselineskip}
par
\vspace*{0.5\baselineskip}

Ben je pense que si je fais ça il va mettre ça dans le \topskip et le saut sera de \topskip et pas de 0.5\baselineskip. Sauf bien sûr si le \topskip est inférieur ou égal à 0.5\baselineskip, mais ça c’est vraiment pas recommandé.

En vérité TeX n’est vraiment pas fait pour tenir le registre, mais dans le cas de bidule un tantinet littéraires, moi j’y tiens…


Michel

Le 18 janv. 2023 à 16:01, Bastien DUMONT xyz@xyz.tld a écrit :

Bonjour,

Est-ce que utiliser \vskip au lieu de \vspace nd réglerait pas le problème ? D’après TeX in a nutshell, l’espacement vertical inséré par \vskip en haut d’une page est ignoré.
Ah mais justement, je ne veux pas qu’il soit ignoré !

Je veux un blanc vertical de 0.5\baselineskip, puis une ligne avec le nom du personnage centré, puis un autre blanc de 0.5\baselineskip. De façon à ce que le nom du personnage occupe exactement deux lignes que l’on soit en haut de page ou pas.

Michel

Le 18/01/2023 à 16:23, Michel Bovani a écrit :

#Mauvaise foi on
Ben en fait, depuis toujours, je fais \let\addtolrength\addtolength
juste après le \begin{document}
#Mauvaise foi off

Et pour le “i” en trop et la parenthèse fermante manquante, c’est quoi
le code-de-mauvaise-foi :slight_smile:

–Jean-Yves

Ah oui, pardon, c’était donc le même problème que celui que j’ai eu il n’y a pas longtemps (j’ai retrouvé où).

Je m’en suis sorti avec quelque chose comme \kern0.5\baselineskip \vbox{…}. Mais il vaut peut-être mieux utiliser \vspace*.

Le Wednesday 18 January 2023 à 04:28:47PM, Michel Bovani a écrit :

Le 18 janv. 2023 à 16:01, Bastien DUMONT
<xyz@xyz.tld> a écrit :

Bonjour,

Est-ce que utiliser \vskip au lieu de \vspace nd réglerait pas le
problème ? D'après TeX in a nutshell, l'espacement vertical inséré par \
vskip en haut d'une page est ignoré.

Ah mais justement, je ne veux pas qu’il soit ignoré !

Je veux un blanc vertical de 0.5\baselineskip, puis une ligne avec le nom du
personnage centré, puis un autre blanc de 0.5\baselineskip. De façon à ce que
le nom du personnage occupe exactement deux lignes que l’on soit en haut de
page ou pas.

Michel

Le 18 janv. 2023 à 16:23, Michel Bovani xyz@xyz.tld a écrit :

Le 18 janv. 2023 à 16:08, Thierry Bouche <xyz@xyz.tld mailto:xyz@xyz.tld> a écrit :

Si je comprends bien, tu te moques de savoir si tu es en haut de page ou pas, tu veux toujours ton décalage d’une demi-ligne, mais alors pourquoi ne pas remplacer
\vspace{0.5\baselineskip}
par
\vspace*{0.5\baselineskip}

Ben je pense que si je fais ça il va mettre ça dans le \topskip et le saut sera de \topskip et pas de 0.5\baselineskip. Sauf bien sûr si le \topskip est inférieur ou égal à 0.5\baselineskip, mais ça c’est vraiment pas recommandé.

En vérité non pas exactement, mais c’est en quelque sorte pire :

\documentclass[a4paper]{article}
\parindent=0pt
\parskip=0pt
%\topskip=30pt

\begin{document}
%\fontsize{30}{36}\selectfont

\null\clearpage

xxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxx
\vspace{0.5\baselineskip}
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxx

\clearpage
\vspace*{0.5\baselineskip}
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxx
\par xxxxxxxxxxxxxxxxxxxxxxxxxxxx

\end{document}

Si je t’ai bien suivi, sur les pages 2 et 3 qu’il est facile de mettre en vis-à-vis, le décalage d’une demi-ligne devrait être rattrapé à la ligne 3 et les lignes 3 et 4 devraient être en vis-à-vis. Et pas du tout.

En décommentant les 2 lignes, on observe le phénomène grossi 3 fois et ça reste un phénomène que je ne m’explique pas trop !

Apparemment si je remplace \vspace*{0.5\baselineskip} par \vspace*{-0.5\baselineskip}, ça arrange tout jusqu’à preuve du contraire. Mais alors il me faudrait une commande à géométrie variable… et on retombe sur l’idée de tester le haut de page !

Michel