summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/metapost/slideshow/slideshow.mp
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/metapost/slideshow/slideshow.mp')
-rw-r--r--Master/texmf-dist/metapost/slideshow/slideshow.mp387
1 files changed, 387 insertions, 0 deletions
diff --git a/Master/texmf-dist/metapost/slideshow/slideshow.mp b/Master/texmf-dist/metapost/slideshow/slideshow.mp
new file mode 100644
index 00000000000..f7afbfadb4c
--- /dev/null
+++ b/Master/texmf-dist/metapost/slideshow/slideshow.mp
@@ -0,0 +1,387 @@
+%% simple metapost slide show
+%%
+%% Copyright 2001, Patrick TJ McPhee
+%% everyone is welcome to use this code for any purpose, to modify it, and
+%% to copy it in whole or in part for use in other macro sets, with the
+%% conditions that this copyright notice be preserved with any significant
+%% portion of the code, and that modifications to this file be clearly
+%% marked.
+%%
+%% see the file slideshow.txt for documentation
+%% $Header: /usr/home/ptjm/texmf/metapost/RCS/slideshow.mp 1.8 2001/08/06 18:48:17 pmcphee Exp $
+
+newinternal slideshowversion;
+slideshowversion := 1.0;
+
+%%
+%% basic figure handling
+%%
+
+picture lastpicture, background;
+
+% set the aspect ratio of the picture to match a 640x480 screen
+if not known lawidth:
+ lawidth := 6.4in;
+ laheight := 4.8in;
+fi;
+
+% make a sophisticated gradient background -- note that this can be done
+% natively in pdf 1.3 if you know how....
+def drawgradient(expr topcolour, botcolour) :=
+ save pw,l,r,t,b,shade,grad;
+
+ numeric l,r,t,b,pw;
+ color shade, grad;
+
+ % we will draw 100 coloured stripes across the screen
+ pw = laheight/100;
+ pickup pensquare scaled pw;
+ lft l = 0 = bot b;
+ rt r = lawidth;
+ t = laheight; % don't say `top t' because I want to over-extend
+
+ % shade is the colour of the current stripe, while grad
+ % is the amount to change on each stripe
+ shade := botcolour;
+ grad := (1/100)*(topcolour - botcolour);
+
+ for ypos := b step pw until t:
+ draw (l, ypos)--(r, ypos) withcolor shade;
+ shade := shade + grad;
+ endfor;
+enddef;
+
+% draw the background -- we'll make it blue, just like power point
+background := image(drawgradient((0,0,.3), (0,0,.5)););
+
+% `keep track' of figure numbers
+def nextfig := beginfig(charcode+1) enddef;
+
+% always save the current picture at the end of each figure,
+% so it can be used in the next one
+extra_endfig := extra_endfig & "lastpicture := currentpicture; currentpicture := background; if known lastpicture: draw lastpicture; fi;";
+
+% continue overlays the current picture with the last picture shipped out
+% this allows slides to be built up
+newinternal continuations;
+continuations := 0;
+def docontinue = if known lastpicture and (continuations = 1): currentpicture := lastpicture; bpos := bpos.prev; else: bpos := 0; fi; enddef;
+extra_beginfig := extra_beginfig & "docontinue;";
+
+% one might want to do that by default
+def continue = continuations := 1; enddef;
+% or not
+def endcontinue = continuations := 0; enddef;
+
+% break in continuation
+def discontinue = clearit; lastpicture := nullpicture; bpos := 0; bpos.prev := 0; enddef;
+
+
+%%
+%% drawing assists
+%%
+
+
+% we'll use two pens to draw figures
+pickup pencircle xscaled 5 pt yscaled 4 pt rotated 20;
+thick nib := savepen;
+
+pickup pencircle xscaled 2 pt yscaled 1 pt rotated 20;
+thin nib := savepen;
+
+%%
+%% text manipulation assists
+%%
+
+
+% and we'll make the text yellow, just like power-point
+color textcolour;
+textcolour := red+green;
+defaultfont := "phvr8r";
+
+
+% this is the thing we use as a bullet
+picture bulletpic;
+bulletpic := image(draw char(226) infont "pzdr" withcolor textcolour;);
+
+pair headerpos, footerpos, boff, borigin, borigin.in, blimit;
+numeric baselineskip, parskip, parskip.in, bpos;
+
+% positions of the bottom left corner of the header, and the bottom right
+% corner of the footer
+headerpos = (1in, 4in);
+footerpos = (6in, .2in);
+
+% offset of text from the bullet
+boff = (20bp, 0);
+
+% upper-left start position for bulletted text
+borigin = (1.5in,3.4in);
+
+% upper-left start position for indented bulletted text
+borigin.in = borigin + boff;
+
+% lower-right limit of bulletted text
+blimit = (4.4in,1in);
+
+% distance between baselines in bulletted text
+baselineskip = 11bp;
+
+% distance between bullet points for normal bullets
+parskip = 5 pt;
+
+% distance between bullet points for indented bullets
+parskip.in = 1pt;
+
+% current bullet position
+bpos = 0;
+
+% internal use - bullet position at the end of the last slide
+bpos.prev = 0;
+
+vardef breaktowidth(expr s, w)(text sheight) =
+ save p;
+ picture p;
+
+ p := s infont defaultfont scaled defaultscale;
+ % if the string is too long to fit within bounds, we break it up on
+ % word boundaries.
+ if xpart(lrcorner p - llcorner p) > w:
+ save q, offs, len, goodlen; picture q; numeric offs, len, goodlen;
+ picture q;
+ p := nullpicture;
+ offs := 0;
+ len := 1;
+ goodlen := 0;
+ forever:
+ exitunless len < length(s);
+ q := (substring(offs, len) of s) infont defaultfont scaled defaultscale;
+ if xpart (lrcorner q - llcorner q) > w:
+ sheight := sheight + baselineskip;
+ p := image(draw p shifted (0, baselineskip);
+ draw (substring(offs, goodlen) of s) infont defaultfont
+ scaled defaultscale;);
+ offs := goodlen + 1;
+ len := offs + 1;
+ fi;
+ if substring(len, len+1) of s = " ": goodlen := len; fi;
+ len := len + 1;
+ endfor;
+
+ p := image(draw p shifted (0, baselineskip);
+ draw (substring(offs, length s) of s) infont defaultfont
+ scaled defaultscale;);
+ fi;
+ p
+enddef;
+
+% bullet(text) or bullet(picture) writes bulletpic and text or picture
+% in the next bullet position on the screen
+% bullet.in(text) does the same thing, but indented. This can be
+% extended for arbitrary suffix tag by defining a pair called borigin.tag,
+% and a numeric called parskip.tag. Note that bpos is shared, so this really
+% only works for additional levels of indentation
+vardef bullet@#(expr s) =
+ save p, sheight;
+ numeric sheight;
+ picture p;
+
+ % add the parskip for this bullet type, unless we're at the top
+ if bpos > 0: bpos := bpos + parskip@#; fi
+
+ if picture s:
+ p := s;
+ sheight := ypart(ulcorner p - llcorner p) - baselineskip;
+ else:
+ sheight := 0;
+ p := image(draw breaktowidth(s, xpart(blimit - borigin@#))(sheight)
+ withcolor textcolour;);
+ fi;
+
+ % start a new slide if this bullet won't fit. If we're in continuation mode,
+ % the previous slide already has the previous bullets, so just clear this
+ % slide and put the bullet at the top. In discontinous mode, we need to end
+ % the figure, but this causes some problems as it ends the group started by
+ % vardef, so we lose p and sheight (which were saved).
+ if ypart borigin@# - sheight - bpos < ypart blimit:
+ if continuations = 1: discontinue;
+ else:
+ begingroup;
+ endfig;
+ bpos.prev := 0;
+ nextfig;
+ endgroup;
+ fi;
+ fi;
+ draw bulletpic shifted (borigin@# - (0, bpos));
+ draw p shifted (borigin@# + boff - (0, bpos+sheight));
+ bpos := bpos + sheight + baselineskip;
+ bpos.prev := bpos;
+enddef;
+
+% handy abbreviation for a common paradigm
+vardef bpoint@#(expr s) = nextfig; bullet@#(s); endfig; enddef;
+
+% the same as the plain metapost label, but using textcolour
+vardef blabel@#(expr s,z) = draw thelabel@#(s,z) withcolor textcolour; enddef;
+
+vardef dotblabel@#(expr s,z) =
+ blabel@#(s,z);
+ interim linecap:=rounded;
+ draw z withpen pencircle scaled dotlabeldiam withcolor textcolour;
+enddef;
+
+% a label which is also a hyperlink
+def dolink(expr p, n) =
+ special "[ /Rect [ " & decimal xpart llcorner p & " " &
+ decimal ypart llcorner p & " " &
+ decimal xpart urcorner p & " " &
+ decimal ypart urcorner p & " ] /Dest /" & n &
+ " /Border [ 0 0 0 ] /Subtype /Link /ANN pdfmark";
+enddef;
+
+vardef hyperlabel@#(expr s,z, n) =
+ save p;
+ picture p;
+ p := thelabel@#(s,z);
+ dolink(p, n);
+ draw p withcolor textcolour;
+enddef;
+
+vardef hyperbullet@#(expr s, n) =
+ save p;
+ picture p;
+ p := image(bullet@#(s););
+ dolink(p, n);
+ draw p;
+enddef;
+
+def hyperdest(expr n) = special "[ /Dest /" & n & " /View [ /Fit ] /DEST pdfmark"; enddef;
+
+
+picture headerpic, footerpic;
+
+% header saves a string or picture which will be displayed at headerpos
+% on each slide. The header is added after the slide is saved to lastpicture
+def header(expr s) =
+ if picture s: headerpic := s;
+ else: headerpic := image(
+ draw s infont defaultfont scaled (defaultscale*magstep1)
+ shifted headerpos
+ withcolor textcolour;);
+ fi;
+enddef;
+
+def drawheader = if known headerpic: draw headerpic; fi; enddef;
+
+% header saves a string or picture which will be displayed to the left of
+% footerpos on each slide. The footer is added after the slide is saved
+% to lastpicture
+def footer(expr s) =
+ if picture s: footerpic := s;
+ else: footerpic := s infont defaultfont scaled defaultscale;
+ footerpic := image(
+ draw footerpic
+ shifted (footerpos - (lrcorner footerpic - llcorner footerpic))
+ withcolor textcolour;);
+ fi;
+enddef;
+
+def drawfooter = if known footerpic: draw footerpic; fi; enddef;
+extra_endfig := extra_endfig & "drawheader; drawfooter;";
+
+% current slide number
+def folio = decimal charcode enddef;
+
+%%
+%% font encoding -- currently, only to 8r (I just couldn't bear putting this in
+%% a source file)
+%%
+def encodefont(expr tfm, fn) =
+ special "/" & tfm & " /" & fn & "8r def";
+ special "/" & fn & " findfont dup length dict copy dup /Encoding";
+ special "[ /.notdef /dotaccent /fi /fl /fraction /hungarumlaut /Lslash /lslash";
+ special "/ogonek /ring /.notdef /breve /minus /.notdef /Zcaron /zcaron /caron /dotlessi";
+ special "/dotlessj /ff /ffi /ffl /.notdef /.notdef /.notdef /.notdef";
+ special "/.notdef /.notdef /.notdef /.notdef /grave /quotesingle /space /exclam /quotedbl /numbersign";
+ special "/dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash";
+ special "/zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question";
+ special "/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z";
+ special "/bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft";
+ special "/a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z";
+ special "/braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /quotesinglbase /florin";
+ special "/quotedblbase /ellipsis /dagger /daggerdbl /circumflex /perthousand /Scaron /guilsinglleft";
+ special "/OE /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /quotedblleft /quotedblright /bullet /endash /emdash";
+ special "/tilde /trademark /scaron /guilsinglright /oe /.notdef /.notdef /Ydieresis /.notdef";
+ special "/exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft";
+ special "/logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior";
+ special "/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright";
+ special "/onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla";
+ special "/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis";
+ special "/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex";
+ special "/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla";
+ special "/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis";
+ special "/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex";
+ special "/udieresis /yacute /thorn /ydieresis ] put /" & fn & "8r exch definefont pop";
+enddef;
+
+%%
+%% pdf macros and assists
+%%
+
+
+% maintain a ps file which loads all the slides in order
+% this is specific to gs
+string psfile;
+psfile := jobname & ".ps";
+
+extra_endfig := extra_endfig & "write " & ditto & "(" & ditto & "& jobname &"
+ & ditto & "." & ditto
+ & "& folio &" & ditto & ") run" & ditto & " to psfile;";
+
+% put the viewer into full screen mode by default, and define a document-default
+% page transition (I'm using the random transition with 1/2 second duration)
+% since there is no way to specify a document-default, the transition has to be
+% added to each page dictionary
+special "[ /PageMode /FullScreen /DOCVIEW pdfmark";
+
+special "[ /_objdef {mytrans} /type /dict /OBJ pdfmark";
+special "[ {mytrans} << /Type /Trans /D .5 /S /Random /Dm /H /M /O /Di 315 >> /PUT pdfmark ";
+
+extra_endfig := extra_endfig & "special " & ditto
+ & "[ {ThisPage} << /Trans {mytrans} >> /PUT pdfmark" & ditto & ";";
+
+special "[ /CropBox [ 0 0 " & decimal(lawidth) & " " & decimal(laheight) & " ] /PAGES pdfmark";
+
+% allow the user to specify document info
+def author(expr s) :=
+ special "[ /Author (" & s & ") /DOCINFO pdfmark";
+enddef;
+def title(expr s) :=
+ special "[ /Title (" & s & ") /DOCINFO pdfmark";
+enddef;
+def subject(expr s) :=
+ special "[ /Subject (" & s & ") /DOCINFO pdfmark";
+enddef;
+def keywords(expr s) :=
+ special "[ /Keywords (" & s & ") /DOCINFO pdfmark";
+enddef;
+def copyright(expr s) :=
+ special "[ /Copyright (" & s & ") /DOCINFO pdfmark";
+enddef;
+
+def moddate(expr s) :=
+ special "[ /ModificationDate (" & s & ") /DOCINFO pdfmark";
+enddef;
+
+def createdate(expr s) :=
+ special "[ /CreationDate (" & s & ") /DOCINFO pdfmark";
+enddef;
+
+% except for the document info we specify ourselves
+createdate("D:" & decimal year & decimal month & if day < 10: "0" fi & decimal(day) & decimal time);
+special "[ /Creator (Metapost " & base_name & " base, version " & base_version & ") /DOCINFO pdfmark";
+
+% gs will need this
+prologues:=2;
+