Savoir si un bloc va être coupé dans une macro

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

J'étais tranquillement en train d'écrire des maths en ligne en LaTeX (avec $) et le bougre m'a coupé une formule pour revenir à la ligne. J'aimerais pouvoir éviter ça. Je sais que l'on peut faire ${...}$ mais je ne tiens pas à dépasser dans la marge à droite, non non non. Faute de mieux, j'ai utilisé \\ pour revenir à la ligne.

Seulement, si mon texte évolue, il faudra probablement que je vire ce \\ et ça m'ennuie déjà. Par ailleurs ça n'est pas très sémantique. Que faire alors ? J'ai pensé à définir une macro \çavatrancher¹ qui introduit un retour à la ligne avant #1 seulement si la ligne va être coupée. Serait-ce une bonne idée ? Comment l'implémenter ?

Merci d'avance.

¹: j'utilise XeLaTeX ☺

+0 -0
Auteur du sujet

Cette réponse a aidé l'auteur du sujet

Bonjour,

À priori, les commandes \nobreak et \allowbreak répondent à ton besoin. Elles servent à indiquer à LaTeX qu'il peut ou non couper la ligne. L'inconvénient, c'est qu'il faut écrire tes formules en insérant une commande devant chaque chiffre/symbole/lettre.

+0 -0
Auteur du sujet

Ah oui, pourquoi pas. Je pourrais faire un \StrSubstitute{#1}{ }{\nobreak}. L'exemple suivant fonctionne (sans la macro les maths sont coupées) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
\documentclass[11pt]{article}
\usepackage{amsmath}
\usepackage{xstring}

\newcommand{avatrancher}[1]{\StrSubstitute{#1}{ }{\nobreak}}

\begin{document}

text text text text text text text text text text text text text
avatrancher{$\forall r, \sum_{i=1}^k u_{ij} = 1$}

\end{document}

Merci !

Si quelqu'un a une réponse à la question originale ça m'intéresse quand même. De toute façon je compte me mettre à TeX pour de vrai, ça sera l'occasion de revenir éditer le topic si je trouve tout seul.

Édité par anonyme

+0 -0
Auteur du sujet

Cette réponse a aidé l'auteur du sujet

Voici une solution en TeX qui fait la même chose, elle remplace les espaces compris entre la paire \> et \< par la séquence \nobreak\space.

1
2
3
4
5
6
7
8
9
\begingroup
    \catcode`\ =13%
    \gdef\>{%
        \begingroup%
        \catcode`\ =13%
        \gdef {\nobreak\space}%
    }
    \global\let\<\endgroup%
\endgroup

Ton code deviendra :

1
2
text text text text text text text text text text text text text
\> $\forall r, \sum_{i=1}^k u_{ij} = 1$ \<.

Après, est-ce que c'est une bonne idée de forcer la ligne à continuer, je ne suis pas sûr… LaTeX s'arrange quand même pour couper à des endroits logiques comme après le =. Si tu forces, il va réduire les espaces, voir même coller les lettres et tu auras quand même un overfull hbox. Je pense que si tu ne veux pas que la formules soit coupées, c'est encore de la mettre dans un bloc dédié, quitte à utiliser \noindent pour montrer que le paragraphe n'est pas terminé. Ça donnerai ceci (note que dans l'exemple, le \noindent ne sert à rien vu que je n'ai pas laissé de ligne vide entre la formule et le texte) :

1
2
3
Text text text text text text text text text text text text text
\[ \forall r, \sum_{i=1}^k u_{ij} = 1 \]
\noindent text text text text text text text text text text text text text...

Une dernière chose, si tu souhaites te mettre sérieusement à TeX, je te conseille deux ouvrages en particulier, le TeXbook étant imbuvable :

  • « TeX Impatient », disponible au format PDF ici ;
  • « apprendre à programmer en TeX » de Christian Tellechea (auteur de chemfig) disponible uniquement sur commande au format papier ici.

Édité par anonyme

+0 -0
Auteur du sujet

Après, est-ce que c'est une bonne idée de forcer la ligne à continuer, je ne suis pas sûr…

Moi non plus. Mon plan initial était plutôt de forcer le retour à la ligne, mais ça n'est pas non plus idéal.

Merci pour le code et les conseils. :)

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte