2010-02-03 5 views
85

In einem LaTeX-Dokument, das ich schreibe, bekomme ich eine übermäßige hbox Warnung wegen des Wortes "multidisziplinär", das am Ende einer Zeile gerendert wird.Wie bekomme ich LaTeX, um ein Wort, das einen Gedankenstrich enthält, zu trennen?

Ich kann diese besondere Warnung loswerden, indem Sie es in multi-discipli\-nary ändern, aber das gleiche Problem wird anderswo geschehen, da dieses Wort viel in der Zeitung verwendet wird.

Ich möchte stattdessen den \hyphenation{} Befehl verwenden, aber offensichtlich funktioniert mein vorläufiges \hyphenation{multi-disci-pli-na-ry} nicht, weil es den ersten Strich nicht richtig versteht.

Welche Beschwörungsformel brauche ich, um in einem Wort, das bereits einen Bindestrich enthält, den richtigen Einzug zu erhalten?

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

+0

Warum ist es ein Problem, dass das Wort beim harten Hypen gebrochen wird? Ist "multi- newline dimensional" nicht in Ordnung? –

+1

Bonus-Antwort: Eine Google-Suche von "Latex Silbentrennung" ergab alle möglichen nützliche Ergebnisse, einschließlich der Latex-Wiki-Buch, das die Antwort hat: http://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 Bindestrich tat. aber in diesem Beispiel würde es eine "Underfull hbox" verursachen, und latex wählt, um überhaupt nicht zu trennen. – Gyom

Antwort

44

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

TeX kein Wort Silbentrennung, der bereits Bindestrich worden. Zum Beispiel würde der (Karikatur) englische Familienname Smyth-Postlethwaite keine Silbentrennung verwenden, was mühsam sein könnte. Das ist richtig Englisch Satzstil (nicht für andere Sprachen richtig sein kann), aber wenn Bedarf müssen Sie den Bindestrich im Namen mit einem \hyph Befehl ersetzen können, definiert

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

Dies ist nicht die Art von Dingen, die diese FAQ normalerweise empfehlen würde ... Das hyphenat Paket definiert ein Bündel solcher Befehle (zum Einführen von Trennstellen bei verschiedenen Interpunktionszeichen).


Oder Sie könnten \newcommand ein Befehl, der zu multi-discipli\-nary erweitert (+ Nutzung Suchen Alle ersetzen bestehende Wörter zu ersetzen).

+0

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, überall einen '\ newcommand' zu verwenden (deshalb suchte ich nach etwas, das auf '\ silhenation' basiert). Ich denke, ich behalte es einfach so, wie es ist, und füge explizite Bindestriche manuell hinzu, wenn sich Latex über überladene H-Boxen beschwert. – Gyom

+1

Der korrekte Befehl ist '\ hyp {}' – scheffield

-4

antwortete ich etwas ähnliches hier: LaTeX breaking up too many words

Ich sagte:

meine Bedürfnisse für zwei geeignet
\hyphenpenalty=750 

Der Wert von 750:

Sie eine hyphenation Strafe irgendwo in Ihrer Präambel sollte Spaltenlayout auf Briefpapier (8.5x11 in) mit einer 12 pt Schrift. Passen Sie den Wert an Ihre Bedürfnisse an. Je höher die Zahl, desto weniger Silbentrennung wird auftreten. Sie können auch einen Blick auf der hyphenatpackage haben, ist es ein bisschen mehr bietet als nur hyphenation Strafe

+1

Er fragt, wie man Bindestrich vermeidet, nicht darüber, wie man Grenzen definiert. –

-4

Um hyphenation in bereits hyphenated Wort vermeide ich verwenden non-breaking Raum ~ in Kombination mit rückwärtigem Raum \!. Zum Beispiel, Befehl

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

im Text verwendet, unterdrücken Silbentrennung in Wort 3-D. Wahrscheinlich nicht die beste Lösung, aber es hat für mich funktioniert!

+4

