{-# 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
 , onslide
 , visible
 , invisible
 , beamercolor
 , overprint
   -- ** Transparency Effects
 , CoverOption (..)
 , Opaqueness (..)
 , setbeamercovered
   -- ** 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 :: ClassName
beamer = ClassName
"beamer"

-- | A presentation is composed of a sequence of frames. Each frame is created with this function.
frame :: LaTeXC l => l -> l
frame :: l -> l
frame = (LaTeX -> LaTeX) -> l -> l
forall l. LaTeXC l => (LaTeX -> LaTeX) -> l -> l
liftL ((LaTeX -> LaTeX) -> l -> l) -> (LaTeX -> LaTeX) -> l -> l
forall a b. (a -> b) -> a -> b
$ ClassName -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv ClassName
"frame" []

-- | Set the title of the current frame. Use it within a 'frame'.
frametitle :: LaTeXC l => l -> l
frametitle :: l -> l
frametitle = (LaTeX -> LaTeX) -> l -> l
forall l. LaTeXC l => (LaTeX -> LaTeX) -> l -> l
liftL ((LaTeX -> LaTeX) -> l -> l) -> (LaTeX -> LaTeX) -> l -> l
forall a b. (a -> b) -> a -> b
$ \LaTeX
l -> ClassName -> [TeXArg] -> LaTeX
TeXComm ClassName
"frametitle" [LaTeX -> TeXArg
FixArg LaTeX
l]

-- | Set the subtitle of the current frame. Use it within a 'frame'.
framesubtitle :: LaTeXC l => l -> l
framesubtitle :: l -> l
framesubtitle = (LaTeX -> LaTeX) -> l -> l
forall l. LaTeXC l => (LaTeX -> LaTeX) -> l -> l
liftL ((LaTeX -> LaTeX) -> l -> l) -> (LaTeX -> LaTeX) -> l -> l
forall a b. (a -> b) -> a -> b
$ \LaTeX
l -> ClassName -> [TeXArg] -> LaTeX
TeXComm ClassName
"framesubtitle" [LaTeX -> TeXArg
FixArg LaTeX
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 :: [OverlaySpec] -> l -> l
alert [OverlaySpec]
os = (LaTeX -> LaTeX) -> l -> l
forall l. LaTeXC l => (LaTeX -> LaTeX) -> l -> l
liftL ((LaTeX -> LaTeX) -> l -> l) -> (LaTeX -> LaTeX) -> l -> l
forall a b. (a -> b) -> a -> b
$ \LaTeX
l -> ClassName -> [TeXArg] -> LaTeX
TeXComm ClassName
"alert" [ [LaTeX] -> TeXArg
MSymArg ([LaTeX] -> TeXArg) -> [LaTeX] -> TeXArg
forall a b. (a -> b) -> a -> b
$ (OverlaySpec -> LaTeX) -> [OverlaySpec] -> [LaTeX]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> LaTeX
TeXRaw (Text -> LaTeX) -> (OverlaySpec -> Text) -> OverlaySpec -> LaTeX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OverlaySpec -> Text
forall a. Render a => a -> Text
render) [OverlaySpec]
os, LaTeX -> TeXArg
FixArg LaTeX
l]

-- | Introduces a pause in a slide.
pause :: LaTeXC l => l
pause :: l
pause = ClassName -> l
forall l. LaTeXC l => ClassName -> l
comm0 ClassName
"pause"

-- | 'beameritem' works like 'item', but allows you to specify the slides where
-- the item will be displayed.
beameritem :: LaTeXC l => [OverlaySpec] -> l
beameritem :: [OverlaySpec] -> l
beameritem [OverlaySpec]
os = LaTeX -> l
forall l. LaTeXC l => LaTeX -> l
fromLaTeX (LaTeX -> l) -> LaTeX -> l
forall a b. (a -> b) -> a -> b
$ ClassName -> [TeXArg] -> LaTeX
TeXComm ClassName
"item" [ [LaTeX] -> TeXArg
MSymArg ([LaTeX] -> TeXArg) -> [LaTeX] -> TeXArg
forall a b. (a -> b) -> a -> b
$ (OverlaySpec -> LaTeX) -> [OverlaySpec] -> [LaTeX]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> LaTeX
TeXRaw (Text -> LaTeX) -> (OverlaySpec -> Text) -> OverlaySpec -> LaTeX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OverlaySpec -> Text
forall a. Render a => a -> Text
render) [OverlaySpec]
os ]

