Avec hyperref, la command \Hy@raisedlink est nécessaire pour qu'une ancre renvoie vers le haut de la ligne et non vers le bas.

Cependant celle-ci perturbe la rupture de ligne.

Voir l'exemple ci-dessous (compilé avec XeLaTeX).

Ouvrir dans l'éditeur
\documentclass[a4paper]{book}
\usepackage[a4paper]{geometry}
\usepackage{polyglossia,fontspec,hyperref}
\setmainfont{Linux Libertine O}
\setmainlanguage{greek}

\makeatletter
\newcommand\test{6. Καὶ δὴ τῷ κράτει
    \edtext{τοῦ} \edtext{συγγενέος} \edtext{ἐπιθαρσήσας}, \edtext{οὐμενοῦν}
    \edtext{εἴ τι}
καὶ \edtext{δέοι}
παθεῖν
δείσας
καλὴν ἑαυτῷ
τῆς εἰς Χριστὸν πίστεως, τὴν ἐν
    \edtext{Γράμματι}
νομοθεσίαν,
ὑποβάθραν
    \edtext{προύθηκεν}.
    \edtext{Περιτυχὼν}
γὰρ
    \edtext{τῶν}, \edtext{Μωσαικῶν}
    \edtext{βιβλίων},
καὶ
    \edtext{τῆς Ἐβραίων ἁπάσης Γραφῆς},
καὶ τούτοις ὡς μάλιστα φιλομαθῶς
    \edtext{ἐναπασχολήσας}τὸν νοῦν, καὶ
    \edtext{ὅλος}
    \edtext{ὅλῳ}
στοιχειωθεὶς,}

\begin{document}

\section{Good}
\def\edtext#1{#1}
\test

\section{Bad}
\def\edtext#1{\Hy@raisedlink{}#1\Hy@raisedlink{}}

\test

\section{Better}
\def\edtext#1{\Hy@raisedlink{}\hspace{0pt}#1\Hy@raisedlink{}\hspace{0pt}}

\test

\section{Ok?}
\def\edtext#1{\Hy@raisedlink{}\hspace{0pt}#1\Hy@raisedlink{}}

\test

\end{document}

Y a-t-il une manière d'avoir l'équivalent de \Hy@raisedlink mais sans ce problème de coupure de ligne ?

Posée 09 Déc '15, 19:00

Ma%C3%AFeul's gravatar image

Maïeul
309514
Taux d'acceptation : 37%

Modifiée 09 Déc '15, 19:15

Pathe's gravatar image

Pathe ♦♦
7.4k29197245

Lorsque \Hy@raisedlink{} précède un mot, la pénalité maximale de 10000 qu'elle insère (voir ligne 2523 du package hyperref) décourage toute coupure du mot, c'est ce qui crée des dépassements dans la marge de droite. Sauf erreur de ma part, cela est voulu puisque cette macro a vocation à agir après un mot et non pas avant.

Pour quelle raison vouloir mettre un ancre avant un mot ? En définissant \def\edtext#1{#1\Hy@raisedlink{}}, aucun problème n’apparaît.

