Type plain Latin-script text into LaTeX and it comes out with surprising care: write office and the ffi fuses into one glyph, the pair AV closes up by 1.11084 pt, and the line breaks are chosen by scanning the whole paragraph. Yet that automation also leaves gaps — it will happily split wolffish as wolff-ish. And if you break the ligature with \/ to fix things, the word's hyphenation disappears completely. This page sets out, with measurements, the judgements an author has to make when setting Western text: when to break a ligature, what to declare to babel, how to use capitals and small caps, and what changes when Western passages sit inside a Japanese manuscript.
The five ligatures LaTeX makes: ff, fi, fl, ffi, ffl
A ligature melts adjacent letters into a single glyph, and the five LaTeX forms by default are ff, fi, fl, ffi and ffl. Type office or fluffier in the body text and the substitution happens with no mark left in the source. The reason is a matter of shape: the flick at the top right of an f collides with the dot of a following i or the ascender of an l, so f-ligatures have been cast since the days of metal type. Measured in 10 pt T1 Computer Modern, the fi ligature is 5.5542 pt while the separated f{}i is 5.83191 pt — the ligature is 0.27771 pt narrower, and that difference is exactly the space saved by tucking the letters together.
The same machinery works on punctuation too. Two hyphens in a row, --, become an en dash, used for numeric ranges; three, ---, become an em dash, used for parenthetical asides; and two grave accents followed later by two apostrophes give the proper opening and closing double quotation marks. These conversions are baked into the font metrics, so no command is needed (which dash to choose is covered in detail on the quotes-and-dashes page).
Three ways to break a ligature: only one keeps hyphenation
A ligature that straddles a morpheme boundary — the seam where a word was built out of parts — hurts legibility rather than helping it. The classic example is shelfful (shelf + ful): fusing the ff hides the join between the two pieces. The word is cited on page 19 of Knuth's The TeXbook, a source the selnolig package documentation still points to. cufflink, offload, wolffish and halflife are of the same kind. Tradition offers three ways to break the ligature: shelf\/ful (an italic correction), shelf{}ful (an empty group), and shelf\kern0pt ful (a zero-width kern).
Here is a difference you only find by measuring. Ask \showhyphens where the break points are and plain wolffish splits as wolff-ish — where the morphemes would want wolf-fish. wolf{}fish splits as wolff-ish too: the ligature is gone but hyphenation is untouched. Yet wolf\/fish and wolf\kern0pt fish both end up with no break points at all, and so does a \mbox{} inserted in the middle. The reason is simple: \/ and \kern each insert a typesetting node, and TeX's scan for the word stops there. {} leaves nothing behind, so the word is still a word — which makes {} the only ligature-breaker that preserves hyphenation.
| Written as | Width (10pt, T1 CM) | What showhyphens reports |
|---|---|---|
shelfful | 30.88135 pt | shelf-ful — ligature kept, break point kept |
shelf{}ful | 31.15906 pt | shelf-ful — ligature gone, break point still there |
shelf\kern0pt ful | 31.15906 pt | no break points — hyphenation is lost |
shelf\/ful | 31.93665 pt | no break points, and 0.77759 pt of italic correction on the f as well |
The practical conclusion: when you break a ligature by hand, use {}. \/ is the venerable form shown in The TeXbook, and it is defensible in that it restores the space the f overhang would have used — but it stops the word breaking at a line end. For a short word the harm is small; for a long compound such as selffulfilling, losing every break point stretches the interword spaces on that line and thins out the whole paragraph. If LuaLaTeX is available, selnolig is the nicest answer of all: it carries English and German morphology as patterns and suppresses the unwanted ligatures in shelfful or offload with no markup in your text (version 0.302 in TeX Live 2024, LuaLaTeX only).
% \showhyphens output, TeX Live 2024, T1 Computer Modern:
% shelfful -> shelf-ful (ligature, break point kept)
% shelf{}ful -> shelf-ful (ligature broken, break point kept)
% shelf\kern0pt ful -> shelfful (no break points)
% shelf\/ful -> shelfful (no break points)
% wolffish -> wolff-ish (a break TeX gets wrong on its own)
A shelf{}ful of books, one cuff{}link, an off{}load.
% LuaLaTeX only: handles the whole word list for you
% \usepackage{selnolig}Kerning closes AV by 1.11084 pt — and {} cancels that too
A kern adjusts the gap between a particular pair of adjacent letters, closing or opening it so the spacing looks even. Pairs with slanted shapes such as AV, To, Wa and LT look gappy if left alone. Measured in 10 pt T1 Computer Modern, AV is 13.8855 pt, while A{}V with an empty group between them is 14.99634 pt — the 1.11084 pt of tightening the font asked for has vanished. The table of kerning pairs lives in the font metrics (a .tfm file in the pdfLaTeX world, a table inside the font for OpenType faces), and TeX reads it to set the spacing. The author writes nothing.
One caution rebounds from that onto the previous section: breaking a ligature with {} also cancels whatever kern sat at that spot. If the font defined a kern between the two fs, it goes as well. For shelf{}ful that is the 0.27771 pt by which 30.88135 pt grew to 31.15906 pt. It is not visible to the eye, but where the fit of the letters matters exactly — a logo, a trademark — giving \kern your own number is safer than reaching for {}. Conversely, when you want to space a whole word out evenly (tracking, or letterspacing), do not scatter your own \kerns: use microtype's \textls{...}, which leaves hyphenation working.
Hyphenation differs by language: declare it with babel
The same spelling breaks in different places depending on the language. Ask \showhyphens and signature comes out as sig-na-ture under English patterns, si-gna-ture under French, and sig-na-tu-re under Spanish — the break positions themselves move. Kongress is more extreme: under English patterns no break point is found at all. A fair share of the symptoms people report as “the lines will not pack” or “the word spacing keeps stretching” traces back to a document that never declared its language. \usepackage[french]{babel} — or polyglossia under XeLaTeX and LuaLaTeX — is not decoration but a prerequisite for setting the text correctly.
| Word | english | french | ngerman | spanish |
|---|---|---|---|---|
signature | sig-na-ture | si-gna-ture | si-gna-ture | sig-na-tu-re |
Analyse | Anal-yse | Ana-lyse | Ana-ly-se | Analy-se |
Kongress | Kongress (no break points) | Kon-gress | Kon-gress | Kon-gress |
impossible | im-pos-si-ble | im-pos-sible | im-pos-si-ble | im-pos-si-ble |
transatlantique | transat-lan-tique | trans-at-lan-tique | trans-at-lan-ti-que | trans-atlan-ti-que |
Even with the language declared, the automatic decision misjudges proper nouns and technical terms. The remedies come in three levels. (1) To make a word always break only where you say, list it in the preamble inside \hyphenation{...}, marking the permitted points with -, words separated by spaces. Under the default (US English) patterns manuscript has no break point at all, which is why \hyphenation{man-u-script} has been the standard example for decades. (2) For a one-off, put \- (a discretionary hyphen) inside the word — but a word carrying \- can then break only there. (3) To forbid breaking altogether, wrap it in \mbox{...}. As the measurements above showed, \mbox{} strips every break point, which here is exactly the point.
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[english]{babel} % loads the English hyphenation patterns
\hyphenation{man-u-script data-base FORTRAN} % global exceptions
\begin{document}
We rewrote the manuscript in \mbox{FORTRAN} overnight,
and the data\-base held.
\end{document}
% \showhyphens{...} prints the break points to the log --
% the fastest way to see what the current patterns actually do.babel changes more than hyphenation: it changes the text itself
Hand babel a language and its typographic conventions come with it. French is the clearest case. Measure the same input, Bonjour: oui!: without babel it is 58.48572 pt wide, and with \usepackage[french]{babel} it is 62.37366 pt — 3.88794 pt more. Pull the text out of the PDF and the reason is plain: the output reads Bonjour : oui !. French typography puts a space before the high punctuation marks (:, ;, !, ?), and babel inserts it for you. Write \og ... \fg{} and you get the guillemets « » as well.
German gives you the low and high quotation marks „ … “ through its quote shorthands, and Spanish and Italian bring in their own conventions the same way. There is a trap here. The moment you switch babel's language, space starts appearing in places it did not before, so the line breaking changes wholesale and the layout moves. That is the accident behind “I added a language option while answering the referees and now the floats on unrelated pages have shifted.” Decide the language in the first preamble you write, and in a multilingual document name the main language explicitly with main=.
Small caps and capitals: \textsc{UNESCO} does not come out small
When you want to set an acronym or a name apart in running Western text, small caps disturb the colour of the line less than a run of full capitals. The command is \textsc{...}, and here lies a common mix-up. A small-caps font is one in which the lowercase slots hold small capitals. What you feed \textsc therefore has to be lowercase. Measured in 10 pt T1 Computer Modern, \textsc{unesco} is 34.68042 pt while \textsc{UNESCO} is 46.09985 pt — the latter is larger than an ordinary UNESCO (42.35077 pt). Aiming to make it smaller has produced the widest of the three.
Small caps carry a second cost, on the PDF side. Run pdftotext over a PDF that set \textsc{unesco} and what comes back is unesco — still lowercase. The glyphs are capitals but the text layer holds lowercase letters. A paper that sets organisation or standard names in small caps may therefore not be found when someone searches for them. If bibliographic data and searchability matter, set acronyms in ordinary capitals and keep \textsc for the places where you really want the contrast. As for \MakeUppercase, recent kernels handle accents correctly: \MakeUppercase{stra\ss e caf\'e na\"\i ve} gives STRASSE CAFÉ NAÏVE, with ß opening out to SS as convention requires.
One more thing: the font cabinet has limits. Computer Modern has no italic small caps, so \textit{\textsc{unesco}} produces LaTeX Font Warning: Font shape T1/cmr/m/scit undefined and quietly substitutes the slanted small caps instead. It is a warning, not an error, so it tends to travel all the way to publication unnoticed. If you really need italic small caps, the choice is between picking another face — Latin Modern among them — and abandoning the combination.
\textsc{unesco} % 34.68042pt -- real small caps
\textsc{UNESCO} % 46.09985pt -- full-size caps in the SC font
UNESCO % 42.35077pt -- ordinary capitals
% pdftotext of the first line gives "unesco", in lowercase
\MakeUppercase{stra\ss e caf\'e} % -> STRASSE CAFÉ
% English abbreviations keep the period, and the period is not a sentence end:
e.g.\ and i.e.\ and cf.\ and et al.\ -- see the punctuation pageGetting the right margin to behave: microtype and Overfull hboxes
The package that lifts Western typesetting a whole grade is microtype. The single line \usepackage{microtype} brings two micro-typographic refinements into play. Character protrusion pushes line-ending punctuation and round or slanted letters such as o and A a hair past the margin, producing an optically even edge. Font expansion stretches or squeezes the glyphs of each line by a fraction of a percent, taking over part of the work the interword glue would otherwise do. Which features you get depends on the engine: microtype-xetex.def carries the errors Font expansion does not work with xetex and Letterspacing currently doesn't work with xetex — so under XeLaTeX, count on protrusion only.
Lines will still overrun the right edge, and the Overfull \hbox message in the log is the signal. TeX chose those breaks by weighing the paragraph as a whole — the Knuth–Plass algorithm, published by Donald Knuth and Michael Plass in Software: Practice and Experience in 1981. So an overrun does not mean the algorithm gave up on that line; it means no arrangement of the whole paragraph pleased it more. Two declarations tune how tightly a paragraph packs: \sloppy tolerates wider word spaces in order to avoid an overrun, while \fussy (the default) keeps the spacing strict and lets the overrun happen. To loosen a single paragraph, wrap it in the sloppypar environment. The order matters, though: reach for \sloppy last. Load microtype first, then change one word of the wording or add a single \-. That usually settles it, and it leaves the paragraph looking better.
When a Japanese author sets a Western-language document
Start writing an English paper in a Japanese environment and this is usually the first error: ! LaTeX Error: Unicode character (U+3000) not set up for use with LaTeX. The culprit is a full-width space, one of which left behind by the input method mid-conversion is enough to stop pdfLaTeX. ( (U+FF08) and ) (U+FF09) fail the same way, not set up for use with LaTeX. What makes it awkward is that on screen they are indistinguishable from a half-width space or a plain parenthesis. Spending a minute on the day you start the English draft to search out and remove full-width spaces, parentheses and commas saves you from this class of error for good.
A second thing that matters is the choice of document class and engine. Set an English document with a Japanese class such as jsarticle, or with upLaTeX, and the Japanese typesetting model is still standing behind it, interposing work the Western text does not need. For an English-only manuscript, moving plainly to article with pdfLaTeX — or LuaLaTeX with fontspec — is the safe route. Conversely, in a mainly Japanese manuscript with Western passages, the sentence spacing in those passages tends to come out uneven, so \frenchspacing is worth considering (the mechanism is set out on the punctuation page). And microtype's protrusion and expansion are for Western text; Japanese typesetting is handled by a different model, in tools such as luatexja.
- Clean out the full-width characters on day one. Search for the full-width space U+3000, the full-width parentheses
()and the full-width comma, and delete them. They are whatnot set up for use with LaTeXis about. - Declare the language before you start writing. Adding
\usepackage[english]{babel}later changes the line breaking, and with it the position of your floats. - Break ligatures with
{}when you break them by hand.\/and\kern0ptwipe out the word's hyphenation. Under LuaLaTeX, hand the job toselnolig. - Set acronyms in ordinary capitals.
\textscleaves lowercase in the PDF text layer, so it is the wrong tool for a word you want people to find. \sloppyis the last resort.microtypefirst, then a change of wording or a single\-. Count theOverfull \hboxmessages after that, not before.