How do I get LaTeX to hyphenate a word that contains a dash?
LatexHyphenationLatex Problem Overview
In a LaTeX document I'm writing, I get an overfull hbox warning because of the word "multi-disciplinary", which happens to be rendered at the end of a line.
I can get rid of this particular warning by changing it into multi-discipli\-nary
, but the same problem will happen elsewhere, since this word is used a lot in the paper.
I'd like to use the \hyphenation{}
command instead, but obviously my tentative \hyphenation{multi-disci-pli-na-ry}
does not work, because it does not understand the first dash correctly.
What incantation do I need to get correct indentation in a word that already contains a dash?
Bonus question: Where could I have found the answer to that question myself?
Latex Solutions
Solution 1 - Latex
The problem (as KennyTM noted) is that LaTeX won't hyphenate words with dashes in them. Luckily, there's a standard package (part of ncctools) that addresses that very problem, called extdash
. This defines new hyphen and dash commands that do not disrupt hyphenation, and which can allow or prevent line breaks at the hyphen/dash. I prefer to use it with the shortcuts
option, so I can use, e.g., \-/
rather than \Hyphdash
. Here's what you want:
\usepackage[shortcuts]{extdash}
...
multi\-/disciplinary
To prevent breaking at that hyphen, use multi\=/disciplinary
(Aside: The Chicago Manual of Style advises dropping the hyphens attaching affixes like 'multi', unless the word is ambiguous or unintelligible without it.)
Solution 2 - Latex
From https://texfaq.org/FAQ-nohyph:
> TeX won’t hyphenate a word that’s already been hyphenated. For
> example, the (caricature) English surname Smyth-Postlethwaite wouldn’t
> hyphenate, which could be troublesome. This is correct English
> typesetting style (it may not be correct for other languages), but if
> needs must, you can replace the hyphen in the name with a \hyph
> command, defined
>
> \def\hyph{-\penalty0\hskip0pt\relax}
>
> This is not the sort of thing this FAQ would ordinarily recommend…
> The hyphenat
package defines a bundle of such commands (for
> introducing hyphenation points at various punctuation characters).
Or you could \newcommand
a command that expands to multi-discipli\-nary
(use Search + Replace All to replace existing words).
Solution 3 - Latex
I use package hyphenat
and then write compound words like Finnish word Internet-yhteys (Eng. Internet connection) as Internet\hyp yhteys
. Looks goofy but seems to be the most elegant way I've found.
Solution 4 - Latex
multi-disciplinary
will not be hyphenated, as explained by kennytm. But multi-\-disciplinary
has the same hyphenation opportunities that multidisciplinary
has.
I admit that I don't know why this works. It is different from the behaviour described here (emphasis mine):
> The command \-
inserts a discretionary hyphen into a word. This also becomes the only point where hyphenation is allowed in this word.
Solution 5 - Latex
I had the same problem. I use hyphenat plus the following macro:
\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
Note that this uses the expl3 package from latex3.
It makes the -
an active character that scans forward to see if it is followed by more dashes. If so, it stays a -
, to make sure --
and ---
keep working. If not, it becomes the \hyp
command from hyphenat, enabling word breaks in the rest of the word. This is a generic solution that makes all words that contain explicit hyphens hyphenate normally.
Note that -
becomes a macro that is not fully expandable, so try to include this after loading other packages that may not expect -
to be a macro
Edit: This is my second version, the first version was less robust when a {
or }
followed a hyphen. This one is not, but unlike the first version the -
in this version is not fully expandable.
Edit 2: My module for fixing this ended up growing into the following. As I no longer use Latex and it was over 10 years ago that I wrote this, I have no idea if the following still works. Caveat emptor!
\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
% The original hyphen is available as the \hp command.
\ExplSyntaxOn
\cs_new:Npn \hp {-}
% make hyphen the normal character
\cs_new:Npn \hyphenfixdisabled {
\catcode`\-=12\relax
}
\cs_new:Npn \hyphenfix_emdash:c {---}
\cs_new:Npn \hyphenfix_endash:c {--}
\cs_new:Npn \hyphenfix_discardnext:NN #1#2{#1}
\cs_new:Npn \hyphenfix_ignore:c {-}
\catcode`\-=\active
%Making hyphen an active character throughout a document can lead to unexpected errors, especially if it is being edited by multiple persons. This note command at the beginning of what will be the meaning of `-' will hopefully help diagnose errors resulting from hyphen behaving unexpectedly.
\catcode`\!=11
\catcode`\.=11
\let \Note:hyphen_is_an_active_character!_see_hyphenfix.tex! \relax
\cs_new_protected:Npn \hyphenfix_fixhyphen:w{
\if_mode_math:
\hp
\else: \use_i_after_fi:nw {
\Note:hyphen_is_an_active_character!_see_hyphenfix.tex!
\futurelet\hyphenfix_nexttok\hyphenfix_i:w
}
\fi:
}
\catcode`\!=12
\catcode`\.=12
\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
}
}
\cs_new:Npn \hyphenfixenable {
\catcode`\-=\active
\let-\hyphenfix_fixhyphen:w
}
\cs_new:Npn \hyphenfixdisable {
\let-\hyphenfix_ignore:c
\catcode`\-=12\relax
}
\catcode`\-=12\relax
\ExplSyntaxOff
Solution 6 - Latex
multi\hskip0pt-\hskip0pt disciplinary
You can e.g. define like
\def\:{\hskip0pt}
and then write
multi\:-\:disciplinary
Note that the babel Russian language package has its own set of dashes that do not prohibit hyphenation, "~
(double quotation+tilde) for example.
Solution 7 - Latex
Since Latex thinks multi-disciplinary is a single word with preferred hyphenation, you can indicate that these are two separate words,e.g.: multi-\hspace{0pt}disciplinary is sufficient to resolve this.
Solution 8 - Latex
I answered something similar here: https://stackoverflow.com/questions/1609837/latex-breaking-up-too-many-words
I said:
you should set a hyphenation penalty somewhere in your preamble:
\hyphenpenalty=750
The value of 750 suited my needs for a two column layout on letter paper (8.5x11 in) with a 12 pt font. Adjust the value to suit your needs. The higher the number, the less hyphenation will occur. You may also want to have a look at the hyphenatpackage, it provides a bit more than just hyphenation penalty
Solution 9 - Latex
To avoid hyphenation in already hyphenated word I used non-breaking space ~
in combination with backward space \!
. For example, command
3~\!\!\!\!-~\!\!\!D
used in the text, suppress hyphenation in word 3-D. Probably not the best solution, but it worked for me!