content: 
  {-# LANGUAGE OverloadedStrings #-}
  
  -- | Some types shared along the library.
  module Text.LaTeX.Base.Types (
     ClassName
   , PackageName
   , PageStyle
   , Label
   , createLabel , labelName
   , Pos (..) , HPos (..)
   , TableSpec (..)
   , Measure (..)
   ) where
  
  import Text.LaTeX.Base.Syntax
  import Text.LaTeX.Base.Render
  
  -- | Class names are represented by a 'String'.
  type ClassName = String
  
  -- | Package names are represented by a 'String'.
  type PackageName = String
  
  -- | Page styles are represented by a 'String'.
  type PageStyle = String
  
  -- | Type of labels.
  newtype Label = Label String deriving (Eq, Show)
  
  -- | Create a label from its name.
  createLabel :: String -> Label
  createLabel = Label
  
  -- | Get the name of a label.
  labelName :: Label -> String
  labelName (Label str) = str
  
  instance Render Label where
      render (Label str) = fromString str
  
  instance IsString Label where
      fromString = createLabel
  
  -- | Vertical position. 'Here' and 'ForcePos' are used with @table@ environments.
  data Pos = Bottom | Center | Top | Here | ForcePos deriving Show
  
  instance Render Pos where
   render Bottom   = "b"
   render Center   = "c"
   render Top      = "t"
   render Here     = "h"
   render ForcePos = "!"
  
  -- | Horizontal position.
  data HPos = HLeft | HCenter | HRight deriving Show
  
  instance Render HPos where
   render HLeft   = "l"
   render HCenter = "c"
   render HRight  = "r"
  
  -- | Type of table specifications.
  data TableSpec =
     LeftColumn         -- ^ Left-justified column.
   | CenterColumn       -- ^ Centered column.
   | RightColumn        -- ^ Right-justified column.
   | ParColumnTop LaTeX -- ^ Paragraph column with text vertically aligned at the top.
   | ParColumnMid LaTeX -- ^ Paragraph column with text vertically aligned at the middle. Requires 'array' package.
   | ParColumnBot LaTeX -- ^ Paragraph column with text vertically aligned at the bottom. Requires 'array' package.
   | NameColumn String  -- ^ User defined column. Requires 'array' package.
   | BeforeColumn LaTeX -- ^ Can be used before a 'LeftColumn', 'CenterColumn', 'RightColumn', 'ParColumnTop', 'ParColumnMid' or a 'ParColumnBot' specification. Inserts the code directly in front of the entry of the column. Requires 'array' package.
   | AfterColumn LaTeX  -- ^ Can be used after a 'LeftColumn', 'CenterColumn', 'RightColumn', 'ParColumnTop', 'ParColumnMid' or a 'ParColumnBot' specification. Inserts the code directly in front of the entry of the column. Requires 'array' package.
   | VerticalLine       -- ^ Vertical line between two columns.
   | DVerticalLine      -- ^ Double vertical line between two columns.
   | Separator LaTeX    -- ^ Column separator. Requires 'array' package.
     deriving Show
  
  instance Render TableSpec where
   render LeftColumn       = "l"
   render CenterColumn     = "c"
   render RightColumn      = "r"
   render (ParColumnTop l) = "p" <> render (FixArg l)
   render (ParColumnMid l) = "m" <> render (FixArg l)
   render (ParColumnBot l) = "b" <> render (FixArg l)
   render (NameColumn n)   = fromString n
   render (BeforeColumn l) = ">{" <> render l <> "}"
   render (AfterColumn l)  = "<{" <> render l <> "}"
   render VerticalLine     = "|"
   render DVerticalLine    = "||"
   render (Separator l)    = "@" <> render (FixArg l)
  