%D \module %D [ file=simpleslides-s-Automata, %D version=2010-08-10-15:28:22+0200, %D title=\CONTEXT\ Style File, %D subtitle=Presentation Module --- Automaton Style, %D author=Philipp Gesang, %D date=\currentdate, %D copyright={Philipp Gesang}] %C %C Copyright 2007 Aditya Mahajan and Thomas A. Schmitz %C This file may be distributed under the GNU General Public License v. 2.0. %C Modified 2010 by Philipp Gesang %D Providing presentation Backgrounds according to Conway's Game of Life. %D Initially based on the BigNumber theme by A. Mahajan and Th. Schmitz. (Many, %D many thanks!) %M \usemodule[simpleslides,style=Automata] %M \loadsetups[t-simpleslides-automata.xml] \writestatus{simpleslides}{loading Theme Automata} \startmodule[simpleslides-s-Automata] \setupmodule[ mode=, file=, rule=, extendxy=, clip=, ] % using defaults from lua config \ctxlua{environment.loadluafile( "automata-main" )} \ctxlua{mplife.slides = true} \unprotect %D First, we change the page layout to have more space all around. \setuplayout [ width=fit, margin=2cm, height=fit, leftmargindistance=.8cm, rightmargindistance=.0cm, header=18mm, %headerdistance=.3cm, footer=0cm, %footerdistance=0mm, %topspace=.5cm, topspace=.8cm, backspace=1.9cm, location=singlesided] \setuplayout [simpleslides:layout:horizontal][header=18mm] \setuplayout [simpleslides:layout:vertical] [header=0mm] \setuplayout [simpleslides:layout:title] \setuplayer[simpleslides:layer:slidetitle] [width=\paperwidth, height=\paperheight,x=20mm] %D Next we define generic frames, which will be used by other macros to %D get a consistent look and feel. \defineframed[simpleslides:framed:small] [ frame=off, offset=0pt, width=1.7cm, align=middle] \setupcombinations[distance=2.5em] %D These macros are used for placing figures/pictures: \define\NormalHeight {\textheight} \define\NormalWidth {.46\textwidth} \define\PictureFrameHeight {\textheight} \define\PictureFrameWidth {.46\textwidth} %D This module has two color schemes, a blue one and a red one. %D “backgroundoutside” and “backgroundscreen” -- obvioulsly -- determine how %D the background will look like, whereas “contrastcolor” is used to draw the %D automaton {\em onto} the background. Transparancy of the automaton is %D adjusted via the “opacity” factor in your automatarc. \startsetups simpleslides:setups:blue \definecolor [simpleslides:contrastcolor] [r=0.7,g=0.7,b=0.9] \definecolor [simpleslides:backgroundoutside] [r=0.9,g=0.9,b=0.95] \definecolor [simpleslides:backgroundscreen] [s=.975] \definecolor [simpleslides:textcolor] [s=0] \stopsetups \startsetups simpleslides:setups:red \definecolor [simpleslides:contrastcolor] [r=0.4] \definecolor [simpleslides:backgroundoutside] [r=0.5,g=0.2,b=0.2] \definecolor [simpleslides:backgroundscreen] [s=.4] \definecolor [simpleslides:textcolor] [s=1] \stopsetups %D Now we choose the scheme that the user asked for. \doifsetupselse {simpleslides:setups:\moduleparameter{simpleslides}{color}} {\setups{simpleslides:setups:\moduleparameter{simpleslides}{color}}} {\setups{simpleslides:setups:blue}} \setupcolors[textcolor={simpleslides:textcolor}] %D Setting up the automata part. Note that the precedence of settings is: %D \type{kpse:automatarc-global.lua} < \type{./automatrc.lua} < \type{setupmodule}, %D but some options (such as the color scheme) can only be specified via %D \type{setupmodule[…]}. %D First, we check for the automaton type. \doifsomethingelse{\moduleparameter{simpleslides}{mode}}{\ctxlua{ mplife.setup.current.mode = "\luaescapestring{\moduleparameter{simpleslides}{mode}}" if mplife.setup.current.mode == "life" then mplife.successive = mplife.gol_successive else environment.loadluafile("automata-eca") mplife.successive = mplife.eca_successive end}} {\ctxlua{mplife.successive = mplife.gol_successive}} %D The number of dead cells to add left and right / before and after %D the initial frame. (Makes sense only for Game of Life.) \doifsomething{\moduleparameter{simpleslides}{extendxy}}{\ctxlua {mplife.setup.current.extendx = tonumber("\luaescapestring{\moduleparameter{simpleslides}{extendxy}}") mplife.setup.current.extendy = tonumber("\luaescapestring{\moduleparameter{simpleslides}{extendxy}}") }} \doifsomething{\moduleparameter{simpleslides}{extendx}}{\ctxlua {mplife.setup.current.extendx = tonumber("\luaescapestring{\moduleparameter{simpleslides}{extendx}}") }} \doifsomething{\moduleparameter{simpleslides}{extendy}}{\ctxlua {mplife.setup.current.extendy = tonumber("\luaescapestring{\moduleparameter{simpleslides}{extendy}}") }} %D Initial “tape”, i.e. the first frame with respect to Game of Life automata %D and the first line for Elementary automata. Filenames without suffix expand %D to \type{file .. ".gol"}. \doifsomething{\moduleparameter{simpleslides}{file}}{\ctxlua {mplife.setup.current.file = "\luaescapestring{\moduleparameter{simpleslides}{file}}" }} %D Clipping is essential to cope with left/right propagation of %D patterns. E.g. with rule 158 the total propagation at iteration %D n is itself n to the left and n to the right. Whereas rule 102 %D (a Sierpiński fractal generator) protrudes only to the left at %D a rate of n. %D Frames cannot be simply cut off at the borders with adjacient %D cells treated as “dead” because it would distort the pattern. %D Therefore, frames are generated as complete sections which are %D clipped to the desired size, as specified by the initial row. %D To determine whether to clip your pattern to the left, right, %D or in both directions, check the propagation at %D \type{string.format("http://mathworld.wolfram.com/Rule%s.html", rule)} %D or consult Wolfram's “A New Kind of Science” but beware not to %D buy everything he claims… %D %D Accepts values: \type{left}, \type{right} and \type{both}. \doifsomething{\moduleparameter{simpleslides}{clip}}{\ctxlua {mplife.setup.current.clip = "\luaescapestring{\moduleparameter{simpleslides}{clip}}" }} \startluacode do local c = mplife.setup.current if c.mode == "life" then c.init = gol.parse_file(c.file) c.last = c.init else c.init = eca.parse_file(c.file) c.framesize = math.floor(c.aspect * c.init:len()) c.pages = structure.counters.record("realpage")["last"] if c.clip then c.xneeded = c.pages * c.framesize if c.clip == "both" then -- Assume initial pattern is centered. c.diff = c.xneeded - math.ceil(c.init:len()/2) else c.diff = c.xneeded - c.init:len() end if c.diff > 0 then local affix = "" for i=1, c.diff, 1 do affix = affix .. "0" end if c.clip == "left" or c.clip == "both" then c.init = affix .. c.init end if c.clip == "right" or c.clip == "both" then c.init = c.init .. affix end end end end mplife.setup.current = c end \stopluacode %D Rules determine the transformation from one iteration to the next. %D {\em Life} rules take the form \type{B3/S23}, the separator being any of \type{/}, %D \type{.} and \type{-}. %D Rules for elementary cellular automata are given in decimal: \type{1}--\type{255}. \doifsomething{\moduleparameter{simpleslides}{rule}}{\ctxlua {if mplife.setup.current.mode == "life" then mplife.setup.current.rule = gol.parse_rule("\luaescapestring{\moduleparameter{simpleslides}{rule}}") else mplife.setup.current.rule = eca.gen_rule(tonumber("\luaescapestring{\moduleparameter{simpleslides}{rule}}")) end}} %D We also use \METAPOST\ to draw the horizontal and vertical page backgrounds. %D Backgrounds will be of solid color, the ornament gets the transparency. \startuniqueMPgraphic{simpleslides:MP:horizontal} StartPage ; fill Page withcolor \MPcolor{simpleslides:backgroundoutside} ; fill Field[Text][Text] enlarged 0.2cm withcolor \MPcolor{simpleslides:backgroundscreen} ; StopPage ; \stopuniqueMPgraphic \startuniqueMPgraphic{simpleslides:MP:vertical} StartPage ; fill Page withcolor \MPcolor{simpleslides:backgroundoutside} ; z1 = urcorner Field[Text][Text] shifted (.2cm,0) ; z2 = lrcorner Field[Text][Text] shifted (.2cm,-.2cm) ; z3 = z1 shifted (-8.05cm,0) ; z4 = (x3,y2) ; save Main ; path Main ; Main := z1 -- z2 -- z4 -- z3 --cycle ; fill Main withcolor \MPcolor{simpleslides:backgroundscreen} ; StopPage ; \stopuniqueMPgraphic %D We define these backgrounds as overlays: \defineoverlay [simpleslides:background:horizontal] [\useMPgraphic{simpleslides:MP:horizontal}] \defineoverlay [simpleslides:background:vertical] [\useMPgraphic{simpleslides:MP:vertical}] \defineoverlay [simpleslides:background:title] [\useMPgraphic{simpleslides:MP:horizontal}] \defineoverlay [simpleslides:background:ornament] [\ctxlua{mplife.successive()}] %D The slide title is placed on the top of the text area. The layer takes care %D of the positioning. \setupSlideTitle [\c!after=, \c!alternative=layer, \c!width=\textwidth, \c!height=2.5cm, \c!command=\doSlideTitle] %D Squares are used as the first level of itemizations \definesymbol[1][$\square$] \setupitemize[1][inmargin] %\setupitemize[each][joinedup,unpacked] \protect \stopmodule \endinput