diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,22 @@
 
-# From 3.13.0.1 to 3.13.1.0
+# HaTeX Changelog
+
+This is the logchange of HaTeX. It might not be exhaustive.
+For a full list of changes, see the commit history of the
+git repository:
+
+https://github.com/Daniel-Diaz/HaTeX/commits/master
+
+# Changelog by versions
+
+## From 3.13.1.0 to 3.14.0.0
+
+* Fixed link in cabal file.
+* Added support for arguments delimited by parenthesis (experimental).
+* More tests on parsing.
+* Parser now backtracks when failing in argument parsing.
+
+## From 3.13.0.1 to 3.13.1.0
 
 * New function ``matrixTabular`` to create tables from matrices.
 * Modified LaTeX Monoid instance to make monoid laws hold.
diff --git a/Examples/beamer.hs b/Examples/beamer.hs
--- a/Examples/beamer.hs
+++ b/Examples/beamer.hs
@@ -1,38 +1,38 @@
-
-{-# LANGUAGE OverloadedStrings #-}
-
-import Text.LaTeX
-import Text.LaTeX.Packages.Beamer
-import Text.LaTeX.Packages.Inputenc
-
-main :: IO ()
-main = execLaTeXT beamerExample >>= renderFile "beamer.tex"
-
-beamerExample :: Monad m => LaTeXT_ m
-beamerExample = thePreamble >> document theBody
-
-thePreamble :: Monad m => LaTeXT_ m
-thePreamble = do
- -- To start using beamer, set the document class to be 'beamer'.
- documentclass [] beamer
- usepackage [utf8] inputenc
- author "Daniel Díaz"
- title "Beamer example using HaTeX"
- -- Use a theme to improve the aspect of your slides.
- usetheme CambridgeUS
-
-theBody :: Monad m => LaTeXT_ m
-theBody = do
- -- Each slide is a call to the function 'frame' with the content of the slide.
- frame maketitle
- frame $ do
-  frametitle "Example with block"
-  "Here comes "
-  alert [FromSlide 2] "the block!"
-  uncover [FromSlide 5] " Ha! I was hiding here!"
-  pause
-  pause
-  block "The block" $ do
-   pause
-   "The content of the block appears after a pause."
-  uncover [FromSlide 6] $ center "And that's it!"
+
+{-# LANGUAGE OverloadedStrings #-}
+
+import Text.LaTeX
+import Text.LaTeX.Packages.Beamer
+import Text.LaTeX.Packages.Inputenc
+
+main :: IO ()
+main = execLaTeXT beamerExample >>= renderFile "beamer.tex"
+
+beamerExample :: Monad m => LaTeXT_ m
+beamerExample = thePreamble >> document theBody
+
+thePreamble :: Monad m => LaTeXT_ m
+thePreamble = do
+ -- To start using beamer, set the document class to be 'beamer'.
+ documentclass [] beamer
+ usepackage [utf8] inputenc
+ author "Daniel Díaz"
+ title "Beamer example using HaTeX"
+ -- Use a theme to improve the aspect of your slides.
+ usetheme CambridgeUS
+
+theBody :: Monad m => LaTeXT_ m
+theBody = do
+ -- Each slide is a call to the function 'frame' with the content of the slide.
+ frame maketitle
+ frame $ do
+  frametitle "Example with block"
+  "Here comes "
+  alert [FromSlide 2] "the block!"
+  uncover [FromSlide 5] " Ha! I was hiding here!"
+  pause
+  pause
+  block "The block" $ do
+   pause
+   "The content of the block appears after a pause."
+  uncover [FromSlide 6] $ center "And that's it!"
diff --git a/Examples/comments.hs b/Examples/comments.hs
--- a/Examples/comments.hs
+++ b/Examples/comments.hs
@@ -1,18 +1,18 @@
-{-# LANGUAGE OverloadedStrings #-}
-
-import Text.LaTeX
-
-main :: IO ()
-main = execLaTeXT example >>= renderFile "Comments.tex"
-
-example :: Monad m => LaTeXT_ m
-example = do
- documentclass [] article
- document exampleBody
-
-exampleBody :: Monad m => LaTeXT_ m
-exampleBody = do
- "This is a basic example for testing the "
- "comments functionality in HaTeX." %: "A short comment here."
- "Multi-line comments are separated by lines." %: "First line.\nSecond line."
- "After a comment, the following code will start in a new line of the output."
+{-# LANGUAGE OverloadedStrings #-}
+
+import Text.LaTeX
+
+main :: IO ()
+main = execLaTeXT example >>= renderFile "Comments.tex"
+
+example :: Monad m => LaTeXT_ m
+example = do
+ documentclass [] article
+ document exampleBody
+
+exampleBody :: Monad m => LaTeXT_ m
+exampleBody = do
+ "This is a basic example for testing the "
+ "comments functionality in HaTeX." %: "A short comment here."
+ "Multi-line comments are separated by lines." %: "First line.\nSecond line."
+ "After a comment, the following code will start in a new line of the output."
diff --git a/Examples/fibs.hs b/Examples/fibs.hs
--- a/Examples/fibs.hs
+++ b/Examples/fibs.hs
@@ -1,34 +1,34 @@
-{-# LANGUAGE OverloadedStrings #-}
-
-import Text.LaTeX
-
-main :: IO ()
-main = execLaTeXT example >>= renderFile "Fibs.tex"
-
-example :: Monad m => LaTeXT_ m
-example = do
- documentclass [] article
- document exampleBody
-
-exampleBody :: Monad m => LaTeXT_ m
-exampleBody = do
- "This is an example of how "
- hatex3
- " works, printing a table of "
- "the thirteen first elements of the "
- "Fibonacci sequence."
- bigskip
- center $ underline $ textbf "Fibonacci table"
- center $ tabular Nothing [RightColumn,VerticalLine,LeftColumn] $ do
-   textbf "Fibonacci number" & textbf "Value"
-   lnbk
-   hline
-   foldr (\n l -> do texy n & texy (fib n)
-                     lnbk
-                     l ) (return ()) [0 .. 12]
-
-fibs :: [Int]
-fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
-
-fib :: Int -> Int
-fib = (fibs!!)
+{-# LANGUAGE OverloadedStrings #-}
+
+import Text.LaTeX
+
+main :: IO ()
+main = execLaTeXT example >>= renderFile "Fibs.tex"
+
+example :: Monad m => LaTeXT_ m
+example = do
+ documentclass [] article
+ document exampleBody
+
+exampleBody :: Monad m => LaTeXT_ m
+exampleBody = do
+ "This is an example of how "
+ hatex3
+ " works, printing a table of "
+ "the thirteen first elements of the "
+ "Fibonacci sequence."
+ bigskip
+ center $ underline $ textbf "Fibonacci table"
+ center $ tabular Nothing [RightColumn,VerticalLine,LeftColumn] $ do
+   textbf "Fibonacci number" & textbf "Value"
+   lnbk
+   hline
+   foldr (\n l -> do texy n & texy (fib n)
+                     lnbk
+                     l ) (return ()) [0 .. 12]
+
+fibs :: [Int]
+fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
+
+fib :: Int -> Int
+fib = (fibs!!)
diff --git a/Examples/matrices.hs b/Examples/matrices.hs
--- a/Examples/matrices.hs
+++ b/Examples/matrices.hs
@@ -1,22 +1,22 @@
-
-import Text.LaTeX
-import Text.LaTeX.Packages.AMSMath
-
-import Data.Matrix
-
-main :: IO ()
-main = execLaTeXT matrices >>= renderFile "matrices.tex"
-
-matrices :: Monad m => LaTeXT_ m
-matrices = do
- thePreamble
- document theBody
-
-thePreamble :: Monad m => LaTeXT_ m
-thePreamble = do
- documentclass [] article
- -- You need to import 'amsmath' to use 'pmatrix'.
- usepackage [] amsmath
-
-theBody :: Monad m => LaTeXT_ m
-theBody = equation_ $ pmatrix Nothing $ (identity 5 :: Matrix Int)
+
+import Text.LaTeX
+import Text.LaTeX.Packages.AMSMath
+
+import Data.Matrix
+
+main :: IO ()
+main = execLaTeXT matrices >>= renderFile "matrices.tex"
+
+matrices :: Monad m => LaTeXT_ m
+matrices = do
+ thePreamble
+ document theBody
+
+thePreamble :: Monad m => LaTeXT_ m
+thePreamble = do
+ documentclass [] article
+ -- You need to import 'amsmath' to use 'pmatrix'.
+ usepackage [] amsmath
+
+theBody :: Monad m => LaTeXT_ m
+theBody = equation_ $ pmatrix Nothing $ (identity 5 :: Matrix Int)
diff --git a/Examples/simple.hs b/Examples/simple.hs
--- a/Examples/simple.hs
+++ b/Examples/simple.hs
@@ -1,45 +1,45 @@
-
-{- Simple example
-
-This example is intended to be as simple as possible, but containing the most significant parts.
-
-The Overloaded Strings language extension is quite handy because it allows you to write text without
-using 'fromString' everywhere.
-
--}
-
-{-# LANGUAGE OverloadedStrings #-}
-
-import Text.LaTeX
-
--- By executing 'execLaTeXT' you run the 'LaTeXT' monad and make a 'LaTeX' value as output.
--- With 'renderFile' you render it to 'Text' and write it in a file.
-main :: IO ()
-main = execLaTeXT simple >>= renderFile "simple.tex"
-
--- It's a good idea to separate the preamble of the body.
-simple :: Monad m => LaTeXT_ m
-simple = do
- thePreamble
- document theBody
-
--- Preamble with some basic info.
-thePreamble :: Monad m => LaTeXT_ m
-thePreamble = do
- documentclass [] article
- author "Daniel Diaz"
- title "Simple example"
-
--- Body with a section.
-theBody :: Monad m => LaTeXT_ m
-theBody = do
- maketitle
- section "Hello"
- "This is a simple example using the "
- hatex
- " library. "
- -- 'textbf' turns characters to bold font (as you already may know).
- textbf "Enjoy!"
- " "
- -- This is how we nest commands.
- textbf (large "Yoohoo!")
+
+{- Simple example
+
+This example is intended to be as simple as possible, but containing the most significant parts.
+
+The Overloaded Strings language extension is quite handy because it allows you to write text without
+using 'fromString' everywhere.
+
+-}
+
+{-# LANGUAGE OverloadedStrings #-}
+
+import Text.LaTeX
+
+-- By executing 'execLaTeXT' you run the 'LaTeXT' monad and make a 'LaTeX' value as output.
+-- With 'renderFile' you render it to 'Text' and write it in a file.
+main :: IO ()
+main = execLaTeXT simple >>= renderFile "simple.tex"
+
+-- It's a good idea to separate the preamble of the body.
+simple :: Monad m => LaTeXT_ m
+simple = do
+ thePreamble
+ document theBody
+
+-- Preamble with some basic info.
+thePreamble :: Monad m => LaTeXT_ m
+thePreamble = do
+ documentclass [] article
+ author "Daniel Diaz"
+ title "Simple example"
+
+-- Body with a section.
+theBody :: Monad m => LaTeXT_ m
+theBody = do
+ maketitle
+ section "Hello"
+ "This is a simple example using the "
+ hatex
+ " library. "
+ -- 'textbf' turns characters to bold font (as you already may know).
+ textbf "Enjoy!"
+ " "
+ -- This is how we nest commands.
+ textbf (large "Yoohoo!")
diff --git a/Examples/tree.hs b/Examples/tree.hs
--- a/Examples/tree.hs
+++ b/Examples/tree.hs
@@ -1,41 +1,41 @@
-
-{-# LANGUAGE OverloadedStrings #-}
-
-import Text.LaTeX.Base
-import Text.LaTeX.Packages.Trees.Qtree
-import Text.LaTeX.Packages.Inputenc
-
-treeExample1 :: Tree String
-treeExample1 = Node (Just "Root") [Leaf "Leaf 1",Leaf "Leaf 2"]
-
-treeExample2 :: Tree Int
-treeExample2 = Node (Just 0) [Node Nothing [Leaf 1,Leaf 2] , Leaf 3]
-
-treeExample3 :: Tree LaTeX
-treeExample3 = Node (Just $ textbf $ textit "Bold and italic")
-                  [ Leaf $ textbf "Bold"
-                  , Leaf $ textit "Italic"
-                    ]
-
--- Main
-
-main :: IO ()
-main = renderFile "tree.tex" example
-
-example :: LaTeX
-example = thePreamble <> document theBody
-
-thePreamble :: LaTeX
-thePreamble =
-    documentclass [] article
- <> usepackage [] qtree
- <> usepackage [utf8] inputenc
- <> title "Examples with trees"
- <> author "Daniel Díaz"
-
-theBody :: LaTeX
-theBody =
-    maketitle
- <> tree fromString treeExample1
- <> rendertree treeExample2
+
+{-# LANGUAGE OverloadedStrings #-}
+
+import Text.LaTeX.Base
+import Text.LaTeX.Packages.Trees.Qtree
+import Text.LaTeX.Packages.Inputenc
+
+treeExample1 :: Tree String
+treeExample1 = Node (Just "Root") [Leaf "Leaf 1",Leaf "Leaf 2"]
+
+treeExample2 :: Tree Int
+treeExample2 = Node (Just 0) [Node Nothing [Leaf 1,Leaf 2] , Leaf 3]
+
+treeExample3 :: Tree LaTeX
+treeExample3 = Node (Just $ textbf $ textit "Bold and italic")
+                  [ Leaf $ textbf "Bold"
+                  , Leaf $ textit "Italic"
+                    ]
+
+-- Main
+
+main :: IO ()
+main = renderFile "tree.tex" example
+
+example :: LaTeX
+example = thePreamble <> document theBody
+
+thePreamble :: LaTeX
+thePreamble =
+    documentclass [] article
+ <> usepackage [] qtree
+ <> usepackage [utf8] inputenc
+ <> title "Examples with trees"
+ <> author "Daniel Díaz"
+
+theBody :: LaTeX
+theBody =
+    maketitle
+ <> tree fromString treeExample1
+ <> rendertree treeExample2
  <> tree id treeExample3
diff --git a/HaTeX.cabal b/HaTeX.cabal
--- a/HaTeX.cabal
+++ b/HaTeX.cabal
@@ -1,5 +1,5 @@
 Name: HaTeX
-Version: 3.13.1.0
+Version: 3.14.0.0
 Author: Daniel Díaz
 Category: Text, LaTeX
 Build-type: Simple
@@ -27,7 +27,7 @@
              Browse the @examples@ directory in the source distribution to see some simple examples.
              It might help you to get started. The HaTeX User's Guide is available at
              <https://github.com/Daniel-Diaz/hatex-guide/blob/master/README.md>.
-             We also have a mailing list (http://projects.haskell.org/cgi-bin/mailman/listinfo/hatex)
+             We also have a mailing list (<http://projects.haskell.org/cgi-bin/mailman/listinfo/hatex>)
              and an IRC channel (@#hatex@). If you just want to read a short introduction, read
              the "Text.LaTeX" module.
              .
@@ -121,3 +121,13 @@
                , tasty
                , QuickCheck
                , tasty-quickcheck
+  ghc-options: -Wall -fno-warn-orphans
+Test-Suite parser-tests
+  Default-language: Haskell2010
+  type: exitcode-stdio-1.0
+  hs-source-dirs: parsertest
+  main-is: parsertest.hs
+  build-depends: base == 4.*
+               , HaTeX
+               , text
+  ghc-options: -Wall
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,68 +1,66 @@
-# The HaTeX library
-
-HaTeX is a Haskell library that implements the *LaTeX syntax*.
-
-Check a list of examples of usage in the [Examples](https://github.com/Daniel-Diaz/HaTeX/tree/master/Examples) directory.
-A good starting point may be [simple.hs](https://github.com/Daniel-Diaz/HaTeX/blob/master/Examples/simple.hs).
-Run any example script executing the ``main`` function.
-
-## Installation notes
-
-To install `HaTeX`, use [cabal-install](http://hackage.haskell.org/package/cabal-install).
-
-    $ cabal update
-    $ cabal install HaTeX
-
-This will install the latest official release (recommended).
-If you want to try a newer version, use _git_ to clone the code contained
-in this repository.
-
-    $ git clone git@github.com:Daniel-Diaz/HaTeX.git
-    $ cd HaTeX
-    $ cabal install
-
-However, note that the API may be unstable and is subject to any kind of change.
-In the other hand, this package follows the [_Package Versioning Policy_](http://www.haskell.org/haskellwiki/Package_versioning_policy),
-so it is unlikely to suffer from API breakages if you follow it too when importing the library.
-
-See the [Hackage page of HaTeX](http://hackage.haskell.org/package/HaTeX) to browse older versions.
-
-## Travis automatic build
-
-[![Build Status](https://travis-ci.org/Daniel-Diaz/HaTeX.png?branch=master)](https://travis-ci.org/Daniel-Diaz/HaTeX)
-
-## HaTeX User's Guide
-
-The HaTeX User's Guide lives [here](https://github.com/Daniel-Diaz/hatex-guide)... and is also done in Haskell!
-It is free source and anybody can contribute to it. Doing so, you will help current and future users!
-
-A downloadable version (not necessarily the last version, but most likely)
-can be found [here](http://daniel-diaz.github.com/projects/hatex/hatex-guide.pdf).
-To be sure that you are reading the last version, go to the github repository of the guide and follow instructions
-to build it. It is fairly easy.
-
-## Community and Contributions
-
-There are many ways to get involved in the HaTeX project.
-
-* Fork the [GitHub repository](https://github.com/Daniel-Diaz/HaTeX).
-* Report bugs or make suggestions opening a ticket in the [Issue Tracker](https://github.com/Daniel-Diaz/HaTeX/issues).
-* Help us to improve and extend our [hatex-guide](https://github.com/Daniel-Diaz/hatex-guide).
-* Join the [Mailing List](http://projects.haskell.org/cgi-bin/mailman/listinfo/hatex) for help or announcements of the
-last developments.
-* Drop by the IRC channel at `#hatex`.
-
-## TODO list
-
-* Add more examples.
-* More testing on the parser (See [#15](https://github.com/Daniel-Diaz/HaTeX/issues/15)).
-  This includes adding more test cases to the [parsertest folder](https://github.com/Daniel-Diaz/HaTeX/tree/master/parsertest).
-* Add more documentation.
-* BibTeX support.
-
-## Related projects
-
-* [TeX-my-math](https://github.com/leftaroundabout/Symbolic-math-HaTeX): Experimental library to ease the production
-of mathematical expressions using HaTeX.
-* [haskintex](http://daniel-diaz.github.io/projects/haskintex): Tool to use Haskell and in particular the HaTeX library
-within a LaTeX file.
+# The HaTeX library
+
+HaTeX is a Haskell library that implements the *LaTeX syntax*.
+
+Check a list of examples of usage in the [Examples](https://github.com/Daniel-Diaz/HaTeX/tree/master/Examples) directory.
+A good starting point may be [simple.hs](https://github.com/Daniel-Diaz/HaTeX/blob/master/Examples/simple.hs).
+Run any example script executing the ``main`` function.
+
+## Installation notes
+
+To install `HaTeX`, use [cabal-install](http://hackage.haskell.org/package/cabal-install).
+
+    $ cabal update
+    $ cabal install HaTeX
+
+This will install the latest official release (recommended).
+If you want to try a newer version, use _git_ to clone the code contained
+in this repository.
+
+    $ git clone git@github.com:Daniel-Diaz/HaTeX.git
+    $ cd HaTeX
+    $ cabal install
+
+However, note that the API may be unstable and is subject to any kind of change.
+In the other hand, this package follows the [_Package Versioning Policy_](http://www.haskell.org/haskellwiki/Package_versioning_policy),
+so it is unlikely to suffer from API breakages if you follow it too when importing the library.
+
+See the [Hackage page of HaTeX](http://hackage.haskell.org/package/HaTeX) to browse older versions.
+
+## Travis automatic build
+
+[![Build Status](https://travis-ci.org/Daniel-Diaz/HaTeX.png?branch=master)](https://travis-ci.org/Daniel-Diaz/HaTeX)
+
+## HaTeX User's Guide
+
+The HaTeX User's Guide lives [here](https://github.com/Daniel-Diaz/hatex-guide)... and is also done in Haskell!
+It is free source and anybody can contribute to it. Doing so, you will help current and future users!
+
+A downloadable version (not necessarily the last version, but most likely)
+can be found [here](http://daniel-diaz.github.com/projects/hatex/hatex-guide.pdf).
+To be sure that you are reading the last version, go to the github repository of the guide and follow instructions
+to build it. It is fairly easy.
+
+## Community and Contributions
+
+There are many ways to get involved in the HaTeX project.
+
+* Fork the [GitHub repository](https://github.com/Daniel-Diaz/HaTeX).
+* Report bugs or make suggestions opening a ticket in the [Issue Tracker](https://github.com/Daniel-Diaz/HaTeX/issues).
+* Help us to improve and extend our [hatex-guide](https://github.com/Daniel-Diaz/hatex-guide).
+* Join the [Mailing List](http://projects.haskell.org/cgi-bin/mailman/listinfo/hatex) for help or announcements of the
+latest developments.
+* Drop by the IRC channel at `#hatex`.
+
+## TODO list
+
+* Add more examples.
+* Add more documentation.
+* BibTeX support.
+
+## Related projects
+
+* [TeX-my-math](https://github.com/leftaroundabout/Symbolic-math-HaTeX): Experimental library to ease the production
+of mathematical expressions using HaTeX.
+* [haskintex](http://daniel-diaz.github.io/projects/haskintex): Tool to use Haskell and in particular the HaTeX library
+within a LaTeX file.
diff --git a/ReleaseNotes b/ReleaseNotes
--- a/ReleaseNotes
+++ b/ReleaseNotes
@@ -1,91 +1,91 @@
-HaTeX Release Notes
--- From version 3.0.0
-
->>> 3.4
-
-- Num instance for LaTeXT.
-- New re-exports: liftIO.
-- Relaxed transformers package dependency to: >= 0.2.2 && < 0.4
-- Changed infix rule of (=:) and (/=:).
-- More documentation notes.
-- New functions: hfill, vfill.
-- The internal representation of LaTeXT has changed to prevent
-  a set of errors.
-- Changes in Text.LaTeX.
-- Several minor fixes.
-
->>> 3.3
-
-- New functions 'protectString' and 'protectText'.
-- New function 'rendertexM'.
-- New environments: 'figure' and 'caption'.
-- New example: simple.hs.
-- Updated version of transfomers to 0.3.*.
-- Trees implemented: datatype and Qtree package.
-- Render instances for Integer and Double.
-- New docs.
-- Class system implemented. Monad modules dropped.
-
->>> 3.2.0.1
-
-- This version only fix the patch that makes HaTeX compatible with GHC 7.4.
-
->>> 3.2
-
-Highlights:
-
-+ Parser implemented (New dependency on parsec).
-+ Greek alphabet added to AMSMath.
-+ New LaTeX package: graphicx.
-+ Function 'documentclass' changed.
-
-Other changes:
-
-- Dependency changed from mtl to transformers.
-- New commands: par, textwidth and linewidth.
-- New environment: minipage.
-- Compatibility with GHC 7.4 (with CPP extension).
-- Function 'lift' is now re-exported in Text.LaTeX.Base.Writer module.
-- New function 'renderChars' in the Render module.
-- ReadMe edited, now with ToDo list.
-
->>> 3.1.1
-
-- Dependency relaxed from 'mtl == 2.*' to 'transformers == 0.2.*'.
-
->>> 3.1.0
-
-Highlights:
-
-+ Added warnings (See Text.LaTeX.Base.Warnings).
-+ Added an "Examples" directory.
-+ Num instance for LaTeX and LaTeXT.
-+ New package implemented "AMSThm" (See Text.LaTeX.Packages.AMSThm).
-
-Changes by modules:
-
-** Base modules
-* Text.LaTeX.Base.Syntax:
--- Added Eq instance to LaTeX and TeXArg.
-* Text.LaTeX.Base.Writer:
--- Added MonadTrans instance to LaTeXT.
--- New functions: execLaTeXTWarn, liftFun, liftOp.
-* Text.LaTeX.Base.Types:
--- Added Eq instance to Label.
-* Text.LaTeX.Base:
--- Added Num instance to LaTeX.
-* Text.LaTeX.Base.Monad:
--- Added Num instance to LaTeXT.
-* Text.LaTeX.Base.Commands:
--- New function: between.
-
-** Package modules:
-* Text.LaTeX.Packages.AMSMath
--- New symbols: (=:) , (/=:) , forall
-              , dagger, ddagger, in_ , ni
-              , (<:) , (<=:)
-              , (>:) , (>=:)
-
->>> 3.0.0
-
-* First release of the third version of HaTeX.
+HaTeX Release Notes
+-- From version 3.0.0
+
+>>> 3.4
+
+- Num instance for LaTeXT.
+- New re-exports: liftIO.
+- Relaxed transformers package dependency to: >= 0.2.2 && < 0.4
+- Changed infix rule of (=:) and (/=:).
+- More documentation notes.
+- New functions: hfill, vfill.
+- The internal representation of LaTeXT has changed to prevent
+  a set of errors.
+- Changes in Text.LaTeX.
+- Several minor fixes.
+
+>>> 3.3
+
+- New functions 'protectString' and 'protectText'.
+- New function 'rendertexM'.
+- New environments: 'figure' and 'caption'.
+- New example: simple.hs.
+- Updated version of transfomers to 0.3.*.
+- Trees implemented: datatype and Qtree package.
+- Render instances for Integer and Double.
+- New docs.
+- Class system implemented. Monad modules dropped.
+
+>>> 3.2.0.1
+
+- This version only fix the patch that makes HaTeX compatible with GHC 7.4.
+
+>>> 3.2
+
+Highlights:
+
++ Parser implemented (New dependency on parsec).
++ Greek alphabet added to AMSMath.
++ New LaTeX package: graphicx.
++ Function 'documentclass' changed.
+
+Other changes:
+
+- Dependency changed from mtl to transformers.
+- New commands: par, textwidth and linewidth.
+- New environment: minipage.
+- Compatibility with GHC 7.4 (with CPP extension).
+- Function 'lift' is now re-exported in Text.LaTeX.Base.Writer module.
+- New function 'renderChars' in the Render module.
+- ReadMe edited, now with ToDo list.
+
+>>> 3.1.1
+
+- Dependency relaxed from 'mtl == 2.*' to 'transformers == 0.2.*'.
+
+>>> 3.1.0
+
+Highlights:
+
++ Added warnings (See Text.LaTeX.Base.Warnings).
++ Added an "Examples" directory.
++ Num instance for LaTeX and LaTeXT.
++ New package implemented "AMSThm" (See Text.LaTeX.Packages.AMSThm).
+
+Changes by modules:
+
+** Base modules
+* Text.LaTeX.Base.Syntax:
+-- Added Eq instance to LaTeX and TeXArg.
+* Text.LaTeX.Base.Writer:
+-- Added MonadTrans instance to LaTeXT.
+-- New functions: execLaTeXTWarn, liftFun, liftOp.
+* Text.LaTeX.Base.Types:
+-- Added Eq instance to Label.
+* Text.LaTeX.Base:
+-- Added Num instance to LaTeX.
+* Text.LaTeX.Base.Monad:
+-- Added Num instance to LaTeXT.
+* Text.LaTeX.Base.Commands:
+-- New function: between.
+
+** Package modules:
+* Text.LaTeX.Packages.AMSMath
+-- New symbols: (=:) , (/=:) , forall
+              , dagger, ddagger, in_ , ni
+              , (<:) , (<=:)
+              , (>:) , (>=:)
+
+>>> 3.0.0
+
+* First release of the third version of HaTeX.
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,3 +1,3 @@
-import Distribution.Simple
-
+import Distribution.Simple
+
 main = defaultMain
diff --git a/Text/LaTeX.hs b/Text/LaTeX.hs
--- a/Text/LaTeX.hs
+++ b/Text/LaTeX.hs
@@ -1,102 +1,102 @@
-
--- | This module is a re-export of the Base module.
---   You may find it shorter to import. Below you can
---   also find a short overview of HaTeX.
---
---   Historically, this module also exported the Packages
---   module. But, since it's more common to import the Base
---   module and, then, only the packages you need (instead
---   of all of them), this module has been upgraded supporting
---   it.
---
---   For this reason, the module @Text.LaTeX.Packages@ no longer
---   exists.
-module Text.LaTeX
- ( -- * Base module re-export
-   module Text.LaTeX.Base
-   -- * An overview of HaTeX
-
-   -- $ove
-
-   -- ** The @LaTeX@ type
-
-   -- $type
-
-   -- ** Rendering LaTeX code
-
-   -- $rnd
-
-   -- ** Using more features
-
-   -- $pkgs
-
-   -- ** More from HaTeX
-
-   -- $bey
-
-   -- ** Using monads
-
-   -- $wrt
-
-   -- ** Examples
-
-   -- $exm
-   ) where
-
-import Text.LaTeX.Base
-
--- $ove
--- HaTeX is a library that implements the LaTeX syntax for both rendering and parsing.
-
-{- $type
-The core type is called 'LaTeX'. Values of this type are always a syntactically correct
-piece of LaTeX code, which we call a LaTeX /block/. To append blocks, we use the 'Monoid'
-class. Thus, the operator '<>' appends blocks. To generate blocks, we use functions.
-Basic functions are defined in the "Text.LaTeX.Base.Commands" module. Roughly speaking,
-it contains functions to generate blocks containing LaTeX commands and environments that
-are always defined. In the other hand, 'LaTeX' is an instance of the 'IsString' class.
-This allow us to insert LaTeX code containing simple text by just writing it as a 'String'
-and enabling the @OverlaodedStrings@ language extension.
--}
-
-{- $rnd
-Once you have a 'LaTeX' block built, the function 'render' will turn it into 'Text'. If
-your intention is to write the output in a file, use 'renderFile' to write the LaTeX
-code output directly into that file.
--}
-
-{- $pkgs
-Apart from the core commands and environments, HaTeX offers more functions to generate LaTeX
-blocks containing more exotic things. These functions are categorized by LaTeX packages. For example,
-those commands and environments that come from the LaTeX @babel@ package are under the module
-"Text.LaTeX.Packages.Babel", and those that come from the @graphicx@ package are under "Text.LaTeX.Packages.Graphicx".
-Import each package individually to use them.
-This way, is easier to guess where to look for a particular function, and easier to detect
-if a particular feature is missing.
--}
-
-{- $bey
-Beyond the implementation of existing LaTeX packages,
-HaTeX also provides some useful functions to build LaTeX code blocks from Haskell values.
-The Texy class allows you to pretty-print Haskell values to LaTeX blocks. This includes numbers, matrices,
-vectors or trees. HaTeX also features some modules dedicated to the generation of TikZ scripts
-(see "Text.LaTeX.Packages.TikZ.Simple").
-Everything you need to generate LaTeX code using Haskell should be included in this library.
-If some feature is missing, the GitHub issue list is waiting for you <https://github.com/Daniel-Diaz/HaTeX/issues>.
--}
-
-{- $wrt
-LaTeX blocks can also be managed by the 'LaTeXT' monad transformer. Similar to the 'WriterT' monad,
-it stores and append values from a 'Monoid', in this case, the 'Monoid' of the 'LaTeX' values.
-Both interfaces are fused into one under the 'LaTeXC' class, the class of LaTeX blocks.
-Particular documentation of each feature can be found in the corresponding module.
-Further explanation of the library and its concepts can be found in the /HaTeX User's Guide/
-(<https://github.com/Daniel-Diaz/hatex-guide/blob/master/README.md>).
--}
-
-{- $exm
-Some examples can be found in the source code, under the /Examples/ directory. In particular, the example
-contained in the file @simple.hs@ is intended to be read by new users of the library.
-If you have any question regarding one of the examples, there is something you want to ask about
-HaTeX, or for anything you would like to discuss, we have a mailing list at <http://projects.haskell.org/cgi-bin/mailman/listinfo/hatex>.
--}
+
+-- | This module is a re-export of the Base module.
+--   You may find it shorter to import. Below you can
+--   also find a short overview of HaTeX.
+--
+--   Historically, this module also exported the Packages
+--   module. But, since it's more common to import the Base
+--   module and, then, only the packages you need (instead
+--   of all of them), this module has been upgraded supporting
+--   it.
+--
+--   For this reason, the module @Text.LaTeX.Packages@ no longer
+--   exists.
+module Text.LaTeX
+ ( -- * Base module re-export
+   module Text.LaTeX.Base
+   -- * An overview of HaTeX
+
+   -- $ove
+
+   -- ** The @LaTeX@ type
+
+   -- $type
+
+   -- ** Rendering LaTeX code
+
+   -- $rnd
+
+   -- ** Using more features
+
+   -- $pkgs
+
+   -- ** More from HaTeX
+
+   -- $bey
+
+   -- ** Using monads
+
+   -- $wrt
+
+   -- ** Examples
+
+   -- $exm
+   ) where
+
+import Text.LaTeX.Base
+
+-- $ove
+-- HaTeX is a library that implements the LaTeX syntax for both rendering and parsing.
+
+{- $type
+The core type is called 'LaTeX'. Values of this type are always a syntactically correct
+piece of LaTeX code, which we call a LaTeX /block/. To append blocks, we use the 'Monoid'
+class. Thus, the operator '<>' appends blocks. To generate blocks, we use functions.
+Basic functions are defined in the "Text.LaTeX.Base.Commands" module. Roughly speaking,
+it contains functions to generate blocks containing LaTeX commands and environments that
+are always defined. In the other hand, 'LaTeX' is an instance of the 'IsString' class.
+This allow us to insert LaTeX code containing simple text by just writing it as a 'String'
+and enabling the @OverlaodedStrings@ language extension.
+-}
+
+{- $rnd
+Once you have a 'LaTeX' block built, the function 'render' will turn it into 'Text'. If
+your intention is to write the output in a file, use 'renderFile' to write the LaTeX
+code output directly into that file.
+-}
+
+{- $pkgs
+Apart from the core commands and environments, HaTeX offers more functions to generate LaTeX
+blocks containing more exotic things. These functions are categorized by LaTeX packages. For example,
+those commands and environments that come from the LaTeX @babel@ package are under the module
+"Text.LaTeX.Packages.Babel", and those that come from the @graphicx@ package are under "Text.LaTeX.Packages.Graphicx".
+Import each package individually to use them.
+This way, is easier to guess where to look for a particular function, and easier to detect
+if a particular feature is missing.
+-}
+
+{- $bey
+Beyond the implementation of existing LaTeX packages,
+HaTeX also provides some useful functions to build LaTeX code blocks from Haskell values.
+The Texy class allows you to pretty-print Haskell values to LaTeX blocks. This includes numbers, matrices,
+vectors or trees. HaTeX also features some modules dedicated to the generation of TikZ scripts
+(see "Text.LaTeX.Packages.TikZ.Simple").
+Everything you need to generate LaTeX code using Haskell should be included in this library.
+If some feature is missing, the GitHub issue list is waiting for you <https://github.com/Daniel-Diaz/HaTeX/issues>.
+-}
+
+{- $wrt
+LaTeX blocks can also be managed by the 'LaTeXT' monad transformer. Similar to the 'WriterT' monad,
+it stores and append values from a 'Monoid', in this case, the 'Monoid' of the 'LaTeX' values.
+Both interfaces are fused into one under the 'LaTeXC' class, the class of LaTeX blocks.
+Particular documentation of each feature can be found in the corresponding module.
+Further explanation of the library and its concepts can be found in the /HaTeX User's Guide/
+(<https://github.com/Daniel-Diaz/hatex-guide/blob/master/README.md>).
+-}
+
+{- $exm
+Some examples can be found in the source code, under the /Examples/ directory. In particular, the example
+contained in the file @simple.hs@ is intended to be read by new users of the library.
+If you have any question regarding one of the examples, there is something you want to ask about
+HaTeX, or for anything you would like to discuss, we have a mailing list at <http://projects.haskell.org/cgi-bin/mailman/listinfo/hatex>.
+-}
diff --git a/Text/LaTeX/Base.hs b/Text/LaTeX/Base.hs
--- a/Text/LaTeX/Base.hs
+++ b/Text/LaTeX/Base.hs
@@ -1,59 +1,59 @@
-
-{-# LANGUAGE CPP #-}
-
-{- |
-This module exports those minimal things you need
-to work with HaTeX. Those things are:
-
-* The 'LaTeX' datatype.
-
-* The '<>' operator, to append 'LaTeX' values.
-
-* The "Text.LaTeX.Base.Render" module, to render a 'LaTeX' value into 'Text'.
-
-* The "Text.LaTeX.Base.Types" module, which contains several types used by
-  other modules.
-
-* The "Text.LaTeX.Base.Commands" module, which exports the LaTeX standard commands
-  and environments.
-
-* The "Text.LaTeX.Base.Writer" module, to work with the monad interface of the library.
-
-* The "Text.LaTeX.Base.Texy" module, which exports the 'Texy' class. Useful to pretty-print
-  values in LaTeX form.
-
--}
-module Text.LaTeX.Base
- ( -- * @LaTeX@ datatype
-   LaTeX
-   -- * Escaping reserved characters
- , protectString , protectText
-   -- * Internal re-exports
- , module Text.LaTeX.Base.Render
- , module Text.LaTeX.Base.Types
- , module Text.LaTeX.Base.Commands
- , module Text.LaTeX.Base.Writer
- , module Text.LaTeX.Base.Texy
-   -- * Monoids
-   --
-   -- | Since the 'Monoid' instance is the only way to append 'LaTeX'
-   --   values, a re-export of the 'Monoid' class is given here for convenience.
- , Monoid (..)
- , (<>)
-   ) where
-
--- Internal modules
-import Text.LaTeX.Base.Syntax
-  ( LaTeX
-#if __GLASGOW_HASKELL__ < 704
-  , (<>)
-#endif
-  , protectString
-  , protectText)
-import Text.LaTeX.Base.Render
-import Text.LaTeX.Base.Types
-import Text.LaTeX.Base.Commands
-import Text.LaTeX.Base.Writer
-import Text.LaTeX.Base.Texy
--- External modules
-import Data.Monoid
+
+{-# LANGUAGE CPP #-}
+
+{- |
+This module exports those minimal things you need
+to work with HaTeX. Those things are:
+
+* The 'LaTeX' datatype.
+
+* The '<>' operator, to append 'LaTeX' values.
+
+* The "Text.LaTeX.Base.Render" module, to render a 'LaTeX' value into 'Text'.
+
+* The "Text.LaTeX.Base.Types" module, which contains several types used by
+  other modules.
+
+* The "Text.LaTeX.Base.Commands" module, which exports the LaTeX standard commands
+  and environments.
+
+* The "Text.LaTeX.Base.Writer" module, to work with the monad interface of the library.
+
+* The "Text.LaTeX.Base.Texy" module, which exports the 'Texy' class. Useful to pretty-print
+  values in LaTeX form.
+
+-}
+module Text.LaTeX.Base
+ ( -- * @LaTeX@ datatype
+   LaTeX
+   -- * Escaping reserved characters
+ , protectString , protectText
+   -- * Internal re-exports
+ , module Text.LaTeX.Base.Render
+ , module Text.LaTeX.Base.Types
+ , module Text.LaTeX.Base.Commands
+ , module Text.LaTeX.Base.Writer
+ , module Text.LaTeX.Base.Texy
+   -- * Monoids
+   --
+   -- | Since the 'Monoid' instance is the only way to append 'LaTeX'
+   --   values, a re-export of the 'Monoid' class is given here for convenience.
+ , Monoid (..)
+ , (<>)
+   ) where
+
+-- Internal modules
+import Text.LaTeX.Base.Syntax
+  ( LaTeX
+#if __GLASGOW_HASKELL__ < 704
+  , (<>)
+#endif
+  , protectString
+  , protectText)
+import Text.LaTeX.Base.Render
+import Text.LaTeX.Base.Types
+import Text.LaTeX.Base.Commands
+import Text.LaTeX.Base.Writer
+import Text.LaTeX.Base.Texy
+-- External modules
+import Data.Monoid
diff --git a/Text/LaTeX/Base/Class.hs b/Text/LaTeX/Base/Class.hs
--- a/Text/LaTeX/Base/Class.hs
+++ b/Text/LaTeX/Base/Class.hs
@@ -1,92 +1,92 @@
-
-{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
-
--- | Definition of the 'LaTeXC' class, used to combine the classic applicative and
---   the latter monadic interfaces of /HaTeX 3/. The user can define new instances
---   as well, adding flexibility to the way /HaTeX/ is used.
-module Text.LaTeX.Base.Class (
-   LaTeXC (..)
- , Monoid (..)
-   -- * Combinators
-   -- ** From @LaTeX@
- , fromLaTeX
-   -- ** Lifting
-   -- | Lifting functions from 'LaTeX' functions to functions over any instance of 'LaTeXC'.
-   --   In general, the implementation is as follows:
-   --
-   -- > liftLN f x1 ... xN = liftListL (\[x1,...,xN] -> f x1 ... xN) [x1,...,xN]
-   --
- , liftL
- , liftL2
- , liftL3
-   -- ** Others
- , comm0
- , comm1
- , commS
- , braces
- ) where
-
-import Text.LaTeX.Base.Syntax
-import Data.Monoid
-import Data.String
-
--- | This is the class of 'LaTeX' code generators. It has 'Monoid' and 'IsString' as
---   superclasses.
-class (Monoid l,IsString l) => LaTeXC l where
- -- | This method must take a function that combines a list of 'LaTeX' values into a new one,
- --   and creates a function that combines @l@-typed values. The combining function can be
- --   seen as a function with 0 or more 'LaTeX' arguments with a 'LaTeX' value as output.
- liftListL :: ([LaTeX] -> LaTeX) -> [l] -> l
-
--- | This instance just sets @liftListL = id@.
-instance LaTeXC LaTeX where
- liftListL = id
-
--- COMBINATORS
-
--- | Map a 'LaTeX' value to its equivalent in any 'LaTeXC' instance.
-fromLaTeX :: LaTeXC l => LaTeX -> l
-fromLaTeX l = liftListL (\_ -> l) []
-
--- | Lift a inner function of 'LaTeX' values into any 'LaTeXC' instance.
-liftL :: LaTeXC l => (LaTeX -> LaTeX) -> l -> l
-liftL f x = liftListL (\[x] -> f x) [x]
-
--- | Variant of 'liftL' with a two arguments function.
-liftL2 :: LaTeXC l => (LaTeX -> LaTeX -> LaTeX) -> l -> l -> l
-liftL2 f x y = liftListL (\[x,y] -> f x y) [x,y]
-
--- | Variant of 'liftL' with a three arguments function.
-liftL3 :: LaTeXC l => (LaTeX -> LaTeX -> LaTeX -> LaTeX) -> l -> l -> l -> l
-liftL3 f x y z = liftListL (\[x,y,z] -> f x y z) [x,y,z]
-
--- | A simple (without arguments) and handy command generator
---   using the name of the command.
---
--- > comm0 str = fromLaTeX $ TeXComm str []
---
-comm0 :: LaTeXC l => String -> l
-comm0 str = fromLaTeX $ TeXComm str []
-
--- | A one parameter command generator using the name of the command.
---   The parameter will be rendered as a fixed argument.
---
--- > comm1 str = liftL $ \l -> TeXComm str [FixArg l]
---
-comm1 :: LaTeXC l => String -> l -> l
-comm1 str = liftL $ \l -> TeXComm str [FixArg l]
-
--- | Like 'comm0' but using 'TeXCommS', i.e. no \"{}\" will be inserted to protect
--- the command's end.
---
--- > commS = fromLaTeX . TeXCommS
---
-commS :: LaTeXC l => String -> l
-commS = fromLaTeX . TeXCommS
-
--- | A lifted version of the 'TeXBraces' constructor.
---
--- > braces = liftL TeXBraces
---
-braces :: LaTeXC l => l -> l
-braces = liftL TeXBraces
+
+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
+
+-- | Definition of the 'LaTeXC' class, used to combine the classic applicative and
+--   the latter monadic interfaces of /HaTeX 3/. The user can define new instances
+--   as well, adding flexibility to the way /HaTeX/ is used.
+module Text.LaTeX.Base.Class (
+   LaTeXC (..)
+ , Monoid (..)
+   -- * Combinators
+   -- ** From @LaTeX@
+ , fromLaTeX
+   -- ** Lifting
+   -- | Lifting functions from 'LaTeX' functions to functions over any instance of 'LaTeXC'.
+   --   In general, the implementation is as follows:
+   --
+   -- > liftLN f x1 ... xN = liftListL (\[x1,...,xN] -> f x1 ... xN) [x1,...,xN]
+   --
+ , liftL
+ , liftL2
+ , liftL3
+   -- ** Others
+ , comm0
+ , comm1
+ , commS
+ , braces
+ ) where
+
+import Text.LaTeX.Base.Syntax
+import Data.Monoid
+import Data.String
+
+-- | This is the class of 'LaTeX' code generators. It has 'Monoid' and 'IsString' as
+--   superclasses.
+class (Monoid l,IsString l) => LaTeXC l where
+ -- | This method must take a function that combines a list of 'LaTeX' values into a new one,
+ --   and creates a function that combines @l@-typed values. The combining function can be
+ --   seen as a function with 0 or more 'LaTeX' arguments with a 'LaTeX' value as output.
+ liftListL :: ([LaTeX] -> LaTeX) -> [l] -> l
+
+-- | This instance just sets @liftListL = id@.
+instance LaTeXC LaTeX where
+ liftListL = id
+
+-- COMBINATORS
+
+-- | Map a 'LaTeX' value to its equivalent in any 'LaTeXC' instance.
+fromLaTeX :: LaTeXC l => LaTeX -> l
+fromLaTeX l = liftListL (\_ -> l) []
+
+-- | Lift a inner function of 'LaTeX' values into any 'LaTeXC' instance.
+liftL :: LaTeXC l => (LaTeX -> LaTeX) -> l -> l
+liftL f x = liftListL (\[x] -> f x) [x]
+
+-- | Variant of 'liftL' with a two arguments function.
+liftL2 :: LaTeXC l => (LaTeX -> LaTeX -> LaTeX) -> l -> l -> l
+liftL2 f x y = liftListL (\[x,y] -> f x y) [x,y]
+
+-- | Variant of 'liftL' with a three arguments function.
+liftL3 :: LaTeXC l => (LaTeX -> LaTeX -> LaTeX -> LaTeX) -> l -> l -> l -> l
+liftL3 f x y z = liftListL (\[x,y,z] -> f x y z) [x,y,z]
+
+-- | A simple (without arguments) and handy command generator
+--   using the name of the command.
+--
+-- > comm0 str = fromLaTeX $ TeXComm str []
+--
+comm0 :: LaTeXC l => String -> l
+comm0 str = fromLaTeX $ TeXComm str []
+
+-- | A one parameter command generator using the name of the command.
+--   The parameter will be rendered as a fixed argument.
+--
+-- > comm1 str = liftL $ \l -> TeXComm str [FixArg l]
+--
+comm1 :: LaTeXC l => String -> l -> l
+comm1 str = liftL $ \l -> TeXComm str [FixArg l]
+
+-- | Like 'comm0' but using 'TeXCommS', i.e. no \"{}\" will be inserted to protect
+-- the command's end.
+--
+-- > commS = fromLaTeX . TeXCommS
+--
+commS :: LaTeXC l => String -> l
+commS = fromLaTeX . TeXCommS
+
+-- | A lifted version of the 'TeXBraces' constructor.
+--
+-- > braces = liftL TeXBraces
+--
+braces :: LaTeXC l => l -> l
+braces = liftL TeXBraces
diff --git a/Text/LaTeX/Base/Parser.hs b/Text/LaTeX/Base/Parser.hs
--- a/Text/LaTeX/Base/Parser.hs
+++ b/Text/LaTeX/Base/Parser.hs
@@ -160,9 +160,6 @@
                   then special
                   else do
                     c  <- takeTill endCmd
-                    -- if c `elem` ["begin","end"]
-                    --    then fail $ "Command not allowed: " ++ T.unpack c
-                    --    else maybe (TeXCommS $ T.unpack c) (TeXComm $ T.unpack c) <$> cmdArgs
                     maybe (TeXCommS $ T.unpack c) (TeXComm $ T.unpack c) <$> cmdArgs
 
 ------------------------------------------------------------------------
@@ -170,7 +167,7 @@
 ------------------------------------------------------------------------
 cmdArgs :: Parser (Maybe [TeXArg])
 cmdArgs = try (string "{}" >> return (Just []))
-            <|> fmap Just (many1 cmdArg)
+            <|> fmap Just (try $ many1 cmdArg)
             <|> return Nothing
 
 cmdArg :: Parser TeXArg
diff --git a/Text/LaTeX/Base/Pretty.hs b/Text/LaTeX/Base/Pretty.hs
--- a/Text/LaTeX/Base/Pretty.hs
+++ b/Text/LaTeX/Base/Pretty.hs
@@ -64,6 +64,8 @@
              else list $ fmap docLaTeX ls
 docTeXArg (SymArg l) = docTeXArg $ MSymArg [l]
 docTeXArg (MSymArg ls) = encloseSep (char '<') (char '>') (char ',') $ fmap docLaTeX ls
+docTeXArg (ParArg l) = docTeXArg $ MParArg [l]
+docTeXArg (MParArg ls) = encloseSep (char '(') (char ')') (char ',') $ fmap docLaTeX ls
 
 -- | Pretty print a 'LaTeX' value. It produces a more human-friendly output than 'render'.
 --
diff --git a/Text/LaTeX/Base/Render.hs b/Text/LaTeX/Base/Render.hs
--- a/Text/LaTeX/Base/Render.hs
+++ b/Text/LaTeX/Base/Render.hs
@@ -1,170 +1,172 @@
-
-{-# LANGUAGE OverloadedStrings #-}
-
--- | The final purpose of this module is to render a Text value
---   from a 'LaTeX' value. The interface is abstracted via a typeclass
---   so you can cast to 'Text' other types as well. Also, some other
---   handy 'Text'-related functions are defined.
-module Text.LaTeX.Base.Render
- ( -- * Re-exports
-   Text
- , module Data.String
-   -- * Render class
- , Render (..)
- , renderAppend
- , renderChars
- , renderCommas
- , renderFile
- , rendertex
-   -- * Reading files
- , readFileTex
-   -- * Util
- , showFloat
-   ) where
-
-import Data.Text (Text,lines,unlines)
-import Text.LaTeX.Base.Syntax
-import Text.LaTeX.Base.Class
-import Data.String
-import Data.Text.Encoding
-import Data.List (intersperse)
-import qualified Data.ByteString as B
-import Data.Word (Word8)
-import Numeric (showFFloat)
-
--- | Class of values that can be transformed to 'Text'.
--- You mainly will use this to obtain the 'Text' output
--- of a 'LaTeX' value. If you are going to write the result
--- in a file, consider to use 'renderFile'.
---
--- Consider also to use 'rendertex' to get 'Render'able values
--- into 'LaTeX' blocks.
---
--- If you want to make a type instance of 'Render' and you already
--- have a 'Show' instance, you can use the default instance.
---
--- > render = fromString . show
---
-class Show a => Render a where
- render :: a -> Text
- --
- render = fromString . show
-
--- | This instance escapes LaTeX reserved characters.
-instance Render Text where
- render = protectText
-
--- | Render every element of a list and append results.
-renderAppend :: Render a => [a] -> Text
-renderAppend = mconcat . fmap render
-
--- | Render every element of a list and append results,
---   separated by the given 'Char'.
-renderChars :: Render a => Char -> [a] -> Text
-renderChars c = mconcat . intersperse (fromString [c]) . fmap render
-
--- | Render every element of a list and append results,
---   separated by commas.
-renderCommas :: Render a => [a] -> Text
-renderCommas = renderChars ','
-
--- | Use this function to render a 'LaTeX' (or another
---   one in the 'Render' class) value directly
---   in a file.
-renderFile :: Render a => FilePath -> a -> IO ()
-renderFile f = B.writeFile f . encodeUtf8 . render
-
--- | If you are going to insert the content of a file
--- in your 'LaTeX' data, use this function to ensure
--- your encoding is correct.
-readFileTex :: FilePath -> IO Text
-readFileTex = fmap decodeUtf8 . B.readFile
-
--- | If you can transform a value to 'Text', you can
---   insert that 'Text' in your 'LaTeX' code.
---   That is what this function does.
---
--- /Warning: /'rendertex'/ does not escape LaTeX reserved characters./
--- /Use /'protectText'/ to escape them./
-rendertex :: (Render a,LaTeXC l) => a -> l
-rendertex = fromLaTeX . TeXRaw . render
-
--- Render instances
-
-instance Render Measure where
- render (Pt x) = render x <> "pt"
- render (Mm x) = render x <> "mm"
- render (Cm x) = render x <> "cm"
- render (In x) = render x <> "in"
- render (Ex x) = render x <> "ex"
- render (Em x) = render x <> "em"
- render (CustomMeasure x) = render x
-
--- LaTeX instances
-
-instance Render LaTeX where
-  
-  render (TeXRaw t) = t
-  
-  render (TeXComm name []) = "\\" <> fromString name <> "{}"
-  render (TeXComm name args) =
-      "\\"
-   <> fromString name
-   <> renderAppend args
-  render (TeXCommS name) = "\\" <> fromString name
-  
-  render (TeXEnv name args c) =
-      "\\begin{"
-   <> fromString name
-   <> "}"
-   <> renderAppend args
-   <> render c
-   <> "\\end{"
-   <> fromString name
-   <> "}"
-
-  render (TeXMath Dollar l) = "$" <> render l <> "$"
-  render (TeXMath Square l) = "\\[" <> render l <> "\\]"
-  render (TeXMath Parentheses l) = "\\(" <> render l <> "\\)"
-
-  render (TeXLineBreak m b) = "\\\\" <> maybe mempty (\x -> "[" <> render x <> "]") m <> ( if b then "*" else mempty )
-
-  render (TeXBraces l) = "{" <> render l <> "}"
-
-  render (TeXComment c) =
-   let xs = Data.Text.lines c
-   in if null xs then "%\n"
-                 else Data.Text.unlines $ fmap ("%" <>) xs
-
-  render (TeXSeq l1 l2) = render l1 <> render l2
-  render TeXEmpty = mempty
-
-instance Render TeXArg where
- render (OptArg l) = "[" <> render l <> "]"
- render (FixArg l) = "{" <> render l <> "}"
- render (MOptArg []) = mempty
- render (MOptArg ls) = "[" <> renderCommas ls <> "]"
- render (SymArg l) = "<" <> render l <> ">"
- render (MSymArg ls) = "<" <> renderCommas ls <> ">"
-
--- Other instances
-
--- | Show a signed floating number using standard decimal notation using 5 decimals.
-showFloat :: RealFloat a => a -> String
-showFloat x = showFFloat (Just 5) x []
-
-instance Render Int where
-instance Render Integer where
-instance Render Float where
-  render = fromString . showFloat
-instance Render Double where
-  render = fromString . showFloat
-instance Render Word8 where
-
--- | 'Render' instance for 'Bool'. It satisfies @render True = "true"@ and @render False = "false"@.
-instance Render Bool where
-  render True = "true"
-  render _ = "false"
-
-instance Render a => Render [a] where
- render xs = "[" <> renderCommas xs <> "]"
+
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | The final purpose of this module is to render a Text value
+--   from a 'LaTeX' value. The interface is abstracted via a typeclass
+--   so you can cast to 'Text' other types as well. Also, some other
+--   handy 'Text'-related functions are defined.
+module Text.LaTeX.Base.Render
+ ( -- * Re-exports
+   Text
+ , module Data.String
+   -- * Render class
+ , Render (..)
+ , renderAppend
+ , renderChars
+ , renderCommas
+ , renderFile
+ , rendertex
+   -- * Reading files
+ , readFileTex
+   -- * Util
+ , showFloat
+   ) where
+
+import Data.Text (Text,lines,unlines)
+import Text.LaTeX.Base.Syntax
+import Text.LaTeX.Base.Class
+import Data.String
+import Data.Text.Encoding
+import Data.List (intersperse)
+import qualified Data.ByteString as B
+import Data.Word (Word8)
+import Numeric (showFFloat)
+
+-- | Class of values that can be transformed to 'Text'.
+-- You mainly will use this to obtain the 'Text' output
+-- of a 'LaTeX' value. If you are going to write the result
+-- in a file, consider to use 'renderFile'.
+--
+-- Consider also to use 'rendertex' to get 'Render'able values
+-- into 'LaTeX' blocks.
+--
+-- If you want to make a type instance of 'Render' and you already
+-- have a 'Show' instance, you can use the default instance.
+--
+-- > render = fromString . show
+--
+class Show a => Render a where
+ render :: a -> Text
+ --
+ render = fromString . show
+
+-- | This instance escapes LaTeX reserved characters.
+instance Render Text where
+ render = protectText
+
+-- | Render every element of a list and append results.
+renderAppend :: Render a => [a] -> Text
+renderAppend = mconcat . fmap render
+
+-- | Render every element of a list and append results,
+--   separated by the given 'Char'.
+renderChars :: Render a => Char -> [a] -> Text
+renderChars c = mconcat . intersperse (fromString [c]) . fmap render
+
+-- | Render every element of a list and append results,
+--   separated by commas.
+renderCommas :: Render a => [a] -> Text
+renderCommas = renderChars ','
+
+-- | Use this function to render a 'LaTeX' (or another
+--   one in the 'Render' class) value directly
+--   in a file.
+renderFile :: Render a => FilePath -> a -> IO ()
+renderFile f = B.writeFile f . encodeUtf8 . render
+
+-- | If you are going to insert the content of a file
+-- in your 'LaTeX' data, use this function to ensure
+-- your encoding is correct.
+readFileTex :: FilePath -> IO Text
+readFileTex = fmap decodeUtf8 . B.readFile
+
+-- | If you can transform a value to 'Text', you can
+--   insert that 'Text' in your 'LaTeX' code.
+--   That is what this function does.
+--
+-- /Warning: /'rendertex'/ does not escape LaTeX reserved characters./
+-- /Use /'protectText'/ to escape them./
+rendertex :: (Render a,LaTeXC l) => a -> l
+rendertex = fromLaTeX . TeXRaw . render
+
+-- Render instances
+
+instance Render Measure where
+ render (Pt x) = render x <> "pt"
+ render (Mm x) = render x <> "mm"
+ render (Cm x) = render x <> "cm"
+ render (In x) = render x <> "in"
+ render (Ex x) = render x <> "ex"
+ render (Em x) = render x <> "em"
+ render (CustomMeasure x) = render x
+
+-- LaTeX instances
+
+instance Render LaTeX where
+  
+  render (TeXRaw t) = t
+  
+  render (TeXComm name []) = "\\" <> fromString name <> "{}"
+  render (TeXComm name args) =
+      "\\"
+   <> fromString name
+   <> renderAppend args
+  render (TeXCommS name) = "\\" <> fromString name
+  
+  render (TeXEnv name args c) =
+      "\\begin{"
+   <> fromString name
+   <> "}"
+   <> renderAppend args
+   <> render c
+   <> "\\end{"
+   <> fromString name
+   <> "}"
+
+  render (TeXMath Dollar l) = "$" <> render l <> "$"
+  render (TeXMath Square l) = "\\[" <> render l <> "\\]"
+  render (TeXMath Parentheses l) = "\\(" <> render l <> "\\)"
+
+  render (TeXLineBreak m b) = "\\\\" <> maybe mempty (\x -> "[" <> render x <> "]") m <> ( if b then "*" else mempty )
+
+  render (TeXBraces l) = "{" <> render l <> "}"
+
+  render (TeXComment c) =
+   let xs = Data.Text.lines c
+   in if null xs then "%\n"
+                 else Data.Text.unlines $ fmap ("%" <>) xs
+
+  render (TeXSeq l1 l2) = render l1 <> render l2
+  render TeXEmpty = mempty
+
+instance Render TeXArg where
+ render (OptArg l) = "[" <> render l <> "]"
+ render (FixArg l) = "{" <> render l <> "}"
+ render (MOptArg []) = mempty
+ render (MOptArg ls) = "[" <> renderCommas ls <> "]"
+ render (SymArg l) = "<" <> render l <> ">"
+ render (MSymArg ls) = "<" <> renderCommas ls <> ">"
+ render (ParArg l) = "(" <> render l <> ")"
+ render (MParArg ls) = "(" <> renderCommas ls <> ")"
+
+-- Other instances
+
+-- | Show a signed floating number using standard decimal notation using 5 decimals.
+showFloat :: RealFloat a => a -> String
+showFloat x = showFFloat (Just 5) x []
+
+instance Render Int where
+instance Render Integer where
+instance Render Float where
+  render = fromString . showFloat
+instance Render Double where
+  render = fromString . showFloat
+instance Render Word8 where
+
+-- | 'Render' instance for 'Bool'. It satisfies @render True = "true"@ and @render False = "false"@.
+instance Render Bool where
+  render True = "true"
+  render _ = "false"
+
+instance Render a => Render [a] where
+ render xs = "[" <> renderCommas xs <> "]"
diff --git a/Text/LaTeX/Base/Syntax.hs b/Text/LaTeX/Base/Syntax.hs
--- a/Text/LaTeX/Base/Syntax.hs
+++ b/Text/LaTeX/Base/Syntax.hs
@@ -1,317 +1,328 @@
-
-{-# LANGUAGE CPP, DeriveDataTypeable #-}
-
--- | LaTeX syntax description in the definition of the 'LaTeX' datatype.
---   If you want to add new commands or environments not defined in
---   the library, import this module and use 'LaTeX' data constructors.
-module Text.LaTeX.Base.Syntax
- ( -- * @LaTeX@ datatype
-   Measure (..)
- , MathType (..)
- , LaTeX (..)
- , TeXArg (..)
- , (<>)
-   -- * Escaping reserved characters
- , protectString
- , protectText
-   -- * Syntax analysis
- , matchCommand
- , lookForCommand
- , matchEnv
- , lookForEnv
- , texmap
- , texmapM
-   -- ** Utils
- , getBody
- , getPreamble
-   ) where
-
-import Data.Text (Text,pack)
-import qualified Data.Text
-import Data.Monoid
-import Data.String
-import Control.Applicative
-import Control.Monad (replicateM)
-import Data.Functor.Identity (runIdentity)
-import Data.Typeable
-import Test.QuickCheck
-
--- | Measure units defined in LaTeX. Use 'CustomMeasure' to use commands like 'textwidth'.
---   For instance:
---
--- > rule Nothing (CustomMeasure linewidth) (Pt 2)
---
--- This will create a black box (see 'rule') as wide as the text and two points tall.
---
-data Measure =
-   Pt Double -- ^ A point is 1/72.27 inch, that means about 0.0138 inch or 0.3515 mm.
- | Mm Double -- ^ Millimeter.
- | Cm Double -- ^ Centimeter.
- | In Double -- ^ Inch.
- | Ex Double -- ^ The height of an \"x\" in the current font.
- | Em Double -- ^ The width of an \"M\" in the current font.
- | CustomMeasure LaTeX -- ^ You can introduce a 'LaTeX' expression as a measure.
-   deriving (Eq, Show)
-
--- | Different types of syntax for mathematical expressions.
-data MathType = Parentheses | Square | Dollar
-  deriving (Eq,Show)
-
--- | Type of @LaTeX@ blocks.
-data LaTeX =
-   TeXRaw Text -- ^ Raw text.
- | TeXComm String [TeXArg] -- ^ Constructor for commands.
-                           -- First argument is the name of the command.
-                           -- Second, its arguments.
- | TeXCommS String -- ^ Constructor for commands with no arguments.
-                   --   When rendering, no space or @{}@ will be added at
-                   --   the end.
- | TeXEnv String [TeXArg] LaTeX -- ^ Constructor for environments.
-                                -- First argument is the name of the environment.
-                                -- Second, its arguments.
-                                -- Third, its content.
- | TeXMath MathType LaTeX -- ^ Mathematical expressions.
- | TeXLineBreak (Maybe Measure) Bool -- ^ Line break command.
- | TeXBraces LaTeX -- ^ A expression between braces.
- | TeXComment Text -- ^ Comments.
- | TeXSeq LaTeX LaTeX -- ^ Sequencing of 'LaTeX' expressions.
-                      -- Use '<>' preferably.
- | TeXEmpty -- ^ An empty block.
-            -- /Neutral element/ of '<>'.
-   deriving (Eq,Show,Typeable)
-
--- | An argument for a 'LaTeX' command or environment.
-data TeXArg =
-   FixArg LaTeX    -- ^ Fixed argument.
- | OptArg LaTeX    -- ^ Optional argument.
- | MOptArg [LaTeX] -- ^ Multiple optional argument.
- | SymArg LaTeX    -- ^ An argument enclosed between @\<@ and @\>@.
- | MSymArg [LaTeX] -- ^ Version of 'SymArg' with multiple options.
-   deriving (Eq,Show)
-
--- Monoid instance for 'LaTeX'.
-
--- | Method 'mappend' is strict in both arguments (except in the case when the first argument is 'TeXEmpty').
-instance Monoid LaTeX where
- mempty = TeXEmpty
- mappend TeXEmpty x = x
- mappend x TeXEmpty = x
- -- This equation is to make 'mappend' associative.
- mappend (TeXSeq x y) z = TeXSeq x $ mappend y z
- --
- mappend x y = TeXSeq x y
-
--- Since GHC starting from 7.4 provides (<>) as synonym to 'mappend' (see "Data.Monoid"),
--- we avoid an overlapping definition with a CPP conditional.
-#if __GLASGOW_HASKELL__ < 704
--- | Alias for 'mappend'.
-(<>) :: Monoid a => a -> a -> a
-(<>) = mappend
-#endif
-
--- | Method 'fromString' escapes LaTeX reserved characters using 'protectString'.
-instance IsString LaTeX where
- fromString = TeXRaw . fromString . protectString
-
--- | Escape LaTeX reserved characters in a 'String'.
-protectString :: String -> String
-protectString = mconcat . fmap protectChar
-
--- | Escape LaTeX reserved characters in a 'Text'.
-protectText :: Text -> Text
-protectText = Data.Text.concatMap (fromString . protectChar)
-
-protectChar :: Char -> String
-protectChar '#'  = "\\#"
-protectChar '$'  = "\\$"
-protectChar '%'  = "\\%"
-protectChar '^'  = "\\^{}"
-protectChar '&'  = "\\&"
-protectChar '{'  = "\\{"
-protectChar '}'  = "\\}"
-protectChar '~'  = "\\~{}"
-protectChar '\\' = "\\textbackslash{}"
-protectChar '_'  = "\\_{}"
-protectChar x = [x]
-
--- Syntax analysis
-
--- | Look into a 'LaTeX' syntax tree to find any call to the command with
---   the given name. It returns a list of arguments with which this command
---   is called.
---
--- > lookForCommand = (fmap snd .) . matchCommand . (==)
---
---   If the returned list is empty, the command was not found. However,
---   if the list contains empty lists, those are callings to the command
---   with no arguments.
---
---   For example
---
--- > lookForCommand "author" l
---
---   would look for the argument passed to the @\\author@ command in @l@.
-lookForCommand :: String -- ^ Name of the command.
-               -> LaTeX  -- ^ LaTeX syntax tree.
-               -> [[TeXArg]] -- ^ List of arguments passed to the command.
-lookForCommand = (fmap snd .) . matchCommand . (==)
-
--- | Traverse a 'LaTeX' syntax tree and returns the commands (see 'TeXComm' and
---   'TeXCommS') that matches the condition and their arguments in each call.
-matchCommand :: (String -> Bool) -> LaTeX -> [(String,[TeXArg])]
-matchCommand f (TeXComm str as) =
-  let xs = concatMap (matchCommandArg f) as
-  in  if f str then (str,as) : xs else xs
-matchCommand f (TeXCommS str) = if f str then [(str,[])] else []
-matchCommand f (TeXEnv _ as l) =
-  let xs = concatMap (matchCommandArg f) as
-  in  xs ++ matchCommand f l
-matchCommand f (TeXMath _ l) = matchCommand f l
-matchCommand f (TeXBraces l) = matchCommand f l
-matchCommand f (TeXSeq l1 l2) = matchCommand f l1 ++ matchCommand f l2
-matchCommand _ _ = []
-
-matchCommandArg :: (String -> Bool) -> TeXArg -> [(String,[TeXArg])]
-matchCommandArg f (OptArg  l ) = matchCommand f l
-matchCommandArg f (FixArg  l ) = matchCommand f l
-matchCommandArg f (MOptArg ls) = concatMap (matchCommand f) ls
-matchCommandArg f (SymArg  l ) = matchCommand f l
-matchCommandArg f (MSymArg ls) = concatMap (matchCommand f) ls
-
--- | Similar to 'lookForCommand', but applied to environments.
---   It returns a list with arguments passed and content of the
---   environment in each call.
---
--- > lookForEnv = (fmap (\(_,as,l) -> (as,l)) .) . matchEnv . (==)
---
-lookForEnv :: String -> LaTeX -> [([TeXArg],LaTeX)]
-lookForEnv = (fmap (\(_,as,l) -> (as,l)) .) . matchEnv . (==)
-
--- | Traverse a 'LaTeX' syntax tree and returns the environments (see
---   'TeXEnv') that matches the condition, their arguments and their content
---   in each call.
-matchEnv :: (String -> Bool) -> LaTeX -> [(String,[TeXArg],LaTeX)]
-matchEnv f (TeXComm _ as) = concatMap (matchEnvArg f) as
-matchEnv f (TeXEnv str as l) =
-  let xs = concatMap (matchEnvArg f) as
-      ys = matchEnv f l
-      zs = xs ++ ys
-  in  if f str then (str,as,l) : zs else zs
-matchEnv f (TeXMath _ l) = matchEnv f l
-matchEnv f (TeXBraces l) = matchEnv f l
-matchEnv f (TeXSeq l1 l2) = matchEnv f l1 ++ matchEnv f l2
-matchEnv _ _ = []
-
-matchEnvArg :: (String -> Bool) -> TeXArg -> [(String,[TeXArg],LaTeX)]
-matchEnvArg f (OptArg  l ) = matchEnv f l
-matchEnvArg f (FixArg  l ) = matchEnv f l
-matchEnvArg f (MOptArg ls) = concatMap (matchEnv f) ls
-matchEnvArg f (SymArg  l ) = matchEnv f l
-matchEnvArg f (MSymArg ls) = concatMap (matchEnv f) ls
-
--- | The function 'texmap' looks for subexpressions that match a given
---   condition and applies a function to them.
---
--- > texmap c f = runIdentity . texmapM c (pure . f)
-texmap :: (LaTeX -> Bool) -- ^ Condition.
-       -> (LaTeX -> LaTeX) -- ^ Function to apply when the condition matches.
-       ->  LaTeX -> LaTeX
-texmap c f = runIdentity . texmapM c (pure . f)
-
--- | Version of 'texmap' where the function returns values in a 'Monad'.
-texmapM :: (Applicative m, Monad m)
-        => (LaTeX -> Bool) -- ^ Condition.
-        -> (LaTeX -> m LaTeX) -- ^ Function to apply when the condition matches.
-        ->  LaTeX -> m LaTeX
-texmapM c f = go
-  where
-   go l@(TeXComm str as)  = if c l then f l else TeXComm str <$> mapM go' as
-   go l@(TeXEnv str as b) = if c l then f l else TeXEnv str <$> mapM go' as <*> go b
-   go l@(TeXMath t b)     = if c l then f l else TeXMath t <$> go b
-   go l@(TeXBraces b)     = if c l then f l else TeXBraces <$> go b
-   go l@(TeXSeq l1 l2)    = if c l then f l else liftA2 TeXSeq (go l1) (go l2)
-   go l = if c l then f l else pure l
-   --
-   go' (FixArg  l ) = FixArg  <$> go l
-   go' (OptArg  l ) = OptArg  <$> go l
-   go' (MOptArg ls) = MOptArg <$> mapM go ls
-   go' (SymArg  l ) = SymArg  <$> go l
-   go' (MSymArg ls) = MSymArg <$> mapM go ls
-
--- | Extract the content of the 'document' environment, if present.
-getBody :: LaTeX -> Maybe LaTeX
-getBody l =
-  case lookForEnv "document" l of
-    ((_,b):_) -> Just b
-    _ -> Nothing
-
--- | Extract the preamble of a 'LaTeX' document (everything before the 'document'
---   environment). It could be empty.
-getPreamble :: LaTeX -> LaTeX
-getPreamble (TeXEnv "document" _ _) = mempty
-getPreamble (TeXSeq l1 l2) = getPreamble l1 <> getPreamble l2
-getPreamble l = l
-
----------------------------------------
--- LaTeX Arbitrary instance
-
-arbitraryChar :: Gen Char
-arbitraryChar = elements $
-     ['A'..'Z']
-  ++ ['a'..'z']
-  ++ "\n-+*/!\"$%&(){}^_.,:;'#@<>?\\ "
-
--- | Utility for the instance of 'LaTeX' to 'Arbitrary'.
---   We generate a short sequence of characters and
---   escape reserved characters with 'protectText'.
-arbitraryRaw :: Gen Text
-arbitraryRaw = do
-  n <- choose (1,20)
-  protectText . pack <$> replicateM n arbitraryChar
-
--- | Generator for names of command and environments.
---   We use only alphabetical characters.
-arbitraryName :: Gen String
-arbitraryName = do
-  n <- choose (1,10)
-  replicateM n $ elements $ ['a' .. 'z'] ++ ['A' .. 'Z']
-
-instance Arbitrary Measure where
-  arbitrary = do
-     n <- choose (0,5)
-     let f = [Pt,Mm,Cm,In,Ex,Em] !! n
-     f <$> arbitrary
-
-instance Arbitrary LaTeX where
-  arbitrary = do
-     -- We give more chances to 'TeXRaw'.
-     -- This results in arbitrary 'LaTeX' values
-     -- not getting too large.
-     n <- choose (0,16 :: Int)
-     case n of
-       0 -> pure TeXEmpty
-       1 -> do m <- choose (0,5)
-               TeXComm <$> arbitraryName <*> vectorOf m arbitrary
-       2 -> TeXCommS <$> arbitraryName
-       3 -> do m <- choose (0,5)
-               TeXEnv <$> arbitraryName <*> vectorOf m arbitrary <*> arbitrary
-       4 -> do m <- choose (0,2)
-               let t = [Parentheses,Square,Dollar] !! m
-               TeXMath <$> pure t <*> arbitrary
-       5 -> TeXLineBreak <$> arbitrary <*> arbitrary
-       6 -> TeXBraces <$> arbitrary
-       7 -> TeXComment <$> arbitraryRaw
-       8 -> TeXSeq <$> arbitrary <*> arbitrary
-       _ -> TeXRaw <$> arbitraryRaw
-
-instance Arbitrary TeXArg where
-  arbitrary = do
-     n <- choose (0,4 :: Int)
-     case n of
-       0 -> OptArg <$> arbitrary
-       1 -> do m <- choose (1,5)
-               MOptArg <$> vectorOf m arbitrary
-       2 -> SymArg <$> arbitrary
-       3 -> do m <- choose (1,5)
-               MSymArg <$> vectorOf m arbitrary
-       _ -> FixArg <$> arbitrary
+
+{-# LANGUAGE CPP, DeriveDataTypeable #-}
+
+-- | LaTeX syntax description in the definition of the 'LaTeX' datatype.
+--   If you want to add new commands or environments not defined in
+--   the library, import this module and use 'LaTeX' data constructors.
+module Text.LaTeX.Base.Syntax
+ ( -- * @LaTeX@ datatype
+   Measure (..)
+ , MathType (..)
+ , LaTeX (..)
+ , TeXArg (..)
+ , (<>)
+   -- * Escaping reserved characters
+ , protectString
+ , protectText
+   -- * Syntax analysis
+ , matchCommand
+ , lookForCommand
+ , matchEnv
+ , lookForEnv
+ , texmap
+ , texmapM
+   -- ** Utils
+ , getBody
+ , getPreamble
+   ) where
+
+import Data.Text (Text,pack)
+import qualified Data.Text
+import Data.Monoid
+import Data.String
+import Control.Applicative
+import Control.Monad (replicateM)
+import Data.Functor.Identity (runIdentity)
+import Data.Typeable
+import Test.QuickCheck
+
+-- | Measure units defined in LaTeX. Use 'CustomMeasure' to use commands like 'textwidth'.
+--   For instance:
+--
+-- > rule Nothing (CustomMeasure linewidth) (Pt 2)
+--
+-- This will create a black box (see 'rule') as wide as the text and two points tall.
+--
+data Measure =
+   Pt Double -- ^ A point is 1/72.27 inch, that means about 0.0138 inch or 0.3515 mm.
+ | Mm Double -- ^ Millimeter.
+ | Cm Double -- ^ Centimeter.
+ | In Double -- ^ Inch.
+ | Ex Double -- ^ The height of an \"x\" in the current font.
+ | Em Double -- ^ The width of an \"M\" in the current font.
+ | CustomMeasure LaTeX -- ^ You can introduce a 'LaTeX' expression as a measure.
+   deriving (Eq, Show)
+
+-- | Different types of syntax for mathematical expressions.
+data MathType = Parentheses | Square | Dollar
+  deriving (Eq,Show)
+
+-- | Type of @LaTeX@ blocks.
+data LaTeX =
+   TeXRaw Text -- ^ Raw text.
+ | TeXComm String [TeXArg] -- ^ Constructor for commands.
+                           -- First argument is the name of the command.
+                           -- Second, its arguments.
+ | TeXCommS String -- ^ Constructor for commands with no arguments.
+                   --   When rendering, no space or @{}@ will be added at
+                   --   the end.
+ | TeXEnv String [TeXArg] LaTeX -- ^ Constructor for environments.
+                                -- First argument is the name of the environment.
+                                -- Second, its arguments.
+                                -- Third, its content.
+ | TeXMath MathType LaTeX -- ^ Mathematical expressions.
+ | TeXLineBreak (Maybe Measure) Bool -- ^ Line break command.
+ | TeXBraces LaTeX -- ^ A expression between braces.
+ | TeXComment Text -- ^ Comments.
+ | TeXSeq LaTeX LaTeX -- ^ Sequencing of 'LaTeX' expressions.
+                      -- Use '<>' preferably.
+ | TeXEmpty -- ^ An empty block.
+            -- /Neutral element/ of '<>'.
+   deriving (Eq,Show,Typeable)
+
+-- | An argument for a 'LaTeX' command or environment.
+data TeXArg =
+   FixArg LaTeX    -- ^ Fixed argument.
+ | OptArg LaTeX    -- ^ Optional argument.
+ | MOptArg [LaTeX] -- ^ Multiple optional argument.
+ | SymArg LaTeX    -- ^ An argument enclosed between @\<@ and @\>@.
+ | MSymArg [LaTeX] -- ^ Version of 'SymArg' with multiple options.
+ | ParArg LaTeX    -- ^ An argument enclosed between @(@ and @)@.
+ | MParArg [LaTeX] -- ^ Version of 'ParArg' with multiple options.
+   deriving (Eq,Show)
+
+-- Monoid instance for 'LaTeX'.
+
+-- | Method 'mappend' is strict in both arguments (except in the case when the first argument is 'TeXEmpty').
+instance Monoid LaTeX where
+ mempty = TeXEmpty
+ mappend TeXEmpty x = x
+ mappend x TeXEmpty = x
+ -- This equation is to make 'mappend' associative.
+ mappend (TeXSeq x y) z = TeXSeq x $ mappend y z
+ --
+ mappend x y = TeXSeq x y
+
+-- Since GHC starting from 7.4 provides (<>) as synonym to 'mappend' (see "Data.Monoid"),
+-- we avoid an overlapping definition with a CPP conditional.
+#if __GLASGOW_HASKELL__ < 704
+-- | Alias for 'mappend'.
+(<>) :: Monoid a => a -> a -> a
+(<>) = mappend
+#endif
+
+-- | Method 'fromString' escapes LaTeX reserved characters using 'protectString'.
+instance IsString LaTeX where
+ fromString = TeXRaw . fromString . protectString
+
+-- | Escape LaTeX reserved characters in a 'String'.
+protectString :: String -> String
+protectString = mconcat . fmap protectChar
+
+-- | Escape LaTeX reserved characters in a 'Text'.
+protectText :: Text -> Text
+protectText = Data.Text.concatMap (fromString . protectChar)
+
+protectChar :: Char -> String
+protectChar '#'  = "\\#"
+protectChar '$'  = "\\$"
+protectChar '%'  = "\\%"
+protectChar '^'  = "\\^{}"
+protectChar '&'  = "\\&"
+protectChar '{'  = "\\{"
+protectChar '}'  = "\\}"
+protectChar '~'  = "\\~{}"
+protectChar '\\' = "\\textbackslash{}"
+protectChar '_'  = "\\_{}"
+protectChar x = [x]
+
+-- Syntax analysis
+
+-- | Look into a 'LaTeX' syntax tree to find any call to the command with
+--   the given name. It returns a list of arguments with which this command
+--   is called.
+--
+-- > lookForCommand = (fmap snd .) . matchCommand . (==)
+--
+--   If the returned list is empty, the command was not found. However,
+--   if the list contains empty lists, those are callings to the command
+--   with no arguments.
+--
+--   For example
+--
+-- > lookForCommand "author" l
+--
+--   would look for the argument passed to the @\\author@ command in @l@.
+lookForCommand :: String -- ^ Name of the command.
+               -> LaTeX  -- ^ LaTeX syntax tree.
+               -> [[TeXArg]] -- ^ List of arguments passed to the command.
+lookForCommand = (fmap snd .) . matchCommand . (==)
+
+-- | Traverse a 'LaTeX' syntax tree and returns the commands (see 'TeXComm' and
+--   'TeXCommS') that matches the condition and their arguments in each call.
+matchCommand :: (String -> Bool) -> LaTeX -> [(String,[TeXArg])]
+matchCommand f (TeXComm str as) =
+  let xs = concatMap (matchCommandArg f) as
+  in  if f str then (str,as) : xs else xs
+matchCommand f (TeXCommS str) = if f str then [(str,[])] else []
+matchCommand f (TeXEnv _ as l) =
+  let xs = concatMap (matchCommandArg f) as
+  in  xs ++ matchCommand f l
+matchCommand f (TeXMath _ l) = matchCommand f l
+matchCommand f (TeXBraces l) = matchCommand f l
+matchCommand f (TeXSeq l1 l2) = matchCommand f l1 ++ matchCommand f l2
+matchCommand _ _ = []
+
+matchCommandArg :: (String -> Bool) -> TeXArg -> [(String,[TeXArg])]
+matchCommandArg f (OptArg  l ) = matchCommand f l
+matchCommandArg f (FixArg  l ) = matchCommand f l
+matchCommandArg f (MOptArg ls) = concatMap (matchCommand f) ls
+matchCommandArg f (SymArg  l ) = matchCommand f l
+matchCommandArg f (MSymArg ls) = concatMap (matchCommand f) ls
+matchCommandArg f (ParArg  l ) = matchCommand f l
+matchCommandArg f (MParArg ls) = concatMap (matchCommand f) ls
+
+-- | Similar to 'lookForCommand', but applied to environments.
+--   It returns a list with arguments passed and content of the
+--   environment in each call.
+--
+-- > lookForEnv = (fmap (\(_,as,l) -> (as,l)) .) . matchEnv . (==)
+--
+lookForEnv :: String -> LaTeX -> [([TeXArg],LaTeX)]
+lookForEnv = (fmap (\(_,as,l) -> (as,l)) .) . matchEnv . (==)
+
+-- | Traverse a 'LaTeX' syntax tree and returns the environments (see
+--   'TeXEnv') that matches the condition, their arguments and their content
+--   in each call.
+matchEnv :: (String -> Bool) -> LaTeX -> [(String,[TeXArg],LaTeX)]
+matchEnv f (TeXComm _ as) = concatMap (matchEnvArg f) as
+matchEnv f (TeXEnv str as l) =
+  let xs = concatMap (matchEnvArg f) as
+      ys = matchEnv f l
+      zs = xs ++ ys
+  in  if f str then (str,as,l) : zs else zs
+matchEnv f (TeXMath _ l) = matchEnv f l
+matchEnv f (TeXBraces l) = matchEnv f l
+matchEnv f (TeXSeq l1 l2) = matchEnv f l1 ++ matchEnv f l2
+matchEnv _ _ = []
+
+matchEnvArg :: (String -> Bool) -> TeXArg -> [(String,[TeXArg],LaTeX)]
+matchEnvArg f (OptArg  l ) = matchEnv f l
+matchEnvArg f (FixArg  l ) = matchEnv f l
+matchEnvArg f (MOptArg ls) = concatMap (matchEnv f) ls
+matchEnvArg f (SymArg  l ) = matchEnv f l
+matchEnvArg f (MSymArg ls) = concatMap (matchEnv f) ls
+matchEnvArg f (ParArg  l ) = matchEnv f l
+matchEnvArg f (MParArg ls) = concatMap (matchEnv f) ls
+
+-- | The function 'texmap' looks for subexpressions that match a given
+--   condition and applies a function to them.
+--
+-- > texmap c f = runIdentity . texmapM c (pure . f)
+texmap :: (LaTeX -> Bool) -- ^ Condition.
+       -> (LaTeX -> LaTeX) -- ^ Function to apply when the condition matches.
+       ->  LaTeX -> LaTeX
+texmap c f = runIdentity . texmapM c (pure . f)
+
+-- | Version of 'texmap' where the function returns values in a 'Monad'.
+texmapM :: (Applicative m, Monad m)
+        => (LaTeX -> Bool) -- ^ Condition.
+        -> (LaTeX -> m LaTeX) -- ^ Function to apply when the condition matches.
+        ->  LaTeX -> m LaTeX
+texmapM c f = go
+  where
+   go l@(TeXComm str as)  = if c l then f l else TeXComm str <$> mapM go' as
+   go l@(TeXEnv str as b) = if c l then f l else TeXEnv str <$> mapM go' as <*> go b
+   go l@(TeXMath t b)     = if c l then f l else TeXMath t <$> go b
+   go l@(TeXBraces b)     = if c l then f l else TeXBraces <$> go b
+   go l@(TeXSeq l1 l2)    = if c l then f l else liftA2 TeXSeq (go l1) (go l2)
+   go l = if c l then f l else pure l
+   --
+   go' (FixArg  l ) = FixArg  <$> go l
+   go' (OptArg  l ) = OptArg  <$> go l
+   go' (MOptArg ls) = MOptArg <$> mapM go ls
+   go' (SymArg  l ) = SymArg  <$> go l
+   go' (MSymArg ls) = MSymArg <$> mapM go ls
+   go' (ParArg  l ) = ParArg  <$> go l
+   go' (MParArg ls) = MParArg <$> mapM go ls
+
+-- | Extract the content of the 'document' environment, if present.
+getBody :: LaTeX -> Maybe LaTeX
+getBody l =
+  case lookForEnv "document" l of
+    ((_,b):_) -> Just b
+    _ -> Nothing
+
+-- | Extract the preamble of a 'LaTeX' document (everything before the 'document'
+--   environment). It could be empty.
+getPreamble :: LaTeX -> LaTeX
+getPreamble (TeXEnv "document" _ _) = mempty
+getPreamble (TeXSeq l1 l2) = getPreamble l1 <> getPreamble l2
+getPreamble l = l
+
+---------------------------------------
+-- LaTeX Arbitrary instance
+
+arbitraryChar :: Gen Char
+arbitraryChar = elements $
+     ['A'..'Z']
+  ++ ['a'..'z']
+  ++ "\n-+*/!\"$%&(){}^_.,:;'#@<>?\\ "
+
+-- | Utility for the instance of 'LaTeX' to 'Arbitrary'.
+--   We generate a short sequence of characters and
+--   escape reserved characters with 'protectText'.
+arbitraryRaw :: Gen Text
+arbitraryRaw = do
+  n <- choose (1,20)
+  protectText . pack <$> replicateM n arbitraryChar
+
+-- | Generator for names of command and environments.
+--   We use only alphabetical characters.
+arbitraryName :: Gen String
+arbitraryName = do
+  n <- choose (1,10)
+  replicateM n $ elements $ ['a' .. 'z'] ++ ['A' .. 'Z']
+
+instance Arbitrary Measure where
+  arbitrary = do
+     n <- choose (0,5)
+     let f = [Pt,Mm,Cm,In,Ex,Em] !! n
+     f <$> arbitrary
+
+instance Arbitrary LaTeX where
+  arbitrary = do
+     -- We give more chances to 'TeXRaw'.
+     -- This results in arbitrary 'LaTeX' values
+     -- not getting too large.
+     n <- choose (0,16 :: Int)
+     case n of
+       0 -> pure TeXEmpty
+       1 -> do m <- choose (0,5)
+               TeXComm <$> arbitraryName <*> vectorOf m arbitrary
+       2 -> TeXCommS <$> arbitraryName
+       3 -> do m <- choose (0,5)
+               TeXEnv <$> arbitraryName <*> vectorOf m arbitrary <*> arbitrary
+       4 -> do m <- choose (0,2)
+               let t = [Parentheses,Square,Dollar] !! m
+               TeXMath <$> pure t <*> arbitrary
+       5 -> TeXLineBreak <$> arbitrary <*> arbitrary
+       6 -> TeXBraces <$> arbitrary
+       7 -> TeXComment <$> arbitraryRaw
+       8 -> TeXSeq <$> arbitrary <*> arbitrary
+       _ -> TeXRaw <$> arbitraryRaw
+
+instance Arbitrary TeXArg where
+  arbitrary = do
+     n <- choose (0,6 :: Int)
+     case n of
+       0 -> OptArg <$> arbitrary
+       1 -> do m <- choose (1,5)
+               MOptArg <$> vectorOf m arbitrary
+       2 -> SymArg <$> arbitrary
+       3 -> do m <- choose (1,5)
+               MSymArg <$> vectorOf m arbitrary
+       4 -> ParArg <$> arbitrary
+       5 -> do m <- choose (1,5)
+               MParArg <$> vectorOf m arbitrary
+       _ -> FixArg <$> arbitrary
diff --git a/Text/LaTeX/Base/Types.hs b/Text/LaTeX/Base/Types.hs
--- a/Text/LaTeX/Base/Types.hs
+++ b/Text/LaTeX/Base/Types.hs
@@ -1,81 +1,81 @@
-
-{-# 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.
-data Pos = Bottom | Center | Top deriving Show
-
-instance Render Pos where
- render Bottom = "b"
- render Center = "c"
- render Top    = "t"
-
--- | 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.
- | VerticalLine       -- ^ Vertical line between two columns.
- | DVerticalLine      -- ^ Double vertical line between two columns.
-   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 VerticalLine     = "|"
- render DVerticalLine    = "||"
+
+{-# 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.
+data Pos = Bottom | Center | Top deriving Show
+
+instance Render Pos where
+ render Bottom = "b"
+ render Center = "c"
+ render Top    = "t"
+
+-- | 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.
+ | VerticalLine       -- ^ Vertical line between two columns.
+ | DVerticalLine      -- ^ Double vertical line between two columns.
+   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 VerticalLine     = "|"
+ render DVerticalLine    = "||"
diff --git a/Text/LaTeX/Base/Warnings.hs b/Text/LaTeX/Base/Warnings.hs
--- a/Text/LaTeX/Base/Warnings.hs
+++ b/Text/LaTeX/Base/Warnings.hs
@@ -1,146 +1,146 @@
-
-{-# LANGUAGE OverloadedStrings #-}
-
--- | This module provides functionality for check a 'LaTeX' value for
---   possibly undesired things (like the call to an undefined label),
---   returning 'Warning's. These are called 'Warning's because they
---   never terminate the program execution.
-module Text.LaTeX.Base.Warnings (
-   -- * Warnings datatype
-   Warning (..)
- , TeXCheck
- , check
- , checkFromFunction
-   -- * Several checkings
- , checkLabels
- , checkClass
- , checkDoc
-   -- * Complete checking
- , checkAll
- ) where
-
-import Text.LaTeX.Base.Syntax
-import Control.Monad.Trans.State
-import Data.Text
-import Data.Maybe
-import Control.Arrow
-import Data.Monoid
-
--- | List of possible warnings.
-data Warning =
-   UnusedLabel Text    -- ^ There is an unused label. Argument is its name.
- | UndefinedLabel Text -- ^ There is a reference to an undefined label. Arguments is the name.
-   --
- | NoClassSelected     -- ^ No class selected with 'documentclass'.
- | NoDocumentInserted  -- ^ No 'document' inserted.
-   --
- | CustomWarning Text  -- ^ Custom warning for custom checkings. Use it as you want.
-   deriving (Eq,Show)
-
--- | A 'TeXCheck' is a function that checks possible warnings from a 'LaTeX' value.
---   Use the 'Monoid' instance to combine check functions.
-newtype TeXCheck = TC { check :: LaTeX -> [Warning] -- ^ Apply a checking.
-                      }
--- | Build a 'TeXCheck' from a function.
-checkFromFunction :: (LaTeX -> [Warning]) -> TeXCheck
-checkFromFunction = TC
-
-instance Monoid TeXCheck where
- mempty = TC $ const []
- mappend (TC tc1) (TC tc2) = TC $ uncurry mappend . (tc1 &&& tc2)
-
--- | Check with 'checkLabels', 'checkClass' and 'checkDoc'.
-checkAll :: TeXCheck
-checkAll = mconcat [ checkLabels , checkClass , checkDoc ]
-
--- Searching for 'documentclass' and 'document'
-
-type BoolSt = State Bool
-
--- | Check if a document class is specified for the document (using 'documentclass').
-checkClass :: TeXCheck
-checkClass = TC $ \l -> if execState (classcheck l) False then [] else [NoClassSelected]
-
-classcheck :: LaTeX -> BoolSt ()
-classcheck (TeXComm c _) =
- case c of
-  "documentclass" -> put True
-  _ -> return ()
-classcheck (TeXBraces l) = classcheck l
-classcheck (TeXSeq l1 l2) = classcheck l1 >> classcheck l2
-classcheck _ = return ()
-
--- | Check if the 'document' environment is called in a 'LaTeX'.
-checkDoc :: TeXCheck
-checkDoc = TC $ \l -> if execState (doccheck l) False then [] else [NoDocumentInserted]
-
-doccheck :: LaTeX -> BoolSt ()
-doccheck (TeXEnv n _ _) =
- case n of
-  "document" -> put True
-  _ -> return ()
-doccheck (TeXBraces l) = doccheck l
-doccheck (TeXSeq l1 l2) = doccheck l1 >> doccheck l2
-doccheck _ = return ()
-
--- Checking labels
-
-data LabWarn =
-   RefNoLabel Text
- | LabelNoRef Text
- | LabelRef Text
-
-labWarnToWarning :: LabWarn -> Maybe Warning
-labWarnToWarning (RefNoLabel n) = Just $ UndefinedLabel n
-labWarnToWarning (LabelNoRef n) = Just $ UnusedLabel n
-labWarnToWarning _ = Nothing
-
-type LabSt = State [LabWarn]
-
--- | Checking for unused labels or references tu undefined labels.
-checkLabels :: TeXCheck
-checkLabels = TC $ \l -> catMaybes . fmap labWarnToWarning $ execState (labcheck l) []
-
-labcheck :: LaTeX -> LabSt ()
-labcheck (TeXComm c [FixArg (TeXRaw n)]) =
- case c of
-  "label"   -> newlab n
-  "ref"     -> newref n
-  "pageref" -> newref n
-  _ -> return ()
-labcheck (TeXEnv _ _ l) = labcheck l
-labcheck (TeXMath _ l) = labcheck l
-labcheck (TeXBraces l) = labcheck l
-labcheck (TeXSeq l1 l2) = labcheck l1 >> labcheck l2
-labcheck _ = return ()
-
-newlab :: Text -> LabSt ()
-newlab t = do
- st <- get
- let addLab :: Text -> [LabWarn] -> [LabWarn]
-     addLab n [] = [LabelNoRef n]
-     addLab n l@(x:xs) = let ys = x : addLab n xs in
-       case x of
-        RefNoLabel m -> if n == m then LabelRef n : xs
-                                  else ys
-        LabelNoRef m -> if n == m then l
-                                  else ys
-        LabelRef   m -> if n == m then l
-                                  else ys
- put $ addLab t st
-
-newref :: Text -> LabSt ()
-newref t = do
- st <- get
- let addRef :: Text -> [LabWarn] -> [LabWarn]
-     addRef n [] = [RefNoLabel n]
-     addRef n l@(x:xs) = let ys = x : addRef n xs in
-       case x of
-        RefNoLabel m -> if n == m then l
-                                  else ys
-        LabelNoRef m -> if n == m then LabelRef n : xs
-                                  else ys
-        LabelRef   m -> if n == m then l
-                                  else ys
- put $ addRef t st
-
+
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | This module provides functionality for check a 'LaTeX' value for
+--   possibly undesired things (like the call to an undefined label),
+--   returning 'Warning's. These are called 'Warning's because they
+--   never terminate the program execution.
+module Text.LaTeX.Base.Warnings (
+   -- * Warnings datatype
+   Warning (..)
+ , TeXCheck
+ , check
+ , checkFromFunction
+   -- * Several checkings
+ , checkLabels
+ , checkClass
+ , checkDoc
+   -- * Complete checking
+ , checkAll
+ ) where
+
+import Text.LaTeX.Base.Syntax
+import Control.Monad.Trans.State
+import Data.Text
+import Data.Maybe
+import Control.Arrow
+import Data.Monoid
+
+-- | List of possible warnings.
+data Warning =
+   UnusedLabel Text    -- ^ There is an unused label. Argument is its name.
+ | UndefinedLabel Text -- ^ There is a reference to an undefined label. Arguments is the name.
+   --
+ | NoClassSelected     -- ^ No class selected with 'documentclass'.
+ | NoDocumentInserted  -- ^ No 'document' inserted.
+   --
+ | CustomWarning Text  -- ^ Custom warning for custom checkings. Use it as you want.
+   deriving (Eq,Show)
+
+-- | A 'TeXCheck' is a function that checks possible warnings from a 'LaTeX' value.
+--   Use the 'Monoid' instance to combine check functions.
+newtype TeXCheck = TC { check :: LaTeX -> [Warning] -- ^ Apply a checking.
+                      }
+-- | Build a 'TeXCheck' from a function.
+checkFromFunction :: (LaTeX -> [Warning]) -> TeXCheck
+checkFromFunction = TC
+
+instance Monoid TeXCheck where
+ mempty = TC $ const []
+ mappend (TC tc1) (TC tc2) = TC $ uncurry mappend . (tc1 &&& tc2)
+
+-- | Check with 'checkLabels', 'checkClass' and 'checkDoc'.
+checkAll :: TeXCheck
+checkAll = mconcat [ checkLabels , checkClass , checkDoc ]
+
+-- Searching for 'documentclass' and 'document'
+
+type BoolSt = State Bool
+
+-- | Check if a document class is specified for the document (using 'documentclass').
+checkClass :: TeXCheck
+checkClass = TC $ \l -> if execState (classcheck l) False then [] else [NoClassSelected]
+
+classcheck :: LaTeX -> BoolSt ()
+classcheck (TeXComm c _) =
+ case c of
+  "documentclass" -> put True
+  _ -> return ()
+classcheck (TeXBraces l) = classcheck l
+classcheck (TeXSeq l1 l2) = classcheck l1 >> classcheck l2
+classcheck _ = return ()
+
+-- | Check if the 'document' environment is called in a 'LaTeX'.
+checkDoc :: TeXCheck
+checkDoc = TC $ \l -> if execState (doccheck l) False then [] else [NoDocumentInserted]
+
+doccheck :: LaTeX -> BoolSt ()
+doccheck (TeXEnv n _ _) =
+ case n of
+  "document" -> put True
+  _ -> return ()
+doccheck (TeXBraces l) = doccheck l
+doccheck (TeXSeq l1 l2) = doccheck l1 >> doccheck l2
+doccheck _ = return ()
+
+-- Checking labels
+
+data LabWarn =
+   RefNoLabel Text
+ | LabelNoRef Text
+ | LabelRef Text
+
+labWarnToWarning :: LabWarn -> Maybe Warning
+labWarnToWarning (RefNoLabel n) = Just $ UndefinedLabel n
+labWarnToWarning (LabelNoRef n) = Just $ UnusedLabel n
+labWarnToWarning _ = Nothing
+
+type LabSt = State [LabWarn]
+
+-- | Checking for unused labels or references tu undefined labels.
+checkLabels :: TeXCheck
+checkLabels = TC $ \l -> catMaybes . fmap labWarnToWarning $ execState (labcheck l) []
+
+labcheck :: LaTeX -> LabSt ()
+labcheck (TeXComm c [FixArg (TeXRaw n)]) =
+ case c of
+  "label"   -> newlab n
+  "ref"     -> newref n
+  "pageref" -> newref n
+  _ -> return ()
+labcheck (TeXEnv _ _ l) = labcheck l
+labcheck (TeXMath _ l) = labcheck l
+labcheck (TeXBraces l) = labcheck l
+labcheck (TeXSeq l1 l2) = labcheck l1 >> labcheck l2
+labcheck _ = return ()
+
+newlab :: Text -> LabSt ()
+newlab t = do
+ st <- get
+ let addLab :: Text -> [LabWarn] -> [LabWarn]
+     addLab n [] = [LabelNoRef n]
+     addLab n l@(x:xs) = let ys = x : addLab n xs in
+       case x of
+        RefNoLabel m -> if n == m then LabelRef n : xs
+                                  else ys
+        LabelNoRef m -> if n == m then l
+                                  else ys
+        LabelRef   m -> if n == m then l
+                                  else ys
+ put $ addLab t st
+
+newref :: Text -> LabSt ()
+newref t = do
+ st <- get
+ let addRef :: Text -> [LabWarn] -> [LabWarn]
+     addRef n [] = [RefNoLabel n]
+     addRef n l@(x:xs) = let ys = x : addRef n xs in
+       case x of
+        RefNoLabel m -> if n == m then l
+                                  else ys
+        LabelNoRef m -> if n == m then LabelRef n : xs
+                                  else ys
+        LabelRef   m -> if n == m then l
+                                  else ys
+ put $ addRef t st
+
diff --git a/Text/LaTeX/Base/Writer.hs b/Text/LaTeX/Base/Writer.hs
--- a/Text/LaTeX/Base/Writer.hs
+++ b/Text/LaTeX/Base/Writer.hs
@@ -1,208 +1,208 @@
-
-{-# LANGUAGE TypeFamilies #-}
-
--- | The writer monad applied to 'LaTeX' values. Useful to compose 'LaTeX' values
---   using the @do@ notation:
---
--- > anExample :: Monad m => LaTeXT m ()
--- > anExample = do
--- >   documentclass [] article
--- >   author "Daniel Monad"
--- >   title "LaTeX and do notation"
--- >   document $ do
--- >     maketitle
--- >     section "Some words"
--- >     "Using " ; texttt "do" ; " notation "
--- >     "you avoid many ocurrences of the "
--- >     texttt "(<>)" ; " operator and a lot of "
--- >     "parentheses. With the cost of a monad."
---
--- Since 'LaTeXT' is a monad transformer, you can do also:
---
--- > anotherExample :: LaTeXT IO ()
--- > anotherExample = lift (readFileTex "foo") >>= verbatim
---
--- This way, it is easy (without carrying arguments) to include IO outputs
--- in the LaTeX document, like files, times or random objects.
---
--- Another approach could be to have custom counters, label management
--- or any other user-defined feature.
---
--- Of course, you can always use the simpler interface provided by the plain 'LaTeX' type.
---
-module Text.LaTeX.Base.Writer
- ( -- * @LaTeXT@ writer
-   LaTeXT
- , runLaTeXT
- , execLaTeXT
-   -- ** Synonyms
- , LaTeXT_
- , LaTeXM
- , runLaTeXM
- , execLaTeXM
-   -- * Utils
- , execLaTeXTWarn
- , extractLaTeX
- , extractLaTeX_
- , textell
- , rendertexM
- , liftFun
- , liftOp
-   -- * Re-exports
- , lift
- , liftIO
-   ) where
-
--- base
-import Control.Applicative
-import Control.Monad (liftM)
-import Control.Arrow
-import Data.String
-import Data.Monoid
--- transformers
-import Control.Monad.Trans.Writer
-import Control.Monad.IO.Class
-import Control.Monad.Trans.Class
-import Data.Functor.Identity
--- HaTeX
-import Text.LaTeX.Base.Syntax
-import Text.LaTeX.Base.Class
-import Text.LaTeX.Base.Render
-import Text.LaTeX.Base.Warnings (Warning,checkAll,check)
-
--- | 'WriterT' monad transformer applied to 'LaTeX' values.
-newtype LaTeXT m a =
-  LaTeXT { unwrapLaTeXT :: WriterT LaTeX m a }
-
-instance Functor f => Functor (LaTeXT f) where
- fmap f = LaTeXT . fmap f . unwrapLaTeXT
-
-instance Applicative f => Applicative (LaTeXT f) where
- pure = LaTeXT . pure
- (LaTeXT f) <*> (LaTeXT x) = LaTeXT $ f <*> x
-
--- | Type synonym for empty 'LaTeXT' computations.
-type LaTeXT_ m = LaTeXT m ()
-
--- | The 'LaTeXT' monad transformed applied to 'Identity'.
-type LaTeXM = LaTeXT Identity
-
--- | A particular case of 'runLaTeXT'.
---
--- > runLaTeXM = runIdentity . runLaTeXT
---
-runLaTeXM :: LaTeXM a -> (a, LaTeX)
-runLaTeXM = runIdentity . runLaTeXT
-
--- | A particular case of 'execLaTeXT'.
---
--- > execLaTeXM = runIdentity . execLaTeXT
---
-execLaTeXM :: LaTeXM a -> LaTeX
-execLaTeXM = runIdentity . execLaTeXT
-
-instance MonadTrans LaTeXT where
- lift = LaTeXT . lift
-
-instance Monad m => Monad (LaTeXT m) where
- return = LaTeXT . return
- (LaTeXT c) >>= f = LaTeXT $ do 
-  a <- c
-  let LaTeXT c' = f a
-  c'
- fail = return . error
-
-instance MonadIO m => MonadIO (LaTeXT m) where
- liftIO = lift . liftIO
-
-instance (Monad m, a ~ ()) => LaTeXC (LaTeXT m a) where
- liftListL f xs = mapM extractLaTeX_ xs >>= textell . f
-
--- | Running a 'LaTeXT' computation returns the final 'LaTeX' value.
-runLaTeXT :: Monad m => LaTeXT m a -> m (a,LaTeX)
-runLaTeXT = runWriterT . unwrapLaTeXT
-
--- | This is the usual way to run the 'LaTeXT' monad
---   and obtain a 'LaTeX' value.
---
--- > execLaTeXT = liftM snd . runLaTeXT
---
--- If @anExample@ is defined as above (at the top of this module
--- documentation), use the following to get the LaTeX value
--- generated out.
---
--- > myLaTeX :: Monad m => m LaTeX
--- > myLaTeX = execLaTeXT anExample
---
-execLaTeXT :: Monad m => LaTeXT m a -> m LaTeX
-execLaTeXT = liftM snd . runLaTeXT
-
--- | Version of 'execLaTeXT' with possible warning messages.
---   This function applies 'checkAll' to the 'LaTeX' output.
-execLaTeXTWarn :: Monad m => LaTeXT m a -> m (LaTeX,[Warning])
-execLaTeXTWarn = liftM (id &&& check checkAll) . execLaTeXT
-
--- | This function run a 'LaTeXT' computation,
---   lifting the result again in the monad.
-extractLaTeX :: Monad m => LaTeXT m a -> LaTeXT m (a,LaTeX)
-extractLaTeX = LaTeXT . lift . runWriterT . unwrapLaTeXT
-
--- | Executes a 'LaTeXT' computation, embedding it again in
---   the 'LaTeXT' monad.
---
--- > extractLaTeX_ = liftM snd . extractLaTeX
---
--- This function was heavily used in the past by HaTeX-meta
--- to generate those @.Monad@ modules. The current purpose
--- is to implement the 'LaTeXC' instance of 'LaTeXT', which
--- is closely related.
-extractLaTeX_ :: Monad m => LaTeXT m a -> LaTeXT m LaTeX
-extractLaTeX_ = liftM snd . extractLaTeX
-
--- | With 'textell' you can append 'LaTeX' values to the
---   state of the 'LaTeXT' monad.
-textell :: Monad m => LaTeX -> LaTeXT m ()
-textell = LaTeXT . tell
-
--- | Lift a function over 'LaTeX' values to a function
---   acting over the state of a 'LaTeXT' computation.
-liftFun :: Monad m
-        => (LaTeX -> LaTeX)
-        -> (LaTeXT m a -> LaTeXT m a)
-liftFun f (LaTeXT c) = LaTeXT $ do
- (p,l) <- lift $ runWriterT c
- tell $ f l
- return p
-
--- | Lift an operator over 'LaTeX' values to an operator
---   acting over the state of two 'LaTeXT' computations.
---
--- /Note: The returned value is the one returned by the/
--- /second argument of the lifted operator./
-liftOp :: Monad m
-       => (LaTeX -> LaTeX -> LaTeX)
-       -> (LaTeXT m a -> LaTeXT m b -> LaTeXT m b)
-liftOp op (LaTeXT c) (LaTeXT c') = LaTeXT $ do
- (_,l)  <- lift $ runWriterT c
- (p,l') <- lift $ runWriterT c'
- tell $ l `op` l'
- return p
-
--- | Just like 'rendertex', but with 'LaTeXT' output.
---
--- > rendertexM = textell . rendertex
---
-rendertexM :: (Render a, Monad m) => a -> LaTeXT m ()
-rendertexM = textell . rendertex
-
--- Overloaded Strings
-
-instance (Monad m, a ~ ()) => IsString (LaTeXT m a) where
- fromString = textell . fromString
-
--- Monoids
-
-instance (Monad m, a ~ ()) => Monoid (LaTeXT m a) where
- mempty = return ()
- mappend = (>>)
-
+
+{-# LANGUAGE TypeFamilies #-}
+
+-- | The writer monad applied to 'LaTeX' values. Useful to compose 'LaTeX' values
+--   using the @do@ notation:
+--
+-- > anExample :: Monad m => LaTeXT m ()
+-- > anExample = do
+-- >   documentclass [] article
+-- >   author "Daniel Monad"
+-- >   title "LaTeX and do notation"
+-- >   document $ do
+-- >     maketitle
+-- >     section "Some words"
+-- >     "Using " ; texttt "do" ; " notation "
+-- >     "you avoid many ocurrences of the "
+-- >     texttt "(<>)" ; " operator and a lot of "
+-- >     "parentheses. With the cost of a monad."
+--
+-- Since 'LaTeXT' is a monad transformer, you can do also:
+--
+-- > anotherExample :: LaTeXT IO ()
+-- > anotherExample = lift (readFileTex "foo") >>= verbatim
+--
+-- This way, it is easy (without carrying arguments) to include IO outputs
+-- in the LaTeX document, like files, times or random objects.
+--
+-- Another approach could be to have custom counters, label management
+-- or any other user-defined feature.
+--
+-- Of course, you can always use the simpler interface provided by the plain 'LaTeX' type.
+--
+module Text.LaTeX.Base.Writer
+ ( -- * @LaTeXT@ writer
+   LaTeXT
+ , runLaTeXT
+ , execLaTeXT
+   -- ** Synonyms
+ , LaTeXT_
+ , LaTeXM
+ , runLaTeXM
+ , execLaTeXM
+   -- * Utils
+ , execLaTeXTWarn
+ , extractLaTeX
+ , extractLaTeX_
+ , textell
+ , rendertexM
+ , liftFun
+ , liftOp
+   -- * Re-exports
+ , lift
+ , liftIO
+   ) where
+
+-- base
+import Control.Applicative
+import Control.Monad (liftM)
+import Control.Arrow
+import Data.String
+import Data.Monoid
+-- transformers
+import Control.Monad.Trans.Writer
+import Control.Monad.IO.Class
+import Control.Monad.Trans.Class
+import Data.Functor.Identity
+-- HaTeX
+import Text.LaTeX.Base.Syntax
+import Text.LaTeX.Base.Class
+import Text.LaTeX.Base.Render
+import Text.LaTeX.Base.Warnings (Warning,checkAll,check)
+
+-- | 'WriterT' monad transformer applied to 'LaTeX' values.
+newtype LaTeXT m a =
+  LaTeXT { unwrapLaTeXT :: WriterT LaTeX m a }
+
+instance Functor f => Functor (LaTeXT f) where
+ fmap f = LaTeXT . fmap f . unwrapLaTeXT
+
+instance Applicative f => Applicative (LaTeXT f) where
+ pure = LaTeXT . pure
+ (LaTeXT f) <*> (LaTeXT x) = LaTeXT $ f <*> x
+
+-- | Type synonym for empty 'LaTeXT' computations.
+type LaTeXT_ m = LaTeXT m ()
+
+-- | The 'LaTeXT' monad transformed applied to 'Identity'.
+type LaTeXM = LaTeXT Identity
+
+-- | A particular case of 'runLaTeXT'.
+--
+-- > runLaTeXM = runIdentity . runLaTeXT
+--
+runLaTeXM :: LaTeXM a -> (a, LaTeX)
+runLaTeXM = runIdentity . runLaTeXT
+
+-- | A particular case of 'execLaTeXT'.
+--
+-- > execLaTeXM = runIdentity . execLaTeXT
+--
+execLaTeXM :: LaTeXM a -> LaTeX
+execLaTeXM = runIdentity . execLaTeXT
+
+instance MonadTrans LaTeXT where
+ lift = LaTeXT . lift
+
+instance Monad m => Monad (LaTeXT m) where
+ return = LaTeXT . return
+ (LaTeXT c) >>= f = LaTeXT $ do 
+  a <- c
+  let LaTeXT c' = f a
+  c'
+ fail = return . error
+
+instance MonadIO m => MonadIO (LaTeXT m) where
+ liftIO = lift . liftIO
+
+instance (Monad m, a ~ ()) => LaTeXC (LaTeXT m a) where
+ liftListL f xs = mapM extractLaTeX_ xs >>= textell . f
+
+-- | Running a 'LaTeXT' computation returns the final 'LaTeX' value.
+runLaTeXT :: Monad m => LaTeXT m a -> m (a,LaTeX)
+runLaTeXT = runWriterT . unwrapLaTeXT
+
+-- | This is the usual way to run the 'LaTeXT' monad
+--   and obtain a 'LaTeX' value.
+--
+-- > execLaTeXT = liftM snd . runLaTeXT
+--
+-- If @anExample@ is defined as above (at the top of this module
+-- documentation), use the following to get the LaTeX value
+-- generated out.
+--
+-- > myLaTeX :: Monad m => m LaTeX
+-- > myLaTeX = execLaTeXT anExample
+--
+execLaTeXT :: Monad m => LaTeXT m a -> m LaTeX
+execLaTeXT = liftM snd . runLaTeXT
+
+-- | Version of 'execLaTeXT' with possible warning messages.
+--   This function applies 'checkAll' to the 'LaTeX' output.
+execLaTeXTWarn :: Monad m => LaTeXT m a -> m (LaTeX,[Warning])
+execLaTeXTWarn = liftM (id &&& check checkAll) . execLaTeXT
+
+-- | This function run a 'LaTeXT' computation,
+--   lifting the result again in the monad.
+extractLaTeX :: Monad m => LaTeXT m a -> LaTeXT m (a,LaTeX)
+extractLaTeX = LaTeXT . lift . runWriterT . unwrapLaTeXT
+
+-- | Executes a 'LaTeXT' computation, embedding it again in
+--   the 'LaTeXT' monad.
+--
+-- > extractLaTeX_ = liftM snd . extractLaTeX
+--
+-- This function was heavily used in the past by HaTeX-meta
+-- to generate those @.Monad@ modules. The current purpose
+-- is to implement the 'LaTeXC' instance of 'LaTeXT', which
+-- is closely related.
+extractLaTeX_ :: Monad m => LaTeXT m a -> LaTeXT m LaTeX
+extractLaTeX_ = liftM snd . extractLaTeX
+
+-- | With 'textell' you can append 'LaTeX' values to the
+--   state of the 'LaTeXT' monad.
+textell :: Monad m => LaTeX -> LaTeXT m ()
+textell = LaTeXT . tell
+
+-- | Lift a function over 'LaTeX' values to a function
+--   acting over the state of a 'LaTeXT' computation.
+liftFun :: Monad m
+        => (LaTeX -> LaTeX)
+        -> (LaTeXT m a -> LaTeXT m a)
+liftFun f (LaTeXT c) = LaTeXT $ do
+ (p,l) <- lift $ runWriterT c
+ tell $ f l
+ return p
+
+-- | Lift an operator over 'LaTeX' values to an operator
+--   acting over the state of two 'LaTeXT' computations.
+--
+-- /Note: The returned value is the one returned by the/
+-- /second argument of the lifted operator./
+liftOp :: Monad m
+       => (LaTeX -> LaTeX -> LaTeX)
+       -> (LaTeXT m a -> LaTeXT m b -> LaTeXT m b)
+liftOp op (LaTeXT c) (LaTeXT c') = LaTeXT $ do
+ (_,l)  <- lift $ runWriterT c
+ (p,l') <- lift $ runWriterT c'
+ tell $ l `op` l'
+ return p
+
+-- | Just like 'rendertex', but with 'LaTeXT' output.
+--
+-- > rendertexM = textell . rendertex
+--
+rendertexM :: (Render a, Monad m) => a -> LaTeXT m ()
+rendertexM = textell . rendertex
+
+-- Overloaded Strings
+
+instance (Monad m, a ~ ()) => IsString (LaTeXT m a) where
+ fromString = textell . fromString
+
+-- Monoids
+
+instance (Monad m, a ~ ()) => Monoid (LaTeXT m a) where
+ mempty = return ()
+ mappend = (>>)
+
diff --git a/Text/LaTeX/Packages/AMSFonts.hs b/Text/LaTeX/Packages/AMSFonts.hs
--- a/Text/LaTeX/Packages/AMSFonts.hs
+++ b/Text/LaTeX/Packages/AMSFonts.hs
@@ -1,34 +1,34 @@
-
--- | Module for the package @amsfonts@.
-module Text.LaTeX.Packages.AMSFonts
- ( -- * AMSFonts package
-   amsfonts
-   -- * Fonts
- , mathbb
-   ) where
-
-import Text.LaTeX.Base.Syntax
-import Text.LaTeX.Base.Class
-import Text.LaTeX.Base.Types
-
--- | AMSFonts package.
--- Example:
---
--- > usepackage [] amsfonts
-amsfonts :: ClassName
-amsfonts = "amsfonts"
-
---
-
--- | This font is useful for representing sets like
---   R (real numbers) or Z (integers). For instance:
---
--- > "The set of real numbers are represented by " <> mathbb "R" <> "."
---
--- Or in monadic form:
---
--- > "The set of real numbers are represented by " >> mathbb "R" >> "."
---
--- /Note the use of overloaded strings./
-mathbb :: LaTeXC l => l -> l
-mathbb = liftL $ \l -> TeXComm "mathbb" [FixArg l]
+
+-- | Module for the package @amsfonts@.
+module Text.LaTeX.Packages.AMSFonts
+ ( -- * AMSFonts package
+   amsfonts
+   -- * Fonts
+ , mathbb
+   ) where
+
+import Text.LaTeX.Base.Syntax
+import Text.LaTeX.Base.Class
+import Text.LaTeX.Base.Types
+
+-- | AMSFonts package.
+-- Example:
+--
+-- > usepackage [] amsfonts
+amsfonts :: ClassName
+amsfonts = "amsfonts"
+
+--
+
+-- | This font is useful for representing sets like
+--   R (real numbers) or Z (integers). For instance:
+--
+-- > "The set of real numbers are represented by " <> mathbb "R" <> "."
+--
+-- Or in monadic form:
+--
+-- > "The set of real numbers are represented by " >> mathbb "R" >> "."
+--
+-- /Note the use of overloaded strings./
+mathbb :: LaTeXC l => l -> l
+mathbb = liftL $ \l -> TeXComm "mathbb" [FixArg l]
diff --git a/Text/LaTeX/Packages/AMSMath.hs b/Text/LaTeX/Packages/AMSMath.hs
--- a/Text/LaTeX/Packages/AMSMath.hs
+++ b/Text/LaTeX/Packages/AMSMath.hs
@@ -1,904 +1,904 @@
-
-{-# LANGUAGE OverloadedStrings, TypeFamilies #-}
-
--- | \AMSMath\ support. Also numeric instances ('Num', 'Fractional' and 'Floating') for 'LaTeX' and 'LaTeXT'.
-module Text.LaTeX.Packages.AMSMath
- ( -- * AMSMath package
-   amsmath
-   -- * Math Environments
- , math, mathDisplay
- , equation , equation_
- , align , align_
-   -- ** Referencing
- , eqref , nonumber
-   -- * Symbols and utilities
-   -- | The unicode approximations do, of course, not reliably represent how
-   --   LaTeX renders these symbols.
-   
-   -- ** Brackets / delimiters
- , autoParens
- , autoSquareBrackets, autoBraces, autoAngleBrackets
- , autoBrackets
- 
- , langle , rangle
- , lfloor , rfloor
- , lceil , rceil 
- , dblPipe
-   -- ** Superscript and subscript
- , (^:) , (!:)
-   -- ** Function symbols
-   -- | Some symbols are preceded with /t/ to be distinguished from
-   --   predefined Haskell entities (like 'sin' and 'cos').
- , tsin , arcsin
- , tcos , arccos
- , ttan , arctan
- , cot , arccot
- , tsinh , tcosh , ttanh , coth
- , sec , csc
- , texp
- , tlog , ln
- , tsqrt
-   -- ** Sum/Integral symbols
- , tsum , sumFromTo
- , prod , prodFromTo
- , integral , integralFromTo
-   -- ** Operator symbols
-   -- *** Arithmetic
- , pm , mp
- , cdot , times , div_
- , frac
- , (*:) , star
- , circ , bullet
-   -- *** Comparison
- , (=:) , (/=:)
- , (<:) , (<=:)
- , (>:) , (>=:)
- , ll , gg
- , equiv
- , propto
-   -- *** Sets
- , in_ , ni , notin
- , subset , supset
- , cap , cup
- , setminus
-   -- *** Misc operators
- , vee , wedge
- , oplus , ominus , otimes
- , oslash , odot
- 
-   -- ** Greek alphabet
-   -- | Functions of greek alphabet symbols.
-   --
-   --   Uppercase versions are suffixed with @u@.
-   --   Variants are prefixed with @var@.
-   --   The function 'pi_' is ended by an underscore symbol to
-   --   distinguish it from the 'pi' Prelude function.
- , alpha    , beta       , gamma
- , gammau   , delta      , deltau
- , epsilon  , varepsilon , zeta
- , eta      , theta      , vartheta , thetau
- , iota     , kappa      , lambda
- , lambdau  , mu         , nu
- , xi       , xiu        , pi_
- , varpi    , piu        , rho
- , varrho   , sigma      , varsigma
- , sigmau   , tau        , upsilon
- , upsilonu , phi        , varphi
- , phiu     , chi        , psi
- , psiu     , omega      , omegau
-   -- ** Other symbols
- , to , mapsto
- , forall , exists
- , dagger, ddagger
- , infty
-   -- * Fonts
- , mathdefault
- , mathbf
- , mathrm
- , mathcal
- , mathsf
- , mathtt
- , mathit
-   -- * Matrices
- , pmatrix  , bmatrix
- , b2matrix , vmatrix
- , v2matrix
-   ) where
-
-import Text.LaTeX.Base
-import Text.LaTeX.Base.Syntax
-import Text.LaTeX.Base.Class
-
--- External imports
-import Data.List
-import Data.Ratio
-import Data.Matrix
-
--- | AMSMath package.
--- Example:
---
--- > usepackage [] amsmath
-amsmath :: PackageName
-amsmath = "amsmath"
-
--- | Inline mathematical expressions.
-math :: LaTeXC l => l -> l
-math = liftL $ TeXMath Dollar
-
--- | Displayed mathematical expressions, i.e. in a seperate line / block.
-mathDisplay :: LaTeXC l => l -> l
-mathDisplay = liftL $ TeXMath Square
-
--------------------------------------------------------
-------- Numeric instances for LaTeX and LaTeXT --------
--------------------------------------------------------
-
------------ LaTeX instances
-
--- | Careful! Method 'signum' is undefined. Don't use it!
---   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
-instance Num LaTeX where
- (+) = between "+"
- (-) = between "-"
- (*) = (<>)
- negate = (TeXEmpty -)
- fromInteger = rendertex
- abs = autoBrackets "|" "|"
- -- Non-defined methods
- signum _ = error "Cannot use \"signum\" Num method with a LaTeX value."
-
--- | Division uses the LaTeX 'frac' command.
---   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
-instance Fractional LaTeX where
- (/) = frac
- fromRational = rendertex . (fromRational :: Rational -> Double)
-
--- | Undefined methods: 'asinh', 'atanh' and 'acosh'.
---   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
-instance Floating LaTeX where
- pi = pi_
- exp = (texp <>)
- sqrt = tsqrt Nothing
- log = (tlog <>)
- (**) = (^:)
- logBase b x = (tlog !: b) <> x
- sin = (tsin <>)
- tan = (ttan <>)
- cos = (tcos <>)
- asin = (arcsin <>)
- atan = (arctan <>)
- acos = (arccos <>)
- sinh = (tsinh <>)
- tanh = (ttanh <>)
- cosh = (tcosh <>)
- -- Non-defined methods
- asinh = error "Function 'asinh' is not defined in AMSMath!"
- atanh = error "Function 'atabh' is not defined in AMSMath!"
- acosh = error "Function 'acosh' is not defined in AMSMath!"
-
------------ LaTeXT instances
-
--- | Warning: this instance only exists for the 'Num' instance.
---   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
-instance Eq (LaTeXT m a) where
- _ == _ = error "Cannot use \"(==)\" Eq method with a LaTeXT value."
-
--- | Warning: this instance only exists for the 'Num' instance.
---   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
-instance Show (LaTeXT m a) where
- show _ = error "Cannot use \"show\" Show method with a LaTeXT value."
-
--- | Careful! Method 'signum' is undefined. Don't use it!
---   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
-instance (Monad m, a ~ ()) => Num (LaTeXT m a) where
- (+) = liftOp (+)
- (-) = liftOp (-)
- (*) = (>>)
- negate = liftFun negate
- fromInteger = fromLaTeX . fromInteger
- abs = liftFun abs
- -- Non-defined methods
- signum _ = error "Cannot use \"signum\" Num method with a LaTeXT value."
-
--- | Division uses the LaTeX 'frac' command.
---   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
-instance (Monad m, a ~ ()) => Fractional (LaTeXT m a) where
- (/) = liftOp (/)
- fromRational = fromLaTeX . fromRational
-
--- | Undefined methods: 'asinh', 'atanh' and 'acosh'.
---   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
-instance (Monad m, a ~ ()) => Floating (LaTeXT m a) where
- pi = pi_
- exp = liftFun exp
- sqrt = liftFun sqrt
- log = liftFun log
- (**) = liftOp (**)
- logBase = liftOp logBase
- sin = liftFun sin
- tan = liftFun tan
- cos = liftFun cos
- asin = liftFun asin
- atan = liftFun atan
- acos = liftFun acos
- sinh = liftFun sinh
- tanh = liftFun tanh
- cosh = liftFun cosh
- -- Non-defined methods
- asinh = error "Function 'asinh' is not defined in AMSMath!"
- atanh = error "Function 'atabh' is not defined in AMSMath!"
- acosh = error "Function 'acosh' is not defined in AMSMath!"
-
--- | A reference to a numbered equation. Use with a 'label' defined in the
--- scope of the equation refered to.
-eqref :: LaTeXC l => l -> l
-eqref = liftL $ \l -> TeXComm "eqref" [FixArg . TeXRaw $ render l]
-
--- | Prevent an equation from being numbered, where the environment would by default do that.
-nonumber :: LaTeXC l => l
-nonumber = comm0 "nonumber"
-
--- | A numbered mathematical equation (or otherwise math expression).
-equation :: LaTeXC l => l -> l
-equation = liftL $ TeXEnv "equation" []
-
--- | The unnumbered variant of 'equation'.
-equation_ :: LaTeXC l => l -> l
-equation_ = liftL $ TeXEnv "equation*" []
-
--- | An array of aligned equations. Use '&' to specify the points that should
--- horizontally match. Each equation is numbered, unless prevented by 'nonumber'.
-align :: LaTeXC l => [l] -> l
-align = liftL(TeXEnv "align" []) . mconcat . intersperse lnbk 
-
--- | The unnumbered variant of 'align'.
-align_ :: LaTeXC l => [l] -> l
-align_ = liftL(TeXEnv "align*" []) . mconcat . intersperse lnbk 
-
--------------------------------------
-------- Symbols and utilities -------
-
--- | Surround a LaTeX math expression by parentheses whose height
--- automatically matches the expression's. Translates to @\\left(...\\right)@.
-autoParens :: LaTeXC l => l -> l
-autoParens x = commS "left(" <> x <> commS "right)"
-
--- | Like 'autoParens', but with square brackets. Equivalent to @'autoBrackets'\"[\"\"]\"@.
-autoSquareBrackets :: LaTeXC l => l -> l
-autoSquareBrackets x = commS "left[" <> x <> commS "right]"
-
--- | Like 'autoParens', but with curly brackets.
-autoBraces :: LaTeXC l => l -> l
-autoBraces x = commS "left"<>"{" <> x <> commS "right"<>"}"
-
--- | Like 'autoParens', but with angle brackets 〈 ... 〉. Equivalent to @'autoBrackets' 'langle' 'rangle'@.
-autoAngleBrackets :: LaTeXC l => l -> l
-autoAngleBrackets x = commS "left"<>langle <> x <> commS "right"<>rangle
-
--- | Use custom LaTeX expressions as auto-scaled delimiters to surround math.
--- Suitable delimiters include |...| (absolute value), ‖...‖ (norm,
--- 'dblPipe'), ⌊...⌋ (round-off Gauss brackets, 'lfloor' / 'rfloor') etc..
-autoBrackets :: LaTeXC l => LaTeX -> LaTeX -> l -> l
-autoBrackets lBrack rBrack x
-  = commS "left" <> braces (fromLaTeX lBrack) <> x <> commS "right" <> braces (fromLaTeX rBrack)
-
--- | Left angle bracket, 〈.
-langle :: LaTeXC l => l
-langle = comm0 "langle"
-
--- | Right angle bracket, 〉.
-rangle :: LaTeXC l => l
-rangle = comm0 "rangle"
-
--- | Left floor, ⌊.
-lfloor :: LaTeXC l => l
-lfloor = comm0 "lfloor"
-
--- | Right floor, ⌋.
-rfloor :: LaTeXC l => l
-rfloor = comm0 "rfloor"
-
--- | Left ceiling, ⌈.
-lceil :: LaTeXC l => l
-lceil = comm0 "lceil"
-
--- | Right ceiling, ⌉.
-rceil :: LaTeXC l => l
-rceil = comm0 "rceil"
-
--- | Double vertical line, used as delimiter for norms (‖ ... ‖).
-dblPipe :: LaTeXC l => l
-dblPipe = comm0 "|"
-
--- | Superscript.
-(^:) :: LaTeXC l => l -> l -> l
-x ^: y = x <> raw "^"  <> braces y
-
--- | Subscript.
-(!:) :: LaTeXC l => l -> l -> l
-x !: y = x <> raw "_" <> braces y
-
----- Function symbols
-
--- | Sine function symbol.
-tsin :: LaTeXC l => l
-tsin = comm0 "sin"
-
--- | Arcsine function symbol.
-arcsin :: LaTeXC l => l
-arcsin = comm0 "arcsin"
-
--- | Cosine function symbol.
-tcos :: LaTeXC l => l
-tcos = comm0 "cos"
-
--- | Arccosine function symbol.
-arccos :: LaTeXC l => l
-arccos = comm0 "arccos"
-
--- | Tangent function symbol.
-ttan :: LaTeXC l => l
-ttan = comm0 "tan"
-
--- | Arctangent function symbol.
-arctan :: LaTeXC l => l
-arctan = comm0 "arctan"
-
--- | Cotangent function symbol.
-cot :: LaTeXC l => l
-cot = comm0 "cot"
-
--- | Arccotangent function symbol.
-arccot :: LaTeXC l => l
-arccot = comm0 "arccot"
-
--- | Hyperbolic sine function symbol.
-tsinh :: LaTeXC l => l
-tsinh = comm0 "sinh"
-
--- | Hyperbolic cosine function symbol.
-tcosh :: LaTeXC l => l
-tcosh = comm0 "cosh"
-
--- | Hyperbolic tangent function symbol.
-ttanh :: LaTeXC l => l
-ttanh = comm0 "tanh"
-
--- | Hyperbolic cotangent function symbol.
-coth :: LaTeXC l => l
-coth = comm0 "coth"
-
--- | Secant function symbol.
-sec :: LaTeXC l => l
-sec = comm0 "sec"
-
--- | Cosecant function symbol.
-csc :: LaTeXC l => l
-csc = comm0 "csc"
-
--- | Exponential function symbol.
-texp :: LaTeXC l => l
-texp = comm0 "exp"
-
--- | Logarithm function symbol.
-tlog :: LaTeXC l => l
-tlog = comm0 "log"
-
--- | Natural logarithm symbol.
-ln :: LaTeXC l => l
-ln = comm0 "ln"
-
--- | Root notation. Use @tsqrt (Just n) x@ for the @n@th root of @x@.
---   When 'Nothing' is supplied, the function will output a square root.
-tsqrt :: LaTeXC l => Maybe l -> l -> l
-tsqrt Nothing  = liftL $ \x -> TeXComm "sqrt" [FixArg x]
-tsqrt (Just n) = liftL2 (\m x -> TeXComm "sqrt" [OptArg m, FixArg x]) n
-
----- Sum/Integral symbols
-
--- | Sigma sumation symbol. Use 'sumFromTo' instead if you want to
---   specify the limits of the sum.
-tsum :: LaTeXC l => l
-tsum = comm0 "sum"
-
--- | Sigma sumation symbol with limits.
-sumFromTo :: LaTeXC l
-          => l -- ^ Expression below the sigma.
-          -> l -- ^ Expression above the sigma.
-          -> l
-sumFromTo x y = commS "sum" !: x ^: y
-
--- | Pi product symbol. Use 'prodFromTo' if you want to specify the
---   limits of the product.
-prod :: LaTeXC l => l
-prod = comm0 "prod"
-
--- | Pi product symbol with limits.
-prodFromTo :: LaTeXC l
-           => l -- ^ Expression below the pi.
-           -> l -- ^ Expression above the pi.
-           -> l
-prodFromTo x y = commS "prod" !: x ^: y
-
--- | Integral symbol. Use 'integralFromTo' if you want to specify
---   the limits of the integral.
-integral :: LaTeXC l => l
-integral = comm0 "int"
-
--- | Integral symbol with limits of integration.
-integralFromTo :: LaTeXC l
-               => l -- ^ Lower limit of integration.
-               -> l -- ^ Upper limit of integration.
-               -> l
-integralFromTo x y = commS "int" !: x ^: y
-
----- Operator symbols
-
--- | Negative form of an operator.
-notop :: LaTeXC l =>
-         (l -> l -> l)
-      ->  l -> l -> l
-notop op =
- \l1 l2 ->
-   (l1 <> commS "not") `op` l2
-
--- | Plus-or-minus operator (±).
-pm :: LaTeXC l => l -> l -> l
-pm  = between $ comm0 "pm"
-
--- | Minus-or-plus operator (∓).
-mp :: LaTeXC l => l -> l -> l
-mp  = between $ comm0 "mp"
-
--- | Centered-dot operator (⋅).
-cdot :: LaTeXC l => l -> l -> l
-cdot  = between $ comm0 "cdot"
-
--- | \"x-cross\" multiplication operator (×).
-times :: LaTeXC l => l -> l -> l
-times = between $ comm0 "times"
-
--- | Division operator.
-div_ :: LaTeXC l => l -> l -> l
-div_  = between $ comm0 "div"
-
--- | Fraction operator.
-frac :: LaTeXC l => l -> l -> l
-frac = liftL2 $ \p q -> TeXComm "frac" [FixArg p, FixArg q]
-
-infixl 7 *:
-
--- | Asterisk operator (*).
---
--- > infixl 7 *:
-(*:) :: LaTeXC l => l -> l -> l
-(*:) = between $ comm0 "ast"
-
--- | Star operator (★).
-star :: LaTeXC l => l -> l -> l
-star  = between $ comm0 "star"
-
--- | Ring operator (∘).
-circ :: LaTeXC l => l -> l -> l
-circ  = between $ comm0 "circ"
-
--- | Bullet operator (∙).
-bullet :: LaTeXC l => l -> l -> l
-bullet  = between $ comm0 "bullet"
-
-infixr 4 =: , /=:
-
--- | Equal.
---
--- > infixr 4 =:
-(=:) :: LaTeXC l => l -> l -> l
-(=:)  = between "="
-
--- | Not equal (≠).
---
--- > infixr 4 /=:
-(/=:) :: LaTeXC l => l -> l -> l
-(/=:) = notop (=:)
-
--- | Greater.
-(>:) :: LaTeXC l => l -> l -> l
-(>:) = between ">"
-
--- | Greater or equal (≥).
-(>=:) :: LaTeXC l => l -> l -> l
-(>=:) = between $ comm0 "geq"
-
--- | Lesser.
-(<:) :: LaTeXC l => l -> l -> l
-(<:) = between "<"
-
--- | Lesser or equal (≤).
-(<=:) :: LaTeXC l => l -> l -> l
-(<=:) = between $ comm0 "leq"
-
--- | Much less (≪).
-ll :: LaTeXC l => l -> l -> l
-ll = between $ comm0 "ll"
-
--- | Much greater (≫).
-gg :: LaTeXC l => l -> l -> l
-gg = between $ comm0 "gg"
-
--- | Proportional-to (∝).
-propto :: LaTeXC l => l -> l -> l
-propto  = between $ comm0 "propto"
-
--- | Identical \/ defined-as \/ equivalent (≡).
-equiv :: LaTeXC l => l -> l -> l
-equiv  = between $ comm0 "equiv"
-
--- | Element-of (∈).
-in_ :: LaTeXC l => l -> l -> l
-in_ = between $ comm0 "in"
-
--- | Mirrored element-of (∋).
-ni :: LaTeXC l => l -> l -> l
-ni  = between $ comm0 "ni"
-
--- | Not element of (∉).
-notin :: LaTeXC l => l -> l -> l
-notin = between $ comm0 "notin"
-
--- | Subset-of (⊂).
-subset :: LaTeXC l => l -> l -> l
-subset  = between $ comm0 "subset"
-
--- | Superset-of (⊃).
-supset :: LaTeXC l => l -> l -> l
-supset  = between $ comm0 "supset"
-
--- | Set intersection (∩).
-cap :: LaTeXC l => l -> l -> l
-cap  = between $ comm0 "cap"
-
--- | Set union (∪).
-cup :: LaTeXC l => l -> l -> l
-cup  = between $ comm0 "cup"
-
--- | Set minus (∖).
-setminus :: LaTeXC l => l -> l -> l
-setminus  = between $ comm0 "setminus"
-
--- | Angle pointing downwards (∨).
-vee :: LaTeXC l => l -> l -> l
-vee  = between $ comm0 "vee"
-
--- | Angle pointing upwards (∧).
-wedge :: LaTeXC l => l -> l -> l
-wedge  = between $ comm0 "wedge"
-
--- | Circled plus operator (⊕).
-oplus :: LaTeXC l => l -> l -> l
-oplus  = between $ comm0 "oplus"
-
--- | Circled minus operator (⊖).
-ominus :: LaTeXC l => l -> l -> l
-ominus  = between $ comm0 "ominus"
-
--- | Circled multiplication cross (⊗).
-otimes :: LaTeXC l => l -> l -> l
-otimes  = between $ comm0 "otimes"
-
--- | Circled slash (⊘).
-oslash :: LaTeXC l => l -> l -> l
-oslash  = between $ comm0 "oslash"
-
--- | Circled dot operator (⊙).
-odot :: LaTeXC l => l -> l -> l
-odot  = between $ comm0 "odot"
-
----- Greek alphabet
-
--- | /α/ symbol.
-alpha :: LaTeXC l => l
-alpha = comm0 "alpha"
-
--- | /β/ symbol.
-beta :: LaTeXC l => l
-beta = comm0 "beta"
-
--- | /γ/ symbol.
-gamma :: LaTeXC l => l
-gamma = comm0 "gamma"
-
--- | Γ symbol.
-gammau :: LaTeXC l => l
-gammau = comm0 "Gamma"
-
--- | /δ/ symbol.
-delta :: LaTeXC l => l
-delta = comm0 "delta"
-
--- | Δ symbol.
-deltau :: LaTeXC l => l
-deltau = comm0 "Delta"
-
--- | /ϵ/ symbol.
-epsilon :: LaTeXC l => l
-epsilon = comm0 "epsilon"
-
--- | /ε/ symbol.
-varepsilon :: LaTeXC l => l
-varepsilon = comm0 "varepsilon"
-
--- | /ζ/ symbol.
-zeta :: LaTeXC l => l
-zeta = comm0 "zeta"
-
--- | /η/ symbol.
-eta :: LaTeXC l => l
-eta = comm0 "eta"
-
--- | /θ/ symbol.
-theta :: LaTeXC l => l
-theta = comm0 "theta"
-
--- | /ϑ/ symbol.
-vartheta :: LaTeXC l => l
-vartheta = comm0 "vartheta"
-
--- | Θ symbol.
-thetau :: LaTeXC l => l
-thetau = comm0 "thetau"
-
--- | /ι/ symbol.
-iota :: LaTeXC l => l
-iota = comm0 "iota"
-
--- | /κ/ symbol.
-kappa :: LaTeXC l => l
-kappa = comm0 "kappa"
-
--- | /λ/ symbol.
-lambda :: LaTeXC l => l
-lambda = comm0 "lambda"
-
--- | Λ symbol.
-lambdau :: LaTeXC l => l
-lambdau = comm0 "Lambda"
-
--- | /μ/ symbol.
-mu :: LaTeXC l => l
-mu = comm0 "mu"
-
--- | /ν/ symbol.
-nu :: LaTeXC l => l
-nu = comm0 "nu"
-
--- | /ξ/ symbol.
-xi :: LaTeXC l => l
-xi = comm0 "xi"
-
--- | Ξ symbol.
-xiu :: LaTeXC l => l
-xiu = comm0 "Xi"
-
--- | /π/ symbol.
-pi_ :: LaTeXC l => l
-pi_ = comm0 "pi"
-
--- | /ϖ/ symbol.
-varpi :: LaTeXC l => l
-varpi = comm0 "varpi"
-
--- | Π symbol.
-piu :: LaTeXC l => l
-piu = comm0 "Pi"
-
--- | /ρ/ symbol.
-rho :: LaTeXC l => l
-rho = comm0 "rho"
-
--- | /ϱ/ symbol.
-varrho :: LaTeXC l => l
-varrho = comm0 "varrho"
-
--- | /σ/ symbol.
-sigma :: LaTeXC l => l
-sigma = comm0 "sigma"
-
--- | /ς/ symbol.
-varsigma :: LaTeXC l => l
-varsigma = comm0 "varsigma"
-
--- | Σ symbol.
-sigmau :: LaTeXC l => l
-sigmau = comm0 "Sigma"
-
--- | /τ/ symbol.
-tau :: LaTeXC l => l
-tau = comm0 "tau"
-
--- | /υ/ symbol.
-upsilon :: LaTeXC l => l
-upsilon = comm0 "upsilon"
-
--- | Υ symbol.
-upsilonu :: LaTeXC l => l
-upsilonu = comm0 "Upsilon"
-
--- | /ϕ/ symbol.
-phi :: LaTeXC l => l
-phi = comm0 "phi"
-
--- | /φ/ symbol.
-varphi :: LaTeXC l => l
-varphi = comm0 "varphi"
-
--- | Φ symbol.
-phiu :: LaTeXC l => l
-phiu = comm0 "Phi"
-
--- | /χ/ symbol.
-chi :: LaTeXC l => l
-chi = comm0 "chi"
-
--- | /ψ/ symbol.
-psi :: LaTeXC l => l
-psi = comm0 "psi"
-
--- | Ψ symbol.
-psiu :: LaTeXC l => l
-psiu = comm0 "Psi"
-
--- | /ω/ symbol.
-omega :: LaTeXC l => l
-omega = comm0 "omega"
-
--- | Ω symbol.
-omegau :: LaTeXC l => l
-omegau = comm0 "Omega"
-
----- Other symbols
-
--- | A right-arrow, →.
-to :: LaTeXC l => l
-to = comm0 "to"
-
--- | A right-arrow for function definitions, ↦.
-mapsto :: LaTeXC l => l
-mapsto = comm0 "mapsto"
-
--- | /For all/ symbol, ∀.
-forall :: LaTeXC l => l
-forall = comm0 "forall"
-
--- | /Exists/ symbol, ∃.
-exists :: LaTeXC l => l
-exists = comm0 "exists"
-
--- | Dagger symbol, †.
-dagger :: LaTeXC l => l
-dagger = comm0 "dagger"
-
--- | Double dagger symbol, ‡.
-ddagger :: LaTeXC l => l
-ddagger = comm0 "ddagger"
-
--- | Infinity symbol.
-infty :: LaTeXC l => l
-infty = comm0 "infty"
-
--------------------------------------
------------- Math Fonts -------------
-
--- | Default math symbol font.
-mathdefault :: LaTeXC l => l -> l
-mathdefault = liftL $ \l -> TeXComm "mathdefault" [FixArg l]
-
--- | Bold face.
-mathbf :: LaTeXC l => l -> l
-mathbf = liftL $ \l -> TeXComm "mathbf" [FixArg l]
-
--- | Roman, i.e. not-italic math.
-mathrm :: LaTeXC l => l -> l
-mathrm = liftL $ \l -> TeXComm "mathrm" [FixArg l]
-
--- | Calligraphic math symbols.
-mathcal :: LaTeXC l => l -> l
-mathcal = liftL $ \l -> TeXComm "mathcal" [FixArg l]
-
--- | Sans-serif math.
-mathsf :: LaTeXC l => l -> l
-mathsf = liftL $ \l -> TeXComm "mathsf" [FixArg l]
-
--- | Typewriter font.
-mathtt :: LaTeXC l => l -> l
-mathtt = liftL $ \l -> TeXComm "mathtt" [FixArg l]
-
--- | Italic math. Uses the same glyphs as 'mathdefault', but with spacings
---   intended for multi-character symbols rather than juxtaposition of single-character symbols.
-mathit :: LaTeXC l => l -> l
-mathit = liftL $ \l -> TeXComm "mathit" [FixArg l]
-
--------------------------------------
-------------- Matrices --------------
-
-matrix2tex :: (Texy a, LaTeXC l) => Matrix a -> l
-matrix2tex m = mconcat
- [ foldr1 (&) [ texy $ m ! (i,j)
-     | j <- [1 .. ncols m]
-     ] <> lnbk
-     | i <- [1 .. nrows m]
-   ]
-
-toMatrix :: (Texy a, LaTeXC l) => String -> Maybe HPos -> Matrix a -> l
-toMatrix str Nothing  = liftL (TeXEnv str []) . matrix2tex
-toMatrix str (Just p) = liftL (TeXEnv (str ++ "*") [OptArg $ rendertex p]) . matrix2tex
-
--- | LaTeX rendering of a matrix using @pmatrix@ and a custom function to render cells.
---   Optional argument sets the alignment of the cells. Default (providing 'Nothing') 
---   is centered.
---
--- > ( M )
---
-pmatrix :: (Texy a, LaTeXC l) => Maybe HPos -> Matrix a -> l
-pmatrix = toMatrix "pmatrix"
-
--- | LaTeX rendering of a matrix using @bmatrix@ and a custom function to render cells.
---   Optional argument sets the alignment of the cells. Default (providing 'Nothing') 
---   is centered.
---
--- > [ M ]
---
-bmatrix :: (Texy a, LaTeXC l) => Maybe HPos -> Matrix a -> l
-bmatrix = toMatrix "bmatrix"
-
--- | LaTeX rendering of a matrix using @Bmatrix@ and a custom function to render cells.
---   Optional argument sets the alignment of the cells. Default (providing 'Nothing') 
---   is centered.
---
--- > { M }
---
-b2matrix :: (Texy a, LaTeXC l) => Maybe HPos -> Matrix a -> l
-b2matrix = toMatrix "Bmatrix"
-
--- | LaTeX rendering of a matrix using @vmatrix@ and a custom function to render cells.
---   Optional argument sets the alignment of the cells. Default (providing 'Nothing') 
---   is centered.
---
--- > | M |
---
-vmatrix :: (Texy a, LaTeXC l) => Maybe HPos -> Matrix a -> l
-vmatrix = toMatrix "vmatrix"
-
--- | LaTeX rendering of a matrix using @Vmatrix@ and a custom function to render cells.
---   Optional argument sets the alignment of the cells. Default (providing 'Nothing') 
---   is centered.
---
--- > || M ||
---
-v2matrix :: (Texy a, LaTeXC l) => Maybe HPos -> Matrix a -> l
-v2matrix = toMatrix "Vmatrix"
-
--------------------------------------
----------- Texy instances -----------
-
--- | Instance defined in "Text.LaTeX.Packages.AMSMath".
-instance (Integral a, Texy a) => Texy (Ratio a) where
- texy x = frac (texy $ numerator x) (texy $ denominator x)
-
--- | Instance defined in "Text.LaTeX.Packages.AMSMath".
-instance (Texy a, Texy b) => Texy (a,b) where
- texy (x,y) = autoParens $ texy x <> "," <> texy y
- 
--- | Instance defined in "Text.LaTeX.Packages.AMSMath".
-instance (Texy a, Texy b, Texy c) => Texy (a,b,c) where
- texy (x,y,z) = autoParens $ texy x <> "," <> texy y <> "," <> texy z
-
--- | Instance defined in "Text.LaTeX.Packages.AMSMath".
-instance (Texy a, Texy b, Texy c, Texy d) => Texy (a,b,c,d) where
- texy (a,b,c,d) = autoParens $ texy a <> "," <> texy b <> "," <> texy c <> "," <> texy d
-
--- | Instance defined in "Text.LaTeX.Packages.AMSMath".
-instance Texy a => Texy (Matrix a) where
- texy = pmatrix Nothing
-
--- | Instance defined in "Text.LaTeX.Packages.AMSMath".
-instance Texy a => Texy [a] where
- texy = autoSquareBrackets . mconcat .  intersperse "," .  fmap texy
+
+{-# LANGUAGE OverloadedStrings, TypeFamilies #-}
+
+-- | \AMSMath\ support. Also numeric instances ('Num', 'Fractional' and 'Floating') for 'LaTeX' and 'LaTeXT'.
+module Text.LaTeX.Packages.AMSMath
+ ( -- * AMSMath package
+   amsmath
+   -- * Math Environments
+ , math, mathDisplay
+ , equation , equation_
+ , align , align_
+   -- ** Referencing
+ , eqref , nonumber
+   -- * Symbols and utilities
+   -- | The unicode approximations do, of course, not reliably represent how
+   --   LaTeX renders these symbols.
+   
+   -- ** Brackets / delimiters
+ , autoParens
+ , autoSquareBrackets, autoBraces, autoAngleBrackets
+ , autoBrackets
+ 
+ , langle , rangle
+ , lfloor , rfloor
+ , lceil , rceil 
+ , dblPipe
+   -- ** Superscript and subscript
+ , (^:) , (!:)
+   -- ** Function symbols
+   -- | Some symbols are preceded with /t/ to be distinguished from
+   --   predefined Haskell entities (like 'sin' and 'cos').
+ , tsin , arcsin
+ , tcos , arccos
+ , ttan , arctan
+ , cot , arccot
+ , tsinh , tcosh , ttanh , coth
+ , sec , csc
+ , texp
+ , tlog , ln
+ , tsqrt
+   -- ** Sum/Integral symbols
+ , tsum , sumFromTo
+ , prod , prodFromTo
+ , integral , integralFromTo
+   -- ** Operator symbols
+   -- *** Arithmetic
+ , pm , mp
+ , cdot , times , div_
+ , frac
+ , (*:) , star
+ , circ , bullet
+   -- *** Comparison
+ , (=:) , (/=:)
+ , (<:) , (<=:)
+ , (>:) , (>=:)
+ , ll , gg
+ , equiv
+ , propto
+   -- *** Sets
+ , in_ , ni , notin
+ , subset , supset
+ , cap , cup
+ , setminus
+   -- *** Misc operators
+ , vee , wedge
+ , oplus , ominus , otimes
+ , oslash , odot
+ 
+   -- ** Greek alphabet
+   -- | Functions of greek alphabet symbols.
+   --
+   --   Uppercase versions are suffixed with @u@.
+   --   Variants are prefixed with @var@.
+   --   The function 'pi_' is ended by an underscore symbol to
+   --   distinguish it from the 'pi' Prelude function.
+ , alpha    , beta       , gamma
+ , gammau   , delta      , deltau
+ , epsilon  , varepsilon , zeta
+ , eta      , theta      , vartheta , thetau
+ , iota     , kappa      , lambda
+ , lambdau  , mu         , nu
+ , xi       , xiu        , pi_
+ , varpi    , piu        , rho
+ , varrho   , sigma      , varsigma
+ , sigmau   , tau        , upsilon
+ , upsilonu , phi        , varphi
+ , phiu     , chi        , psi
+ , psiu     , omega      , omegau
+   -- ** Other symbols
+ , to , mapsto
+ , forall , exists
+ , dagger, ddagger
+ , infty
+   -- * Fonts
+ , mathdefault
+ , mathbf
+ , mathrm
+ , mathcal
+ , mathsf
+ , mathtt
+ , mathit
+   -- * Matrices
+ , pmatrix  , bmatrix
+ , b2matrix , vmatrix
+ , v2matrix
+   ) where
+
+import Text.LaTeX.Base
+import Text.LaTeX.Base.Syntax
+import Text.LaTeX.Base.Class
+
+-- External imports
+import Data.List
+import Data.Ratio
+import Data.Matrix
+
+-- | AMSMath package.
+-- Example:
+--
+-- > usepackage [] amsmath
+amsmath :: PackageName
+amsmath = "amsmath"
+
+-- | Inline mathematical expressions.
+math :: LaTeXC l => l -> l
+math = liftL $ TeXMath Dollar
+
+-- | Displayed mathematical expressions, i.e. in a seperate line / block.
+mathDisplay :: LaTeXC l => l -> l
+mathDisplay = liftL $ TeXMath Square
+
+-------------------------------------------------------
+------- Numeric instances for LaTeX and LaTeXT --------
+-------------------------------------------------------
+
+----------- LaTeX instances
+
+-- | Careful! Method 'signum' is undefined. Don't use it!
+--   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
+instance Num LaTeX where
+ (+) = between "+"
+ (-) = between "-"
+ (*) = (<>)
+ negate = (TeXEmpty -)
+ fromInteger = rendertex
+ abs = autoBrackets "|" "|"
+ -- Non-defined methods
+ signum _ = error "Cannot use \"signum\" Num method with a LaTeX value."
+
+-- | Division uses the LaTeX 'frac' command.
+--   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
+instance Fractional LaTeX where
+ (/) = frac
+ fromRational = rendertex . (fromRational :: Rational -> Double)
+
+-- | Undefined methods: 'asinh', 'atanh' and 'acosh'.
+--   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
+instance Floating LaTeX where
+ pi = pi_
+ exp = (texp <>)
+ sqrt = tsqrt Nothing
+ log = (tlog <>)
+ (**) = (^:)
+ logBase b x = (tlog !: b) <> x
+ sin = (tsin <>)
+ tan = (ttan <>)
+ cos = (tcos <>)
+ asin = (arcsin <>)
+ atan = (arctan <>)
+ acos = (arccos <>)
+ sinh = (tsinh <>)
+ tanh = (ttanh <>)
+ cosh = (tcosh <>)
+ -- Non-defined methods
+ asinh = error "Function 'asinh' is not defined in AMSMath!"
+ atanh = error "Function 'atabh' is not defined in AMSMath!"
+ acosh = error "Function 'acosh' is not defined in AMSMath!"
+
+----------- LaTeXT instances
+
+-- | Warning: this instance only exists for the 'Num' instance.
+--   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
+instance Eq (LaTeXT m a) where
+ _ == _ = error "Cannot use \"(==)\" Eq method with a LaTeXT value."
+
+-- | Warning: this instance only exists for the 'Num' instance.
+--   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
+instance Show (LaTeXT m a) where
+ show _ = error "Cannot use \"show\" Show method with a LaTeXT value."
+
+-- | Careful! Method 'signum' is undefined. Don't use it!
+--   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
+instance (Monad m, a ~ ()) => Num (LaTeXT m a) where
+ (+) = liftOp (+)
+ (-) = liftOp (-)
+ (*) = (>>)
+ negate = liftFun negate
+ fromInteger = fromLaTeX . fromInteger
+ abs = liftFun abs
+ -- Non-defined methods
+ signum _ = error "Cannot use \"signum\" Num method with a LaTeXT value."
+
+-- | Division uses the LaTeX 'frac' command.
+--   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
+instance (Monad m, a ~ ()) => Fractional (LaTeXT m a) where
+ (/) = liftOp (/)
+ fromRational = fromLaTeX . fromRational
+
+-- | Undefined methods: 'asinh', 'atanh' and 'acosh'.
+--   This instance is defined in the "Text.LaTeX.Packages.AMSMath" module.
+instance (Monad m, a ~ ()) => Floating (LaTeXT m a) where
+ pi = pi_
+ exp = liftFun exp
+ sqrt = liftFun sqrt
+ log = liftFun log
+ (**) = liftOp (**)
+ logBase = liftOp logBase
+ sin = liftFun sin
+ tan = liftFun tan
+ cos = liftFun cos
+ asin = liftFun asin
+ atan = liftFun atan
+ acos = liftFun acos
+ sinh = liftFun sinh
+ tanh = liftFun tanh
+ cosh = liftFun cosh
+ -- Non-defined methods
+ asinh = error "Function 'asinh' is not defined in AMSMath!"
+ atanh = error "Function 'atabh' is not defined in AMSMath!"
+ acosh = error "Function 'acosh' is not defined in AMSMath!"
+
+-- | A reference to a numbered equation. Use with a 'label' defined in the
+-- scope of the equation refered to.
+eqref :: LaTeXC l => l -> l
+eqref = liftL $ \l -> TeXComm "eqref" [FixArg . TeXRaw $ render l]
+
+-- | Prevent an equation from being numbered, where the environment would by default do that.
+nonumber :: LaTeXC l => l
+nonumber = comm0 "nonumber"
+
+-- | A numbered mathematical equation (or otherwise math expression).
+equation :: LaTeXC l => l -> l
+equation = liftL $ TeXEnv "equation" []
+
+-- | The unnumbered variant of 'equation'.
+equation_ :: LaTeXC l => l -> l
+equation_ = liftL $ TeXEnv "equation*" []
+
+-- | An array of aligned equations. Use '&' to specify the points that should
+-- horizontally match. Each equation is numbered, unless prevented by 'nonumber'.
+align :: LaTeXC l => [l] -> l
+align = liftL(TeXEnv "align" []) . mconcat . intersperse lnbk 
+
+-- | The unnumbered variant of 'align'.
+align_ :: LaTeXC l => [l] -> l
+align_ = liftL(TeXEnv "align*" []) . mconcat . intersperse lnbk 
+
+-------------------------------------
+------- Symbols and utilities -------
+
+-- | Surround a LaTeX math expression by parentheses whose height
+-- automatically matches the expression's. Translates to @\\left(...\\right)@.
+autoParens :: LaTeXC l => l -> l
+autoParens x = commS "left(" <> x <> commS "right)"
+
+-- | Like 'autoParens', but with square brackets. Equivalent to @'autoBrackets'\"[\"\"]\"@.
+autoSquareBrackets :: LaTeXC l => l -> l
+autoSquareBrackets x = commS "left[" <> x <> commS "right]"
+
+-- | Like 'autoParens', but with curly brackets.
+autoBraces :: LaTeXC l => l -> l
+autoBraces x = commS "left"<>"{" <> x <> commS "right"<>"}"
+
+-- | Like 'autoParens', but with angle brackets 〈 ... 〉. Equivalent to @'autoBrackets' 'langle' 'rangle'@.
+autoAngleBrackets :: LaTeXC l => l -> l
+autoAngleBrackets x = commS "left"<>langle <> x <> commS "right"<>rangle
+
+-- | Use custom LaTeX expressions as auto-scaled delimiters to surround math.
+-- Suitable delimiters include |...| (absolute value), ‖...‖ (norm,
+-- 'dblPipe'), ⌊...⌋ (round-off Gauss brackets, 'lfloor' / 'rfloor') etc..
+autoBrackets :: LaTeXC l => LaTeX -> LaTeX -> l -> l
+autoBrackets lBrack rBrack x
+  = commS "left" <> braces (fromLaTeX lBrack) <> x <> commS "right" <> braces (fromLaTeX rBrack)
+
+-- | Left angle bracket, 〈.
+langle :: LaTeXC l => l
+langle = comm0 "langle"
+
+-- | Right angle bracket, 〉.
+rangle :: LaTeXC l => l
+rangle = comm0 "rangle"
+
+-- | Left floor, ⌊.
+lfloor :: LaTeXC l => l
+lfloor = comm0 "lfloor"
+
+-- | Right floor, ⌋.
+rfloor :: LaTeXC l => l
+rfloor = comm0 "rfloor"
+
+-- | Left ceiling, ⌈.
+lceil :: LaTeXC l => l
+lceil = comm0 "lceil"
+
+-- | Right ceiling, ⌉.
+rceil :: LaTeXC l => l
+rceil = comm0 "rceil"
+
+-- | Double vertical line, used as delimiter for norms (‖ ... ‖).
+dblPipe :: LaTeXC l => l
+dblPipe = comm0 "|"
+
+-- | Superscript.
+(^:) :: LaTeXC l => l -> l -> l
+x ^: y = x <> raw "^"  <> braces y
+
+-- | Subscript.
+(!:) :: LaTeXC l => l -> l -> l
+x !: y = x <> raw "_" <> braces y
+
+---- Function symbols
+
+-- | Sine function symbol.
+tsin :: LaTeXC l => l
+tsin = comm0 "sin"
+
+-- | Arcsine function symbol.
+arcsin :: LaTeXC l => l
+arcsin = comm0 "arcsin"
+
+-- | Cosine function symbol.
+tcos :: LaTeXC l => l
+tcos = comm0 "cos"
+
+-- | Arccosine function symbol.
+arccos :: LaTeXC l => l
+arccos = comm0 "arccos"
+
+-- | Tangent function symbol.
+ttan :: LaTeXC l => l
+ttan = comm0 "tan"
+
+-- | Arctangent function symbol.
+arctan :: LaTeXC l => l
+arctan = comm0 "arctan"
+
+-- | Cotangent function symbol.
+cot :: LaTeXC l => l
+cot = comm0 "cot"
+
+-- | Arccotangent function symbol.
+arccot :: LaTeXC l => l
+arccot = comm0 "arccot"
+
+-- | Hyperbolic sine function symbol.
+tsinh :: LaTeXC l => l
+tsinh = comm0 "sinh"
+
+-- | Hyperbolic cosine function symbol.
+tcosh :: LaTeXC l => l
+tcosh = comm0 "cosh"
+
+-- | Hyperbolic tangent function symbol.
+ttanh :: LaTeXC l => l
+ttanh = comm0 "tanh"
+
+-- | Hyperbolic cotangent function symbol.
+coth :: LaTeXC l => l
+coth = comm0 "coth"
+
+-- | Secant function symbol.
+sec :: LaTeXC l => l
+sec = comm0 "sec"
+
+-- | Cosecant function symbol.
+csc :: LaTeXC l => l
+csc = comm0 "csc"
+
+-- | Exponential function symbol.
+texp :: LaTeXC l => l
+texp = comm0 "exp"
+
+-- | Logarithm function symbol.
+tlog :: LaTeXC l => l
+tlog = comm0 "log"
+
+-- | Natural logarithm symbol.
+ln :: LaTeXC l => l
+ln = comm0 "ln"
+
+-- | Root notation. Use @tsqrt (Just n) x@ for the @n@th root of @x@.
+--   When 'Nothing' is supplied, the function will output a square root.
+tsqrt :: LaTeXC l => Maybe l -> l -> l
+tsqrt Nothing  = liftL $ \x -> TeXComm "sqrt" [FixArg x]
+tsqrt (Just n) = liftL2 (\m x -> TeXComm "sqrt" [OptArg m, FixArg x]) n
+
+---- Sum/Integral symbols
+
+-- | Sigma sumation symbol. Use 'sumFromTo' instead if you want to
+--   specify the limits of the sum.
+tsum :: LaTeXC l => l
+tsum = comm0 "sum"
+
+-- | Sigma sumation symbol with limits.
+sumFromTo :: LaTeXC l
+          => l -- ^ Expression below the sigma.
+          -> l -- ^ Expression above the sigma.
+          -> l
+sumFromTo x y = commS "sum" !: x ^: y
+
+-- | Pi product symbol. Use 'prodFromTo' if you want to specify the
+--   limits of the product.
+prod :: LaTeXC l => l
+prod = comm0 "prod"
+
+-- | Pi product symbol with limits.
+prodFromTo :: LaTeXC l
+           => l -- ^ Expression below the pi.
+           -> l -- ^ Expression above the pi.
+           -> l
+prodFromTo x y = commS "prod" !: x ^: y
+
+-- | Integral symbol. Use 'integralFromTo' if you want to specify
+--   the limits of the integral.
+integral :: LaTeXC l => l
+integral = comm0 "int"
+
+-- | Integral symbol with limits of integration.
+integralFromTo :: LaTeXC l
+               => l -- ^ Lower limit of integration.
+               -> l -- ^ Upper limit of integration.
+               -> l
+integralFromTo x y = commS "int" !: x ^: y
+
+---- Operator symbols
+
+-- | Negative form of an operator.
+notop :: LaTeXC l =>
+         (l -> l -> l)
+      ->  l -> l -> l
+notop op =
+ \l1 l2 ->
+   (l1 <> commS "not") `op` l2
+
+-- | Plus-or-minus operator (±).
+pm :: LaTeXC l => l -> l -> l
+pm  = between $ comm0 "pm"
+
+-- | Minus-or-plus operator (∓).
+mp :: LaTeXC l => l -> l -> l
+mp  = between $ comm0 "mp"
+
+-- | Centered-dot operator (⋅).
+cdot :: LaTeXC l => l -> l -> l
+cdot  = between $ comm0 "cdot"
+
+-- | \"x-cross\" multiplication operator (×).
+times :: LaTeXC l => l -> l -> l
+times = between $ comm0 "times"
+
+-- | Division operator.
+div_ :: LaTeXC l => l -> l -> l
+div_  = between $ comm0 "div"
+
+-- | Fraction operator.
+frac :: LaTeXC l => l -> l -> l
+frac = liftL2 $ \p q -> TeXComm "frac" [FixArg p, FixArg q]
+
+infixl 7 *:
+
+-- | Asterisk operator (*).
+--
+-- > infixl 7 *:
+(*:) :: LaTeXC l => l -> l -> l
+(*:) = between $ comm0 "ast"
+
+-- | Star operator (★).
+star :: LaTeXC l => l -> l -> l
+star  = between $ comm0 "star"
+
+-- | Ring operator (∘).
+circ :: LaTeXC l => l -> l -> l
+circ  = between $ comm0 "circ"
+
+-- | Bullet operator (∙).
+bullet :: LaTeXC l => l -> l -> l
+bullet  = between $ comm0 "bullet"
+
+infixr 4 =: , /=:
+
+-- | Equal.
+--
+-- > infixr 4 =:
+(=:) :: LaTeXC l => l -> l -> l
+(=:)  = between "="
+
+-- | Not equal (≠).
+--
+-- > infixr 4 /=:
+(/=:) :: LaTeXC l => l -> l -> l
+(/=:) = notop (=:)
+
+-- | Greater.
+(>:) :: LaTeXC l => l -> l -> l
+(>:) = between ">"
+
+-- | Greater or equal (≥).
+(>=:) :: LaTeXC l => l -> l -> l
+(>=:) = between $ comm0 "geq"
+
+-- | Lesser.
+(<:) :: LaTeXC l => l -> l -> l
+(<:) = between "<"
+
+-- | Lesser or equal (≤).
+(<=:) :: LaTeXC l => l -> l -> l
+(<=:) = between $ comm0 "leq"
+
+-- | Much less (≪).
+ll :: LaTeXC l => l -> l -> l
+ll = between $ comm0 "ll"
+
+-- | Much greater (≫).
+gg :: LaTeXC l => l -> l -> l
+gg = between $ comm0 "gg"
+
+-- | Proportional-to (∝).
+propto :: LaTeXC l => l -> l -> l
+propto  = between $ comm0 "propto"
+
+-- | Identical \/ defined-as \/ equivalent (≡).
+equiv :: LaTeXC l => l -> l -> l
+equiv  = between $ comm0 "equiv"
+
+-- | Element-of (∈).
+in_ :: LaTeXC l => l -> l -> l
+in_ = between $ comm0 "in"
+
+-- | Mirrored element-of (∋).
+ni :: LaTeXC l => l -> l -> l
+ni  = between $ comm0 "ni"
+
+-- | Not element of (∉).
+notin :: LaTeXC l => l -> l -> l
+notin = between $ comm0 "notin"
+
+-- | Subset-of (⊂).
+subset :: LaTeXC l => l -> l -> l
+subset  = between $ comm0 "subset"
+
+-- | Superset-of (⊃).
+supset :: LaTeXC l => l -> l -> l
+supset  = between $ comm0 "supset"
+
+-- | Set intersection (∩).
+cap :: LaTeXC l => l -> l -> l
+cap  = between $ comm0 "cap"
+
+-- | Set union (∪).
+cup :: LaTeXC l => l -> l -> l
+cup  = between $ comm0 "cup"
+
+-- | Set minus (∖).
+setminus :: LaTeXC l => l -> l -> l
+setminus  = between $ comm0 "setminus"
+
+-- | Angle pointing downwards (∨).
+vee :: LaTeXC l => l -> l -> l
+vee  = between $ comm0 "vee"
+
+-- | Angle pointing upwards (∧).
+wedge :: LaTeXC l => l -> l -> l
+wedge  = between $ comm0 "wedge"
+
+-- | Circled plus operator (⊕).
+oplus :: LaTeXC l => l -> l -> l
+oplus  = between $ comm0 "oplus"
+
+-- | Circled minus operator (⊖).
+ominus :: LaTeXC l => l -> l -> l
+ominus  = between $ comm0 "ominus"
+
+-- | Circled multiplication cross (⊗).
+otimes :: LaTeXC l => l -> l -> l
+otimes  = between $ comm0 "otimes"
+
+-- | Circled slash (⊘).
+oslash :: LaTeXC l => l -> l -> l
+oslash  = between $ comm0 "oslash"
+
+-- | Circled dot operator (⊙).
+odot :: LaTeXC l => l -> l -> l
+odot  = between $ comm0 "odot"
+
+---- Greek alphabet
+
+-- | /α/ symbol.
+alpha :: LaTeXC l => l
+alpha = comm0 "alpha"
+
+-- | /β/ symbol.
+beta :: LaTeXC l => l
+beta = comm0 "beta"
+
+-- | /γ/ symbol.
+gamma :: LaTeXC l => l
+gamma = comm0 "gamma"
+
+-- | Γ symbol.
+gammau :: LaTeXC l => l
+gammau = comm0 "Gamma"
+
+-- | /δ/ symbol.
+delta :: LaTeXC l => l
+delta = comm0 "delta"
+
+-- | Δ symbol.
+deltau :: LaTeXC l => l
+deltau = comm0 "Delta"
+
+-- | /ϵ/ symbol.
+epsilon :: LaTeXC l => l
+epsilon = comm0 "epsilon"
+
+-- | /ε/ symbol.
+varepsilon :: LaTeXC l => l
+varepsilon = comm0 "varepsilon"
+
+-- | /ζ/ symbol.
+zeta :: LaTeXC l => l
+zeta = comm0 "zeta"
+
+-- | /η/ symbol.
+eta :: LaTeXC l => l
+eta = comm0 "eta"
+
+-- | /θ/ symbol.
+theta :: LaTeXC l => l
+theta = comm0 "theta"
+
+-- | /ϑ/ symbol.
+vartheta :: LaTeXC l => l
+vartheta = comm0 "vartheta"
+
+-- | Θ symbol.
+thetau :: LaTeXC l => l
+thetau = comm0 "thetau"
+
+-- | /ι/ symbol.
+iota :: LaTeXC l => l
+iota = comm0 "iota"
+
+-- | /κ/ symbol.
+kappa :: LaTeXC l => l
+kappa = comm0 "kappa"
+
+-- | /λ/ symbol.
+lambda :: LaTeXC l => l
+lambda = comm0 "lambda"
+
+-- | Λ symbol.
+lambdau :: LaTeXC l => l
+lambdau = comm0 "Lambda"
+
+-- | /μ/ symbol.
+mu :: LaTeXC l => l
+mu = comm0 "mu"
+
+-- | /ν/ symbol.
+nu :: LaTeXC l => l
+nu = comm0 "nu"
+
+-- | /ξ/ symbol.
+xi :: LaTeXC l => l
+xi = comm0 "xi"
+
+-- | Ξ symbol.
+xiu :: LaTeXC l => l
+xiu = comm0 "Xi"
+
+-- | /π/ symbol.
+pi_ :: LaTeXC l => l
+pi_ = comm0 "pi"
+
+-- | /ϖ/ symbol.
+varpi :: LaTeXC l => l
+varpi = comm0 "varpi"
+
+-- | Π symbol.
+piu :: LaTeXC l => l
+piu = comm0 "Pi"
+
+-- | /ρ/ symbol.
+rho :: LaTeXC l => l
+rho = comm0 "rho"
+
+-- | /ϱ/ symbol.
+varrho :: LaTeXC l => l
+varrho = comm0 "varrho"
+
+-- | /σ/ symbol.
+sigma :: LaTeXC l => l
+sigma = comm0 "sigma"
+
+-- | /ς/ symbol.
+varsigma :: LaTeXC l => l
+varsigma = comm0 "varsigma"
+
+-- | Σ symbol.
+sigmau :: LaTeXC l => l
+sigmau = comm0 "Sigma"
+
+-- | /τ/ symbol.
+tau :: LaTeXC l => l
+tau = comm0 "tau"
+
+-- | /υ/ symbol.
+upsilon :: LaTeXC l => l
+upsilon = comm0 "upsilon"
+
+-- | Υ symbol.
+upsilonu :: LaTeXC l => l
+upsilonu = comm0 "Upsilon"
+
+-- | /ϕ/ symbol.
+phi :: LaTeXC l => l
+phi = comm0 "phi"
+
+-- | /φ/ symbol.
+varphi :: LaTeXC l => l
+varphi = comm0 "varphi"
+
+-- | Φ symbol.
+phiu :: LaTeXC l => l
+phiu = comm0 "Phi"
+
+-- | /χ/ symbol.
+chi :: LaTeXC l => l
+chi = comm0 "chi"
+
+-- | /ψ/ symbol.
+psi :: LaTeXC l => l
+psi = comm0 "psi"
+
+-- | Ψ symbol.
+psiu :: LaTeXC l => l
+psiu = comm0 "Psi"
+
+-- | /ω/ symbol.
+omega :: LaTeXC l => l
+omega = comm0 "omega"
+
+-- | Ω symbol.
+omegau :: LaTeXC l => l
+omegau = comm0 "Omega"
+
+---- Other symbols
+
+-- | A right-arrow, →.
+to :: LaTeXC l => l
+to = comm0 "to"
+
+-- | A right-arrow for function definitions, ↦.
+mapsto :: LaTeXC l => l
+mapsto = comm0 "mapsto"
+
+-- | /For all/ symbol, ∀.
+forall :: LaTeXC l => l
+forall = comm0 "forall"
+
+-- | /Exists/ symbol, ∃.
+exists :: LaTeXC l => l
+exists = comm0 "exists"
+
+-- | Dagger symbol, †.
+dagger :: LaTeXC l => l
+dagger = comm0 "dagger"
+
+-- | Double dagger symbol, ‡.
+ddagger :: LaTeXC l => l
+ddagger = comm0 "ddagger"
+
+-- | Infinity symbol.
+infty :: LaTeXC l => l
+infty = comm0 "infty"
+
+-------------------------------------
+------------ Math Fonts -------------
+
+-- | Default math symbol font.
+mathdefault :: LaTeXC l => l -> l
+mathdefault = liftL $ \l -> TeXComm "mathdefault" [FixArg l]
+
+-- | Bold face.
+mathbf :: LaTeXC l => l -> l
+mathbf = liftL $ \l -> TeXComm "mathbf" [FixArg l]
+
+-- | Roman, i.e. not-italic math.
+mathrm :: LaTeXC l => l -> l
+mathrm = liftL $ \l -> TeXComm "mathrm" [FixArg l]
+
+-- | Calligraphic math symbols.
+mathcal :: LaTeXC l => l -> l
+mathcal = liftL $ \l -> TeXComm "mathcal" [FixArg l]
+
+-- | Sans-serif math.
+mathsf :: LaTeXC l => l -> l
+mathsf = liftL $ \l -> TeXComm "mathsf" [FixArg l]
+
+-- | Typewriter font.
+mathtt :: LaTeXC l => l -> l
+mathtt = liftL $ \l -> TeXComm "mathtt" [FixArg l]
+
+-- | Italic math. Uses the same glyphs as 'mathdefault', but with spacings
+--   intended for multi-character symbols rather than juxtaposition of single-character symbols.
+mathit :: LaTeXC l => l -> l
+mathit = liftL $ \l -> TeXComm "mathit" [FixArg l]
+
+-------------------------------------
+------------- Matrices --------------
+
+matrix2tex :: (Texy a, LaTeXC l) => Matrix a -> l
+matrix2tex m = mconcat
+ [ foldr1 (&) [ texy $ m ! (i,j)
+     | j <- [1 .. ncols m]
+     ] <> lnbk
+     | i <- [1 .. nrows m]
+   ]
+
+toMatrix :: (Texy a, LaTeXC l) => String -> Maybe HPos -> Matrix a -> l
+toMatrix str Nothing  = liftL (TeXEnv str []) . matrix2tex
+toMatrix str (Just p) = liftL (TeXEnv (str ++ "*") [OptArg $ rendertex p]) . matrix2tex
+
+-- | LaTeX rendering of a matrix using @pmatrix@ and a custom function to render cells.
+--   Optional argument sets the alignment of the cells. Default (providing 'Nothing') 
+--   is centered.
+--
+-- > ( M )
+--
+pmatrix :: (Texy a, LaTeXC l) => Maybe HPos -> Matrix a -> l
+pmatrix = toMatrix "pmatrix"
+
+-- | LaTeX rendering of a matrix using @bmatrix@ and a custom function to render cells.
+--   Optional argument sets the alignment of the cells. Default (providing 'Nothing') 
+--   is centered.
+--
+-- > [ M ]
+--
+bmatrix :: (Texy a, LaTeXC l) => Maybe HPos -> Matrix a -> l
+bmatrix = toMatrix "bmatrix"
+
+-- | LaTeX rendering of a matrix using @Bmatrix@ and a custom function to render cells.
+--   Optional argument sets the alignment of the cells. Default (providing 'Nothing') 
+--   is centered.
+--
+-- > { M }
+--
+b2matrix :: (Texy a, LaTeXC l) => Maybe HPos -> Matrix a -> l
+b2matrix = toMatrix "Bmatrix"
+
+-- | LaTeX rendering of a matrix using @vmatrix@ and a custom function to render cells.
+--   Optional argument sets the alignment of the cells. Default (providing 'Nothing') 
+--   is centered.
+--
+-- > | M |
+--
+vmatrix :: (Texy a, LaTeXC l) => Maybe HPos -> Matrix a -> l
+vmatrix = toMatrix "vmatrix"
+
+-- | LaTeX rendering of a matrix using @Vmatrix@ and a custom function to render cells.
+--   Optional argument sets the alignment of the cells. Default (providing 'Nothing') 
+--   is centered.
+--
+-- > || M ||
+--
+v2matrix :: (Texy a, LaTeXC l) => Maybe HPos -> Matrix a -> l
+v2matrix = toMatrix "Vmatrix"
+
+-------------------------------------
+---------- Texy instances -----------
+
+-- | Instance defined in "Text.LaTeX.Packages.AMSMath".
+instance (Integral a, Texy a) => Texy (Ratio a) where
+ texy x = frac (texy $ numerator x) (texy $ denominator x)
+
+-- | Instance defined in "Text.LaTeX.Packages.AMSMath".
+instance (Texy a, Texy b) => Texy (a,b) where
+ texy (x,y) = autoParens $ texy x <> "," <> texy y
+ 
+-- | Instance defined in "Text.LaTeX.Packages.AMSMath".
+instance (Texy a, Texy b, Texy c) => Texy (a,b,c) where
+ texy (x,y,z) = autoParens $ texy x <> "," <> texy y <> "," <> texy z
+
+-- | Instance defined in "Text.LaTeX.Packages.AMSMath".
+instance (Texy a, Texy b, Texy c, Texy d) => Texy (a,b,c,d) where
+ texy (a,b,c,d) = autoParens $ texy a <> "," <> texy b <> "," <> texy c <> "," <> texy d
+
+-- | Instance defined in "Text.LaTeX.Packages.AMSMath".
+instance Texy a => Texy (Matrix a) where
+ texy = pmatrix Nothing
+
+-- | Instance defined in "Text.LaTeX.Packages.AMSMath".
+instance Texy a => Texy [a] where
+ texy = autoSquareBrackets . mconcat .  intersperse "," .  fmap texy
diff --git a/Text/LaTeX/Packages/AMSThm.hs b/Text/LaTeX/Packages/AMSThm.hs
--- a/Text/LaTeX/Packages/AMSThm.hs
+++ b/Text/LaTeX/Packages/AMSThm.hs
@@ -1,71 +1,71 @@
-
-{-# LANGUAGE OverloadedStrings #-}
-
--- | Package for theorem environments.
-module Text.LaTeX.Packages.AMSThm
- ( -- * AMSThm package
-   amsthm
-   -- * AMSThm functions
- , newtheorem
- , theorem
- , proof
- , qedhere
- , TheoremStyle (..)
- , theoremstyle
-   ) where
-
-import Text.LaTeX.Base.Syntax
-import Text.LaTeX.Base.Class
-import Text.LaTeX.Base.Render
-import Text.LaTeX.Base.Types
-
--- | AMSThm package.
--- Example:
---
--- > usepackage [] amsthm
-amsthm :: PackageName
-amsthm = "amsthm"
-
--- | Create a new 'theorem' environment type.
---   Arguments are environment name (this will be the argument
---   when using the 'theorem' function) and the displayed title.
---
---   For example:
---
--- > newtheorem "prop" "Proposition"
---
--- > theorem "prop" "This is it."
-newtheorem :: LaTeXC l => String -> l -> l
-newtheorem str = liftL $ \l -> TeXComm "newtheorem" [ FixArg $ fromString str , FixArg l ]
-
--- | Use a environment created by 'newtheorem'.
-theorem :: LaTeXC l => String -> l -> l
-theorem str = liftL $ TeXEnv str []
-
--- | The 'proof' environment. The first optional argument
---   is used to put a custom title to the proof.
-proof :: LaTeXC l => Maybe l -> l -> l
-proof  Nothing = liftL $ TeXEnv "proof" []
-proof (Just n) = liftL2 (\m -> TeXEnv "proof" [OptArg m]) n
-
--- | Insert the /QED/ symbol.
-qedhere :: LaTeXC l => l
-qedhere = comm0 "qedhere"
-
--- | Different styles for 'theorem's.
-data TheoremStyle =
-   Plain
- | Definition
- | Remark
- | CustomThmStyle String
-   deriving Show
-
-instance Render TheoremStyle where
- render Plain = "plain"
- render Definition = "definition"
- render Remark = "remark"
- render (CustomThmStyle str) = fromString str
-
--- | Set the theorem style. Call this function in the preamble.
-theoremstyle :: LaTeXC l => TheoremStyle -> l
-theoremstyle thmsty = fromLaTeX $ TeXComm "theoremstyle" [ FixArg $ TeXRaw $ render thmsty ]
+
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Package for theorem environments.
+module Text.LaTeX.Packages.AMSThm
+ ( -- * AMSThm package
+   amsthm
+   -- * AMSThm functions
+ , newtheorem
+ , theorem
+ , proof
+ , qedhere
+ , TheoremStyle (..)
+ , theoremstyle
+   ) where
+
+import Text.LaTeX.Base.Syntax
+import Text.LaTeX.Base.Class
+import Text.LaTeX.Base.Render
+import Text.LaTeX.Base.Types
+
+-- | AMSThm package.
+-- Example:
+--
+-- > usepackage [] amsthm
+amsthm :: PackageName
+amsthm = "amsthm"
+
+-- | Create a new 'theorem' environment type.
+--   Arguments are environment name (this will be the argument
+--   when using the 'theorem' function) and the displayed title.
+--
+--   For example:
+--
+-- > newtheorem "prop" "Proposition"
+--
+-- > theorem "prop" "This is it."
+newtheorem :: LaTeXC l => String -> l -> l
+newtheorem str = liftL $ \l -> TeXComm "newtheorem" [ FixArg $ fromString str , FixArg l ]
+
+-- | Use a environment created by 'newtheorem'.
+theorem :: LaTeXC l => String -> l -> l
+theorem str = liftL $ TeXEnv str []
+
+-- | The 'proof' environment. The first optional argument
+--   is used to put a custom title to the proof.
+proof :: LaTeXC l => Maybe l -> l -> l
+proof  Nothing = liftL $ TeXEnv "proof" []
+proof (Just n) = liftL2 (\m -> TeXEnv "proof" [OptArg m]) n
+
+-- | Insert the /QED/ symbol.
+qedhere :: LaTeXC l => l
+qedhere = comm0 "qedhere"
+
+-- | Different styles for 'theorem's.
+data TheoremStyle =
+   Plain
+ | Definition
+ | Remark
+ | CustomThmStyle String
+   deriving Show
+
+instance Render TheoremStyle where
+ render Plain = "plain"
+ render Definition = "definition"
+ render Remark = "remark"
+ render (CustomThmStyle str) = fromString str
+
+-- | Set the theorem style. Call this function in the preamble.
+theoremstyle :: LaTeXC l => TheoremStyle -> l
+theoremstyle thmsty = fromLaTeX $ TeXComm "theoremstyle" [ FixArg $ TeXRaw $ render thmsty ]
diff --git a/Text/LaTeX/Packages/Beamer.hs b/Text/LaTeX/Packages/Beamer.hs
--- a/Text/LaTeX/Packages/Beamer.hs
+++ b/Text/LaTeX/Packages/Beamer.hs
@@ -1,158 +1,158 @@
-{-# LANGUAGE OverloadedStrings #-}
-
--- | Beamer is a LaTeX package for the creation of slides.
---
---   Each frame is contained within the 'frame' function. Here is an example:
---
--- > {-# LANGUAGE OverloadedStrings #-}
--- >
--- > import Text.LaTeX
--- > import Text.LaTeX.Packages.Beamer
--- >
--- > mySlides :: Monad m => LaTeXT m ()
--- > mySlides = do
--- >   frame $ do
--- >     frametitle "First frame"
--- >     "Content of the first frame."
--- >   frame $ do
--- >     frametitle "Second frame"
--- >     "Content of the second frame." 
--- >     pause
--- >     " And actually a little more."
---
---   The 'pause' command in the second frame makes the second part of the text
---   to appear one screen later.
-module Text.LaTeX.Packages.Beamer
- ( -- * Beamer package
-   beamer
-   -- * Beamer commands
- , frame
- , frametitle
- , framesubtitle
- , alert
- , pause
- , block
-   -- ** Overlay Specifications
- , OverlaySpec (..)
- , beameritem
- , uncover
- , only
-   -- ** Themes
- , usetheme
- , Theme (..)
-   ) where
-
-import Text.LaTeX.Base.Syntax
-import Text.LaTeX.Base.Class
-import Text.LaTeX.Base.Render
-import Text.LaTeX.Base.Types
-
--- | The 'beamer' document class. Importing a package is not required. Example:
---
--- > documentclass [] beamer
-beamer :: ClassName
-beamer = "beamer"
-
--- | A presentation is composed of a sequence of frames. Each frame is created with this function.
-frame :: LaTeXC l => l -> l
-frame = liftL $ TeXEnv "frame" []
-
--- | Set the title of the current frame. Use it within a 'frame'.
-frametitle :: LaTeXC l => l -> l
-frametitle = liftL $ \l -> TeXComm "frametitle" [FixArg l]
-
--- | Set the subtitle of the current frame. Use it within a 'frame'.
-framesubtitle :: LaTeXC l => l -> l
-framesubtitle = liftL $ \l -> TeXComm "framesubtitle" [FixArg l]
-
--- | Highlight in red a piece of text. With the 'OverlaySpec's, you can specify the slides where
--- the text will be highlighted.
-alert :: LaTeXC l => [OverlaySpec] -> l -> l
-alert os = liftL $ \l -> TeXComm "alert" [ MSymArg $ fmap (TeXRaw . render) os, FixArg l]
-
--- | Introduces a pause in a slide.
-pause :: LaTeXC l => l
-pause = comm0 "pause"
-
--- | 'beameritem' works like 'item', but allows you to specify the slides where
--- the item will be displayed.
-beameritem :: LaTeXC l => [OverlaySpec] -> l
-beameritem os = fromLaTeX $ TeXComm "item" [ MSymArg $ fmap (TeXRaw . render) os ]
-
--- | With 'uncover', show a piece of text only in the slides you want.
-uncover :: LaTeXC l => [OverlaySpec] -> l -> l
-uncover os = liftL $ \l -> TeXComm "uncover" [ MSymArg $ fmap (TeXRaw . render) os , FixArg l ]
-
--- TODO: What is the difference between 'uncover' and 'only'??
-
--- | Similar to 'uncover'.
-only :: LaTeXC l => [OverlaySpec] -> l -> l
-only os = liftL $ \l -> TeXComm "only" [ MSymArg $ fmap (TeXRaw . render) os , FixArg l ]
-
--- | Specifications for beamer functions.
-data OverlaySpec =
-   OneSlide Int
- | FromSlide Int
- | ToSlide Int
- | FromToSlide Int Int
-   deriving Show
-
-instance Render OverlaySpec where
- render (OneSlide n)      = render n
- render (FromSlide n)     = render n <> "-"
- render (ToSlide n)       = "-" <> render n
- render (FromToSlide n m) = render n <> "-" <> render m
-
--- | A 'block' will be displayed surrounding a text.
-block :: LaTeXC l =>
-         l -- ^ Title for the block
-      -> l -- ^ Content of the block
-      -> l -- ^ Result
-block = liftL2 $ \tit -> TeXEnv "block" [ FixArg tit ]
-
--- THEMES --
-
--- | A 'Theme' of a presentation. See 'usetheme'.
---   A preview of each one is given below.
-data Theme = 
-    AnnArbor -- ^ <<docfiles/beamers/previewAnnArbor.png>>
-  | Antibes -- ^ <<docfiles/beamers/previewAntibes.png>>
-  | Bergen -- ^ <<docfiles/beamers/previewBergen.png>>
-  | Berkeley -- ^ <<docfiles/beamers/previewBerkeley.png>>
-  | Berlin -- ^ <<docfiles/beamers/previewBerlin.png>>
-  | Boadilla -- ^ <<docfiles/beamers/previewBoadilla.png>>
-  | CambridgeUS -- ^ <<docfiles/beamers/previewCambridgeUS.png>>
-  | Copenhagen -- ^ <<docfiles/beamers/previewCopenhagen.png>>
-  | Darmstadt -- ^ <<docfiles/beamers/previewDarmstadt.png>>
-  | Dresden -- ^ <<docfiles/beamers/previewDresden.png>>
-  | Frankfurt -- ^ <<docfiles/beamers/previewFrankfurt.png>>
-  | Goettingen -- ^ <<docfiles/beamers/previewGoettingen.png>>
-  | Hannover -- ^ <<docfiles/beamers/previewHannover.png>>
-  | Ilmenau -- ^ <<docfiles/beamers/previewIlmenau.png>>
-  | JuanLesPins -- ^ <<docfiles/beamers/previewJuanLesPins.png>>
-  | Luebeck -- ^ <<docfiles/beamers/previewLuebeck.png>>
-  | Madrid -- ^ <<docfiles/beamers/previewMadrid.png>>
-  | Malmoe -- ^ <<docfiles/beamers/previewMalmoe.png>>
-  | Marburg -- ^ <<docfiles/beamers/previewMarburg.png>>
-  | Montpellier -- ^ <<docfiles/beamers/previewMontpellier.png>>
-  | PaloAlto -- ^ <<docfiles/beamers/previewPaloAlto.png>>
-  | Pittsburgh -- ^ <<docfiles/beamers/previewPittsburgh.png>>
-  | Rochester -- ^ <<docfiles/beamers/previewRochester.png>>
-  | Singapore -- ^ <<docfiles/beamers/previewSingapore.png>>
-  | Szeged -- ^ <<docfiles/beamers/previewSzeged.png>>
-  | Warsaw -- ^ <<docfiles/beamers/previewWarsaw.png>>
-    --
-  | Boxes
-  | Default
-    --
-  | CustomTheme String
-    deriving (Eq,Show)
-
-instance Render Theme where
- render (CustomTheme str) = fromString str
- render x = fromString $ show x
-
--- | Set the 'Theme' employed in your presentation (in the preamble).
-usetheme :: LaTeXC l => Theme -> l
-usetheme th = fromLaTeX $ TeXComm "usetheme" [ FixArg $ TeXRaw $ render th ]
-
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Beamer is a LaTeX package for the creation of slides.
+--
+--   Each frame is contained within the 'frame' function. Here is an example:
+--
+-- > {-# LANGUAGE OverloadedStrings #-}
+-- >
+-- > import Text.LaTeX
+-- > import Text.LaTeX.Packages.Beamer
+-- >
+-- > mySlides :: Monad m => LaTeXT m ()
+-- > mySlides = do
+-- >   frame $ do
+-- >     frametitle "First frame"
+-- >     "Content of the first frame."
+-- >   frame $ do
+-- >     frametitle "Second frame"
+-- >     "Content of the second frame." 
+-- >     pause
+-- >     " And actually a little more."
+--
+--   The 'pause' command in the second frame makes the second part of the text
+--   to appear one screen later.
+module Text.LaTeX.Packages.Beamer
+ ( -- * Beamer package
+   beamer
+   -- * Beamer commands
+ , frame
+ , frametitle
+ , framesubtitle
+ , alert
+ , pause
+ , block
+   -- ** Overlay Specifications
+ , OverlaySpec (..)
+ , beameritem
+ , uncover
+ , only
+   -- ** Themes
+ , usetheme
+ , Theme (..)
+   ) where
+
+import Text.LaTeX.Base.Syntax
+import Text.LaTeX.Base.Class
+import Text.LaTeX.Base.Render
+import Text.LaTeX.Base.Types
+
+-- | The 'beamer' document class. Importing a package is not required. Example:
+--
+-- > documentclass [] beamer
+beamer :: ClassName
+beamer = "beamer"
+
+-- | A presentation is composed of a sequence of frames. Each frame is created with this function.
+frame :: LaTeXC l => l -> l
+frame = liftL $ TeXEnv "frame" []
+
+-- | Set the title of the current frame. Use it within a 'frame'.
+frametitle :: LaTeXC l => l -> l
+frametitle = liftL $ \l -> TeXComm "frametitle" [FixArg l]
+
+-- | Set the subtitle of the current frame. Use it within a 'frame'.
+framesubtitle :: LaTeXC l => l -> l
+framesubtitle = liftL $ \l -> TeXComm "framesubtitle" [FixArg l]
+
+-- | Highlight in red a piece of text. With the 'OverlaySpec's, you can specify the slides where
+-- the text will be highlighted.
+alert :: LaTeXC l => [OverlaySpec] -> l -> l
+alert os = liftL $ \l -> TeXComm "alert" [ MSymArg $ fmap (TeXRaw . render) os, FixArg l]
+
+-- | Introduces a pause in a slide.
+pause :: LaTeXC l => l
+pause = comm0 "pause"
+
+-- | 'beameritem' works like 'item', but allows you to specify the slides where
+-- the item will be displayed.
+beameritem :: LaTeXC l => [OverlaySpec] -> l
+beameritem os = fromLaTeX $ TeXComm "item" [ MSymArg $ fmap (TeXRaw . render) os ]
+
+-- | With 'uncover', show a piece of text only in the slides you want.
+uncover :: LaTeXC l => [OverlaySpec] -> l -> l
+uncover os = liftL $ \l -> TeXComm "uncover" [ MSymArg $ fmap (TeXRaw . render) os , FixArg l ]
+
+-- TODO: What is the difference between 'uncover' and 'only'??
+
+-- | Similar to 'uncover'.
+only :: LaTeXC l => [OverlaySpec] -> l -> l
+only os = liftL $ \l -> TeXComm "only" [ MSymArg $ fmap (TeXRaw . render) os , FixArg l ]
+
+-- | Specifications for beamer functions.
+data OverlaySpec =
+   OneSlide Int
+ | FromSlide Int
+ | ToSlide Int
+ | FromToSlide Int Int
+   deriving Show
+
+instance Render OverlaySpec where
+ render (OneSlide n)      = render n
+ render (FromSlide n)     = render n <> "-"
+ render (ToSlide n)       = "-" <> render n
+ render (FromToSlide n m) = render n <> "-" <> render m
+
+-- | A 'block' will be displayed surrounding a text.
+block :: LaTeXC l =>
+         l -- ^ Title for the block
+      -> l -- ^ Content of the block
+      -> l -- ^ Result
+block = liftL2 $ \tit -> TeXEnv "block" [ FixArg tit ]
+
+-- THEMES --
+
+-- | A 'Theme' of a presentation. See 'usetheme'.
+--   A preview of each one is given below.
+data Theme = 
+    AnnArbor -- ^ <<docfiles/beamers/previewAnnArbor.png>>
+  | Antibes -- ^ <<docfiles/beamers/previewAntibes.png>>
+  | Bergen -- ^ <<docfiles/beamers/previewBergen.png>>
+  | Berkeley -- ^ <<docfiles/beamers/previewBerkeley.png>>
+  | Berlin -- ^ <<docfiles/beamers/previewBerlin.png>>
+  | Boadilla -- ^ <<docfiles/beamers/previewBoadilla.png>>
+  | CambridgeUS -- ^ <<docfiles/beamers/previewCambridgeUS.png>>
+  | Copenhagen -- ^ <<docfiles/beamers/previewCopenhagen.png>>
+  | Darmstadt -- ^ <<docfiles/beamers/previewDarmstadt.png>>
+  | Dresden -- ^ <<docfiles/beamers/previewDresden.png>>
+  | Frankfurt -- ^ <<docfiles/beamers/previewFrankfurt.png>>
+  | Goettingen -- ^ <<docfiles/beamers/previewGoettingen.png>>
+  | Hannover -- ^ <<docfiles/beamers/previewHannover.png>>
+  | Ilmenau -- ^ <<docfiles/beamers/previewIlmenau.png>>
+  | JuanLesPins -- ^ <<docfiles/beamers/previewJuanLesPins.png>>
+  | Luebeck -- ^ <<docfiles/beamers/previewLuebeck.png>>
+  | Madrid -- ^ <<docfiles/beamers/previewMadrid.png>>
+  | Malmoe -- ^ <<docfiles/beamers/previewMalmoe.png>>
+  | Marburg -- ^ <<docfiles/beamers/previewMarburg.png>>
+  | Montpellier -- ^ <<docfiles/beamers/previewMontpellier.png>>
+  | PaloAlto -- ^ <<docfiles/beamers/previewPaloAlto.png>>
+  | Pittsburgh -- ^ <<docfiles/beamers/previewPittsburgh.png>>
+  | Rochester -- ^ <<docfiles/beamers/previewRochester.png>>
+  | Singapore -- ^ <<docfiles/beamers/previewSingapore.png>>
+  | Szeged -- ^ <<docfiles/beamers/previewSzeged.png>>
+  | Warsaw -- ^ <<docfiles/beamers/previewWarsaw.png>>
+    --
+  | Boxes
+  | Default
+    --
+  | CustomTheme String
+    deriving (Eq,Show)
+
+instance Render Theme where
+ render (CustomTheme str) = fromString str
+ render x = fromString $ show x
+
+-- | Set the 'Theme' employed in your presentation (in the preamble).
+usetheme :: LaTeXC l => Theme -> l
+usetheme th = fromLaTeX $ TeXComm "usetheme" [ FixArg $ TeXRaw $ render th ]
+
diff --git a/Text/LaTeX/Packages/Color.hs b/Text/LaTeX/Packages/Color.hs
--- a/Text/LaTeX/Packages/Color.hs
+++ b/Text/LaTeX/Packages/Color.hs
@@ -1,166 +1,166 @@
-
-{-# LANGUAGE OverloadedStrings #-}
-
--- | Make your documents colorful using this module.
---
---   Different functionalities are provided, like changing the color of
---   the text and the paper, or creating colorful boxes.
-module Text.LaTeX.Packages.Color
- ( -- * Color package
-   pcolor
-   -- * Package options
- , monochrome
- , dvipsnames
- , nodvipsnames
- , usenames
-   -- * Types
- , Color (..)
- , ColorName (..)
- , ColorModel (..)
- , ColSpec (..)
-   -- * Words
-   -- | RGB255 colors are determined by three parameters of the 'Word8' type.
-   --   Values of type 'Word8' lie within 0 and 255.
- , Word8
-   -- * Commands
- , pagecolor
- , color
- , textcolor
- , colorbox , fcolorbox
- , normalcolor
-   ) where
-
-import Text.LaTeX.Base.Syntax
-import Text.LaTeX.Base.Class
-import Text.LaTeX.Base.Render
-import Text.LaTeX.Base.Types
---
-import Data.Text (toLower)
-import Data.Word (Word8)
-
--- | The 'pcolor' package.
---
--- > usepackage [] pcolor
-pcolor :: PackageName
-pcolor = "color"
-
--- | To convert all colour commands to black and white,
---   for previewers that cannot handle colour.
-monochrome :: LaTeXC l => l
-monochrome = "monochrome"
-
-dvipsnames :: LaTeXC l => l
-dvipsnames = "dvipsnames"
-
-nodvipsnames :: LaTeXC l => l
-nodvipsnames = "nodvipsnames"
-
-usenames :: LaTeXC l => l
-usenames = "usenames"
-
--- | Color specification.
-data ColSpec =
-   DefColor Color
- | ModColor ColorModel
- | DvipsColor ColorName
-   deriving Show
-
--- | Basic colors.
-data Color =
-   Red
- | Green
- | Blue
- | Yellow
- | Cyan
- | Magenta
- | Black
- | White
-   deriving Show
-
--- | Specify your own color using one of the different color models.
-data ColorModel =
-   RGB Float Float Float
-     -- ^ Each parameter determines the proportion of red, green and
-     --   blue, with a value within the [0,1] interval.
- | RGB255 Word8 Word8 Word8
- | GrayM Float
-     -- ^ Grayscale, from 0 (black) to 1 (white).
- | HTML String
- | CMYK Float Float Float Float
-   deriving Show
-
--- | Other predefined colors.
-data ColorName =
-   Apricot       | Aquamarine  | Bittersweet
- | BlueGreen     | BlueViolet  | BrickRed
- | Brown         | BurntOrange | CadetBlue
- | CarnationPink | Cerulean    | CornflowerBlue
- | Dandelion     | DarkOrchid  | Emerald
- | ForestGreen   | Fuchsia     | Goldenrod
- | Gray          | GreenYellow | JungleGreen
- | Lavender      | LimeGreen   | Mahogany
- | Maroon        | Melon       | MidnightBlue
- | Mulberry      | NavyBlue    | OliveGreen
- | Orange        | OrangeRed   | Orchid
- | Peach         | Periwinkle  | PineGreen
- | Plum          | ProcessBlue | Purple
- | RawSienna     | RedOrange   | RedViolet
- | Rhodamine     | RoyalBlue   | RubineRed
- | Salmon        | SeaGreen    | Sepia
- | SkyBlue       | SpringGreen | Tan
- | TealBlue      | Thistle     | Turquoise
- | Violet        | VioletRed   | WildStrawberry
- | YellowGreen   | YellowOrange
-   deriving Show
-
-instance Render Color where
- render = toLower . fromString . show
-
-instance Render ColorModel where
- render (RGB r g b) = mconcat [ "[rgb]{" , renderCommas [r,g,b] , "}" ]
- render (RGB255 r g b) = mconcat [ "[RGB]{" , renderCommas [r,g,b] , "}" ]
- render (GrayM k) = mconcat [ "[gray]{" , render k , "}"]
- render (HTML str) = mconcat [ "[HTML]{" , fromString str , "}" ]
- render (CMYK c m y k) = mconcat [ "[cmyk]{" , renderCommas [c,m,y,k] , "}" ]
-
-instance Render ColorName where
- render = fromString . show
-
-instance Render ColSpec where
- render (DefColor c)   = mconcat [ "{" , render c , "}" ]
- render (ModColor cm)  = render cm
- render (DvipsColor c) = mconcat [ "{" , render c , "}" ]
-
--- Commands
-
--- | Set the background color for the current and following pages.
-pagecolor :: LaTeXC l => ColSpec -> l
-pagecolor = (commS "pagecolor" <>) . rendertex
-
--- | Switch to a new text color.
-color :: LaTeXC l => ColSpec -> l
-color = (commS "color" <>) . rendertex
-
--- | Set the text of its argument in the given colour.
-textcolor :: LaTeXC l => ColSpec -> l -> l
-textcolor cs l = commS "textcolor" <> rendertex cs
-              <> braces l
-
--- | Put its argument in a box with the given colour as background.
-colorbox :: LaTeXC l => ColSpec -> l -> l
-colorbox cs l = commS "colorbox" <> rendertex cs
-             <> braces l
-
--- | Application of @fcolorbox cs1 cs2 l@ put @l@ in a framed box with
---   @cs1@ as frame color and @cs2@ as background color.
-fcolorbox :: LaTeXC l => ColSpec -> ColSpec -> l -> l
-fcolorbox cs1 cs2 l =
-    commS "fcolorbox" <> rendertex cs1
-                      <> rendertex cs2
- <> braces l
-
--- | Switch to the colour that was active at the end of the preamble.
---   Thus, placing a 'color' command in the preamble can change the
---   standard colour of the whole document.
-normalcolor :: LaTeXC l => l
-normalcolor = comm0 "normalcolor"
+
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Make your documents colorful using this module.
+--
+--   Different functionalities are provided, like changing the color of
+--   the text and the paper, or creating colorful boxes.
+module Text.LaTeX.Packages.Color
+ ( -- * Color package
+   pcolor
+   -- * Package options
+ , monochrome
+ , dvipsnames
+ , nodvipsnames
+ , usenames
+   -- * Types
+ , Color (..)
+ , ColorName (..)
+ , ColorModel (..)
+ , ColSpec (..)
+   -- * Words
+   -- | RGB255 colors are determined by three parameters of the 'Word8' type.
+   --   Values of type 'Word8' lie within 0 and 255.
+ , Word8
+   -- * Commands
+ , pagecolor
+ , color
+ , textcolor
+ , colorbox , fcolorbox
+ , normalcolor
+   ) where
+
+import Text.LaTeX.Base.Syntax
+import Text.LaTeX.Base.Class
+import Text.LaTeX.Base.Render
+import Text.LaTeX.Base.Types
+--
+import Data.Text (toLower)
+import Data.Word (Word8)
+
+-- | The 'pcolor' package.
+--
+-- > usepackage [] pcolor
+pcolor :: PackageName
+pcolor = "color"
+
+-- | To convert all colour commands to black and white,
+--   for previewers that cannot handle colour.
+monochrome :: LaTeXC l => l
+monochrome = "monochrome"
+
+dvipsnames :: LaTeXC l => l
+dvipsnames = "dvipsnames"
+
+nodvipsnames :: LaTeXC l => l
+nodvipsnames = "nodvipsnames"
+
+usenames :: LaTeXC l => l
+usenames = "usenames"
+
+-- | Color specification.
+data ColSpec =
+   DefColor Color
+ | ModColor ColorModel
+ | DvipsColor ColorName
+   deriving Show
+
+-- | Basic colors.
+data Color =
+   Red
+ | Green
+ | Blue
+ | Yellow
+ | Cyan
+ | Magenta
+ | Black
+ | White
+   deriving Show
+
+-- | Specify your own color using one of the different color models.
+data ColorModel =
+   RGB Float Float Float
+     -- ^ Each parameter determines the proportion of red, green and
+     --   blue, with a value within the [0,1] interval.
+ | RGB255 Word8 Word8 Word8
+ | GrayM Float
+     -- ^ Grayscale, from 0 (black) to 1 (white).
+ | HTML String
+ | CMYK Float Float Float Float
+   deriving Show
+
+-- | Other predefined colors.
+data ColorName =
+   Apricot       | Aquamarine  | Bittersweet
+ | BlueGreen     | BlueViolet  | BrickRed
+ | Brown         | BurntOrange | CadetBlue
+ | CarnationPink | Cerulean    | CornflowerBlue
+ | Dandelion     | DarkOrchid  | Emerald
+ | ForestGreen   | Fuchsia     | Goldenrod
+ | Gray          | GreenYellow | JungleGreen
+ | Lavender      | LimeGreen   | Mahogany
+ | Maroon        | Melon       | MidnightBlue
+ | Mulberry      | NavyBlue    | OliveGreen
+ | Orange        | OrangeRed   | Orchid
+ | Peach         | Periwinkle  | PineGreen
+ | Plum          | ProcessBlue | Purple
+ | RawSienna     | RedOrange   | RedViolet
+ | Rhodamine     | RoyalBlue   | RubineRed
+ | Salmon        | SeaGreen    | Sepia
+ | SkyBlue       | SpringGreen | Tan
+ | TealBlue      | Thistle     | Turquoise
+ | Violet        | VioletRed   | WildStrawberry
+ | YellowGreen   | YellowOrange
+   deriving Show
+
+instance Render Color where
+ render = toLower . fromString . show
+
+instance Render ColorModel where
+ render (RGB r g b) = mconcat [ "[rgb]{" , renderCommas [r,g,b] , "}" ]
+ render (RGB255 r g b) = mconcat [ "[RGB]{" , renderCommas [r,g,b] , "}" ]
+ render (GrayM k) = mconcat [ "[gray]{" , render k , "}"]
+ render (HTML str) = mconcat [ "[HTML]{" , fromString str , "}" ]
+ render (CMYK c m y k) = mconcat [ "[cmyk]{" , renderCommas [c,m,y,k] , "}" ]
+
+instance Render ColorName where
+ render = fromString . show
+
+instance Render ColSpec where
+ render (DefColor c)   = mconcat [ "{" , render c , "}" ]
+ render (ModColor cm)  = render cm
+ render (DvipsColor c) = mconcat [ "{" , render c , "}" ]
+
+-- Commands
+
+-- | Set the background color for the current and following pages.
+pagecolor :: LaTeXC l => ColSpec -> l
+pagecolor = (commS "pagecolor" <>) . rendertex
+
+-- | Switch to a new text color.
+color :: LaTeXC l => ColSpec -> l
+color = (commS "color" <>) . rendertex
+
+-- | Set the text of its argument in the given colour.
+textcolor :: LaTeXC l => ColSpec -> l -> l
+textcolor cs l = commS "textcolor" <> rendertex cs
+              <> braces l
+
+-- | Put its argument in a box with the given colour as background.
+colorbox :: LaTeXC l => ColSpec -> l -> l
+colorbox cs l = commS "colorbox" <> rendertex cs
+             <> braces l
+
+-- | Application of @fcolorbox cs1 cs2 l@ put @l@ in a framed box with
+--   @cs1@ as frame color and @cs2@ as background color.
+fcolorbox :: LaTeXC l => ColSpec -> ColSpec -> l -> l
+fcolorbox cs1 cs2 l =
+    commS "fcolorbox" <> rendertex cs1
+                      <> rendertex cs2
+ <> braces l
+
+-- | Switch to the colour that was active at the end of the preamble.
+--   Thus, placing a 'color' command in the preamble can change the
+--   standard colour of the whole document.
+normalcolor :: LaTeXC l => l
+normalcolor = comm0 "normalcolor"
diff --git a/Text/LaTeX/Packages/Graphicx.hs b/Text/LaTeX/Packages/Graphicx.hs
--- a/Text/LaTeX/Packages/Graphicx.hs
+++ b/Text/LaTeX/Packages/Graphicx.hs
@@ -1,108 +1,108 @@
-
-{-# LANGUAGE OverloadedStrings #-}
-
--- | This module allows you to use the LaTeX /graphicx/ library in order to
---   insert graphics in a document and perform some transformations.
---
---   CTAN page for graphicx: <http://ctan.org/pkg/graphicx>.
-module Text.LaTeX.Packages.Graphicx
- ( -- * Graphicx package
-   graphicx
-   -- * Package options
- , dvips
- , dvipdfm
- , pdftex
-   -- * Including graphics
- , IGOption (..)
- , includegraphics
-   -- * Transformations
- , rotatebox
- , scalebox
- , reflectbox
- , resizebox
-   ) where
-
-import Text.LaTeX.Base.Syntax
-import Text.LaTeX.Base.Class
-import Text.LaTeX.Base.Render
-import Text.LaTeX.Base.Types
---
-import Data.Char (toLower)
-
--- | The 'graphicx' package.
---
--- > usepackage [] graphicx
-graphicx :: PackageName
-graphicx = "graphicx"
-
--- Package options
-
--- | Package option of the 'graphicx' package.
-dvips, dvipdfm, pdftex :: LaTeXC l => l
-dvips = "dvips"
-dvipdfm = "dvipdfm"
-pdftex = "pdftex"
-
--- Including graphics
-
--- | Include Graphics Option. These options can be passed as arguments to the 'includegraphics' function.
-data IGOption =
-   IGWidth Measure -- ^ Specify the preferred width of the imported image.
- | IGHeight Measure -- ^ Specify the preferred height of the imported image.
- | KeepAspectRatio Bool -- ^ When 'True', it will scale the image according to both 'IGWidth' and 'IGHeight'
-                        -- , but will not distort the image, so that neither 'IGWidth' nor 'IGHeight' are exceeded.
- | IGScale Float -- ^ Scales the image by the desired scale factor.
- | IGAngle Int -- ^ Rotate the image by given degrees.
- | IGTrim Measure Measure Measure Measure -- ^ This option will crop the imported image. Arguments are from-left
-                                          -- , from-bottom, from-right and from-top respectively.
- | IGClip Bool -- ^ For the 'IGTrim' option to work, you must set 'IGClip' to 'True'.
- | IGPage Int -- ^ If the image file is a pdf file with multiple pages,
-              --   this parameter allows you to use a different page than the first.
-   deriving Show
-
-instance Render IGOption where
- render (IGWidth m) = "width=" <> render m
- render (IGHeight m) = "height=" <> render m
- render (KeepAspectRatio b) = "keepaspectratio=" <> fromString (fmap toLower $ show b)
- render (IGScale r) = "scale=" <> render r
- render (IGAngle a) = "angle=" <> render a
- render (IGTrim l b r t) = "trim=" <> renderChars ' ' [l,b,r,t]
- render (IGClip b) = "clip=" <> fromString (fmap toLower $ show b)
- render (IGPage p) = "page=" <> render p
-
--- | Include an image in the document.
-includegraphics :: LaTeXC l =>
-                  [IGOption] -- ^ Options
-                -> FilePath  -- ^ Image file
-                -> l
-includegraphics opts fp = fromLaTeX $ TeXComm "includegraphics"
- [ MOptArg $ fmap rendertex opts , FixArg $ TeXRaw $ fromString fp ]
-
--- | Rotate the content by the given angle in degrees.
-rotatebox :: LaTeXC l => Float -> l -> l
-rotatebox a = liftL $ \l -> TeXComm "rotatebox" [FixArg $ rendertex a , FixArg l]
-
--- | Scale the content by the given factor. If only the horizontal scale is supplied,
---   the vertical scaling will be the same.
-scalebox :: LaTeXC l =>
-     Float       -- ^ Horizontal scale.
-  -> Maybe Float -- ^ Vertical scale.
-  -> l
-  -> l
-scalebox h mv = liftL $ \l ->
-  TeXComm "rotatebox" $ [FixArg $ rendertex h]
-                     ++  maybe [] ((:[]) . OptArg . rendertex) mv
-                     ++ [FixArg l]
-
--- | Reflect horizontally the content.
-reflectbox :: LaTeXC l => l -> l
-reflectbox = liftL $ \l -> TeXComm "reflectbox" [FixArg l]
-
--- | Resize the content to match the given dimensions.
-resizebox :: LaTeXC l =>
-     Measure -- ^ Horizontal size.
-  -> Measure -- ^ Vertical size.
-  -> l
-  -> l
-resizebox h v = liftL $ \l ->
-  TeXComm "resizebox" [FixArg $ rendertex h,FixArg $ rendertex v,FixArg l]
+
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | This module allows you to use the LaTeX /graphicx/ library in order to
+--   insert graphics in a document and perform some transformations.
+--
+--   CTAN page for graphicx: <http://ctan.org/pkg/graphicx>.
+module Text.LaTeX.Packages.Graphicx
+ ( -- * Graphicx package
+   graphicx
+   -- * Package options
+ , dvips
+ , dvipdfm
+ , pdftex
+   -- * Including graphics
+ , IGOption (..)
+ , includegraphics
+   -- * Transformations
+ , rotatebox
+ , scalebox
+ , reflectbox
+ , resizebox
+   ) where
+
+import Text.LaTeX.Base.Syntax
+import Text.LaTeX.Base.Class
+import Text.LaTeX.Base.Render
+import Text.LaTeX.Base.Types
+--
+import Data.Char (toLower)
+
+-- | The 'graphicx' package.
+--
+-- > usepackage [] graphicx
+graphicx :: PackageName
+graphicx = "graphicx"
+
+-- Package options
+
+-- | Package option of the 'graphicx' package.
+dvips, dvipdfm, pdftex :: LaTeXC l => l
+dvips = "dvips"
+dvipdfm = "dvipdfm"
+pdftex = "pdftex"
+
+-- Including graphics
+
+-- | Include Graphics Option. These options can be passed as arguments to the 'includegraphics' function.
+data IGOption =
+   IGWidth Measure -- ^ Specify the preferred width of the imported image.
+ | IGHeight Measure -- ^ Specify the preferred height of the imported image.
+ | KeepAspectRatio Bool -- ^ When 'True', it will scale the image according to both 'IGWidth' and 'IGHeight'
+                        -- , but will not distort the image, so that neither 'IGWidth' nor 'IGHeight' are exceeded.
+ | IGScale Float -- ^ Scales the image by the desired scale factor.
+ | IGAngle Int -- ^ Rotate the image by given degrees.
+ | IGTrim Measure Measure Measure Measure -- ^ This option will crop the imported image. Arguments are from-left
+                                          -- , from-bottom, from-right and from-top respectively.
+ | IGClip Bool -- ^ For the 'IGTrim' option to work, you must set 'IGClip' to 'True'.
+ | IGPage Int -- ^ If the image file is a pdf file with multiple pages,
+              --   this parameter allows you to use a different page than the first.
+   deriving Show
+
+instance Render IGOption where
+ render (IGWidth m) = "width=" <> render m
+ render (IGHeight m) = "height=" <> render m
+ render (KeepAspectRatio b) = "keepaspectratio=" <> fromString (fmap toLower $ show b)
+ render (IGScale r) = "scale=" <> render r
+ render (IGAngle a) = "angle=" <> render a
+ render (IGTrim l b r t) = "trim=" <> renderChars ' ' [l,b,r,t]
+ render (IGClip b) = "clip=" <> fromString (fmap toLower $ show b)
+ render (IGPage p) = "page=" <> render p
+
+-- | Include an image in the document.
+includegraphics :: LaTeXC l =>
+                  [IGOption] -- ^ Options
+                -> FilePath  -- ^ Image file
+                -> l
+includegraphics opts fp = fromLaTeX $ TeXComm "includegraphics"
+ [ MOptArg $ fmap rendertex opts , FixArg $ TeXRaw $ fromString fp ]
+
+-- | Rotate the content by the given angle in degrees.
+rotatebox :: LaTeXC l => Float -> l -> l
+rotatebox a = liftL $ \l -> TeXComm "rotatebox" [FixArg $ rendertex a , FixArg l]
+
+-- | Scale the content by the given factor. If only the horizontal scale is supplied,
+--   the vertical scaling will be the same.
+scalebox :: LaTeXC l =>
+     Float       -- ^ Horizontal scale.
+  -> Maybe Float -- ^ Vertical scale.
+  -> l
+  -> l
+scalebox h mv = liftL $ \l ->
+  TeXComm "rotatebox" $ [FixArg $ rendertex h]
+                     ++  maybe [] ((:[]) . OptArg . rendertex) mv
+                     ++ [FixArg l]
+
+-- | Reflect horizontally the content.
+reflectbox :: LaTeXC l => l -> l
+reflectbox = liftL $ \l -> TeXComm "reflectbox" [FixArg l]
+
+-- | Resize the content to match the given dimensions.
+resizebox :: LaTeXC l =>
+     Measure -- ^ Horizontal size.
+  -> Measure -- ^ Vertical size.
+  -> l
+  -> l
+resizebox h v = liftL $ \l ->
+  TeXComm "resizebox" [FixArg $ rendertex h,FixArg $ rendertex v,FixArg l]
diff --git a/Text/LaTeX/Packages/Hyperref.hs b/Text/LaTeX/Packages/Hyperref.hs
--- a/Text/LaTeX/Packages/Hyperref.hs
+++ b/Text/LaTeX/Packages/Hyperref.hs
@@ -1,80 +1,80 @@
-
-{-# LANGUAGE OverloadedStrings #-}
-
-module Text.LaTeX.Packages.Hyperref
- ( -- * Hyperref package
-   hyperref
-   -- * Hyperref commands
- , HRefOption (..)
- , URL
- , createURL
- , href
- , url
- , nolinkurl
- , hyperbaseurl
- , hyperimage
- , autoref
-   ) where
-
-import Text.LaTeX.Base.Syntax
-import Text.LaTeX.Base.Class
-import Text.LaTeX.Base.Render
-import Text.LaTeX.Base.Types
-
--- | The 'hyperref' package.
---
--- > usepackage [] hyperref
-hyperref :: PackageName
-hyperref = "hyperref"
-
-data HRefOption =
-   PDFRemoteStartView
- | PDFNewWindow
- | HRefPage Int
-   deriving Show
-
-instance Render HRefOption where
- render PDFRemoteStartView = "pdfremotestartview"
- render PDFNewWindow = "pdfnewwindow"
- render (HRefPage n) = "page=" <> render n
-
-newtype URL = URL String deriving Show
-
-instance Render URL where
- render (URL str) = fromString str
-
-createURL :: String -> URL
-createURL = URL
--- TODO: This function should check that the input
--- String is a valid URL.
-
--- | 'fromString' = 'createURL'.
-instance IsString URL where
- fromString = createURL
-
--- | Reference to an 'URL'.
-href :: LaTeXC l => [HRefOption] -> URL -> l -> l
-href options u = liftL $ \t -> TeXComm "href" [ MOptArg $ fmap rendertex options
-                                              , FixArg  $ rendertex u
-                                              , FixArg t ]
-
--- | Write an 'URL' hyperlinked.
-url :: LaTeXC l => URL -> l
-url u = fromLaTeX $ TeXComm "url" [ FixArg $ rendertex u ]
-
--- | Write an 'URL' without creating a hyperlink.
-nolinkurl :: LaTeXC l => URL -> l
-nolinkurl u = fromLaTeX $ TeXComm "nolinkurl" [ FixArg $ rendertex u ]
-
--- | Establish a base 'URL'.
-hyperbaseurl :: LaTeXC l => URL -> l
-hyperbaseurl u = fromLaTeX $ TeXComm "hyperbaseurl" [ FixArg $ rendertex u ]
-
--- | @hyperimage imgURL t@:
---  The link to the image referenced by the @imgURL@ is inserted, using @t@ as the anchor.
-hyperimage :: LaTeXC l => URL -> l -> l
-hyperimage u = liftL $ \t -> TeXComm "hyperimage" [ FixArg $ rendertex u , FixArg t ]
-
--- | This is a replacement for the usual 'ref' command that places a contextual label in front of the reference.
-autoref :: LaTeXC l => Label -> l
-autoref l = fromLaTeX $ TeXComm "autoref" [ FixArg $ rendertex l ]
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Text.LaTeX.Packages.Hyperref
+ ( -- * Hyperref package
+   hyperref
+   -- * Hyperref commands
+ , HRefOption (..)
+ , URL
+ , createURL
+ , href
+ , url
+ , nolinkurl
+ , hyperbaseurl
+ , hyperimage
+ , autoref
+   ) where
+
+import Text.LaTeX.Base.Syntax
+import Text.LaTeX.Base.Class
+import Text.LaTeX.Base.Render
+import Text.LaTeX.Base.Types
+
+-- | The 'hyperref' package.
+--
+-- > usepackage [] hyperref
+hyperref :: PackageName
+hyperref = "hyperref"
+
+data HRefOption =
+   PDFRemoteStartView
+ | PDFNewWindow
+ | HRefPage Int
+   deriving Show
+
+instance Render HRefOption where
+ render PDFRemoteStartView = "pdfremotestartview"
+ render PDFNewWindow = "pdfnewwindow"
+ render (HRefPage n) = "page=" <> render n
+
+newtype URL = URL String deriving Show
+
+instance Render URL where
+ render (URL str) = fromString str
+
+createURL :: String -> URL
+createURL = URL
+-- TODO: This function should check that the input
+-- String is a valid URL.
+
+-- | 'fromString' = 'createURL'.
+instance IsString URL where
+ fromString = createURL
+
+-- | Reference to an 'URL'.
+href :: LaTeXC l => [HRefOption] -> URL -> l -> l
+href options u = liftL $ \t -> TeXComm "href" [ MOptArg $ fmap rendertex options
+                                              , FixArg  $ rendertex u
+                                              , FixArg t ]
+
+-- | Write an 'URL' hyperlinked.
+url :: LaTeXC l => URL -> l
+url u = fromLaTeX $ TeXComm "url" [ FixArg $ rendertex u ]
+
+-- | Write an 'URL' without creating a hyperlink.
+nolinkurl :: LaTeXC l => URL -> l
+nolinkurl u = fromLaTeX $ TeXComm "nolinkurl" [ FixArg $ rendertex u ]
+
+-- | Establish a base 'URL'.
+hyperbaseurl :: LaTeXC l => URL -> l
+hyperbaseurl u = fromLaTeX $ TeXComm "hyperbaseurl" [ FixArg $ rendertex u ]
+
+-- | @hyperimage imgURL t@:
+--  The link to the image referenced by the @imgURL@ is inserted, using @t@ as the anchor.
+hyperimage :: LaTeXC l => URL -> l -> l
+hyperimage u = liftL $ \t -> TeXComm "hyperimage" [ FixArg $ rendertex u , FixArg t ]
+
+-- | This is a replacement for the usual 'ref' command that places a contextual label in front of the reference.
+autoref :: LaTeXC l => Label -> l
+autoref l = fromLaTeX $ TeXComm "autoref" [ FixArg $ rendertex l ]
diff --git a/Text/LaTeX/Packages/Inputenc.hs b/Text/LaTeX/Packages/Inputenc.hs
--- a/Text/LaTeX/Packages/Inputenc.hs
+++ b/Text/LaTeX/Packages/Inputenc.hs
@@ -1,35 +1,35 @@
-
-{-# LANGUAGE OverloadedStrings #-}
-
--- | This package is of vital importance if you use non-ASCII characters in your document.
---   For example, if you type the word /Ángela/, the /Á/ character will not appear correctly in the
---   output. To solve this problem, use:
---
--- > usepackage [utf8] inputenc
---
---   And make sure that your Haskell source is encoded in UTF-8.
-module Text.LaTeX.Packages.Inputenc
- ( -- * Inputenc package
-   inputenc
-   -- * Encodings
- , utf8
- , latin1
-   ) where
-
-import Text.LaTeX.Base.Class
-import Text.LaTeX.Base.Types
-
--- | Inputenc package.
--- Example:
---
--- > usepackage [utf8] inputenc
-inputenc :: PackageName
-inputenc = "inputenc"
-
--- | UTF-8 encoding.
-utf8 :: LaTeXC l => l
-utf8 = "utf8"
-
--- | Latin-1 encoding.
-latin1 :: LaTeXC l => l
-latin1 = "latin1"
+
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | This package is of vital importance if you use non-ASCII characters in your document.
+--   For example, if you type the word /Ángela/, the /Á/ character will not appear correctly in the
+--   output. To solve this problem, use:
+--
+-- > usepackage [utf8] inputenc
+--
+--   And make sure that your Haskell source is encoded in UTF-8.
+module Text.LaTeX.Packages.Inputenc
+ ( -- * Inputenc package
+   inputenc
+   -- * Encodings
+ , utf8
+ , latin1
+   ) where
+
+import Text.LaTeX.Base.Class
+import Text.LaTeX.Base.Types
+
+-- | Inputenc package.
+-- Example:
+--
+-- > usepackage [utf8] inputenc
+inputenc :: PackageName
+inputenc = "inputenc"
+
+-- | UTF-8 encoding.
+utf8 :: LaTeXC l => l
+utf8 = "utf8"
+
+-- | Latin-1 encoding.
+latin1 :: LaTeXC l => l
+latin1 = "latin1"
diff --git a/Text/LaTeX/Packages/Trees.hs b/Text/LaTeX/Packages/Trees.hs
--- a/Text/LaTeX/Packages/Trees.hs
+++ b/Text/LaTeX/Packages/Trees.hs
@@ -1,28 +1,28 @@
-
--- | Tree definition with some class instances.
-module Text.LaTeX.Packages.Trees (
-   -- * Tree
-   Tree (..)
- ) where
-
-import Data.Monoid
-import Data.Foldable
-import Data.Traversable
-import Control.Applicative
-
--- | Tree datatype.
-data Tree a =
-   Leaf a -- ^ Leafs are non-empty.
- | Node (Maybe a) [Tree a] -- ^ Node values are optional.
-
-instance Functor Tree where
- fmap f (Leaf a) = Leaf $ f a
- fmap f (Node ma ts) = Node (fmap f ma) $ fmap (fmap f) ts
-
-instance Foldable Tree where
- foldMap f (Leaf a) = f a
- foldMap f (Node ma ts) = foldMap f ma `mappend` mconcat (fmap (foldMap f) ts)
-
-instance Traversable Tree where
- sequenceA (Leaf fa) = Leaf <$> fa
- sequenceA (Node mfa ts) = liftA2 Node (sequenceA mfa) $ sequenceA $ fmap sequenceA ts
+
+-- | Tree definition with some class instances.
+module Text.LaTeX.Packages.Trees (
+   -- * Tree
+   Tree (..)
+ ) where
+
+import Data.Monoid
+import Data.Foldable
+import Data.Traversable
+import Control.Applicative
+
+-- | Tree datatype.
+data Tree a =
+   Leaf a -- ^ Leafs are non-empty.
+ | Node (Maybe a) [Tree a] -- ^ Node values are optional.
+
+instance Functor Tree where
+ fmap f (Leaf a) = Leaf $ f a
+ fmap f (Node ma ts) = Node (fmap f ma) $ fmap (fmap f) ts
+
+instance Foldable Tree where
+ foldMap f (Leaf a) = f a
+ foldMap f (Node ma ts) = foldMap f ma `mappend` mconcat (fmap (foldMap f) ts)
+
+instance Traversable Tree where
+ sequenceA (Leaf fa) = Leaf <$> fa
+ sequenceA (Node mfa ts) = liftA2 Node (sequenceA mfa) $ sequenceA $ fmap sequenceA ts
diff --git a/Text/LaTeX/Packages/Trees/Qtree.hs b/Text/LaTeX/Packages/Trees/Qtree.hs
--- a/Text/LaTeX/Packages/Trees/Qtree.hs
+++ b/Text/LaTeX/Packages/Trees/Qtree.hs
@@ -1,48 +1,48 @@
-
-{-# LANGUAGE OverloadedStrings #-}
-
--- | Tree interface using the @qtree@ package.
---   An example of usage is provided in the /examples/ directory of
---   the source distribution.
-module Text.LaTeX.Packages.Trees.Qtree (
-    -- * Tree re-export
-    module Text.LaTeX.Packages.Trees
-    -- * Qtree package
-  , qtree
-    -- * Tree to LaTeX rendering
-  , tree
-  , rendertree
-  ) where
-
-import Text.LaTeX.Base
-import Text.LaTeX.Base.Class
-import Text.LaTeX.Packages.Trees
---
-import Data.List (intersperse)
-
--- | The 'qtree' package.
-qtree :: PackageName
-qtree = "qtree"
-
-tree_ :: LaTeXC l => (a -> l) -> Tree a -> l
-tree_ f (Leaf x) = braces $ f x
-tree_ f (Node mx ts) =
-  mconcat [ "["
-          , maybe mempty (("." <>) . braces . f) mx
-          , " "
-          , mconcat $ intersperse " " $ fmap (tree_ f) ts
-          , " ]"
-            ]
-
--- | Given a function to @LaTeX@ values, you can create a @LaTeX@ tree from a
---   Haskell tree. The function specifies how to render the node values.
-tree :: LaTeXC l => (a -> l) -> Tree a -> l
-tree f t = commS "Tree" <> " " <> tree_ f t
-
--- | Instance defined in "Text.LaTeX.Packages.Trees.Qtree".
-instance Texy a => Texy (Tree a) where
- texy = tree texy
-
--- | This function works as 'tree', but use 'render' as rendering function.
-rendertree :: (Render a, LaTeXC l) => Tree a -> l
-rendertree = tree (raw . protectText . render)
+
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Tree interface using the @qtree@ package.
+--   An example of usage is provided in the /examples/ directory of
+--   the source distribution.
+module Text.LaTeX.Packages.Trees.Qtree (
+    -- * Tree re-export
+    module Text.LaTeX.Packages.Trees
+    -- * Qtree package
+  , qtree
+    -- * Tree to LaTeX rendering
+  , tree
+  , rendertree
+  ) where
+
+import Text.LaTeX.Base
+import Text.LaTeX.Base.Class
+import Text.LaTeX.Packages.Trees
+--
+import Data.List (intersperse)
+
+-- | The 'qtree' package.
+qtree :: PackageName
+qtree = "qtree"
+
+tree_ :: LaTeXC l => (a -> l) -> Tree a -> l
+tree_ f (Leaf x) = braces $ f x
+tree_ f (Node mx ts) =
+  mconcat [ "["
+          , maybe mempty (("." <>) . braces . f) mx
+          , " "
+          , mconcat $ intersperse " " $ fmap (tree_ f) ts
+          , " ]"
+            ]
+
+-- | Given a function to @LaTeX@ values, you can create a @LaTeX@ tree from a
+--   Haskell tree. The function specifies how to render the node values.
+tree :: LaTeXC l => (a -> l) -> Tree a -> l
+tree f t = commS "Tree" <> " " <> tree_ f t
+
+-- | Instance defined in "Text.LaTeX.Packages.Trees.Qtree".
+instance Texy a => Texy (Tree a) where
+ texy = tree texy
+
+-- | This function works as 'tree', but use 'render' as rendering function.
+rendertree :: (Render a, LaTeXC l) => Tree a -> l
+rendertree = tree (raw . protectText . render)
diff --git a/license b/license
--- a/license
+++ b/license
@@ -1,30 +1,30 @@
-Copyright (c)2013, Daniel Díaz
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-
-    * Neither the name of Daniel Díaz nor the names of other
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+Copyright (c)2013, Daniel Díaz
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Daniel Díaz nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/parsertest/example4.tex b/parsertest/example4.tex
new file mode 100644
--- /dev/null
+++ b/parsertest/example4.tex
@@ -0,0 +1,8 @@
+
+\documentclass{article}
+
+\begin{document}
+
+Interval: $[0,1)$.
+
+\end{document}
diff --git a/parsertest/example5.tex b/parsertest/example5.tex
new file mode 100644
--- /dev/null
+++ b/parsertest/example5.tex
@@ -0,0 +1,4 @@
+\documentclass{article}
+\begin{document}
+Let $x \in[0,1)$ be a number.
+\end{document}
diff --git a/parsertest/parsertest.hs b/parsertest/parsertest.hs
--- a/parsertest/parsertest.hs
+++ b/parsertest/parsertest.hs
@@ -1,15 +1,15 @@
 
-import Text.LaTeX
 import Text.LaTeX.Base.Parser
 import qualified Data.Text.IO as T
+import System.Exit (exitSuccess, exitFailure)
 
 testNumbers :: [Int]
-testNumbers = [1 .. 3]
+testNumbers = [1 .. 5]
 
 testFile :: Int -> IO Bool
 testFile i = do
   putStr $ "Parsing example " ++ show i ++ "... "
-  t <- T.readFile $ "example" ++ show i ++ ".tex"
+  t <- T.readFile $ "parsertest/example" ++ show i ++ ".tex"
   case parseLaTeX t of
     Left err -> do putStrLn "Failed."
                    putStrLn $ "The error was: " ++ show err
@@ -22,5 +22,6 @@
   bs <- mapM testFile testNumbers
   let b = and bs
   putStrLn $ "Parser Test Passed: " ++ show b
-  if b then return ()
-       else putStrLn $ "Test result: " ++ show (length $ filter (==True) bs) ++ "/" ++ show (length bs)
+  if b then exitSuccess
+       else do putStrLn $ "Test result: " ++ show (length $ filter (==True) bs) ++ "/" ++ show (length bs)
+               exitFailure
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -4,7 +4,6 @@
 
 import Test.Tasty
 import qualified Test.Tasty.QuickCheck as QC
-import Test.QuickCheck
 
 instance Eq ParseError where
   _ == _ = undefined