-- | With 'uncover', show a piece of text only in the slides you
-- want. On other slides, the text still occupies space and it is still
-- typeset, but it is not shown or only shown as if transparent.
uncover :: LaTeXC l => [OverlaySpec] -> l -> l
uncover :: [OverlaySpec] -> l -> l
uncover [OverlaySpec]
os = (LaTeX -> LaTeX) -> l -> l
forall l. LaTeXC l => (LaTeX -> LaTeX) -> l -> l
liftL ((LaTeX -> LaTeX) -> l -> l) -> (LaTeX -> LaTeX) -> l -> l
forall a b. (a -> b) -> a -> b
$ \LaTeX
l -> ClassName -> [TeXArg] -> LaTeX
TeXComm ClassName
"uncover" [ [LaTeX] -> TeXArg
MSymArg ([LaTeX] -> TeXArg) -> [LaTeX] -> TeXArg
forall a b. (a -> b) -> a -> b
$ (OverlaySpec -> LaTeX) -> [OverlaySpec] -> [LaTeX]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> LaTeX
TeXRaw (Text -> LaTeX) -> (OverlaySpec -> Text) -> OverlaySpec -> LaTeX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OverlaySpec -> Text
forall a. Render a => a -> Text
render) [OverlaySpec]
os , LaTeX -> TeXArg
FixArg LaTeX
l ]

-- | With 'only' the text is inserted only into the specified
-- slides. For other slides, the text is simply thrown away (it occupies
-- no space).
only :: LaTeXC l => [OverlaySpec] -> l -> l
only :: [OverlaySpec] -> l -> l
only [OverlaySpec]
os = (LaTeX -> LaTeX) -> l -> l
forall l. LaTeXC l => (LaTeX -> LaTeX) -> l -> l
liftL ((LaTeX -> LaTeX) -> l -> l) -> (LaTeX -> LaTeX) -> l -> l
forall a b. (a -> b) -> a -> b
$ \LaTeX
l -> ClassName -> [TeXArg] -> LaTeX
TeXComm ClassName
"only" [ [LaTeX] -> TeXArg
MSymArg ([LaTeX] -> TeXArg) -> [LaTeX] -> TeXArg
forall a b. (a -> b) -> a -> b
$ (OverlaySpec -> LaTeX) -> [OverlaySpec] -> [LaTeX]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> LaTeX
TeXRaw (Text -> LaTeX) -> (OverlaySpec -> Text) -> OverlaySpec -> LaTeX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OverlaySpec -> Text
forall a. Render a => a -> Text
render) [OverlaySpec]
os , LaTeX -> TeXArg
FixArg LaTeX
l ]

-- | The behavior of the 'onslide' command depends on whether the
-- optional argument 'text' is given or not. If a 'text' argument is
-- present, 'onslide' (without a ⟨modifier⟩) is mapped to 'uncover'.
onslide :: LaTeXC l => [OverlaySpec] -> l -> l
onslide :: [OverlaySpec] -> l -> l
onslide [OverlaySpec]
os = (LaTeX -> LaTeX) -> l -> l
forall l. LaTeXC l => (LaTeX -> LaTeX) -> l -> l
liftL ((LaTeX -> LaTeX) -> l -> l) -> (LaTeX -> LaTeX) -> l -> l
forall a b. (a -> b) -> a -> b
$ \LaTeX
l -> ClassName -> [TeXArg] -> LaTeX
TeXComm ClassName
"onslide" [ [LaTeX] -> TeXArg
MSymArg ([LaTeX] -> TeXArg) -> [LaTeX] -> TeXArg
forall a b. (a -> b) -> a -> b
$ (OverlaySpec -> LaTeX) -> [OverlaySpec] -> [LaTeX]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> LaTeX
TeXRaw (Text -> LaTeX) -> (OverlaySpec -> Text) -> OverlaySpec -> LaTeX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OverlaySpec -> Text
forall a. Render a => a -> Text
render) [OverlaySpec]
os , LaTeX -> TeXArg
FixArg LaTeX
l ]

