Wie bringe ich LaTeX dazu, ein Wort mit einem Bindestrich zu trennen?

106

In einem LaTeX-Dokument, das ich schreibe, wird aufgrund des Wortes "multidisziplinär", das zufällig am Ende einer Zeile gerendert wird , eine überfüllte hbox- Warnung angezeigt .

Ich kann diese spezielle Warnung loswerden, indem ich sie in ändere multi-discipli\-nary, aber das gleiche Problem wird an anderer Stelle auftreten, da dieses Wort in der Zeitung häufig verwendet wird.

Ich möchte \hyphenation{}stattdessen den Befehl verwenden, aber offensichtlich \hyphenation{multi-disci-pli-na-ry}funktioniert mein vorläufiger Befehl nicht, da er den ersten Bindestrich nicht richtig versteht.

Welche Beschwörung brauche ich, um einen korrekten Einzug in ein Wort zu erhalten, das bereits einen Bindestrich enthält?

Bonusfrage: Wo hätte ich die Antwort auf diese Frage selbst finden können?

Gyom
quelle
Warum ist es ein Problem, wenn das Wort beim harten Hypen gebrochen wird? Ist "multi- \ newline dimensional" nicht in Ordnung?
Geoff Reedy
1
Bonusantwort: Eine Google-Suche nach "Latex-Silbentrennung" ergab alle möglichen nützlichen Ergebnisse, einschließlich des Latex-Wiki-Buches mit der Antwort: en.wikibooks.org/wiki/LaTeX/Formatting#Hyphenation
Mica
3
@mica: nein tut es nicht. Ich habe all diese Seiten vor Jahren gelesen. @geoff: Es wäre in der Tat in Ordnung, wenn Latex dort einen Bindestrich hätte. In diesem Beispiel würde dies jedoch zu einer "unterfüllten hbox" führen, und Latex entscheidet sich dafür, überhaupt nicht zu trennen.
Gyom
Können Sie den ersten Backslash ausführen - im Befehl \ hyphenation?
Brian Postow
1
Vielen Dank für Ihren Kommentar @DrewSteen. Natürlich stimme ich zu. Aber zu meiner Verteidigung gab es damals noch kein tex.SX, als ich diese Fragen stellte :-)
Gyom

Antworten:

51

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

TeX trennt kein Wort, das bereits getrennt wurde. Zum Beispiel würde der (Karikatur-) englische Familienname Smyth-Postlethwaite nicht getrennt, was problematisch sein könnte. Dies ist der richtige englische Satzstil (möglicherweise nicht für andere Sprachen). Bei Bedarf können Sie jedoch den Bindestrich im Namen durch einen \hyph definierten Befehl ersetzen

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

Dies ist nicht die Art von Dingen, die diese FAQ normalerweise empfehlen würde ... Das hyphenatPaket definiert ein Bündel solcher Befehle (zum Einfügen von Silbentrennungspunkten an verschiedenen Satzzeichen).


Oder Sie können \newcommandeinen Befehl verwenden, der erweitert wird multi-discipli\-nary(verwenden Sie Suchen + Alle ersetzen, um vorhandene Wörter zu ersetzen).

kennytm
quelle
Vielen Dank. Wie ich vermutet habe, gibt es keine "perfekte" Antwort. Da ich nicht der einzige Autor in diesem Dokument bin, möchte ich die anderen nicht wirklich dazu zwingen, \newcommandüberall ein zu verwenden (deshalb habe ich etwas gesucht, das darauf basiert \hyphenation). Ich denke, ich werde es einfach so lassen, wie es ist, und explizite Bindestriche manuell hinzufügen, wenn Latex sich über überfüllte Hboxen beschwert.
Gyom
63

Das Problem (wie KennyTM feststellte) ist, dass LaTeX Wörter nicht mit Bindestrichen trennt. Glücklicherweise gibt es ein Standardpaket (Teil von ncctools), das genau dieses Problem behebt extdash. Dies definiert neue Bindestrich- und Strichbefehle, die die Silbentrennung nicht stören und Zeilenumbrüche am Bindestrich / Bindestrich zulassen oder verhindern können. Ich bevorzuge es mit der shortcutsOption zu verwenden, damit ich z . B. \-/anstatt verwenden kann \Hyphdash. Folgendes möchten Sie:

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

Verwenden Sie, um ein Brechen an diesem Bindestrich zu verhindern multi\=/disciplinary

(Nebenbei: Im Chicago Manual of Style wird empfohlen, die Bindestriche mit Anhängen wie "Multi" zu entfernen, es sei denn, das Wort ist ohne es mehrdeutig oder unverständlich.)

Luke M.
quelle
Das ist großartig, gibt aber eine Hyperref-Warnung aus, wenn ich sie in einer Kapitelzeichenfolge verwende : Package hyperref Warning: Token not allowed in a PDF string. Dort \def\hyph{-\penalty0\hskip0pt\relax}funktioniert die andere vorgeschlagene Lösung ( ).
Dr. Jan-Philip Gehrcke
1
@ Jan-PhilipGehrcke: Diese Warnungen können auch mit behoben werden \texorpdfstring(was eine bedingte Kompilierung für Zeichenfolgen ermöglicht, die in Kapitelüberschriften enthalten sind). Ich verstecke Verwendungen in semantischen Makros (hier wahrscheinlich \multidisciplinary). Ja, es ist nicht perfekt.
Blaisorblade
22

