module Text.LaTeX 
     ( -- * How to use HaTeX
       -- ** Introduction
       -- $guide1

       -- ** LaTeX file structure
       -- $guide2

       -- ** A simple example
       -- $guide3

       -- ** Enriching your text
       -- $guide4

       -- ** Performing IO computations
       -- $guide5

       -- * HaTeX related functions
     , hatexVersion
       -- * Exporting to /.tex/
     , export
       -- * Re-exports
     , module Text.LaTeX.Result
     , module Text.LaTeX.Monad
     , module Text.LaTeX.Define
     , module Text.LaTeX.Arguments
     , module Text.LaTeX.Packages
     , module Text.LaTeX.Commands
     , module Text.LaTeX.Macro
     , module Text.LaTeX.IO
     ) where

import Text.LaTeX.Monad
import Text.LaTeX.Commands
import Text.LaTeX.Arguments
import Text.LaTeX.Define
import Text.LaTeX.Packages
import Text.LaTeX.IO
import Text.LaTeX.Result
import Text.LaTeX.Macro
import System.FilePath (takeExtension)

-- | HaTeX nice word.
hatex :: LaTeX
hatex = makebox [] [] $ do "H"
                           raisebox (ex (-0.55)) [] [] $
                             makebox [0.5 >> width] [] "A"

-- | Your HaTeX version.
hatexVersion :: LaTeX
hatexVersion = do textbf "1" ; ".0.1"

-- | Export the 'Result' of a 'LaTeX' sequence in a /.tex/ file.
export ::
     LaTeX    -- ^ 'LaTeX' to export.
  -> FilePath -- ^ Path of export.
  -> IO ()
export x fp = do y <- nlx x
                 let z = fromResult y
                 if takeExtension fp == ".tex" then writeFile fp z
                                               else writeFile (fp ++ ".tex") z


-- Introduction

{- $guide1
If you know how to use LaTeX, you will easily understand how to use HaTeX.
Otherwise, you will need to read well the documentation.

A first step may be to know the LaTeX file structure.

-- LaTeX file structure

{- $guide2
A LaTeX file has two parts:

- A header where you define general settings (document class, page style, use of extern packages, ...) of your document.

- The document's content.

-- A simple example

{- $guide3
We're going to write an example, the best for understanding.

* Function 'documentclass' is used for determining if our document is an 'article', a 'book', a 'report', etc.

* Function 'author' is used for specify document's authory.

* Function 'title' for document's title.

Then, with this three functions, we will define a header in the 'LaTeX' monad.
'LaTeX' is a writer monad that concatenates the text generated by the programmer.
Usually, the text is generated simply writing it, or by functions.

> example = do documentclass [] article
>              author "Daniel Diaz"
>              title "Example"

The first argument of 'documentclass' is used for change certain settings of the class.
For example, you can set the document's main font size to 12pt, writing:

> documentclass [pt 12] article

Or set paper size to A4:

> documentclass [pt 12,a4paper] article

Now, I will write a content:

> hello = "Hello, world!"

To insert the content into the document, we have the function 'document'. Completing our first example:

> example = do documentclass [] article
>              author "Daniel Diaz"
>              title "Example"
>              document hello

At first glance, it seems that 'author', 'title' or 'document' receive a @String@ as argument.
Really, they require a 'LaTeX' argument. 'LaTeX' is the type that represents texts in HaTeX.
So, I recommend to use /Overloaded Strings/
(See <>).

-- Enriching your text

{- $guide4
There are numerous functions to enrich your document.
One feature is change your font format with the functions shown here: "Text.LaTeX.Commands#Fonts".

For example, in:

> texttt "Hello!"

'texttt' sets as monospaced font his content. Or composing:

> texttt $ textbf "Hello!"

'textbf' sets as bold font the monospaced font of @\"Hello!\"@.

If you only want @\"ll\"@ with bold format:

> texttt $ do "He"
>             textbf "ll"
>             "o!"

Applying the function to only part of the text, we achieve modify just that part.

-- Performing IO computations

{- $guide5
To includes an 'IO' computation in 'LaTeX' monad, use 'iolx'.

> gtime = do t <- iolx getClockTime
>            ...

Some 'IO' computations are predefined in "Text.LaTeX.IO".