A prettyprinting library for laying out text documents.

Version on this page:
LTS Haskell 22.29:
Stackage Nightly 2024-07-18:
Latest on Hackage:

See all snapshots doclayout appears in

BSD-3-Clause licensed by John MacFarlane
Maintained by [email protected]
This version can be pinned in stack with:doclayout-,2063

Module documentation for

Depends on 4 packages(full list with versions):
Used by 2 packages in lts-15.3(full list with versions):


CI tests

This is a prettyprinting library designed for laying out plain-text documents. It originated in the pandoc module Text.Pandoc.Pretty, and its development has been guided by pandoc’s needs in rendering wrapped textual documents.

In supports wrapping of text on breaking spaces, indentation and other line prefixes, blank lines, and tabular content.


Text.DocLayout> mydoc = hang 2 "- " (text "foo" <+> text "bar")
Text.DocLayout> putStrLn $ render (Just 20) mydoc
- foo bar
Text.DocLayout> putStrLn $ render (Just 10) (prefixed "> " (mydoc $+$ mydoc))
> - foo
>   bar
> - foo
>   bar

The Doc type may be parameterized to either String or (strict or lazy) Text, depending on the desired render target.



  • Made realLength smarter about combining characters. If a string starts with a combining character, that character takes up a width of 1; if the combining character occurs after another character, it takes 0. See jgm/pandoc#5863.
  • Improve isBlank, re-use in rendering code for BreakingSpace.
  • Fixed incorrect Text width in renderig blocks.


  • Add instances for Doc: Data, Typeable, Ord, Read, Generic.
  • Add literal (like text, but polymorphic).
  • Change some IsString constraints to HasChars.
  • Add some default definitions for methods in HasChars.
  • Change offset and minOffset to be more efficient (in simple cases they no longer render and count line lengths).
  • Add updateColumn.
  • Fix problem with lblock/cblock/rblock when chop is invoked. This caused very strange behavior in which text got reversed in certain circumstances.


  • Initial release.