Dies beantwortet die * entgegengesetzte * Frage, was gefragt wurde. Als Person, die versucht hat, Ihren Post zu bearbeiten, um darauf hinzuweisen, gibt es einen viel besseren Weg, um das zu tun, was Sie getan haben: '\ mbox {3-D}'. – zwol

17

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

+0

Endlich etwas was funktioniert, danke! –

3

Ich hatte das gleiche Problem. Ich benutze hyphenat plus dem folgenden 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 dies das expl3 Paket von LaTeX3 verwendet.

Es macht das ein aktives Zeichen, das vorwärts scannt, um zu sehen, ob es von mehr Strichen gefolgt wird. Wenn ja, bleibt es ein -, um sicherzustellen, dass -- und --- weiter funktionieren. Ist dies nicht der Fall, wird der Befehl \hyp aus dem Bindestrich, wodurch im restlichen Wort Wortumbrüche aktiviert werden. Dies ist eine generische Lösung, die alle Wörter, die explizite Bindestriche enthalten, normal trennt.

Beachten Sie, dass - einen Makro wird, die nicht vollständig erweiterbar ist, so versuchen, dies zu schließen, nachdem andere Pakete laden, die - nicht erwarten können ein Makro

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

3
multi\hskip0pt-\hskip0pt disciplinary 

Sie können z.B. definieren wie

\def\:{\hskip0pt} 

und dann schreiben

multi\:-\:disciplinary 

Beachten Sie, dass das babel russische Sprachpaket über einen eigenen Satz von Strichen hat, die nicht hyphenation verbieten kann, "~ (doppelte Anführungszeichen + Tilde) zum Beispiel.

+1

Sollte "multidisziplinär" sein. Wie in dir MWE, wird es zu viel hernehmen. Setze einfach '\ setlength {\ textwidth} {0.1cm}' um das zu versuchen. – LaRiFaRi

47

Das Problem (wie KennyTM bemerkte) ist, dass LaTeX keine Wörter mit Gedankenstrichen in die Wörter einfügt. Glücklicherweise gibt es ein Standardpaket (Teil von ncctools), das genau dieses Problem anspricht, extdash genannt. Dadurch werden neue Bindestrich- und Bindestrichbefehle definiert, die die Silbentrennung nicht stören und Zeilenumbrüche am Bindestrich/Bindestrich ermöglichen oder verhindern. Ich bevorzuge es mit der shortcuts Option zu verwenden, so kann ich z. B. \-/ statt \Hyphdash verwenden. Hier ist, was Sie wollen:

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

Um zu dieser Bindestrich zu verhindern brechen, verwenden multi\=/disciplinary

(Außer: The Chicago Manual of Style rät die Bindestriche Anbringen Affixe wie 'Multi' fallen, es sei denn, das Wort ist mehrdeutig oder unverständlich ohne es.)

+0

Das ist großartig, aber es gibt eine Hyperref-Warnung, wenn ich es in einer Kapitelzeichenfolge verwende: 'Pakethyperref Warnung: Token in einer PDF-Zeichenkette nicht erlaubt'. Dort funktioniert die andere vorgeschlagene Lösung ('\ def \ hyph {- \ penalty0 \ hskip0pt \ relax}'). –

+0

@ Jan-PhilipGehrcke: diese Warnungen können auch mit '\ texorpdfstring' behoben werden (das bedingte Kompilierung für Strings bietet, die in Kapiteltiteln vorkommen). Ich verberge Verwendungen innerhalb von semantischen Makros (hier wahrscheinlich "multidisziplinär"). Ja, es ist nicht perfekt. – Blaisorblade

3

multi-disciplinary wird nicht getrennt, wie von kennytm erklärt. Aber hat die gleichen Silbenierungsmöglichkeiten, die multidisciplinary hat.

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

Der Befehl \- fügt ein bedingter Trennstrich in einem Wort. Dies ist auch der einzige Punkt, an dem die Silbentrennung in diesem Wort zulässig ist.

Verwandte Themen