-- | The 'visible' command does almost the same as 'uncover'. The only
-- difference is that if the text is not shown, it is never shown in a
-- transparent way, but rather it is not shown at all. Thus for this
-- command the transparency settings have no effect.
visible :: LaTeXC l => [OverlaySpec] -> l -> l
visible :: [OverlaySpec] -> l -> l
visible [OverlaySpec]
os = (LaTeX -> LaTeX) -> l -> l
forall l. LaTeXC l => (LaTeX -> LaTeX) -> l -> l
liftL ((LaTeX -> LaTeX) -> l -> l) -> (LaTeX -> LaTeX) -> l -> l
forall a b. (a -> b) -> a -> b
$ \LaTeX
l -> ClassName -> [TeXArg] -> LaTeX
TeXComm ClassName
"visible" [ [LaTeX] -> TeXArg
MSymArg ([LaTeX] -> TeXArg) -> [LaTeX] -> TeXArg
forall a b. (a -> b) -> a -> b
$ (OverlaySpec -> LaTeX) -> [OverlaySpec] -> [LaTeX]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> LaTeX
TeXRaw (Text -> LaTeX) -> (OverlaySpec -> Text) -> OverlaySpec -> LaTeX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OverlaySpec -> Text
forall a. Render a => a -> Text
render) [OverlaySpec]
os , LaTeX -> TeXArg
FixArg LaTeX
l ]

-- | The 'invisible' is the opposite of 'visible'.
invisible :: LaTeXC l => [OverlaySpec] -> l -> l
invisible :: [OverlaySpec] -> l -> l
invisible [OverlaySpec]
os = (LaTeX -> LaTeX) -> l -> l
forall l. LaTeXC l => (LaTeX -> LaTeX) -> l -> l
liftL ((LaTeX -> LaTeX) -> l -> l) -> (LaTeX -> LaTeX) -> l -> l
forall a b. (a -> b) -> a -> b
$ \LaTeX
l -> ClassName -> [TeXArg] -> LaTeX
TeXComm ClassName
"invisible" [ [LaTeX] -> TeXArg
MSymArg ([LaTeX] -> TeXArg) -> [LaTeX] -> TeXArg
forall a b. (a -> b) -> a -> b
$ (OverlaySpec -> LaTeX) -> [OverlaySpec] -> [LaTeX]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> LaTeX
TeXRaw (Text -> LaTeX) -> (OverlaySpec -> Text) -> OverlaySpec -> LaTeX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OverlaySpec -> Text
forall a. Render a => a -> Text
render) [OverlaySpec]
os , LaTeX -> TeXArg
FixArg LaTeX
l ]

-- | 'beamercolor' works like 'color', but allows you to specify the slides where
-- the text will be bold.
beamercolor :: LaTeXC l => [OverlaySpec] -> l
beamercolor :: [OverlaySpec] -> l
beamercolor [OverlaySpec]
os = LaTeX -> l
forall l. LaTeXC l => LaTeX -> l
fromLaTeX (LaTeX -> l) -> LaTeX -> l
forall a b. (a -> b) -> a -> b
$ ClassName -> [TeXArg] -> LaTeX
TeXComm ClassName
"color" [ [LaTeX] -> TeXArg
MSymArg ([LaTeX] -> TeXArg) -> [LaTeX] -> TeXArg
forall a b. (a -> b) -> a -> b
$ (OverlaySpec -> LaTeX) -> [OverlaySpec] -> [LaTeX]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> LaTeX
TeXRaw (Text -> LaTeX) -> (OverlaySpec -> Text) -> OverlaySpec -> LaTeX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OverlaySpec -> Text
forall a. Render a => a -> Text
render) [OverlaySpec]
os ]

-- | Inside the 'overprint' environment, use 'onslide' commands to
-- specify different things that should be shown for this environment on
-- different slides. Everything within the environment will be placed in
-- a rectangular area of the specified width. The height and depth of
-- the area are chosen large enough to acoommodate the largest contents
-- of this area.
overprint :: LaTeXC l => l -> l
overprint :: l -> l
overprint = (LaTeX -> LaTeX) -> l -> l
forall l. LaTeXC l => (LaTeX -> LaTeX) -> l -> l
liftL ((LaTeX -> LaTeX) -> l -> l) -> (LaTeX -> LaTeX) -> l -> l
forall a b. (a -> b) -> a -> b
$ ClassName -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv ClassName
"overprint" []


-- | Specifications for beamer functions.
data OverlaySpec =
   OneSlide Int
 | FromSlide Int
 | ToSlide Int
 | FromToSlide Int Int
   deriving Int -> OverlaySpec -> ShowS