(09 Déc '15, 21:59) unbonpetit ♦♦ unbonpetit's gravatar image

Je désire insérer une ancre avant un mot pour renvoyer vers le début d'un passage, et non vers la fin d'un passage. C'est tout à fait logique.

(09 Déc '15, 22:20) Maïeul Ma%C3%AFeul's gravatar image
1

Dans ce cas, il faut redéfinir \Hy@raisedlink{} en mettant des \hskip nuls avant et après le \smash et il faut enlever la pénalité.

(09 Déc '15, 22:32) unbonpetit ♦♦ unbonpetit's gravatar image

OK. Je vais faire des tests. J'avais bien pensé au \penalty\@M mais pas au \hskip nul. Mais cela ne sera pas une redéfinition, mais une nouvelle commande, car j'ai aussi parfois besoin de mettre le \Hy@raisedlink{} en fin de mot.

(09 Déc '15, 22:42) Maïeul Ma%C3%AFeul's gravatar image
1

Je mets une réponse en attendant tes tests. Je l'effacerai si besoin.

(09 Déc '15, 22:51) unbonpetit ♦♦ unbonpetit's gravatar image

Je dis peut être une bêtise, mais n'y a-t-il pas moyen de tester la présence d'un espace avant ? Si oui on met un unskip suivi d'un \ ?

(09 Déc '15, 23:23) Maïeul Ma%C3%AFeul's gravatar image

Quelque chose comme \newskip\toto s \toto=\lastskip\unskip\hskip\toto a\bye

(09 Déc '15, 23:28) Maïeul Ma%C3%AFeul's gravatar image

J'ai découvert que cette question a déjà été posée 2 jours auparavant sur stackexchange et me permets de le signaler.

Comme sévissent là-bas des gens beaucoup plus compétents que moi, je retire mes piètres contributions ici.

(10 Déc '15, 09:23) unbonpetit ♦♦ unbonpetit's gravatar image

En même temps tu es le seul à avoir réagi ;-)

(10 Déc '15, 10:17) Maïeul Ma%C3%AFeul's gravatar image
Affichage de 5 parmi 9 Afficher 4 commentaire(s) en plus

J'essaie encore une dernière fois, en espérant que cela convienne !

Sauf erreur de ma part, incompétence ou truc qui est évident et qui m'échappe, je crois qu'il n'est pas possible d'utiliser la même macro pour l'ancre de gauche et l'ancre de droite si l'on veut préserver les espacements et coupures par rapport à un texte sans ancres.

L'ECM fourni par le PO ne contient que des ancres vides, c'est-à-dire ne prenant aucun place horizontale. Dans la vraie vie, il en serait autrement, bien sûr.

Je propose donc une macro \Hy@raisedlink@left, basée sur \Hy@raisedlink, et qui insère un ancre à gauche d'un mot tout en interdisant la coupure de ligne entre cet ancre et le mot. Pour s'en assurer, j'ai choisi d'afficher l'ancre en rouge dans une \llap, de fixer la hauteur de l'ancre à 1ex en spécifiant \HyperRaiseLinkDefault=1ex. Cette assignation serait à supprimer en mode normal.

Ouvrir dans l'éditeur
\documentclass[a4paper]{book}
\usepackage[a4paper]{geometry}
\usepackage{polyglossia,fontspec,hyperref,xcolor}
\setmainfont{Linux Libertine O}
\setmainlanguage{greek}

\makeatletter
\def\Hy@raisedlink@left#1{%
    \ifvmode
        #1%
    \else
        \Hy@SaveSpaceFactor
        \llap{\smash{% <-- "\llap{" a été ajouté
        \begingroup
            \let\HyperRaiseLinkLength\@tempdima
            \setlength\HyperRaiseLinkLength\HyperRaiseLinkDefault
            \HyperRaiseLinkHook
        \expandafter\endgroup
        \expandafter\raise\the\HyperRaiseLinkLength\hbox{%
            \Hy@RestoreSpaceFactor
            #1%
            \Hy@SaveSpaceFactor
        }%
        }}% une "}" a été ajoutée pour fermer la \llap
        \Hy@RestoreSpaceFactor
        \penalty\@M\hskip0pt 
    \fi
}

\newcommand\test{6. Καὶ δὴ τῷ κράτει
    \edtext{τοῦ} \edtext{συγγενέος} \edtext{ἐπιθαρσήσας}, \edtext{οὐμενοῦν}
    \edtext{εἴ τι} καὶ \edtext{δέοι} παθεῖν δείσας καλὴν ἑαυτῷ
    τῆς εἰς Χριστὸν πίστεως, τὴν ἐν \edtext{Γράμματι} νομοθεσίαν,
    ὑποβάθραν \edtext{προύθηκεν}. \edtext{Περιτυχὼν} γὰρ \edtext{τῶν},
    \edtext{Μωσαικῶν} \edtext{βιβλίων}, καὶ \edtext{τῆς Ἐβραίων ἁπάσης Γραφῆς},
    καὶ τούτοις ὡς μάλιστα φιλομαθῶς \edtext{ἐναπασχολήσας}τὸν νοῦν, καὶ
    \edtext{ὅλος} \edtext{ὅλῳ}
στοιχειωθεὶς,}

\begin{document}
\HyperRaiseLinkDefault=1ex % <-- à supprimer dans la vraie vie

\section{Good}
\def\edtext#1{#1}
\test

\section{Bad}
\def\edtext#1{\Hy@raisedlink@left{\color{red}\tiny1}#1\Hy@raisedlink{}}
\test

\end{document}

Voici le résultat :

alt text

Lien permanent

Publiée 10 Déc '15, 14:13

unbonpetit's gravatar image

unbonpetit ♦♦
1.8k18
Taux d'acceptation : 68%

« L'ECM fourni par le PO » : ECM signifie exemple complet minimal, soit. Mais PO ?

(10 Déc '15, 14:46) Pathe ♦♦ Pathe's gravatar image

« c'est-à-dire ne prenant aucun place horizontale. Dans la vraie vie, il en serait autrement, bien sûr » : non, justement, cela sera aussi des ancres vides ;-). En fait je veux pointer sur « le début d'un passage ».

(10 Déc '15, 14:50) Maïeul Ma%C3%AFeul's gravatar image

En tout cas le test sur le MWE est positif et correspond à mes besoins. Reste à voir « dans la vraie vie » si l'on pointe au bon endroit. Je ferai des tests dans les jours qui viennent.

(10 Déc '15, 14:54) Maïeul Ma%C3%AFeul's gravatar image

MWE ? Diantre ! Qu'est-ce donc ?

(10 Déc '15, 15:26) Pathe ♦♦ Pathe's gravatar image
2

MWE = Minimal Working Example, c'est l'ECM anglo-saxon ;)

(10 Déc '15, 16:43) jerome dequeker jerome%20dequeker's gravatar image
2

@Pathe « PO » = « Post Original » venant de l'anglo-saxon « OP » = « Original Post » à moitié francisé : on devrait dire « AO » pour « Article Original » mais personne n'y comprendrait rien :)

(10 Déc '15, 18:24) denis ♦♦ denis's gravatar image
1

@Pathe je pense que PO vient de l'anglais OP, qui est une abréviation de original poster.

(10 Déc '15, 18:56) touhami touhami's gravatar image

Bon, mon test en pratique a l'air bon ;-) J'attends encore le retour d'un utilisateur sur ses propres fichiers.

(12 Déc '15, 21:40) Maïeul Ma%C3%AFeul's gravatar image

@Maïeul : merci pour le retour, j'ai donc eu raison de persévérer. La prochaine fois, je traduirai les acronymes anglais, c'est plus facile, plus rapide et cela rapporte plus de votes positifs !

(12 Déc '15, 21:45) unbonpetit ♦♦ unbonpetit's gravatar image

Et donc les tests en réel s'avèrent réussis ;-). Merci encore.

(13 Déc '15, 12:52) Maïeul Ma%C3%AFeul's gravatar image
Affichage de 5 parmi 10 Afficher 5 commentaire(s) en plus

Voici une solution possible, qui insère des \hskip nuls, et donc perturbe l'agencement des nœuds dans le paragraphe et donc modifie les coupures — qui restent cependant correctes.

Ouvrir dans l'éditeur
\documentclass[a4paper]{book}
\usepackage[a4paper]{geometry}
\usepackage{polyglossia,fontspec,hyperref}
\setmainfont{Linux Libertine O}
\setmainlanguage{greek}

\makeatletter
\def\Hy@raisedlink#1{%
  \ifvmode
    #1%
  \else
    \Hy@SaveSpaceFactor
    \hskip\z@
    \smash{%
      \begingroup
        \let\HyperRaiseLinkLength\@tempdima
        \setlength\HyperRaiseLinkLength\HyperRaiseLinkDefault
        \HyperRaiseLinkHook
      \expandafter\endgroup
      \expandafter\raise\the\HyperRaiseLinkLength\hbox{%
        \Hy@RestoreSpaceFactor
        #1%
        \Hy@SaveSpaceFactor
      }%
    }%
    \Hy@RestoreSpaceFactor
    \hskip\z@
  \fi
}

\newcommand\test{6. Καὶ δὴ τῷ κράτει
    \edtext{τοῦ} \edtext{συγγενέος} \edtext{ἐπιθαρσήσας}, \edtext{οὐμενοῦν}
    \edtext{εἴ τι} καὶ \edtext{δέοι} παθεῖν δείσας καλὴν ἑαυτῷ
    τῆς εἰς Χριστὸν πίστεως, τὴν ἐν \edtext{Γράμματι} νομοθεσίαν,
    ὑποβάθραν \edtext{προύθηκεν}. \edtext{Περιτυχὼν} γὰρ \edtext{τῶν},
    \edtext{Μωσαικῶν} \edtext{βιβλίων}, καὶ \edtext{τῆς Ἐβραίων ἁπάσης Γραφῆς},
    καὶ τούτοις ὡς μάλιστα φιλομαθῶς \edtext{ἐναπασχολήσας}τὸν νοῦν, καὶ
    \edtext{ὅλος} \edtext{ὅλῳ} στοιχειωθεὶς,}

\begin{document}

\section{Good}
\def\edtext#1{#1}
\test

\section{Bad}
\def\edtext#1{\Hy@raisedlink{}#1\Hy@raisedlink{}}
\test

\end{document}

Voici comment sont modifiées les coupures :

alt text

Lien permanent

Publiée 09 Déc '15, 22:56

unbonpetit's gravatar image

unbonpetit ♦♦
1.8k18
Taux d'acceptation : 68%

Modifiée 09 Déc '15, 23:39

Pathe's gravatar image

Pathe ♦♦
7.4k29197245

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.