HaTeX-3.15.0.0: Text/LaTeX/Packages/Beamer.hs
{-# 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 = "beamer"
-- | A presentation is composed of a sequence of frames. Each frame is created with this function.
frame :: LaTeXC l => l -> l
frame = liftL $ TeXEnv "frame" []
-- | Set the title of the current frame. Use it within a 'frame'.
frametitle :: LaTeXC l => l -> l
frametitle = liftL $ \l -> TeXComm "frametitle" [FixArg l]
-- | Set the subtitle of the current frame. Use it within a 'frame'.
framesubtitle :: LaTeXC l => l -> l
framesubtitle = liftL $ \l -> TeXComm "framesubtitle" [FixArg 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 os = liftL $ \l -> TeXComm "alert" [ MSymArg $ fmap (TeXRaw . render) os, FixArg l]
-- | Introduces a pause in a slide.
pause :: LaTeXC l => l
pause = comm0 "pause"
-- | 'beameritem' works like 'item', but allows you to specify the slides where
-- the item will be displayed.
beameritem :: LaTeXC l => [OverlaySpec] -> l
beameritem os = fromLaTeX $ TeXComm "item" [ MSymArg $ fmap (TeXRaw . render) 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 os = liftL $ \l -> TeXComm "uncover" [ MSymArg $ fmap (TeXRaw . render) os , FixArg 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 os = liftL $ \l -> TeXComm "only" [ MSymArg $ fmap (TeXRaw . render) os , FixArg 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 os = liftL $ \l -> TeXComm "onslide" [ MSymArg $ fmap (TeXRaw . render) os , FixArg 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 os = liftL $ \l -> TeXComm "visible" [ MSymArg $ fmap (TeXRaw . render) os , FixArg l ]
-- | The 'invisible' is the opposite of 'visible'.
invisible :: LaTeXC l => [OverlaySpec] -> l -> l
invisible os = liftL $ \l -> TeXComm "invisible" [ MSymArg $ fmap (TeXRaw . render) os , FixArg l ]
-- | 'beamercolor' works like 'color', but allows you to specify the slides where
-- the text will be bold.
beamercolor :: LaTeXC l => [OverlaySpec] -> l
beamercolor os = fromLaTeX $ TeXComm "color" [ MSymArg $ fmap (TeXRaw . render) 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 = liftL $ TeXEnv "overprint" []
-- | Specifications for beamer functions.
data OverlaySpec =
OneSlide Int
| FromSlide Int
| ToSlide Int
| FromToSlide Int Int
deriving Show
instance Render OverlaySpec where
render (OneSlide n) = render n
render (FromSlide n) = render n <> "-"
render (ToSlide n) = "-" <> render n
render (FromToSlide n m) = render n <> "-" <> render 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 = liftL2 $ \tit -> TeXEnv "block" [ FixArg 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 Show
instance Render CoverOption where
render Invisible = "invisible"
render (Transparent Nothing) = "transparent"
render (Transparent (Just op)) = "transparent=" <> render op
render Dynamic = "dynamic"
render HighlyDynamic = "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 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 co =
fromLaTeX $ TeXComm "setbeamercovered" [ FixArg $ TeXRaw $ renderCommas 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 (Eq,Show)
instance Render Theme where
render (CustomTheme str) = fromString str
render x = fromString $ show x
-- | Set the 'Theme' employed in your presentation (in the preamble).
usetheme :: LaTeXC l => Theme -> l
usetheme th = fromLaTeX $ TeXComm "usetheme" [ FixArg $ TeXRaw $ render th ]