Comment faire pour que LaTeX coupe un mot contenant un tiret?

107

Dans un document LaTeX que j'écris, j'obtiens un avertissement hbox trop plein à cause du mot "multidisciplinaire", qui se trouve être rendu à la fin d'une ligne.

Je peux me débarrasser de cet avertissement en le changeant en multi-discipli\-nary, mais le même problème se produira ailleurs, car ce mot est beaucoup utilisé dans le journal.

Je voudrais utiliser la \hyphenation{}commande à la place, mais évidemment ma tentative \hyphenation{multi-disci-pli-na-ry}ne fonctionne pas, car elle 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?

Gyom
la source
Pourquoi est-ce un problème pour le mot d'être cassé à l'hypen dur? "Multi- \ newline dimensionnel" n'est-il pas correct?
Geoff Reedy
1
Réponse bonus: Une recherche Google sur "césure latex" a donné toutes sortes de résultats utiles, y compris le livre wiki latex qui a la réponse: en.wikibooks.org/wiki/LaTeX/Formatting#Hyphenation
Mica
3
@mica: non, ce n'est pas le cas. J'ai lu toutes ces pages il y a des années. @geoff: ce serait bien, en effet, si latex y faisait un trait d'union. mais dans cet exemple, cela provoquerait un "underfull hbox", et latex choisit de ne pas couper du tout.
Gyom le
pouvez-vous inverser le premier - dans la commande \ hyphenation?
Brian Postow
1
Merci pour votre commentaire @DrewSteen. Je suis évidemment d’accord. Mais pour ma défense, il n'existait pas de tex.SX lorsque j'ai posé ces questions :-)
Gyom

Réponses:

52

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

TeX ne coupera pas un mot qui a déjà été coupé. Par exemple, le nom de famille anglais (caricature) Smyth-Postlethwaite ne ferait pas de césure, ce qui pourrait être gênant. Il s'agit d'un style de composition anglais correct (il peut ne pas être correct pour d'autres langues), mais si nécessaire, vous pouvez remplacer le trait d'union dans le nom par une \hyph commande, définie

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

Ce n'est pas le genre de chose que cette FAQ recommande habituellement… Le hyphenatpaquet définit un ensemble de commandes de ce type (pour introduire des points de césure à divers caractères de ponctuation).


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

KennyTM
la source
Merci beaucoup. Comme je le soupçonnais, il n'y a pas de réponse «parfaite». Parce que je ne suis pas le seul auteur de ce document, je ne veux pas vraiment forcer les autres à utiliser un \newcommandpartout (c'est pourquoi je cherchais quelque chose basé sur \hyphenation). Je suppose que je vais simplement le garder `` tel quel '' par défaut, et ajouter manuellement des traits d'union explicites lorsque Latex se plaint de hboxes surchargées.
Gyom le
63

