Drop caps (lettrine)

The oversized opening letter that drops into the first few lines of a chapter is a drop cap in English and a lettrine in French. In LaTeX the job belongs to the package that carries that very name: Daniel Flipo’s lettrine (v2.60, dated 2024-01-20, in TeX Live 2024). The ornament looks like a purely visual matter, but the implementation is obsessively precise: lettrine actually typesets a four-letter reference string, EFTZ, measures its height, and works out the scale factor with \fpeval from xfp. Measured, against a target of 28.98666pt the letter came out 28.98679pt tall — off by 0.00013pt. This page covers the two mandatory arguments of \lettrine, the options lines=, lhang=, loversize= and findent=, the \parshape and \llap underneath, and what actually happens in lists, in two columns and in Japanese.

Using \lettrine: two arguments, and no space between them

Put \usepackage{lettrine} in the preamble and begin the paragraph with \lettrine[options]{T}{he rest}. There are two mandatory arguments. The first, {T}, is the dropped initial itself; the second, {he rest}, is the text that runs on after it, set by default in small capitals. The body of the paragraph then wraps automatically around the right of the cap. There must be no space between {T} and {he rest} — the remainder of the first word goes straight into the second argument. That argument may be empty: \lettrine{T}{} drops the initial and starts the following word in the ordinary face.

latex
\documentclass{article}
\usepackage{lettrine}
\usepackage{lmodern}      % a fully scalable font — see below
\begin{document}
\lettrine{L}{orem} ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor incididunt ut
labore et dolore magna aliqua.
\end{document}

One trap lurks here. Because lettrine scales the initial to an arbitrary size, it needs a font that is available at any size. Computer Modern (CM) and the EC fonts ship with only a fixed ladder of sizes, so a requested size that is not on the ladder gets replaced by the nearest one and the initial no longer fills the line count you asked for. The safe move is to add \usepackage{lmodern} (Latin Modern) or to use a PostScript/OpenType face such as Palatino or Times. If you must stay on CM, load \usepackage{type1cm}; for EC, \usepackage{type1ec}. The log tells you when a substitution happened: a line such as LaTeX Font Warning: Font shape ... in size <31.53638> not available (Font) size <24.88> substituted means the initial came out smaller than intended.

What happens underneath: not \hangindent but \parshape and \llap

lettrine does not use \hangindent. The usual description of a hand-made drop cap — “indent the first few lines with \hangindent and \hangafter, then place a big letter in the gap” — is not what lettrine.sty does. It boxes the initial with \sbox, then builds a \parshape: a list of (indent, line length) pairs, one per line, cancels the paragraph indent with \noindent, and pushes the boxed initial out towards the left margin with \llap. Where \hangindent can only express “one fixed indent for the first n lines”, \parshape can give every line a different indent. That is exactly why the slope= option can tilt the left edge of the text to follow the diagonal contour of an A or a V.

Knowing how the height is derived changes what lines= means. lines=n is not “n times \baselineskip.” The target height is (n − 1) baselineskips plus the x-height of the run-on font (\LettrineTextFont, \scshape by default). Measured in a 10pt article, \baselineskip is 12.0pt and the height of \scshape x is 4.98666pt; with lines=3 the target printed in the log is 28.98666pt, which is exactly 12 × 2 + 4.98666. The letter actually produced measured 28.98679pt. Those two lines are written into the .log on every run, so when an initial comes out the wrong size, read them first: a font substitution shows up as a wide gap between target and result.

latex
% lettrine reports both numbers in the .log on every run:
%   Package lettrine.sty Info: Targeted height = 28.98666pt
%   (lettrine.sty)             (for loversize=0, accent excluded),
%   (lettrine.sty)             Lettrine height = 28.98679pt (L);
%
% Read them when an initial comes out the wrong size:
%   pdflatex doc.tex && grep -A3 "Targeted height" doc.log

The options that matter: lines=, lhang=, loversize=, findent=

