Package enumitem et espaces verticaux

Tout ce qui concerne le langage LaTeX et ses variantes. Ce langage est supporté sur le forum via les balises tex.

Modérateur : gdm_tex

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.
toth
Utilisateur confirmé
Utilisateur confirmé
Messages : 19
Inscription : mardi 17 août 2010, 12:07
Statut actuel : Enseignant

[Résolu] Package enumitem et espaces verticaux

Message par toth »

bonjour,
je rencontre plusieurs problèmes avec les espaces verticaux de mes listes personnalisées via le package enumitem.
si on regarde la doc on y lit que les variables d'espaces verticaux classiques (\topsep, \partopsep, etc... ) sont reprises dans le package.

1) Je constate que, par exemple, faire \setlength{\topsep}{1mm} n'est pas "actif" lorsque \setlist[topsep=1mm] l'est, pourquoi ?
en revanche faire \setlength{\partopsep}{3mm} est équivalent à \setlist[partopsep=1mm] ??

Tout semble se passer comme si certaines des variables \topset, \itemsep, etc... étaient non utilisées et substituées par d'autres du type topsep, itemsep, etc... à mettre dans \setlist

Voir dans l'ECM list A versus list B
2) dans une list la même doc précise bien que les espaces verticaux sont contrôlés par \topsep+\parskip+\partopsep d'une part et \parsep ou \itemsep+\parsep d'autre part.
Il y a la possibilité d'écraser complètement tout espace vertical avec \setlist{nosep} or ca ne fait pas non plus la même chose que de mettre tous les paramétrer stopsep, itemsep, etc... à 0 dans le \setlist. Pourquoi ?
Voir dans l'ECM list B versus list C
Ci-dessous un ECM.

Code : Tout sélectionner

\documentclass{article} 

\usepackage{enumitem} % pour créer un index

\begin{document}

\setlength{\topsep}{3cm}% inactif
\setlength{\parsep}{2cm}% inactif
\setlength{\partopsep}{3mm}% actif
\setlength{\itemsep}{200mm} % inactif
\setlength{\parskip}{0pt}% actif ?

%
\hrulefill
%

texte précédant la liste A 

\begin{itemize}
	\item au niveau 1
	\begin{itemize}
		\item puce de niveau 2
		\item autre puce de niveau 2
	\end{itemize}
	\item encore au niveau  1
\end{itemize}

texte suivant la liste A

%
\hrulefill
%

texte précédant la liste B 

\begin{itemize}[partopsep=3mm, topsep=0pt, parsep=0pt, itemsep=0pt]
	\item au niveau 1
	\begin{itemize}
		\item puce de niveau 2
		\item autre puce de niveau 2
	\end{itemize}
	\item encore au niveau  1
\end{itemize}

texte suivant la liste B

%
\hrulefill
%

\setlist{nosep, partopsep=3mm} 

texte précédant la liste C

\begin{itemize}
	\item au niveau 1
	\begin{itemize}
		\item puce de niveau 2
		\item autre puce de niveau 2
	\end{itemize}
	\item encore au niveau  1
\end{itemize}

texte suivant la liste C

\hrulefill
%

% pour renvoyer les valeurs des variables 
%pour topsep : \the\topsep \\
%pour parsep : \the\parsep \\
%pour partopsep : \the\partopsep \\
%pour itemsep : \the\itemsep \\
%pour labelsep : \the\labelsep \\
%pour itemindent : \the\itemindent \\
%
%pour parskip : \the\parskip \\

\end{document}
Merci d'avance
Dernière modification par toth le samedi 03 octobre 2020, 17:16, modifié 1 fois.
version latex : Texlive2018 / compilation : lualatex / éditeur : texstudio

un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 825
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Package enumitem et espaces verticaux

Message par un bon petit »

Vous n'avez pas à contourner l'interface utilisateur mise en place par les packages, car ces interfaces utilisateur \set... font des choses bien plus compliquées qu'il n'y parait.
Ici, enumitem met à disposition \setlist, vous devez donc utiliser \setlist et non pas modifier ce que vous croyez que \setlist modifie.