Le problème (comme l'a noté KennyTM) est que LaTeX ne coupe pas les mots avec des tirets. Heureusement, il existe un package standard (qui fait partie de ncctools) qui résout ce problème, appelé extdash. Cela définit de nouvelles commandes de tiret et de tiret qui ne perturbent pas la césure et qui peuvent autoriser ou empêcher les sauts de ligne au niveau du tiret / tiret. Je préfère l'utiliser avec l' shortcutsoption, donc je peux utiliser, par exemple, \-/plutôt que \Hyphdash. Voici ce que vous voulez:

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

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

(À part: le Chicago Manual of Style conseille de supprimer les traits d'union attachant des affixes comme «multi», sauf si le mot est ambigu ou inintelligible sans lui.)

Luc M
la source
Cela tombe bien, mais donne un avertissement hyperref quand 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.
Dr.Jan-Philip Gehrcke
1
@ Jan-PhilipGehrcke: ces avertissements peuvent également être corrigés en utilisant \texorpdfstring(qui fournit une compilation conditionnelle pour les chaînes qui vont dans les titres de chapitre). Je cache les utilisations à l'intérieur des macros sémantiques (ici, probablement \multidisciplinary). Oui, ce n'est pas parfait.
Blaisorblade
22

J'utilise package hyphenatet j'écris des mots composés comme le mot finlandais Internet-yhteys ( connexion Internet en anglais ) comme Internet\hyp yhteys. Cela a l'air loufoque mais semble être le moyen le plus élégant que j'ai trouvé.

Zouppen
la source
6

multi-disciplinaryne sera pas coupé, comme expliqué par kennytm. Mais multi-\-disciplinarya les mêmes possibilités de césure que multidisciplinary.

J'avoue que je ne sais pas pourquoi cela fonctionne. C'est différent du comportement décrit ici (c'est moi qui souligne):

La commande \-insère un trait d'union discrétionnaire dans un mot. Cela devient également le seul point où la césure est autorisée dans ce mot .

Rudolfbyker
la source
Le remplacement -par -\-ne change pas la sortie, du moins avec les paramètres par défaut dans overleaf.com (probablement pdflatex, mais au verso ne le dit pas réellement).
Camille Goudeseune
4

J'ai eu le même problème. J'utilise hyphenat 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 package expl3 de latex3.

Cela rend le -personnage actif qui scanne vers l'avant pour voir s'il est suivi de plus de tirets. Si c'est le cas, il reste un -, pour s'assurer --et ---continuer à fonctionner. Sinon, il devient la \hypcommande du trait d'union, permettant des sauts de mots dans le reste du mot. Il s'agit d'une solution générique qui fait que tous les mots contenant des tirets explicites sont coupés normalement.

Notez que cela -devient une macro qui n'est pas entièrement extensible, essayez donc de l'inclure après avoir chargé d'autres packages qui ne -devraient pas être une macro

Edit: C'est ma deuxième version, la première version était moins robuste quand un {ou }suivait un trait d'union. Celui-ci ne l'est pas, mais contrairement à la première version, -dans cette version n'est pas entièrement extensible.

JanKanis
la source
3
multi\hskip0pt-\hskip0pt disciplinary

Vous pouvez par exemple définir comme

\def\:{\hskip0pt}

puis écris

multi\:-\:disciplinary

Notez que le package de langue russe babel a son propre jeu de tirets qui n'interdisent pas la césure, "~(guillemet double + tilde) par exemple.

Michael
la source
1
Devrait être multi-\hskip0pt disciplinary. Comme chez vous MWE, il hypenera trop. Il suffit de régler \setlength{\textwidth}{0.1cm}pour essayer ça.
LaRiFaRi
-3

J'ai répondu à quelque chose de similaire ici: LaTeX brise trop de mots

J'ai dit:

vous devez définir une pénalité de césure quelque part dans votre préambule:

\hyphenpenalty=750

La valeur de 750 correspondait à mes besoins pour une mise en page à deux colonnes sur papier à lettre (8,5 x 11 pouces) avec une police de 12 pt. Ajustez la valeur en fonction de vos besoins. Plus le nombre est élevé, moins il y aura de césure. Vous voudrez peut-être aussi jeter un œil au paquet de césure, il fournit un peu plus qu'une simple pénalité de césure

Mica
la source
1
Il demande comment éviter la césure, pas comment définir des limites.
Andras Gyomrey
-4

Pour éviter la césure dans un mot déjà coupé, j'ai utilisé un espace insécable ~en combinaison avec un espace arrière \!. Par exemple, commande

3~\!\!\!\!-~\!\!\!D

utilisé dans le texte, supprime la césure dans le mot 3-D. Probablement pas la meilleure solution, mais cela a fonctionné pour moi!

Igor
la source
4
Cela répond à la question opposée de ce qui a été demandé. En outre, comme la personne qui a tenté de modifier votre message à point sur dit, il y a une bien meilleure façon de faire ce que vous avez fait: \mbox{3-D}.
zwol