passage-0.1: Language/Passage/Lang/LaTeX.hs
module Language.Passage.Lang.LaTeX where
import Language.Passage.Utils
import qualified Data.Set as S
class LaTeX t where
latex :: t -> Doc
instance LaTeX Double where
latex = double
instance LaTeX Int where
latex = int
cmd :: String -> [Doc] -> Doc
cmd a as = char '\\' <> text a <> case as of
[] -> empty
_ -> hcat (map braces as)
frac, pow :: Doc -> Doc -> Doc
frac a b = cmd "frac" [ a, b ]
pow a b = braces a <> char '^' <> braces b
lg :: Doc
lg = cmd "log" []
expon = cmd "exp" []
logGamma :: Doc -> Doc
logGamma a = cmd "log" [cmd "Gamma" [a]]
literal :: String -> Doc -> Doc
literal s a = cmd s [a]
knownVars :: S.Set String
knownVars = S.fromList
[ "alpha", "beta", "gamma", "delta", "epsilon", "varepsilon"
, "zeta", "eta", "theta", "vartheta", "kappa", "lambda", "mu", "nu", "xi"
, "pi", "varpi", "rho", "varrho", "sigma", "varsigma"
, "tau", "upsilon", "phi", "varphi", "chi", "psi", "imega"
]
var :: String -> Doc
var x | x `S.member` knownVars = cmd x []
| short x = text x
| True = cmd "ensuremath" [ cmd "mathit" [ text x ]]
where short [_] = True
short _ = False
math :: Doc -> Doc
math x = char '$' <> x <> char '$'
env :: String -> [Doc] -> Doc -> Doc
env x opts body = cmd "begin" (text x : opts) $$ body $$ cmd "end" [text x]
sim :: Doc
sim = cmd "sim" []
row :: [Doc] -> Doc
row xs = hsep (punctuate (text "&") xs) <+> text "\\\\"
hline :: Doc
hline = cmd "hline" []
mathcal :: Doc -> Doc
mathcal d = cmd "mathcal" [d]
mathrm :: Doc -> Doc
mathrm d = cmd "mathrm" [d]