Un coup d’œil dans le code source du package suffit à se rendre compte que si l'on écrit \setlist{topsep=3cm}, cela ne modifie PAS le ressort \topsep, mais cela crée (ou modifie) la macro \enit@@list qui sera exécutée ensuite à l'entrée dans l'environnement.

Code : Tout sélectionner

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{enumitem}
\begin{document}
\setlist{topsep=3cm}
\makeatletter
\meaning\enit@@list
\makeatother
\end{document}

toth
Utilisateur confirmé
Utilisateur confirmé
Messages : 19
Inscription : mardi 17 août 2010, 12:07
Statut actuel : Enseignant

Re: Package enumitem et espaces verticaux

Message par toth »

Bonjour,
merci pour ces précisions, je retiendrai la leçon.
je ne pense pas à aller dans le code source, principalement parce que c'est souvent très peu lisible pour le non initié.
Du coup \setlist{topsep=3cm} ne modifie pas \topsep ce qui semble pour le moins contre-intuitif surtout quand ladite commande \topsep est dans la doc.

Alors pardon d'insister mais j'aime bien comprendre (déformation professionnelle :roll: )
j'ai été voir la source (que je lis donc très mal) mais quand je vois :

Code : Tout sélectionner

\enitkv@key{}{topsep}{%
  \enit@setlength\topsep{#1}}
j'ai quand même l'impression que topsep et \topsep sont liés.

De même quand je lis :

Code : Tout sélectionner

\enitkv@key{}{nosep}[true]{%
  \partopsep=\z@skip
  \topsep=\z@skip
  \itemsep=\z@skip
  \parsep=\z@skip}
je ne comprends pas mieux le pb de mon point 2)

J'imagine qu'à d'autres endroits du package le nosep modifie quelque chose mais j'ai pas su voir.
bien cordialement
version latex : Texlive2018 / compilation : lualatex / éditeur : texstudio

un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 825
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Package enumitem et espaces verticaux

Message par un bon petit »

toth a écrit :
samedi 03 octobre 2020, 10:52
je ne pense pas à aller dans le code source
[SNIP]
Alors pardon d'insister mais j'aime bien comprendre
Vous êtes sérieux ? Vous voulez comprendre, mais sans aller lire le code source ?

N'étant pas l'auteur de ce package, je ne compte pas aller faire ce travail pour vous et vous expliquer ce qu'il se passe en coulisse ici. D'ailleurs, ça prendrait trop de temps.
toth a écrit :
samedi 03 octobre 2020, 10:52
Du coup \setlist{topsep=3cm} ne modifie pas \topsep ce qui semble pour le moins contre-intuitif surtout quand ladite commande \topsep est dans la doc.
Décidément !
Je répète, puisque je crois que je n'ai pas été compris : \setlist{topsep=3cm} modifie le ressort \topsep, mais pas immédiatement. Il le modifie plus tard, au bon moment.
toth a écrit :
samedi 03 octobre 2020, 10:52
j'ai quand même l'impression que topsep et \topsep sont liés.
Bien évidemment qu'ils sont liés, c'est d'ailleurs l'évidence : la clé topsep modifie le ressort \topsep, mais pas au moment où vous le croyez.
toth a écrit :
samedi 03 octobre 2020, 10:52
De même quand je lis :

Code : Tout sélectionner

\enitkv@key{}{nosep}[true]{%
  \partopsep=\z@skip
  \topsep=\z@skip
  \itemsep=\z@skip
  \parsep=\z@skip}
je ne comprends pas mieux le pb de mon point 2)
L'auteur du package, contrairement à nous utilisateurs, sait quand manipuler directement les ressorts pour que l'effet soit celui attendu et sans créer des effets de bord problématiques.

C'est justement pour éviter que nous fassions n'importe quoi que l'interface utilisateur \setlist existe !!!

toth
Utilisateur confirmé
Utilisateur confirmé
Messages : 19
Inscription : mardi 17 août 2010, 12:07
Statut actuel : Enseignant

