-- | This package provides extensive control of page headers and footers.
--
-- CTAN page for fancyhdr: <http://www.ctan.org/pkg/fancyhdr>.
module Text.LaTeX.Packages.Fancyhdr (
   -- * fancyhdr package
   fancyhdr
   -- * Simple interface
 , HdrSettings (..)
 , defaultHdrSettings
 , applyHdrSettings
   -- * Raw interface
 , fancy
 , lhead, chead, rhead
 , lfoot, cfoot, rfoot
 , renewheadrulewidth
 , renewfootrulewidth
   ) where

import Text.LaTeX.Base.Syntax
import Text.LaTeX.Base.Class
import Text.LaTeX.Base.Types
import Text.LaTeX.Base.Commands
import Text.LaTeX.Base.Texy

-- | The fancyhdr package.
--   Please, consider to use 'applyHdrSettings'
--   instead of importing the package manually.
--   If you really want to do it manually, use
--   the functions from the /raw interface/
--   exposed below.
fancyhdr :: PackageName
fancyhdr :: PackageName
fancyhdr = PackageName
"fancyhdr"

-- Header and footer settings

-- | Header and footer settings of a LaTeX document.
--   Use 'applyHdrSettings' to apply these settings
--   in your document. A default value is provided
--   by 'defaultHdrSettings', which you can modify
--   using record syntax.
--
-- > mySettings :: HdrSettings
-- > mySettings = defaultHdrSettings
-- >     { centerHeader = "Amazing header"
-- >     , headRuleWidth = Pt 2
-- >       }
--
data HdrSettings = HdrSettings
 { HdrSettings -> LaTeX
leftHeader    :: LaTeX
 , HdrSettings -> LaTeX
centerHeader  :: LaTeX
 , HdrSettings -> LaTeX
rightHeader   :: LaTeX
 , HdrSettings -> LaTeX
leftFooter    :: LaTeX
 , HdrSettings -> LaTeX
centerFooter  :: LaTeX
 , HdrSettings -> LaTeX
rightFooter   :: LaTeX
 , HdrSettings -> Measure
headRuleWidth :: Measure
 , HdrSettings -> Measure
footRuleWidth :: Measure
   } deriving (HdrSettings -> HdrSettings -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HdrSettings -> HdrSettings -> Bool
$c/= :: HdrSettings -> HdrSettings -> Bool
== :: HdrSettings -> HdrSettings -> Bool
$c== :: HdrSettings -> HdrSettings -> Bool
Eq,Int -> HdrSettings -> ShowS
[HdrSettings] -> ShowS
HdrSettings -> PackageName
forall a.
(Int -> a -> ShowS)
-> (a -> PackageName) -> ([a] -> ShowS) -> Show a
showList :: [HdrSettings] -> ShowS
$cshowList :: [HdrSettings] -> ShowS
show :: HdrSettings -> PackageName
$cshow :: HdrSettings -> PackageName
showsPrec :: Int -> HdrSettings -> ShowS
$cshowsPrec :: Int -> HdrSettings -> ShowS
Show)

-- | Default header and footer settings.
--
--   It leaves everything empty but the
--   'centerFooter' field, which is filled
--   with 'thePage'.
--
--   Also, it sets to 0.4 points
--   the 'headRuleWidth' field.
defaultHdrSettings :: HdrSettings
defaultHdrSettings :: HdrSettings
defaultHdrSettings =
  HdrSettings
   { leftHeader :: LaTeX
leftHeader    = forall a. Monoid a => a
mempty
   , centerHeader :: LaTeX
centerHeader  = forall a. Monoid a => a
mempty
   , rightHeader :: LaTeX
rightHeader   = forall a. Monoid a => a
mempty
   , leftFooter :: LaTeX
leftFooter    = forall a. Monoid a => a
mempty
   , centerFooter :: LaTeX
centerFooter  = forall l. LaTeXC l => l
thePage
   , rightFooter :: LaTeX
rightFooter   = forall a. Monoid a => a
mempty
   , headRuleWidth :: Measure
headRuleWidth = Double -> Measure
Pt Double
0.4
   , footRuleWidth :: Measure
footRuleWidth = Double -> Measure
Pt Double
0
     }

-- | Apply custom header and footer settings to a
--   LaTeX document. It takes care of package importing
--   and page style settings, so using this function
--   is enough to get the settings applied.
--   Do /not/ import the 'fancyhdr' package again.
--   To be used in the /preamble/.
applyHdrSettings :: LaTeXC l => HdrSettings -> l
applyHdrSettings :: forall l. LaTeXC l => HdrSettings -> l
applyHdrSettings HdrSettings
hs =
    forall l. LaTeXC l => [l] -> PackageName -> l
usepackage [] PackageName
fancyhdr
 forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => PackageName -> l
