content: 
  {-# LANGUAGE OverloadedStrings #-}
  
  -- | The geometry package provides an easy interface to page dimensions.
  --
  -- CTAN page for geometry: <http://www.ctan.org/pkg/geometry>.
  module Text.LaTeX.Packages.Geometry (
      -- * Geometry package
      geometry
    , importGeometry
      -- * Geometry options
    , GeometryOption (..)
    , applyGeometry
    ) where
  
  import Text.LaTeX
  import Text.LaTeX.Base.Syntax
  import Text.LaTeX.Base.Class
  
  -- | Geometry package. Use it to import it like this:
  --
  -- > usepackage [] geometry
  --
  -- In most cases, it is recommended to use 'importGeometry' instead.
  geometry :: PackageName
  geometry = "geometry"
  
  -- | Options of the geometry package.
  data GeometryOption = 
      GHeight Measure
    | GWidth  Measure
    | GPaper PaperType
    | GCentered
    | GPaperHeight Measure
    | GPaperWidth Measure
    | GLandscape Bool
      deriving Show
  
  renderOption :: Render a => Text -> a -> Text
  renderOption t x = t <> "=" <> render x
  
  instance Render GeometryOption where
    render (GHeight m) = renderOption "height" m
    render (GWidth  m) = renderOption "width"  m
    render (GPaper  p) = render (Paper p)
    render GCentered   = "centered"
    render (GPaperHeight m) = renderOption "paperheight" m
    render (GPaperWidth m) = renderOption "paperwidth" m
    render (GLandscape b) = renderOption "landscape" b
  
  -- | Apply the given geometry options to the document.
  applyGeometry :: LaTeXC l => [GeometryOption] -> l
  applyGeometry opts = fromLaTeX $ TeXComm "geometry" [FixArg $ raw $ renderCommas opts]
  
  -- | Import the geometry package with additional options.
  importGeometry :: LaTeXC l => [GeometryOption] -> l
  importGeometry opts = usepackage (fmap rendertex opts) geometry
  