[OverlaySpec] -> ShowS
OverlaySpec -> ClassName
(Int -> OverlaySpec -> ShowS)
-> (OverlaySpec -> ClassName)
-> ([OverlaySpec] -> ShowS)
-> Show OverlaySpec
forall a.
(Int -> a -> ShowS) -> (a -> ClassName) -> ([a] -> ShowS) -> Show a
showList :: [OverlaySpec] -> ShowS
$cshowList :: [OverlaySpec] -> ShowS
show :: OverlaySpec -> ClassName
$cshow :: OverlaySpec -> ClassName
showsPrec :: Int -> OverlaySpec -> ShowS
$cshowsPrec :: Int -> OverlaySpec -> ShowS
Show

instance Render OverlaySpec where
 render :: OverlaySpec -> Text
render (OneSlide Int
n)      = Int -> Text
forall a. Render a => a -> Text
render Int
n
 render (FromSlide Int
n)     = Int -> Text
forall a. Render a => a -> Text
render Int
n Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"-"
 render (ToSlide Int
n)       = Text
"-" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Int -> Text
forall a. Render a => a -> Text
render Int
n
 render (FromToSlide Int
n Int
m) = Int -> Text
forall a. Render a => a -> Text
render Int
n Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"-" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Int -> Text
forall a. Render a => a -> Text
render Int
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 :: l -> l -> l
block = (LaTeX -> LaTeX -> LaTeX) -> l -> l -> l
forall l. LaTeXC l => (LaTeX -> LaTeX -> LaTeX) -> l -> l -> l
liftL2 ((LaTeX -> LaTeX -> LaTeX) -> l -> l -> l)
-> (LaTeX -> LaTeX -> LaTeX) -> l -> l -> l
forall a b. (a -> b) -> a -> b
$ \LaTeX
tit -> ClassName -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv ClassName
"block" [ LaTeX -> TeXArg
FixArg LaTeX
tit ]


-- Transparency Effects --

-- | Options for covering text
data CoverOption =
   Invisible                 -- ^ Causes covered text to completely disappear
 | Transparent (Maybe Float) -- ^ Causes covered text to be typset in a transparent way
 | Dynamic                   -- ^ Makes all covered text quite
                             -- transparent, but in a dynamic way. The
                             -- longer it will take till the text is
                             -- uncovered, the stronger the
                             -- transparency.
 | HighlyDynamic             -- ^ Has the same effect as dynamic, but
                             -- the effect is stronger.
 -- | StillCovered [Opaqueness] -- ^ Specifies how to render covered items
 --                             -- that have not yet been uncovered.
 -- | AgainCovered [Opaqueness] -- ^ Specifies how to render covered items
 --                             -- that have once more been covered, that
 --                             -- is, that had been shown before but are
 --                             -- now covered again.
   deriving Int -> CoverOption -> ShowS
[CoverOption] -> ShowS
CoverOption -> ClassName
(Int -> CoverOption -> ShowS)
-> (CoverOption -> ClassName)
-> ([CoverOption] -> ShowS)
-> Show CoverOption
forall a.
(Int -> a -> ShowS) -> (a -> ClassName) -> ([a] -> ShowS) -> Show a
showList :: [CoverOption] -> ShowS
$cshowList :: [CoverOption] -> ShowS
show :: CoverOption -> ClassName
$cshow :: CoverOption -> ClassName
showsPrec :: Int -> CoverOption -> ShowS
$cshowsPrec :: Int -> CoverOption -> ShowS
Show

instance Render CoverOption where
 render :: CoverOption -> Text
render CoverOption
Invisible               = Text
"invisible"
 render (Transparent Maybe Float
Nothing)   = Text
"transparent"
 render (Transparent (Just Float
op)) = Text
"transparent=" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Float -> Text
forall a. Render a => a -> Text
render Float
op
 render CoverOption
Dynamic                 = Text
"dynamic"
 render CoverOption
HighlyDynamic           = Text
"highlydynamic"
 -- FIXME
 -- render (StillCovered op)       = "still covered=" <> render op
 -- render (AgainCovered op)       = "again covered=" <> render op

-- | Percentage of opaqueness for the specified overlays.  In
-- 'Opaqueness overlaySpecification percentageOfOpaqueness' the
-- 'overlaySpecification' specifies on which slides covered text should
-- have which 'percentageOfOpaqueness'. Unlike other overlay
-- specifications, this 'overlaySpecification' is a relative overlay
-- specification.
data Opaqueness =
   Opaqueness [OverlaySpec] Float
   deriving Int -> Opaqueness -> ShowS