Re: Package enumitem et espaces verticaux

Message par toth »

un bon petit a écrit :
samedi 03 octobre 2020, 16:11
Vous êtes sérieux ? Vous voulez comprendre, mais sans aller lire le code source ?
je me suis probablement mal exprimé, j'aurai du écrire :
toth a écrit :
samedi 03 octobre 2020, 10:52
je ne pense pas spontanément à aller dans le code source,

Alors pardon d'insister mais, après avoir été voir la source, comme j'aime bien comprendre
un bon petit a écrit :
samedi 03 octobre 2020, 16:11
Je répète, puisque je crois que je n'ai pas été compris : \setlist{topsep=3cm} modifie le ressort \topsep, mais pas immédiatement. Il le modifie plus tard, au bon moment.
Ah et bien grand merci de "répéter" car je n'avais effectivement pas compris. En vous lisant j'avais même compris le contraire :
un bon petit a écrit :
samedi 03 octobre 2020, 09:16
si l'on écrit \setlist{topsep=3cm}, cela ne modifie PAS le ressort \topsep, mais cela crée (ou modifie) la macro \enit@@list qui sera exécutée ensuite à l'entrée dans l'environnement.
C'est le "pas immédiatement" qui me manquait dans la compréhension des choses.

Autre point : ce que je ne comprenais pas dans mon point 2) c'était la différence de rendu entre :

Code : Tout sélectionner

\begin{itemize}[nosep]
	\item au niveau 1
		\begin{itemize}
			\item puce de niveau 2
			\item autre puce de niveau 2
		\end{itemize}
	\item encore au niveau  1
\end{itemize}
et

Code : Tout sélectionner

\setlist{nosep}
\begin{itemize}
	\item au niveau 1
		\begin{itemize}
			\item puce de niveau 2
			\item autre puce de niveau 2
		\end{itemize}
	\item encore au niveau  1
\end{itemize}
Dans le premier cas le nosep ne s'applique qu'à la liste "de niveau 1", dans le second il s'applique à toutes les listes. Une erreur bête.

En tous cas merci de votre patience envers le débutant que je suis.
Bien cordialement,
Dernière modification par toth le samedi 03 octobre 2020, 18:21, modifié 1 fois.
version latex : Texlive2018 / compilation : lualatex / éditeur : texstudio

un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 825
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Package enumitem et espaces verticaux

Message par un bon petit »

toth a écrit :
samedi 03 octobre 2020, 16:57
Autre point : ce que je ne comprenais pas dans mon point 2) c'était la différence de rendu entre :

Code : Tout sélectionner

\begin{itemize}[nosep]
	\item au niveau 1
		\begin{itemize}
			\item puce de niveau 2
			\item autre puce de niveau 2
		\end{itemize}
	\item encore au niveau  1
\end{itemize}
et

Code : Tout sélectionner

\setlist{nosep}
\begin{itemize}
	\item au niveau 1
		\begin{itemize}
			\item puce de niveau 2
			\item autre puce de niveau 2
		\end{itemize}
	\item encore au niveau  1
\end{itemize}
Dans le premier cas le nosep s'applique à toutes les listes, dans le second qu'à la liste "de niveau 1".
C'est le contraire : avec \begin{itemize}[nosep], seule la liste de ce niveau d'imbrication sera nosep. En revanche, avec \setlist{nosep}, toutes les listes et tous les niveaux d'imbrication sont affectés. Pour n'affecter que le niveau 1, c'est \setlist[1]{nosep}, mais tout ceci est décrit et expliqué dans la doc...

toth
Utilisateur confirmé
Utilisateur confirmé
Messages : 19
Inscription : mardi 17 août 2010, 12:07
Statut actuel : Enseignant

Re: Package enumitem et espaces verticaux

Message par toth »

Oui, bien sûr, un malheureux copier/coller de code.
J'ai édité mon post pour plus de lisibilité.
version latex : Texlive2018 / compilation : lualatex / éditeur : texstudio