Désolé si j'ai laissé entendre qu'il y avait quelque chose de magique avec litl… ce qui était vraiment important, c'est que les éléments qui devaient être décalés aient leur propre balisage (mais ensuite, vous changez le hook pour qu'il soit placé avant le marqueur pertinent).
Maintenant, le fait que \hfill (et \leaders) soit ignoré s'il y a un retour à la ligne est une fonctionnalité très utile, et non un bug - cela évite qu'il y ait un espace au début/à la fin d'une ligne cassée. Il n'est pas nécessaire de traiter les choses comme des exceptions, nous avons juste besoin d'éduquer TeX…
La question qui doit être répondue, cependant, est ce que vous voudriez qu'il se passe ?
- Ne jamais casser la ligne avant le nombre (même si le résultat est horrible) : changez la fin du sethook pour être :
litl}{\penalty10000\hfill}
- Une ligne entière vide / une ligne de points avant le nombre :
litl}{\unskip\penalty500\hbox{}\penalty10000\hfill}
Dans les deux cas, si vous utilisez \leaders, placez l'élément supplémentaire devant celui-ci.
Explication :
Ce que ces commandes font, c'est donner des instructions supplémentaires à l'algorithme de césure des lignes.
J'ai également ajouté \unskip, qui supprime un espace précédent s'il y en a un - c'est plus utile pour le code basé sur \leaders, et cela évite qu'il y ait un espace entre les points et le mot précédent.
\penalty 500 signifie que la ligne peut être cassée là, mais c'est loin d'être idéal. Et \hbox{} est simplement un élément de largeur nulle qu'il ne peut pas ignorer. \penalty10000 indique que le coût de la cassure de la ligne ici est « infini ». Ainsi, pour ces deux versions, TeX n'est pas autorisé à casser la ligne à (juste avant) le remplissage, et par conséquent, il ne peut pas être ignoré par le processus normal.
Sorry if I implied there was something magic with litl… what was really important was that the bits that needed to be offset needed to have their own markup (but then you change the hook to be before whatever the relevant marker is.
Now, \hfill (and \leaders) getting discarded if there’s a line-break is a very useful feature, not a bug - it stops there being a space at the start/end of a broken line. There’s no need to treat things as exceptions, we just need to educate TeX…
The question that needs to be answered, though, is what would you like to happen?
- Never ever break the line before the number (even if the result is horrible): change the end of the sethook to be:
litl}{\penalty10000\hfill}
- A whole blank line / line of dots before the number:
litl}{\unskip\penalty500\hbox{}\penalty10000\hfill}
In both of these, if you are using the \leaders, put the extra bit in front of that instead.
Explanation:
What these are doing is giving the line-breaking algorithm some extra instructions.
I’ve also added \unskip which removes a preceding space if there is one - that’s more useful for the \leaders-based code, and stops there being a space between the dots and the preceding word.
The \penalty 500 means the line can be broken there, but it’s a long way from ideal. and \hbox{} is just a zero-width thing that it can’t discard. \penalty10000 says the cost of breaking the line here is ‘infinite’. Thus for both of these versions, TeX is not allowed to break the line at (just before) the fill, and thus it cannot be discarded by the normal process.