{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_HATEX MakeMonadic #-}

module Text.LaTeX.Packages.AMSMath
 ( -- * AMSMath package
   amsmath
   -- * AMSMath functions
 , math
   -- * Symbols and utilities
   -- ** 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
 , texp
 , tlog , ln
   -- ** Operator symbols
 , (=:) , (/=:)
 , (>:) , (>=:)
 , (<:) , (<=:)
 , in_ , ni , notin
   -- ** 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      , 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
 , forall
 , dagger, ddagger
   -- * Fonts
 , mathbf
 , mathrm
 , mathcal
 , mathsf
 , mathtt
 , mathit
   ) where

import Text.LaTeX.Base.Syntax
import Text.LaTeX.Base.Commands (raw,between)
import Text.LaTeX.Base.Types

-- | AMSMath package.
-- Example:
--
-- > usepackage [] amsmath
amsmath :: PackageName
amsmath = "amsmath"

-- | Inline mathematical expressions.
math :: LaTeX -> LaTeX
math = TeXMath

-------------------------------------
------- Symbols and utilities -------

-- | Superscript.
(^:) :: LaTeX -> LaTeX -> LaTeX
x ^: y = x <> raw "^"  <> braces y

-- | Subscript.
(!:) :: LaTeX -> LaTeX -> LaTeX
x !: y = x <> raw "_" <> braces y

---- Function symbols

-- | Sine function symbol.
tsin :: LaTeX
tsin = TeXComm "sin" []

-- | Arcsine function symbol.
arcsin :: LaTeX
arcsin = TeXComm "arcsin" []

-- | Cosine function symbol.
tcos :: LaTeX
tcos = TeXComm "cos" []

-- | Arccosine function symbol.
arccos :: LaTeX
arccos = TeXComm "arccos" []

-- | Tangent function symbol.
ttan :: LaTeX
ttan = TeXComm "tan" []

arctan :: LaTeX
arctan = TeXComm "arctan" []

-- | Exponential function symbol.
texp :: LaTeX
texp = TeXComm "exp" []

-- | Logarithm function symbol.
tlog :: LaTeX
tlog = TeXComm "log" []

-- | Natural logarithm symbol.
ln :: LaTeX
ln = TeXComm "ln" []

---- Operator symbols

-- | Negative form of an operator.
notop :: (LaTeX -> LaTeX -> LaTeX)
      -> (LaTeX -> LaTeX -> LaTeX)
notop op =
 \l1 l2 ->
   (l1 <> TeXCommS "not") `op` l2

infix 4 =: , /=:

(=:),(/=:) :: LaTeX -> LaTeX -> LaTeX
(=:)  = TeXOp "="
(/=:) = notop (=:)

-- | Greater.
(>:) :: LaTeX -> LaTeX -> LaTeX
(>:) = TeXOp ">"

-- | Greater or equal.
(>=:) :: LaTeX -> LaTeX -> LaTeX
(>=:) = between $ TeXComm "geq" []

-- | Lesser.
(<:) :: LaTeX -> LaTeX -> LaTeX
(<:) = TeXOp "<"

-- | Lesser or equal.
(<=:) :: LaTeX -> LaTeX -> LaTeX
(<=:) = between $ TeXComm "leq" []

in_ :: LaTeX -> LaTeX -> LaTeX
in_ = between $ TeXComm "in" []

ni :: LaTeX -> LaTeX -> LaTeX
ni  = between $ TeXComm "ni" []

notin :: LaTeX -> LaTeX -> LaTeX
notin = between $ TeXComm "notin" []

---- Greek alphabet

alpha :: LaTeX
alpha = TeXComm "alpha" []

beta :: LaTeX
beta = TeXComm "beta" []

gamma :: LaTeX
gamma = TeXComm "gamma" []

gammau :: LaTeX
gammau = TeXComm "Gamma" []

delta :: LaTeX
delta = TeXComm "delta" []

deltau :: LaTeX
deltau = TeXComm "Delta" []

epsilon :: LaTeX
epsilon = TeXComm "epsilon" []

varepsilon :: LaTeX
varepsilon = TeXComm "epsilon" []

zeta :: LaTeX
zeta = TeXComm "zeta" []

eta :: LaTeX
eta = TeXComm "eta" []

theta :: LaTeX
theta = TeXComm "theta" []

thetau :: LaTeX
thetau = TeXComm "thetau" []

iota :: LaTeX
iota = TeXComm "iota" []

kappa :: LaTeX
kappa = TeXComm "kappa" []

lambda :: LaTeX
lambda = TeXComm "lambda" []

lambdau :: LaTeX
lambdau = TeXComm "Lambda" []

mu :: LaTeX
mu = TeXComm "mu" []

nu :: LaTeX
nu = TeXComm "nu" []

xi :: LaTeX
xi = TeXComm "xi" []

xiu :: LaTeX
xiu = TeXComm "Xi" []

pi_ :: LaTeX
pi_ = TeXComm "pi" []

varpi :: LaTeX
varpi = TeXComm "varpi" []

piu :: LaTeX
piu = TeXComm "Pi" []

rho :: LaTeX
rho = TeXComm "rho" []

varrho :: LaTeX
varrho = TeXComm "varrho" []

sigma :: LaTeX
sigma = TeXComm "sigma" []

varsigma :: LaTeX
varsigma = TeXComm "varsigma" []

sigmau :: LaTeX
sigmau = TeXComm "Sigma" []

tau :: LaTeX
tau = TeXComm "tau" []

upsilon :: LaTeX
upsilon = TeXComm "upsilon" []

upsilonu :: LaTeX
upsilonu = TeXComm "Upsilon" []

phi :: LaTeX
phi = TeXComm "phi" []

varphi :: LaTeX
varphi = TeXComm "varphi" []

phiu :: LaTeX
phiu = TeXComm "Phi" []

chi :: LaTeX
chi = TeXComm "chi" []

psi :: LaTeX
psi = TeXComm "psi" []

psiu :: LaTeX
psiu = TeXComm "Psi" []

omega :: LaTeX
omega = TeXComm "omega" []

omegau :: LaTeX
omegau = TeXComm "Omega" []

---- Other symbols

-- | A right-arrow.
to :: LaTeX
to = TeXComm "to" []

-- | /For all/ symbol.
forall :: LaTeX
forall = TeXComm "forall" []

-- | Dagger symbol.
dagger :: LaTeX
dagger = TeXComm "dagger" []

-- | Double dagger symbol.
ddagger :: LaTeX
ddagger = TeXComm "ddagger" []

-------------------------------------
------------ Math Fonts -------------

mathbf :: LaTeX -> LaTeX
mathbf l = TeXComm "mathbf" [FixArg l]

mathrm :: LaTeX -> LaTeX
mathrm l = TeXComm "mathrm" [FixArg l]

mathcal :: LaTeX -> LaTeX
mathcal l = TeXComm "mathcal" [FixArg l]

mathsf :: LaTeX -> LaTeX
mathsf l = TeXComm "mathsf" [FixArg l]

mathtt :: LaTeX -> LaTeX
mathtt l = TeXComm "mathtt" [FixArg l]

mathit :: LaTeX -> LaTeX
mathit l = TeXComm "mathit" [FixArg l]