128 votes

Comment faire pour que LaTeX mette un trait d'union à un mot qui contient un tiret ?

Dans un document LaTeX que je suis en train d'écrire, j'obtiens un message de type boîte à outils surchargée avertissement à cause du mot "multidisciplinaire", qui se trouve être rendu à la fin d'une ligne.

Je peux me débarrasser de cet avertissement particulier en le transformant en multi-discipli\-nary mais le même problème se posera ailleurs, puisque ce mot est utilisé à plusieurs reprises dans le document.

J'aimerais utiliser le \hyphenation{} à la place, mais évidemment mon essai \hyphenation{multi-disci-pli-na-ry} ne fonctionne pas, car il ne comprend pas correctement le premier tiret.

De quelle incantation ai-je besoin pour obtenir une indentation correcte dans un mot qui contient déjà un tiret ?

Question bonus : Où aurais-je pu trouver moi-même la réponse à cette question ?

0 votes

Pourquoi est-ce un problème que le mot soit cassé au niveau du trait d'union ? N'est-ce pas "multi- \newline dimensionnel" ok ?

1 votes

Réponse bonus : Une recherche sur Google de "césure latex" a donné toutes sortes de résultats utiles, dont le livre du wiki latex qui contient la réponse : fr.wikibooks.org/wiki/LaTeX/Formatting#Hyphenation

5 votes

@mica : non, ça ne l'est pas. J'ai lu toutes ces pages il y a des années. @geoff : ce serait correct, en effet, si latex faisait un trait d'union à cet endroit. mais dans cet exemple, cela provoquerait une "boîte à lettres insuffisamment remplie", et latex choisit de ne pas faire de trait d'union du tout.

75voto

Luke M Points 301