You tune the appearance with comma-separated options inside the brackets. Four of them do most of the work: lines= sets how many lines tall the initial is, lhang= how far it hangs into the left margin, loversize= how much it is enlarged beyond that line count, and findent= the gap between the cap and the first line of text. The one that repays attention in practice is lhang=: round letters such as O and C look better optically aligned when allowed to overhang slightly (0.1 to 0.2 is typical), and so does a T, whose crossbar juts out at the top left. Letters with a vertical left edge, such as H or N, want 0. All these values are fractions of the letter’s own width or height, so the visual relationship survives a change of font.

OptionMeaningDefault
linesHeight of the initial: (n−1) baselineskips plus the run-on font’s x-height2
lhangFraction of the cap’s width that hangs into the left margin (0–1); good for O, C, T0
loversizeFraction by which to enlarge the target height (−1 to 1); 0.1 means 10 % taller0
lraiseRaise the cap by this fraction of its own height0
findentGap between the cap and the first line of text0pt
nindentIndent of the second and following lines0.5em
slopeSlope of the wrapped text’s left edge, for slanted letters such as A and V0pt
depthHow many extra lines the initial sinks below the normal depth0
anteMaterial set just before the cap, such as a French opening guillemetnone
imageUse an image as the initial; requires graphicx, and viewport= can crop itfalse
refstringReplace the reference string used to fix the height, when EFTZ misfits a display faceEFTZ

The same keys can be given when the package is loaded, where they become document-wide defaults. Write \usepackage[lines=3]{lettrine} and three lines becomes the default, while options on an individual \lettrine[...] override it locally. If a particular letter always wants the same treatment, you can register a per-letter default with \LettrineOptionsFor{O}{lhang=0.2}. That turns “let the round letters overhang” into a one-off job rather than a recurring one.

The font and colour of the cap: using \LettrineFontHook

Set the face of the initial by redefining \LettrineFontHook with \renewcommand. The size is computed from the line count, so there is no need to touch \LettrineFont directly. The hook holds low-level font commands: write \fontfamily{ppl}\fontseries{bx}\fontshape{sl} and the dropped capital alone comes out in Palatino bold slanted. Under LuaLaTeX or XeLaTeX you can go through fontspec instead — \renewcommand{\LettrineFontHook}{\fontspec{LinLibertine_I.otf}} switches to Linux Libertine’s decorative initials. The run-on text (the second argument) has its own hook, \LettrineTextFont, whose default is \scshape. To drop the small capitals, write \renewcommand{\LettrineTextFont}{\rmfamily}.

When changing the colour, mind which brackets you use. For grey it is \renewcommand{\LettrineFontHook}{\color[gray]{0.5}}. The commonly seen \color{gray}{0.5} produces a wrong result without raising an error: compile it and \color{gray} selects the named colour gray while the leftover {0.5} is typeset as text, so a small “0.5” is printed to the lower left of the initial. The hook’s contents run inside the \sbox, so anything that produces characters will produce characters. Use \color{gray} for a named colour or \color[gray]{0.5} for a greyscale value — one or the other, never both spellings mixed.

latex
% Palatino, bold, slanted — for the dropped capital only
\renewcommand{\LettrineFontHook}{\fontfamily{ppl}\fontseries{bx}\fontshape{sl}}

% Grey. NOT \color{gray}{0.5} — that silently prints "0.5" beside the cap.
\renewcommand{\LettrineFontHook}{\color[gray]{0.5}}

% Drop the small capitals on the run-on text
\renewcommand{\LettrineTextFont}{\rmfamily}

% Three lines tall, hanging 20% of its width into the margin
\lettrine[lines=3, lhang=0.2]{T}{his is} the opening paragraph of a chapter.
% A slanted letter wants its own contour:
\lettrine[lines=4, lraise=0.1, nindent=0em, slope=-.5em]{V}{oici} le texte.

Where it goes wrong: mid-paragraph, in lists, in two columns

