Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Wrap Modes

The --wrap flag controls how the formatter lays out line breaks inside a paragraph. It does not affect structure—only where soft line breaks fall.

badness format --wrap preserve paper.tex
ModeBehavior
reflowDefault. Greedy fill: pack words up to --line-width, breaking only where the next word would overflow.
preserveLeave the authored line breaks untouched.
sentenceOne sentence per line. Line width is ignored—a long sentence stays on one line.
semanticSemantic line breaks: keep the author’s soft breaks and add a break after each sentence.

How reflow works

Reflow is implemented through the formatter’s Doc layout engine as a fill node (in the Wadler/Prettier sense): per-gap greedy break decisions, where each inter-word gap independently becomes a space or a line break depending on whether the next word fits within --line-width. The printer remains the single layout authority—wrap modes are expressed through it rather than as a separate line-filling pass.

Sentence and semantic

Both sentence and semantic split a paragraph at sentence boundaries, one sentence per line, ignoring --line-width. Boundary detection is a small per-language rule engine over the words: a ., !, or ? ends a sentence unless the word is a known abbreviation (e.g., Fig., Dr., …), an ellipsis (..., ), or a contextual abbreviation whose following word signals that the sentence continues (U.S. Government stays together, U.S. However splits).

semantic additionally preserves the author’s own line breaks on top of the sentence breaks (the sembr convention). It does not detect clause boundaries itself—a break after a comma or and survives only where the author placed a newline. A run-on sentence on a single source line is still sentence-split.

Language and abbreviations

The abbreviation profile is chosen by document language. Built-in profiles cover English (default), Czech, German, Spanish, and French; an unknown or unset language falls back to English. Set the language and extend the no-break list in badness.toml:

[format]
wrap = "sentence"
lang = "de"                 # BCP-47-style code; the region subtag is folded away

[format.no-break-abbreviations]
default = ["ibid."]         # applied to every document
de = ["bzw.", "Abb."]       # applied only when lang resolves to German

An abbreviation listed here never ends a sentence, so no line break is inserted after it. (Automatic language detection from babel/polyglossia is not yet implemented; set lang explicitly.)