content: 
  {-# LANGUAGE OverloadedStrings #-}
  
  module Text.LaTeX.Packages.TabularX
   ( -- * tabularx package
     tabularxp
     -- * tabularx commands
   , tabularx
   ) where
  
  import Text.LaTeX.Base.Syntax (LaTeX(TeXEnv, TeXRaw), TeXArg(FixArg, OptArg))
  import Text.LaTeX.Base.Class (LaTeXC, liftL)
  import Text.LaTeX.Base.Render (render, renderAppend)
  import Text.LaTeX.Base.Types (PackageName, Pos, TableSpec, Measure)
  
  -- | tabularx package. Use it to import it like this:
  --
  -- > usepackage [] tabularxp
  tabularxp :: PackageName
  tabularxp = "tabularx"
  
  -- | The 'tabularx' environment takes the same arguments as tabular*,
  -- but modifies the widths of certain columns, rather than the inter
  -- column space, to set a table with the requested total width. The
  -- columns that may stretch are marked with the new token X in the
  -- preamble argument.
  --
  tabularx :: LaTeXC l =>
              Measure      -- ^ Width of the whole tabular.
           -> Maybe Pos   -- ^ This optional parameter can be used to specify the vertical position of the table.
                          --   Defaulted to 'Center'.
           -> [TableSpec] -- ^ Table specification of columns and vertical lines.
           -> l           -- ^ Table content. See '&', 'lnbk', 'hline' and 'cline'.
           -> l           -- ^ Resulting table syntax.
  tabularx width maybePos ts =
    liftL $ TeXEnv "tabularx" args
    where
      width' = FixArg $ TeXRaw $ render width
      ts' = FixArg $ TeXRaw $ renderAppend ts
      args = case maybePos of
               Nothing -> [width', ts']
               Just p -> [width', p', ts']
                 where
                   p' = OptArg $ TeXRaw $ render p
  