pagestyle PackageName
fancy
 forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => LaTeX -> l
fromLaTeX (forall l. LaTeXC l => l -> l
lhead forall a b. (a -> b) -> a -> b
$   HdrSettings -> LaTeX
leftHeader HdrSettings
hs)
 forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => LaTeX -> l
fromLaTeX (forall l. LaTeXC l => l -> l
chead forall a b. (a -> b) -> a -> b
$ HdrSettings -> LaTeX
centerHeader HdrSettings
hs)
 forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => LaTeX -> l
fromLaTeX (forall l. LaTeXC l => l -> l
rhead forall a b. (a -> b) -> a -> b
$  HdrSettings -> LaTeX
rightHeader HdrSettings
hs)
 forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => LaTeX -> l
fromLaTeX (forall l. LaTeXC l => l -> l
lfoot forall a b. (a -> b) -> a -> b
$   HdrSettings -> LaTeX
leftFooter HdrSettings
hs)
 forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => LaTeX -> l
fromLaTeX (forall l. LaTeXC l => l -> l
cfoot forall a b. (a -> b) -> a -> b
$ HdrSettings -> LaTeX
centerFooter HdrSettings
hs)
 forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => LaTeX -> l
fromLaTeX (forall l. LaTeXC l => l -> l
rfoot forall a b. (a -> b) -> a -> b
$  HdrSettings -> LaTeX
rightFooter HdrSettings
hs)
 forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => Measure -> l
renewheadrulewidth (HdrSettings -> Measure
headRuleWidth HdrSettings
hs)
 forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => Measure -> l
renewfootrulewidth (HdrSettings -> Measure
footRuleWidth HdrSettings
hs)

-- Raw interface

-- | Page style of the 'fancyhdr' package.
fancy :: PageStyle
fancy :: PackageName
fancy = PackageName
"fancy"

-- | Set the left header.
lhead :: LaTeXC l => l -> l
lhead :: forall l. LaTeXC l => l -> l
lhead = forall l. LaTeXC l => PackageName -> l -> l
comm1 PackageName
"lhead"

-- | Set the center header.
chead :: LaTeXC l => l -> l
chead :: forall l. LaTeXC l => l -> l
chead = forall l. LaTeXC l => PackageName -> l -> l
comm1 PackageName
"chead"

-- | Set the right header.
rhead :: LaTeXC l => l -> l
rhead :: forall l. LaTeXC l => l -> l
rhead = forall l. LaTeXC l => PackageName -> l -> l
comm1 PackageName
"rhead"

-- | Set the left footer.
lfoot :: LaTeXC l => l -> l
lfoot :: forall l. LaTeXC l => l -> l
lfoot = forall l. LaTeXC l => PackageName -> l -> l
comm1 PackageName
"lfoot"

-- | Set the center footer.
cfoot :: LaTeXC l => l -> l
cfoot :: forall l. LaTeXC l => l -> l
cfoot = forall l. LaTeXC l => PackageName -> l -> l
comm1 PackageName
"cfoot"

-- | Set the right footer.
rfoot :: LaTeXC l => l -> l
rfoot :: forall l. LaTeXC l => l -> l
rfoot = forall l. LaTeXC l => PackageName -> l -> l
comm1 PackageName
"rfoot"

-- | Set the @headrulewidth@ attribute.
renewheadrulewidth :: LaTeXC l => Measure -> l
renewheadrulewidth :: forall l. LaTeXC l => Measure -> l
renewheadrulewidth Measure
m = forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall a b. (a -> b) -> a -> b
$
  PackageName -> [TeXArg] -> LaTeX
TeXComm PackageName
"renewcommand" [ LaTeX -> TeXArg
FixArg forall a b. (a -> b) -> a -> b
$ PackageName -> LaTeX
TeXCommS PackageName
"headrulewidth"
                         , LaTeX -> TeXArg
FixArg forall a b. (a -> b) -> a -> b
$ forall t l. (Texy t, LaTeXC l) => t -> l
texy Measure
m
                           ]

-- | Set the @footrulewidth@ attribute.
renewfootrulewidth :: LaTeXC l => Measure -> l
renewfootrulewidth :: forall l. LaTeXC l => Measure -> l
renewfootrulewidth Measure
m = forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall a b. (a -> b) -> a -> b
$
  PackageName -> [TeXArg] -> LaTeX
TeXComm PackageName
"renewcommand" [ LaTeX -> TeXArg
FixArg forall a b. (a -> b) -> a -> b
$ PackageName -> LaTeX
TeXCommS PackageName
"footrulewidth"
                         , LaTeX -> TeXArg
FixArg forall a b. (a -> b) -> a -> b
$ forall t l. (Texy t, LaTeXC l) => t -> l
texy Measure
m
                           ]