{-# 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 ]