\lettrine must begin the paragraph; put anything printable before it and it breaks silently. Compile Some words come first. \lettrine{L}{orem} … and there is no error and no warning — but “Some words come first.” ends up alone on a short indented line of its own, with the dropped capital and the wrap starting underneath it. \lettrine sets a \parshape for the whole paragraph, so material that precedes it is simply left outside that design. A preceding \noindent does not break it: lettrine.sty issues its own \noindent, so a second one is harmless. What breaks it is not whitespace but printable content.

It cannot be used inside a list. The package manual says so outright, and the measurement shows the symptom plainly. Write \lettrine{I}{nlist} immediately after an \item in itemize and it compiles, warns about nothing, and the wrap even looks plausible — but enlarge the output and the item’s bullet is printed on top of the upper left of the dropped capital. The cause is straightforward: the \item label and the \lettrine initial are both placed with \llap, into the same spot beside the left margin. Inside quote, quotation and abstract it works correctly, and inside center only with [lines=1]. If a list has to appear within a paragraph that began with \lettrine, the manual asks for \parshape=0 immediately after the list ends (starting a new paragraph before or after the list works too).

In two columns the same lines= value reads completely differently. Measured, a standard article under twocolumn keeps \textwidth at 469.0pt but gives \columnwidth 229.5pt, with \columnsep 10.0pt. The measure is less than half as wide, yet the height of the initial is derived from \baselineskip and does not change. The proportion of the measure the cap occupies therefore roughly doubles, and at lines=4 the first four lines become so short that they set with conspicuous gaps between words. In two columns, stay at lines=2, leave loversize at 0 and keep lhang modest. Note also that in the right-hand column lhang hangs not into the page margin but into the gutter (\columnsep), so check by eye that the cap does not crowd the text of the column beside it.

Enlarging the first character of Japanese text: what actually happens

Hand \lettrine a kanji and it compiles, and the initial really is set large — but the measurements are computed on the Latin side. Setting \lettrine{吾}{輩は猫である。} with upLaTeX and jsarticle produced no error, yet the log carried LaTeX Font Warning: Font shape OT1/cmr/m/n in size <31.53638> not available (Font) size <24.88> substituted. lettrine derives the height from \LettrineTestString (default EFTZ) in whatever Latin font is current, not from the Japanese font. Adding \usepackage{lmodern} silences the warning, but the wrap indents still do not agree with the square body of Japanese glyphs. On top of that, the default \scshape on the second argument does nothing at all to kana or kanji — the visual handover from oversized initial to small-capital run-on, so natural in Latin text, simply does not exist.

The practical judgement follows from that. If the aim is merely to make the first character stand out at a Japanese chapter opening, handling it with heading size, line allocation, indentation and white space is far more reliable than forcing \lettrine through. If you truly want the dropped form, you will have to put a Japanese font command inside \LettrineFontHook, replace the height reference with refstring= so it measures the character you actually use, and then tune nindent and findent by hand. Either way, the square body of Japanese glyphs suits a dropped initial far less than a Latin capital does. Print a proof and look at it before deciding to adopt it.

When to add it: do not decorate before the text has settled

A drop cap is not a comprehension aid; it is decoration that sets the mood at a chapter opening. So it goes in last. The right values for lines and lhang depend on the length of the paragraph and on how its lines fall, which means every added paragraph calls for a re-check. Do not use it in papers, reports or specifications, where the format is prescribed. Its place is in essays, booklets and the chapter openings of books whose page design welcomes ornament. And once you decide to use it, keep one rule across the whole document: two lines in one chapter and three in another is the classic way to make an ornament stop working as an ornament.

  • Use it only in the first paragraph of a chapter opening. Avoid lists, center (except with [lines=1]), and paragraphs shorter than the cap is tall.
  • Do not insert it until the text has settled. lines and lhang depend on the paragraph’s length and on how its lines fall.
  • Always use a scalable font. Load lmodern or similar and check that Targeted height and Lettrine height agree in the .log.
  • Prefer a textual initial to an image initial. Readers can search and copy the text that way.
  • At a Japanese chapter opening, decide first whether a Western drop cap suits the page. If it does not, use heading size and white space instead.