[Opaqueness] -> ShowS
Opaqueness -> ClassName
(Int -> Opaqueness -> ShowS)
-> (Opaqueness -> ClassName)
-> ([Opaqueness] -> ShowS)
-> Show Opaqueness
forall a.
(Int -> a -> ShowS) -> (a -> ClassName) -> ([a] -> ShowS) -> Show a
showList :: [Opaqueness] -> ShowS
$cshowList :: [Opaqueness] -> ShowS
show :: Opaqueness -> ClassName
$cshow :: Opaqueness -> ClassName
showsPrec :: Int -> Opaqueness -> ShowS
$cshowsPrec :: Int -> Opaqueness -> ShowS
Show

-- FIXME
-- instance Render Opaqueness where
--  render (Opaqueness os op) =
--   TeXComm "opaqueness" [ MSymArg $ fmap (TeXRaw . render) os, FixArg $ TeXRaw $ render op]

-- | The command 'setbeamercovered' allows you to specify in a quite
-- general way how a covered item should be rendered.
setbeamercovered :: LaTeXC l => [CoverOption] -> l
setbeamercovered :: [CoverOption] -> l
setbeamercovered [CoverOption]
co =
  LaTeX -> l
forall l. LaTeXC l => LaTeX -> l
fromLaTeX (LaTeX -> l) -> LaTeX -> l
forall a b. (a -> b) -> a -> b
$ ClassName -> [TeXArg] -> LaTeX
TeXComm ClassName
"setbeamercovered" [ LaTeX -> TeXArg
FixArg (LaTeX -> TeXArg) -> LaTeX -> TeXArg
forall a b. (a -> b) -> a -> b
$ Text -> LaTeX
TeXRaw (Text -> LaTeX) -> Text -> LaTeX
forall a b. (a -> b) -> a -> b
$ [CoverOption] -> Text
forall a. Render a => [a] -> Text
renderCommas [CoverOption]
co ]


-- 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 (Theme -> Theme -> Bool
(Theme -> Theme -> Bool) -> (Theme -> Theme -> Bool) -> Eq Theme
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Theme -> Theme -> Bool
$c/= :: Theme -> Theme -> Bool
== :: Theme -> Theme -> Bool
$c== :: Theme -> Theme -> Bool
Eq,Int -> Theme -> ShowS
[Theme] -> ShowS
Theme -> ClassName
(Int -> Theme -> ShowS)
-> (Theme -> ClassName) -> ([Theme] -> ShowS) -> Show Theme
forall a.
(Int -> a -> ShowS) -> (a -> ClassName) -> ([a] -> ShowS) -> Show a
showList :: [Theme] -> ShowS
$cshowList :: [Theme] -> ShowS
show :: Theme -> ClassName
$cshow :: Theme -> ClassName
showsPrec :: Int -> Theme -> ShowS
$cshowsPrec :: Int -> Theme -> ShowS
Show)

instance Render Theme where
 render :: Theme -> Text
render (CustomTheme ClassName
str) = ClassName -> Text
forall a. IsString a => ClassName -> a
fromString ClassName
str
 render Theme
x = ClassName -> Text
forall a. IsString a => ClassName -> a
fromString (ClassName -> Text) -> ClassName -> Text
forall a b. (a -> b) -> a -> b
$ Theme -> ClassName
forall a. Show a => a -> ClassName
show Theme
x

-- | Set the 'Theme' employed in your presentation (in the preamble).
usetheme :: LaTeXC l => Theme -> l
usetheme :: Theme -> l
usetheme Theme
th = LaTeX -> l
forall l. LaTeXC l => LaTeX -> l
fromLaTeX (LaTeX -> l) -> LaTeX -> l
forall a b. (a -> b) -> a -> b
$ ClassName -> [TeXArg] -> LaTeX
TeXComm ClassName
"usetheme" [ LaTeX -> TeXArg
FixArg (LaTeX -> TeXArg) -> LaTeX -> TeXArg
forall a b. (a -> b) -> a -> b
$ Text -> LaTeX
TeXRaw (Text -> LaTeX) -> Text -> LaTeX
forall a b. (a -> b) -> a -> b
$ Theme -> Text
forall a. Render a => a -> Text
render Theme
th ]