Ich benutze Paket hyphenatund schreibe dann zusammengesetzte Wörter wie das finnische Wort Internet-yhteys (engl. Internetverbindung ) als Internet\hyp yhteys. Sieht doof aus, scheint aber der eleganteste Weg zu sein, den ich gefunden habe.

Zouppen
quelle
6

multi-disciplinarywird nicht getrennt, wie von kennytm erklärt. Hat multi-\-disciplinaryaber die gleichen Silbentrennungsmöglichkeiten multidisciplinarywie.

Ich gebe zu, dass ich nicht weiß, warum das funktioniert. Es unterscheidet sich von dem hier beschriebenen Verhalten (Hervorhebung von mir):

Der Befehl \-fügt einen diskretionären Bindestrich in ein Wort ein. Dies ist auch der einzige Punkt, an dem die Silbentrennung in diesem Wort zulässig ist .

rudolfbyker
quelle
Das Ersetzen -durch -\-ändert nichts an der Ausgabe, zumindest nicht mit den Standardeinstellungen in overleaf.com (wahrscheinlich pdflatex, aber overleaf sagt das eigentlich nicht).
Camille Goudeseune
4

Ich hatte das gleiche Problem. Ich benutze Bindestrich plus das folgende Makro:

\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

Beachten Sie, dass hierfür das expl3-Paket von latex3 verwendet wird.

Es macht das -Zeichen zu einem aktiven Charakter, der nach vorne scannt, um zu sehen, ob weitere Striche folgen. Wenn ja, bleibt es ein -, um sicherzugehen --und ---weiter zu arbeiten. Wenn nicht, wird es zum \hypBefehl von Bindestrich, wodurch Wortumbrüche im Rest des Wortes aktiviert werden. Dies ist eine generische Lösung, bei der alle Wörter, die explizite Bindestriche enthalten, normalerweise getrennt werden.

Beachten Sie, dass dies -zu einem Makro wird, das nicht vollständig erweiterbar ist. Versuchen Sie daher, dies einzuschließen, nachdem Sie andere Pakete geladen haben, von denen möglicherweise nicht erwartet wird -, dass sie ein Makro sind

Bearbeiten: Dies ist meine zweite Version, die erste Version war weniger robust, wenn ein {oder }ein Bindestrich folgte. Dies ist nicht der Fall, aber im Gegensatz zur ersten Version ist die -in dieser Version nicht vollständig erweiterbar.

JanKanis
quelle
3
multi\hskip0pt-\hskip0pt disciplinary

Sie können zB wie definieren

\def\:{\hskip0pt}

und dann schreiben

multi\:-\:disciplinary

Beachten Sie, dass das russische Sprachpaket babel über eigene Striche verfügt, die eine Silbentrennung nicht verbieten "~(z. B. doppeltes Anführungszeichen + Tilde).

Michael
quelle
1
Sollte sein multi-\hskip0pt disciplinary. Wie bei Ihnen MWE wird es zu viel hypen. Einfach einstellen, \setlength{\textwidth}{0.1cm}um das zu versuchen.
LaRiFaRi
-3

Ich habe hier etwas Ähnliches beantwortet: LaTeX bricht zu viele Wörter auf

Ich sagte:

Sie sollten irgendwo in Ihrer Präambel eine Silbentrennungsstrafe festlegen:

\hyphenpenalty=750

Der Wert 750 entsprach meinen Anforderungen für ein zweispaltiges Layout auf Briefpapier (8,5 x 11 Zoll) mit einer 12-Punkt-Schriftart. Passen Sie den Wert an Ihre Bedürfnisse an. Je höher die Zahl, desto weniger Silbentrennung tritt auf. Vielleicht möchten Sie auch einen Blick auf das Silbentrennungspaket werfen, es bietet etwas mehr als nur eine Silbentrennungsstrafe

Glimmer
quelle
1
Er fragt, wie man Bindestriche vermeidet und nicht, wie man Grenzen definiert.
Andras Gyomrey
-4

Um eine Silbentrennung in bereits getrennten Wörtern zu vermeiden, habe ich ein nicht unterbrechendes Leerzeichen ~in Kombination mit einem Rückwärtszeichen verwendet \!. Zum Beispiel Befehl

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

Unterdrücken Sie im Text die Silbentrennung in Wort 3-D. Wahrscheinlich nicht die beste Lösung, aber es hat bei mir funktioniert!

Igor
quelle
4
Dies beantwortet die entgegengesetzte Frage, was gestellt wurde. Wie die Person, die versucht hat, Ihren Beitrag zu bearbeiten, um darauf hinzuweisen, sagte, gibt es einen viel besseren Weg, um das zu tun, was Sie getan haben : \mbox{3-D}.
zwol