J'ai cru comprendre au travers de la définition de la commande \@item que la boîte \@labels est vide lorsque TeX appelle la routine de sortie de sorte que, par exemple, une liste en pied de page ne sera pas compromise.

La commande \@outputpage prend soin de sauvegarder l'état de \if@newlist mais la boîte \@labels n'est pas mentionnée, certainement car ce n'est pas nécessaire.

Mais justement, si l'on souhaite utiliser la boîte \@labels quitte à ce qu'elle ne soit plus vide lorsque TeX décide de couper, est-il sérieux pour pallier cela de dire quelque chose du type :

Ouvrir dans l'éditeur
\newbox\@@labels  
\def\sv@labels{\setbox\@@labels\box\@labels}  
\def\r@labels{\setbox\@labels\box\@@labels}  
\output\expandafter{\expandafter\sv@labels\the\output\r@labels}

Posée 22 Déc '15, 01:11

bcfp's gravatar image

bcfp
1914
Taux d'acceptation : 0%

Modifiée 22 Déc '15, 06:21

Pathe's gravatar image

Pathe ♦♦
7.4k28196245

1

Tel quel, votre code n'est pas vraiment compréhensible... Sinon, quel est l'objectif réel derrière tout ça ?

(22 Déc '15, 02:00) Paul Gaborit Paul%20Gaborit's gravatar image

Pardon mais les contre-obliques ne sont pas sorties...

L'objectif réel est de bricoler un peu le package hyperref pour les environnements de théorèmes. Je me disais que peut-être les ancres pourraient être placées à l'intérieur de la boîte @labels...

(22 Déc '15, 02:30) bcfp bcfp's gravatar image
1

@bcfp Attention ! Les contre-obliques (\) saisies telles quelles dans les contributions ne sont pas visibles.

Pour insérer du ⟨code⟩, notamment des commandes LaTeX, le mieux est de recourir au raccourci Ctrl+k (dans les questions et réponses) et à `⟨code⟩` (dans les commentaires).

Cf., au sein de la FAQ, le paragraphe « Comment mettre en forme ma contribution ? »

(22 Déc '15, 06:22) Pathe ♦♦ Pathe's gravatar image
1

@bcfp Pourquoi ne pas exposer plus clairement votre besoin réel, plutôt que de poser une question sur ce que vous croyez être la solution ? À mon avis, l'ajout d'ancres hyperref dans l'environnement theorem (ou autres) ne passe absolument pas par une modification de la routine de sortie...

(22 Déc '15, 10:33) Paul Gaborit Paul%20Gaborit's gravatar image

@Pathe Merci, je n'avais pas vu le paragraphe sur le code, je vais essayer de m'améliorer !

(22 Déc '15, 11:25) bcfp bcfp's gravatar image

@PaulGaborit Je ne comprends pas, je me demandais juste si cette méthode utilisée notamment pour l'option excludeordu package everyhook était valable (l'auteur de ce package parle d'option plutôt expérimentale) et si elle pouvait être utilisée autour de la boîte \@labels.

Dans l'affirmative, les ancres des théorèmes et item de hyperref pourraient y être placées, juste une idée. En particulier, un amsthm qui démarre par une liste ne serait plus un problème. Mais si la boîte \@labels contient une ancre alors que TeX appelle la routine de sortie...

(22 Déc '15, 11:29) bcfp bcfp's gravatar image

\@labels (box) est utilisé par \item pour stocker l'étiquette (label) et ceci juste pour un petit moment (avant que latex commence la composition de paragraphe), donc si vous voulez sauvegarder son contenue la bonne place est lors ou juste après \item sinon il sera trop tard.

(22 Déc '15, 14:58) touhami touhami's gravatar image

@touhami Je crois que la commande \@item est construite de sorte que \@labels est vide lorsque TeX appelle la routine de sortie. La commande \item peut donc, sans problème, être appelée pour un pied pied de page.

Mais supposons que l'on demande à la commande \refstepcounter qui intervient dans le texte de remplacement de \@thm (ltthm.dtx) de placer une ancre dans \@labels ; comme \refstepcounter intervient avant \item[...] lors d'un \begin{thm}, il est possible que TeX appelle la routine au niveau du \addpenalty\@beginparpenalty alors que \@labels n'est pas vide !

(22 Déc '15, 15:32) bcfp bcfp's gravatar image

D'ailleurs, il me semble qu'à cette heure la situation suivante peut se produire : \begin{thm} entraîne via \refstepcounter le dépôt d'une ancre dans la liste verticale, avant \item[...] ; donc si TeX coupe au niveau du \@beginparpenalty, le théorème se trouve sur une page et le lien renvoie à la page précédente.

Sauf si l'on utilise amsthm ; en effet, hyperref place alors l'ancre via everypar juste avant \unhbox\@labels. Mais c'est alors problématique si l'on souhaite commencer un théorème par une liste (car le \item de la liste redéfini everypar et adieu l'ancre...).

(22 Déc '15, 15:56) bcfp bcfp's gravatar image

c'est plus clair maintenant.

(23 Déc '15, 16:15) touhami touhami's gravatar image

J'ai relu hier soir la documentation du package everyhook et l'auteur précise (je n'avais pas vu) que son option excludeor basée sur la méthode \output\expandafter{\expandafter\save\expandafter\the\output\restore} peut aider à éviter les catastrophes mais peut poser problème avec d'autres packages qui modifient également la routine.

Donc à éviter autant que possible, je ne sais pas...

Je pensais à une autre façon en ajoutant un interrupteur dans \@thm et en revoyant les définitions de \item, \refstepcounter et \hyper@refstepcounter données par hyperref, mais c'est lourd.

(23 Déc '15, 17:45) bcfp bcfp's gravatar image

Voulez-vous utiliser amsthm ou non? Dans les deux cas pas besoin de modifier \output.

(23 Déc '15, 18:21) touhami touhami's gravatar image

@bcfp Encore une fois, votre question n'est pas claire car vous n'expliquez toujours pas à quoi tout cela doit servir au final !

(24 Déc '15, 04:44) Paul Gaborit Paul%20Gaborit's gravatar image

@bcfp Je souscris aux remarques de @Paul Gaborit : la demande est obscure et j'ai l'impression que tu cherches midi à 14 heures !

(24 Déc '15, 12:23) denis ♦♦ denis's gravatar image

Je cherche une méthode pour pallier le défaut mentionné entre autres sur le site tex.stackexchange (lien après la réponse de touhami).

Des intervenants proposent diverses méthodes de contournements : utiliser ntheorem plutôt que amsthm ou encore utiliser la commande \phantomsection.

Puis l'auteur du package hyperref revient sur l'utilisation de \phantomsection en invoquant la commande \autoref et propose une solution locale.

(24 Déc '15, 15:17) bcfp bcfp's gravatar image

En plus de ce problème lié à l'utilisation de amsthm (un problème d'ailleurs mentionné dans la notice de ce package), si l'on utilise le package ntheorem, je crois qu'il est possible que TeX appelle la routine de sortie entre le moment où hyperref dépose l'ancre et le moment où la boîte \@labels contenant l'étiquette est posée (au niveau du \addpenalty\@beginparpenalty qui apparaît dans le texte de remplacement de \@item), donc éventuellement de se retrouver avec un théorème écrit sur une page et un lien qui renvoie à la page précédente. Non ?

(24 Déc '15, 15:31) bcfp bcfp's gravatar image

Je me disais alors que peut-être hyperref pourrait déposer les ancres des item et théorèmes à l'intérieur de la boîte \@labels, ce qui réglerait peut-être tous ces soucis...

(24 Déc '15, 15:44) bcfp bcfp's gravatar image

Mais, en revenant sur l'utilisation du package ntheorem, si l'on dépose l'ancre du théorème dans la boîte \@labels au niveau du \refstepcounter, rebelote, TeX peut appeler la routine de sortie au niveau du \addpenalty\@beginparpenalty de la commande \@item alors que la boîte \@labels n'est pas vide, ce qui est gênant car un item en pied de page par exemple va dire (via \@item) : \global\setbox\@labels\hbox{**\unhbox\@labels**...} !

(24 Déc '15, 15:44) bcfp bcfp's gravatar image

D'où ma question initiale : la méthode autour de \output que j'ai mentionnée au tout début, une méthode que je tire du package everyhook, vous semble-t-elle acceptable ?

Mais finalement je crois que l'on peut faire autrement, s'arranger pour mettre l'ancre dans la boîte \@labels après le \addpenalty\@beginparpenalty et éviter un recours à cette manipulation.

(24 Déc '15, 15:53) bcfp bcfp's gravatar image

C'est peut-être chercher midi à 14h effectivement, je ne sais pas...

En tout cas merci pour vos réponses et commentaires.

(24 Déc '15, 16:03) bcfp bcfp's gravatar image
1

@bcfp Je vous suggère d'intégrer dans votre question tous les éléments d'information dispersés dans vos commentaires afin que la question soir claire et complète (le contexte, l'objectif, les solutions envisagées, etc.). Ensuite, nous pourrons supprimer tous les commentaires et tenter de répondre...

(26 Déc '15, 02:29) Paul Gaborit Paul%20Gaborit's gravatar image
Affichage de 5 parmi 21 Afficher 16 commentaire(s) en plus

Merci pour votre réponse.

Je viens de rentrer, je vais regarder plus attentivement mais d'emblée plusieurs choses me dérangent :

  • tout d'abord, la méthode semble réduite à amsthm, mais pourquoi ne pas se concentrer sur ce cas ;
  • ensuite, je souhaitais éviter de toucher à la commande \@item...
  • enfin, l'ancre sera perdue dans un \begin{theorem}\begin{enumerate}\item\begin{enumerate}\item bla bla

La placer dans la boîte \@labels permet de résister à ce dernier enchaînement et je préférerais des modifications de \item, \refstepcounter et \hyper@refstepcouter (re)définies par hyperref.

À noter que l'on peut contourner le problème par diverses méthodes « simples ». Je me permets de mentionner le lien suivant :

http://tex.stackexchange.com/questions/14000/enumerate-after-label

Lien permanent

Publiée 23 Déc '15, 23:11

bcfp's gravatar image

bcfp
1914
Taux d'acceptation : 0%

Modifiée 24 Déc '15, 01:53

Pathe's gravatar image

Pathe ♦♦
7.4k28196245

Utiliser le package everyhook pour conserver l'ancre malgré les redéfinitions de \everypar a été la première idée. Cependant, pour généraliser (théorèmes fabriqués avec amsthm ou non), il fallait l'option excludeor. Mais alors, quitte à utiliser la manipulation de \output déjà mentionnée, pourquoi ne pas placer l'ancre dans la boîte \@labels et utiliser cette méthode seulement autour de cette boîte ? D'où ma question initiale : une telle manipulation vous semble-t-elle acceptable ?

(23 Déc '15, 23:33) bcfp bcfp's gravatar image

Comme je le disais plus tôt, je pense avoir une solution autour des seules commandes \item,\refstepcounter,\hyper@refstepcounter,\@thm et qui laisse \output tranquille, ce qui finalement m'arrange bien.

Merci pour votre aide.

(23 Déc '15, 23:36) bcfp bcfp's gravatar image

Comme vous avez déjà déclaré redéfinir \@thm directement est lourd (très lourd) De plus vous avez une réponse de H.O.!

(24 Déc '15, 09:45) touhami touhami's gravatar image

De H. O. ? Pourriez-vous être plus clair ?

(24 Déc '15, 11:26) Pathe ♦♦ Pathe's gravatar image
1

@Pathe H.O. Heiko Oberdiek auteur de package hyperref avec Se­bas­tian Rahtz.

(24 Déc '15, 12:14) touhami touhami's gravatar image
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.