Le problème (comme l'a noté KennyTM) est que LaTeX ne met pas de césure aux mots contenant des tirets. Heureusement, il existe un paquetage standard (faisant partie de ncctools) qui résout ce problème, appelé extdash . Il définit de nouvelles commandes de tirets et de traits d'union qui ne perturbent pas la césure, et qui peuvent autoriser ou empêcher les sauts de ligne au niveau du tiret ou du trait d'union. Je préfère l'utiliser avec la commande shortcuts de sorte que je puisse utiliser, par exemple, l'option \-/ plutôt que \Hyphdash . Voilà ce que vous voulez :

\usepackage[shortcuts]{extdash} ... multi\-/disciplinary

Pour éviter de se casser à ce trait d'union, utilisez multi\=/disciplinary

(A propos : _Le manuel de style de Chicago_ conseille de laisser tomber les traits d'union attachant des affixes comme "multi", à moins que le mot soit ambigu ou inintelligible sans cela).

0 votes

C'est génial, mais cela donne un avertissement d'hyperréférence lorsque je l'utilise dans une chaîne de chapitre : Package hyperref Warning: Token not allowed in a PDF string . Là, l'autre solution proposée ( \def\hyph{-\penalty0\hskip0pt\relax} ) fonctionne.

3 votes

@Jan-PhilipGehrcke : ces avertissements peuvent aussi être corrigés en utilisant \texorpdfstring (qui fournit une compilation conditionnelle pour les chaînes qui entrent dans les titres de chapitre). Je cache les utilisations à l'intérieur de macros sémantiques (ici, probablement \multidisciplinary ). Oui, ce n'est pas parfait.

55voto

KennyTM Points 232647

De https://texfaq.org/FAQ-nohyph :

TeX n'utilisera pas de césure pour un mot qui a déjà été ciselé. Par exemple, Par exemple, le nom de famille anglais (caricatural) Smyth-Postlethwaite ne pourra pas être mis en césure. pas de trait d'union, ce qui pourrait être gênant. C'est un style de composition anglais correct anglais (il se peut que ce ne soit pas le cas pour d'autres langues), mais en cas de besoin, vous pouvez remplacer le trait d'union. besoin, vous pouvez remplacer le trait d'union dans le nom par un \hyph la commande, définie

 \def\hyph{-\penalty0\hskip0pt\relax}

C'est no le genre de choses que cette FAQ recommanderait normalement Le site hyphenat définit un ensemble de commandes de ce type (pour introduire des points de césure à divers caractères de ponctuation).


Ou vous pourriez \newcommand une commande qui se développe en multi-discipli\-nary (utilisez Recherche + Remplacer tout pour remplacer les mots existants).

0 votes

Merci beaucoup. Comme je m'en doutais, il n'y a pas de réponse "parfaite". Étant donné que je ne suis pas le seul auteur de ce document, je ne veux pas vraiment forcer les autres à utiliser une balise \newcommand partout (c'est pourquoi je cherchais quelque chose basé sur \hyphenation ). Je pense que je vais juste le garder ''tel quel'' par défaut, et ajouter des traits d'union explicites manuellement lorsque Latex se plaint de boîtes à lettres trop pleines.

28voto

Zouppen Points 548

J'utilise le paquet hyphenat et ensuite écrire des mots composés comme le mot finlandais Accès à l'Internet (Eng. Connexion Internet ) comme Internet\hyp yhteys . Cela semble bizarre, mais c'est le moyen le plus élégant que j'ai trouvé.

5voto

JanKanis Points 850

J'ai eu le même problème. J'utilise trait d'union plus la macro suivante :

\RequirePackage{hyphenat}
\RequirePackage{expl3}

% The following defs make sure words that contain an explicit `-` (hyphen) are still hyphenated the normal way, and double- and triple hyphens keep working the way they should. Just don't use a `-` as the last token of your document. Also note that `-` is now a macro that is not fully expandable

\ExplSyntaxOn

% latex2e doesn't like commands starting with 'end', apparently expl3 doesn't have any problems with it
\cs_new:Npn \hyphenfix_emdash:c {---}
\cs_new:Npn \hyphenfix_endash:c {--}

\cs_new:Npn \hyphenfix_discardnext:NN #1#2{#1}

\catcode`\-=\active

\cs_new_protected:Npn -{
    \futurelet\hyphenfix_nexttok\hyphenfix_i:w
}

\cs_new:Npn \hyphenfix_i:w {
    \cs_if_eq:NNTF{\hyphenfix_nexttok}{-}{
        %discard the next `-` token
        \hyphenfix_discardnext:NN{\futurelet\hyphenfix_nexttok\hyphenfix_ii:w}
    }{
        % from package hyphenat
        \hyp
    }
}

\cs_new:Npn \hyphenfix_ii:w {
    \cs_if_eq:NNTF{\hyphenfix_nexttok}{-}{
        \hyphenfix_discardnext:NN{\hyphenfix_emdash:c}
    }{
        \hyphenfix_endash:c
    }
}

\ExplSyntaxOff

Notez que cela utilise le paquet expl3 de latex3.

Il rend le - un caractère actif qui scanne vers l'avant pour voir s'il est suivi par d'autres tirets. Si c'est le cas, il reste un - pour s'assurer -- y --- continuer à travailler. Sinon, il devient le \hyp de hyphenat, permettant les coupures de mots dans le reste du mot. Il s'agit d'une solution générique qui permet à tous les mots contenant des traits d'union explicites de s'interrompre normalement.

Notez que - devient une macro qui n'est pas entièrement extensible, essayez donc de l'inclure après avoir chargé d'autres paquets qui ne s'attendent peut-être pas à ce que - pour être une macro

Edit : Il s'agit de ma deuxième version, la première version était moins robuste lorsqu'une { o } suivi d'un trait d'union. Celle-ci ne l'est pas, mais à la différence de la première version, l'élément - dans cette version n'est pas entièrement extensible.

0 votes

Désolé mais on dirait qu'une erreur s'est produite dans la macro /futurelet

1 votes

@PeterlitsZo Désolé, ce code date d'il y a plus de 10 ans. Cela fait longtemps que je n'ai pas utilisé LaTeX, donc ce code est devenu pratiquement incompréhensible pour moi. Il fonctionnait pour moi à l'époque. J'ai joint la dernière version dans laquelle mon code s'est développé, peut-être que cela vous aidera.

5voto

Michael Points 11
multi\hskip0pt-\hskip0pt disciplinary

Vous pouvez par exemple définir comme

\def\:{\hskip0pt}

et ensuite écrire

multi\:-\:disciplinary

Notez que le paquet de langue russe de babel possède sa propre série de tirets qui n'interdisent pas la césure, "~ (double guillemet+tilde) par exemple.

1 votes

Devrait être multi-\hskip0pt disciplinary . Comme dans votre MWE, il y aura trop d'hypnose. Il suffit de mettre \setlength{\textwidth}{0.1cm} afin d'essayer cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X