web-dev-qa-db-fra.com

Comment amener LaTeX à faire la césure d'un mot contenant un tiret?

Dans un document LaTeX que j'écris, je reçois un avertissement overbox full hbox en raison 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, puisque ce mot est beaucoup utilisé dans le journal.

J'aimerais utiliser le \hyphenation{} commande à la place, mais évidemment ma tentative \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 mise en retrait correcte dans un mot qui contient déjà un tiret?

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

100
Gyom

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 serait pas un trait d'union, ce qui pourrait être gênant. C'est un style de composition en anglais correct (il se peut que ce ne soit pas le cas pour d'autres langues), mais si nécessaire, vous pouvez remplacer le tiret dans le nom par un \hyph commande, définie

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

Ceci est pas le genre de chose que ceci FAQ recommande normalement… Le hyphenat package définit un ensemble de telles commandes (pour introduire des points de césure à différents caractères de ponctuation).


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

51
kennytm

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

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

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

(De côté: The Chicago Manual of Style conseille de supprimer les traits d'union fixant des affixes tels que 'multi', sauf si le mot est ambigu ou inintelligible sans cela.)

58
Luke M

J'utilise le paquetage hyphenat puis j'écris des mots composés comme Word finlandais Internet-yhteys (Eng. connexion Internet) comme Internet\hyp yhteys. Ça a l'air bizarre mais semble être la manière la plus élégante que j'ai trouvée.

21
Zouppen

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

J'avoue que je ne sais pas pourquoi cela fonctionne. Il est différent du comportement décrit ici (emphase mienne):

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

5
rudolfbyker
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 babel a son propre jeu de tirets qui n’interdit pas la césure, "~ _ (double citation + tilde) par exemple.

3
Michael

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.

Cela rend le - un caractère actif qui balaye en avant pour voir s'il est suivi de plusieurs tirets. Si oui, il reste un -, assurer -- et --- continue de travailler. Sinon, cela devient le \hyp commande de trait d'union, permettant à Word de se briser dans le reste de Word. Il s'agit d'une solution générique qui convertit normalement tous les mots contenant des tirets explicites.

Notez que - devient une macro qui n’est pas entièrement extensible. Essayez donc de l’inclure après le chargement d’autres packages qui ne s’attendent peut-être pas à - être une macro

Edit: Ceci est ma deuxième version, la première version était moins robuste quand un { ou } a suivi un trait d'union. Celui-ci n'est pas, mais contrairement à la première version, le - dans cette version n’est pas totalement extensible.

3
JanKanis