Comment puis-je obtenir de LaTeX un trait d'union entre un mot qui contient un tiret?

dans un document en LaTeX que j'écris, je reçois un avertissement overfull hbox à 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 changeant en multi-discipli-nary , mais le même problème se produira ailleurs, puisque ce mot est beaucoup utilisé dans le papier.

j'aimerais utiliser la commande hyphenation{} à la place, mais évidemment ma tentative hyphenation{multi-disci-pli-na-ry} ne fonctionne pas, parce qu'il ne comprend pas le premier tiret correctement.

de quelle incantation ai-je besoin pour obtenir l'indentation 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?

89
demandé sur Peter Mortensen 2010-02-03 19:02:57

8 réponses

de http://www.tex.ac.uk/cgi-bin/texfaq2html?label=nohyph :

TeX ne mettra pas de trait d'union avec un mot qui a déjà été mis par un trait d'Union. Par exemple, le nom anglais (caricature) Smyth-Postlethwaite ne ferait pas de trait d'Union, ce qui pourrait être gênant. Il s'agit du style de composition correct en anglais (il peut ne pas être correct pour d'autres langues), mais si les besoins doivent, vous pouvez remplacer le trait d'Union dans le nom par une commande \hyph , défini

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

C'est et non le genre de chose que cette FAQ recommande habituellement... le paquet hyphenat définit un faisceau de telles commandes (pour introduire des points d'Union à différents caractères de ponctuation).


Ou \newcommand une commande qui permet de multi-discipli\-nary (utilisation Recherche + Remplacer Tout pour remplacer les mots).

47
répondu kennytm 2010-02-03 16:17:25

le problème (comme KennyTM l'a noté) est que LaTeX ne va pas hyphéner les mots avec des tirets dans eux. Heureusement, il y a un paquet standard (qui fait partie de ncctools) qui traite ce même problème, appelé extdash . Cela permet de définir de nouvelles commandes de tiret et de tiret qui ne perturbent pas le trait d'Union, et qui peuvent permettre ou empêcher les sauts de ligne au trait d'Union/tiret. Je préfère l'utiliser avec l'option shortcuts , donc je peux utiliser, par exemple, \-/ plutôt que \Hyphdash . Voici ce que vous voulez:

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

pour éviter de briser ce trait d'Union, utilisez multi\=/disciplinary

(Côté: Le Chicago Manual of Style , conseille tomber les traits d'union fixation d'affixes comme "multi", sauf si le mot est ambigu ou inintelligible sans elle.)

50
répondu Luke M 2016-06-17 13:41:10

j'utilise le package hyphenat et puis écrire des mots composés comme le finnois mot Internet-yhteys (Eng. connexion Internet ) comme Internet\hyp yhteys . Semble maladroit, mais semble être la façon la plus élégante que j'ai trouvé.

19
répondu Zouppen 2010-12-15 20:11:38

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

noter que cela utilise le paquet expl3 de latex3.

il fait du - un caractère actif qui scanne vers l'avant pour voir s'il est suivi d'autres tirets. Si c'est le cas, il reste un - , pour s'assurer que -- et --- continuent à fonctionner. Si non, il devient la commande \hyp de hyphenat, l'activation lexicale dans le reste du mot. C'est une solution générique qui rend tous les mots qui contiennent des traits d'Union explicites normalement.

notez que - devient une macro qui n'est pas entièrement extensible, alors essayez de l'inclure après avoir chargé d'autres paquets qui ne peuvent pas s'attendre à ce que - soit une macro

Edit: C'est ma deuxième version, la première version a été moins forte quand un { ou } suit un trait d'Union. Ce n'est pas, mais contrairement à la première version de la - dans cette version n'est pas totalement extensible.

3
répondu JanKanis 2011-08-08 12:57:13
multi\hskip0pt-\hskip0pt disciplinary

vous pouvez par exemple définir comme

\def\:{\hskip0pt}

et ensuite écrire

multi\:-\:disciplinary

noter que le paquet en langue russe babel a son propre jeu de tirets qui n'interdisent pas les traits d'Union, "~ (double guillemet+tilde) par exemple.

3
répondu Michael 2011-11-10 06:50:38

multi-disciplinary ne portera pas de trait d'Union, comme l'explique kennytm. Mais multi-\-disciplinary a les mêmes possibilités que multidisciplinary .

j'admets que je ne sais pas pourquoi cela fonctionne. Il 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. ceci devient aussi le seul point où les traits d'Union est permis dans ce mot .

3
répondu rudolfbyker 2015-09-17 15:57:14

j'ai répondu quelque chose de similaire ici: LaTeX cassant trop de mots

j'ai dit:

vous devriez placer un trait d'Union pénalité quelque part dans votre préambule:

\hyphenpenalty=750

La valeur de 750 adapté à mes besoins pour une disposition en deux colonnes sur papier à lettre (8.5x11) avec une police 12 points. Réglez la valeur en fonction de vos besoins. Plus le nombre est élevé, moins la césure va se produire. Vous pouvez également jetez un coup d'oeil sur le pack hyphenatpackage, il fournit un peu plus que juste la pénalité de hyphénation

-4
répondu Mica 2017-05-23 12:25:33

pour éviter la formation d'un trait d'Union dans un mot déjà pourvu d'un trait d'Union, j'ai utilisé l'espace ~ en combinaison avec l'espace \! . Par exemple, la commande

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

utilisé dans le texte, supprimer le trait d'Union dans le mot 3-D. probablement pas la meilleure solution, mais ça a fonctionné pour moi!

-4
répondu Igor 2010-05-12 22:32:59