[TeX] Espace \vskip en fin de page

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
MB
Administrateur
Administrateur
Messages : 7985
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

[TeX] Espace \vskip en fin de page

Message non lu par MB »

Bonjour,

En consultant le chapitre concernant les ressorts de l'excellent Apprendre à programmer en TeX, je tombe sur la remarque suivante.
Les espaces ainsi insérées sont sécables, c’est-à-dire susceptibles d’être remplacées par des coupures de ligne ou de pages. De plus, elles sont ignorées lorsqu’elles se trouvent immédiatement avant la fin du paragraphe pour \hskip ou de la fin de la page pour \vskip.
Je voulais un exemple de ressort ignoré en fin de page, mais j'ai plutôt observé qu'ils étaient ignorés en début de page. Le code suivant produit bien un espace de 1cm en bas de page, alors qu'il me semble que le \vskip se trouve bien immédiatement avant la fin de page. Il y a sans doute un truc qui m'échappe !

Code : Tout sélectionner

\documentclass{minimal}
\usepackage{lua-visual-debug}
\topskip=0pt

\begin{document}

blabla.\vskip 1cm plus 1fill
blabla.\vskip 1cm

\end{document}
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 995
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: [TeX] Espace \vskip en fin de page

Message non lu par un bon petit »

MB a écrit : mercredi 25 janvier 2023, 15:11 Je voulais un exemple de ressort ignoré en fin de page
Les ressorts sont supprimés lorsqu'ils sont sur une coupure :
  • de ligne en mode horizontal (\hskip ou l'espace ou n'importe quel autre ressort horizontal)
  • de page en mode horizontal (\vskip ou n'importe quel autre ressort vertical)
Vous pouvez vous en assurer sur cet ECM. Si vous décommentez le \vskip, cela ne changera rien car ce ressort est supprimé de la liste verticale car la coupure de page se produit là.

Code : Tout sélectionner

\documentclass{article}
\usepackage[showframe,noheadfoot,paperwidth=5cm,paperheight=5cm,margin=0.5cm,noheadfoot]{geometry}
\begin{document}
\parindent=0pt \baselineskip=16pt
Une ligne\par
Une ligne\par
Une ligne\par
Une ligne\par
Une ligne\par
Une ligne\par
Une ligne (la dernière)\par%\vskip1cm
Une ligne\par
\end{document}
Programmer en TeX, TeXpérimental
MB
Administrateur
Administrateur
Messages : 7985
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [TeX] Espace \vskip en fin de page

Message non lu par MB »

Il s'agit ici du cas où le ressort est remplacé par une coupure de page non ?
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 995
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: [TeX] Espace \vskip en fin de page

Message non lu par un bon petit »

Bon oui, c'est ce que dit le texbook ou le paragraphe cité plus haut.
Programmer en TeX, TeXpérimental
MB
Administrateur
Administrateur
Messages : 7985
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [TeX] Espace \vskip en fin de page

Message non lu par MB »

C'est seconde partie du paragraphe qui me posait question.
De plus, elles sont ignorées lorsqu’elles se trouvent immédiatement avant la fin du paragraphe pour \hskip ou de la fin de la page pour \vskip.
Il me semblait comprendre qu'il y avait un autre cas, où le \vskip n'était pas remplacé par une coupure de page, mais simplement ignoré, car situé immédiatement avant la fin de la page.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 995
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: [TeX] Espace \vskip en fin de page

Message non lu par un bon petit »

MB a écrit : mercredi 25 janvier 2023, 16:15 Il me semblait comprendre qu'il y avait un autre cas, où le \vskip n'était pas remplacé par une coupure de page, mais simplement ignoré, car situé immédiatement avant la fin de la page.
Non.
Un ressort est sécable et lorsqu'il est remplacé par une coupure, il est supprimé. Sinon, il reste maintenu dans le liste horizontale ou verticale.
Programmer en TeX, TeXpérimental
MB
Administrateur
Administrateur
Messages : 7985
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [TeX] Espace \vskip en fin de page

Message non lu par MB »

Les \vskip sont tout de même ignorés en début de page non ?

Code : Tout sélectionner

\documentclass{minimal}
\usepackage{lua-visual-debug}
\topskip=0pt

\begin{document}

\vskip 1cm% ignoré
blabla.
\vskip 1cm plus 1fill
blabla.
\vskip 1cm
\newpage
\vskip 1cm% ignoré
blabla.
\vskip 1cm plus 1fill
blabla.
\vskip 1cm

\end{document}
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 995
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: [TeX] Espace \vskip en fin de page

Message non lu par un bon petit »

MB a écrit : mercredi 25 janvier 2023, 16:29 Les \vskip sont tout de même ignorés en début de page non ?
Je me bornerai à citer le TeXbook, chapitre « Comment TeX fabrique les pages », qu'il est très instructif de lire :
À chaque fois que TeX déplace un objet du haut des « contributions récentes » vers le bas de la « page courante », il efface les objets volatils (ressorts, blancs fixes ou pénalités) si la page courante ne contient aucune boite.
Programmer en TeX, TeXpérimental
MB
Administrateur
Administrateur
Messages : 7985
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [TeX] Espace \vskip en fin de page

Message non lu par MB »

Je ne possède malheureusement pas la traduction française du TeXbook et je dois admettre que la citation proposée reste encore assez mystérieuse à mes yeux ... Sinon, j'en profite pour indiquer que l'utilisation de \vglue permet de ne pas ignorer ces espaces en début de page.

Code : Tout sélectionner

\documentclass{minimal}
\usepackage{lua-visual-debug}
\topskip=0pt

\begin{document}

\vskip 1cm% ignoré
blabla.
\vskip 1cm plus 1fill
blabla.
\vskip 1cm
\newpage
\vglue 1cm% pas ignoré
blabla.
\vskip 1cm plus 1fill
blabla.
\vskip 1cm

\end{document}
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 995
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: [TeX] Espace \vskip en fin de page

Message non lu par un bon petit »

MB a écrit : mercredi 25 janvier 2023, 19:28 Je ne possède malheureusement pas la traduction française du TeXbook
Je n'arrive même pas à le croire !
MB a écrit : mercredi 25 janvier 2023, 19:28Sinon, j'en profite pour indiquer que l'utilisation de \vglue permet de ne pas ignorer ces espaces en début de page.
Ouais bof, votre méthode car \vglue est une macro et il faut aller lire son code et comprendre pourquoi « ça marche » plutôt que d'essayer et de se dire « tiens, ça marche ».

Il suffit de mettre une boite en haut de la page qui ne prenne aucune place, typiquement \hrule width0pt height0pt depth0pt.

On peut également \hbox{} ou \null (ce qui est pareil), mais dans ce cas, le ressort d'interligne est entre la boite vide et la suite, ce n'est donc pas équivalent.

Code : Tout sélectionner

\documentclass{article}
\usepackage[showframe,noheadfoot,paperwidth=5cm,paperheight=5cm,margin=0.5cm,noheadfoot]{geometry}
\begin{document}
\parindent0pt \topskip0pt
\hrule width0pt height0pt depth0pt % ou \hbox{} ou \null
\vskip1cm
Une ligne\par
Une ligne.
\end{document}
Programmer en TeX, TeXpérimental
MB
Administrateur
Administrateur
Messages : 7985
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [TeX] Espace \vskip en fin de page

Message non lu par MB »

Oui, je savais qu'on pouvait ajouter une boite vide avant le \vskip, mais je ne connaissais pas la macro \vglue, qui est du coup plus pratique.
Sinon, je confirme ne pas posséder le TeXbook en français, mais j'ai une version numérique en anglais.
When a page is completed, it is removed from the main vertical list and passed to an “output routine,” as we will see later; so its boxes and glue eventually disappear from TEX’s memory. The remainder of the main vertical list exists in two parts: First comes the “current page,” which contains all the material that TEX has considered so far as a candidate for the next page to be broken off; then there are “recent contributions,” i.e., items that will be moved to the current page as soon as TEX finds it convenient to do so. If you say \showlists, TEX will display the contents of the current page and the recent contributions, if any, on your log file. (The example in Chapter 13 doesn’t show any such lists because they were both empty in that case. Chapter 24 explains more about TEX’s timing.)

Whenever TEX is moving an item from the top of the “recent contributions” to the bottom of the “current page”, it discards a discardable item (glue, kern, or
penalty) if the current page does not contain any boxes. This is how glue disappears at a page break. Otherwise if a discardable item is a legitimate breakpoint, TEX calculates the cost c of breaking at this point, using the formula that we have just discussed. If the resulting c is less than or equal to the smallest cost seen so far on the current page, TEX remembers the current breakpoint as the best so far. And if $c = \infty$ or if $p \leqslant −10000$, TEX seizes the initiative and breaks the page at the best remembered breakpoint. Any material on the current page following that best breakpoint is moved back onto the list of recent contributions, where it will be considered again; thus the “current page” typically gets more than one page’s worth of material before the breakpoint is chosen.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 995
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: [TeX] Espace \vskip en fin de page

Message non lu par un bon petit »

MB a écrit : mercredi 25 janvier 2023, 20:06 Oui, je savais qu'on pouvait ajouter une boite vide avant le \vskip, mais je ne connaissais pas la macro \vglue, qui est du coup plus pratique.
Si l'on ne tient pas compte de la préservation du \prevdepth et d'un \nobreak (choses dont on se fiche éperdument en haut d'une page), la macro \vglue fait exactement ce que j'ai proposé : elle met une boite de réglure nulle puis un \vskip de la hauteur demandé.
MB a écrit : mercredi 25 janvier 2023, 20:06 Sinon, je confirme ne pas posséder le TeXbook en français, mais j'ai une version numérique en anglais.
Ça c'est facile, les sources sont données par Knuth.
On trouve d'ailleurs le pdf un peu partout sur internet.

Pour la version française, ce n'est pas le cas, on ne la trouve que sous forme physique d'un bon gros bouquin.
Programmer en TeX, TeXpérimental
touhami
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 488
Inscription : dimanche 11 février 2007, 11:45

Re: [TeX] Espace \vskip en fin de page

Message non lu par touhami »

Bonjour.
MB a écrit : mercredi 25 janvier 2023, 16:29 Les \vskip sont tout de même ignorés en début de page non ?
un bon petit a écrit : mercredi 25 janvier 2023, 18:33
À chaque fois que TeX déplace un objet du haut des « contributions récentes » vers le bas de la « page courante », il efface les objets volatils (ressorts, blancs fixes ou pénalités) si la page courante ne contient aucune boite.
Si j'ai bien compris c'est une réponse affirmative.
Essayer de compiler le code suivant avec et sans \penalty-10000.

Code : Tout sélectionner

\documentclass{minimal}
\begin{document}
foo\par bar
\vskip.5\textheight %coupure avant vskip (supprimée)
%\penalty-10000 %coupure après vskip (non supprimée)
\vskip.5\textheight %supprimée dans les deux cas
baz
\end{document}
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 995
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: [TeX] Espace \vskip en fin de page

Message non lu par un bon petit »

touhami a écrit : jeudi 26 janvier 2023, 20:48
MB a écrit : mercredi 25 janvier 2023, 16:29 Les \vskip sont tout de même ignorés en début de page non ?
un bon petit a écrit : mercredi 25 janvier 2023, 18:33
À chaque fois que TeX déplace un objet du haut des « contributions récentes » vers le bas de la « page courante », il efface les objets volatils (ressorts, blancs fixes ou pénalités) si la page courante ne contient aucune boite.
Si j'ai bien compris c'est une réponse affirmative.
C'est clair pourtant. En haut d'une page, les skip, les kern et les penalty sont supprimés.
Programmer en TeX, TeXpérimental
MB
Administrateur
Administrateur
Messages : 7985
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [TeX] Espace \vskip en fin de page

Message non lu par MB »

Oui, les espaces sont clairement ignorés en début de page, et jamais en fin de page.

Mon interrogation initiale concernait la remarque suivante, qui semble indiquer que les espaces sont ignorés lorsqu'elles se trouvent immédiatement avant la fin de la page, d'où mon incompréhension.
Les espaces ainsi insérées sont sécables, c’est-à-dire susceptibles d’être remplacées par des coupures de ligne ou de pages. De plus, elles sont ignorées lorsqu’elles se trouvent immédiatement avant la fin du paragraphe pour \hskip ou de la fin de la page pour \vskip.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 995
Inscription : vendredi 12 juin 2009, 22:35
Statut actuel : Enseignant
Localisation : Chambéry

Re: [TeX] Espace \vskip en fin de page

Message non lu par un bon petit »

Oui, cela prête à interprétation.
L'auteur a été mal inspiré et aurait dû écrire : « De plus, lorsque c'est la cas, elles sont ignorées lorsqu’elles se trouvent immédiatement avant la fin du paragraphe pour \hskip ou de la fin de la page pour \vskip. »
Programmer en TeX, TeXpérimental
MB
Administrateur
Administrateur
Messages : 7985
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [TeX] Espace \vskip en fin de page

Message non lu par MB »

Pour moi ça n'est pas le problème, mais apparemment je ne parviens pas à me faire comprendre.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.