;*=====================================================================*/
;* serrano/prgm/project/skribe/skr/slide.skr */
;* ------------------------------------------------------------- */
;* Author : Manuel Serrano */
;* Creation : Fri Oct 3 12:22:13 2003 */
;* Last change : Mon Aug 23 09:08:21 2004 (serrano) */
;* Copyright : 2003-04 Manuel Serrano */
;* ------------------------------------------------------------- */
;* Skribe style for slides */
;*=====================================================================*/
;*---------------------------------------------------------------------*/
;* slide-options */
;*---------------------------------------------------------------------*/
(define &slide-load-options (skribe-load-options))
;*---------------------------------------------------------------------*/
;* &slide-seminar-predocument ... */
;*---------------------------------------------------------------------*/
(define &slide-seminar-predocument
"\\special{landscape}
\\slideframe{none}
\\centerslidesfalse
\\raggedslides[0pt]
\\renewcommand{\\slideleftmargin}{0.2in}
\\renewcommand{\\slidetopmargin}{0.3in}
\\newdimen\\slidewidth \\slidewidth 9in")
;*---------------------------------------------------------------------*/
;* &slide-seminar-maketitle ... */
;*---------------------------------------------------------------------*/
(define &slide-seminar-maketitle
"\\def\\labelitemi{$\\bullet$}
\\def\\labelitemii{$\\circ$}
\\def\\labelitemiii{$\\diamond$}
\\def\\labelitemiv{$\\cdot$}
\\pagestyle{empty}
\\slideframe{none}
\\centerslidestrue
\\begin{slide}
\\date{}
\\maketitle
\\end{slide}
\\slideframe{none}
\\centerslidesfalse")
;*---------------------------------------------------------------------*/
;* &slide-prosper-predocument ... */
;*---------------------------------------------------------------------*/
(define &slide-prosper-predocument
"\\slideCaption{}\n")
;*---------------------------------------------------------------------*/
;* %slide-the-slides ... */
;*---------------------------------------------------------------------*/
(define %slide-the-slides '())
(define %slide-the-counter 0)
(define %slide-initialized #f)
(define %slide-latex-mode 'seminar)
;*---------------------------------------------------------------------*/
;* %slide-initialize! ... */
;*---------------------------------------------------------------------*/
(define (%slide-initialize!)
(unless %slide-initialized
(set! %slide-initialized #t)
(case %slide-latex-mode
((seminar)
(%slide-seminar-setup!))
((advi)
(%slide-advi-setup!))
((prosper)
(%slide-prosper-setup!))
(else
(skribe-error 'slide "Illegal latex mode" %slide-latex-mode)))))
;*---------------------------------------------------------------------*/
;* slide ... */
;*---------------------------------------------------------------------*/
(define-markup (slide #!rest opt
#!key
(ident #f) (class #f)
(toc #t)
title (number #t)
(vspace #f) (vfill #f)
(transition #f)
(bg #f) (image #f))
(%slide-initialize!)
(let ((s (new container
(markup 'slide)
(ident (symbol->string (gensym 'slide)))
(class class)
(required-options '(:title :number :toc))
(options `((:number
,(cond
((number? number)
(set! %slide-the-counter number)
number)
(number
(set! %slide-the-counter
(+ 1 %slide-the-counter))
%slide-the-counter)
(else
#f)))
(:toc ,toc)
,@(the-options opt :ident :class :vspace :toc)))
(body (if vspace
(list (slide-vspace vspace) (the-body opt))
(the-body opt))))))
(set! %slide-the-slides (cons s %slide-the-slides))
s))
;*---------------------------------------------------------------------*/
;* ref ... */
;*---------------------------------------------------------------------*/
(define %slide-old-ref ref)
(define-markup (ref #!rest opt #!key (slide #f))
(if (not slide)
(apply %slide-old-ref opt)
(new unresolved
(proc (lambda (n e env)
(cond
((eq? slide 'next)
(let ((c (assq n %slide-the-slides)))
(if (pair? c)
(handle (cadr c))
#f)))
((eq? slide 'prev)
(let ((c (assq n (reverse %slide-the-slides))))
(if (pair? c)
(handle (cadr c))
#f)))
((number? slide)
(let loop ((s %slide-the-slides))
(cond
((null? s)
#f)
((= slide (markup-option (car s) :number))
(handle (car s)))
(else
(loop (cdr s))))))
(else
#f)))))))
;*---------------------------------------------------------------------*/
;* slide-pause ... */
;*---------------------------------------------------------------------*/
(define-markup (slide-pause)
(new markup
(markup 'slide-pause)))
;*---------------------------------------------------------------------*/
;* slide-vspace ... */
;*---------------------------------------------------------------------*/
(define-markup (slide-vspace #!rest opt #!key (unit 'cm))
(new markup
(markup 'slide-vspace)
(options `((:unit ,unit) ,@(the-options opt :unit)))
(body (the-body opt))))
;*---------------------------------------------------------------------*/
;* slide-embed ... */
;*---------------------------------------------------------------------*/
(define-markup (slide-embed #!rest opt
#!key
command
(geometry-opt "-geometry")
(geometry #f) (rgeometry #f)
(transient #f) (transient-opt #f)
(alt #f)
&skribe-eval-location)
(if (not (string? command))
(skribe-error 'slide-embed
"No command provided"
command)
(new markup
(markup 'slide-embed)
(loc &skribe-eval-location)
(required-options '(:alt))
(options `((:geometry-opt ,geometry-opt)
(:alt ,alt)
,@(the-options opt :geometry-opt :alt)))
(body (the-body opt)))))
;*---------------------------------------------------------------------*/
;* slide-record ... */
;*---------------------------------------------------------------------*/
(define-markup (slide-record #!rest opt #!key ident class tag (play #t))
(if (not tag)
(skribe-error 'slide-record "Tag missing" tag)
(new markup
(markup 'slide-record)
(ident ident)
(class class)
(options `((:play ,play) ,@(the-options opt)))
(body (the-body opt)))))
;*---------------------------------------------------------------------*/
;* slide-play ... */
;*---------------------------------------------------------------------*/
(define-markup (slide-play #!rest opt #!key ident class tag color)
(if (not tag)
(skribe-error 'slide-play "Tag missing" tag)
(new markup
(markup 'slide-play)
(ident ident)
(class class)
(options `((:color ,(if color (skribe-use-color! color) #f))
,@(the-options opt :color)))
(body (the-body opt)))))
;*---------------------------------------------------------------------*/
;* slide-play* ... */
;*---------------------------------------------------------------------*/
(define-markup (slide-play* #!rest opt
#!key ident class color (scolor "#000000"))
(let ((body (the-body opt)))
(for-each (lambda (lbl)
(match-case lbl
((?id ?col)
(skribe-use-color! col))))
body)
(new markup
(markup 'slide-play*)
(ident ident)
(class class)
(options `((:color ,(if color (skribe-use-color! color) #f))
(:scolor ,(if color (skribe-use-color! scolor) #f))
,@(the-options opt :color :scolor)))
(body body))))
;*---------------------------------------------------------------------*/
;* base */
;*---------------------------------------------------------------------*/
(let ((be (find-engine 'base)))
(skribe-message "Base slides setup...\n")
;; slide-pause
(markup-writer 'slide-pause be
:action #f)
;; slide-vspace
(markup-writer 'slide-vspace be
:options '()
:action #f)
;; slide-embed
(markup-writer 'slide-embed be
:options '(:alt :geometry-opt)
:action (lambda (n e)
(output (markup-option n :alt) e)))
;; slide-record
(markup-writer 'slide-record be
:options '(:tag :play)
:action (lambda (n e)
(output (markup-body n) e)))
;; slide-play
(markup-writer 'slide-play be
:options '(:tag :color)
:action (lambda (n e)
(output (markup-option n :alt) e)))
;; slide-play*
(markup-writer 'slide-play* be
:options '(:tag :color :scolor)
:action (lambda (n e)
(output (markup-option n :alt) e))))
;*---------------------------------------------------------------------*/
;* slide-body-width ... */
;*---------------------------------------------------------------------*/
(define (slide-body-width e)
(let ((w (engine-custom e 'body-width)))
(if (or (number? w) (string? w)) w 95.)))
;*---------------------------------------------------------------------*/
;* html-slide-title ... */
;*---------------------------------------------------------------------*/
(define (html-slide-title n e)
(let* ((title (markup-body n))
(authors (markup-option n 'author))
(tbg (engine-custom e 'title-background))
(tfg (engine-custom e 'title-foreground))
(tfont (engine-custom e 'title-font)))
(printf "
\n"
(html-width (slide-body-width e)))
(if (string? tbg)
(printf "" tbg)
(display " | "))
(if (string? tfg)
(printf "" tfg))
(if title
(begin
(display "")
(if (string? tfont)
(begin
(printf "" tfont)
(output title e)
(display ""))
(begin
(printf " ")
(output title e)
(display "")))
(display "\n")))
(if (not authors)
(display "\n")
(html-title-authors authors e))
(if (string? tfg)
(display ""))
(display " |
\n")))
;*---------------------------------------------------------------------*/
;* slide-number ... */
;*---------------------------------------------------------------------*/
(define (slide-number)
(length (filter (lambda (n)
(and (is-markup? n 'slide)
(markup-option n :number)))
%slide-the-slides)))
;*---------------------------------------------------------------------*/
;* html */
;*---------------------------------------------------------------------*/
(let ((he (find-engine 'html)))
(skribe-message "HTML slides setup...\n")
;; &html-page-title
(markup-writer '&html-document-title he
:predicate (lambda (n e) %slide-initialized)
:action html-slide-title)
;; slide
(markup-writer 'slide he
:options '(:title :number :transition :toc :bg)
:before (lambda (n e)
(printf "" (markup-ident n))
(display "
\n"))
:action (lambda (n e)
(let ((nb (markup-option n :number))
(t (markup-option n :title)))
(skribe-eval
(center
(color :width (slide-body-width e)
:bg (or (markup-option n :bg) "#ffffff")
(table :width 100.
(tr (th :align 'left
(list
(if nb
(format "~a / ~a -- " nb
(slide-number)))
t)))
(tr (td (hrule)))
(tr (td :width 100. :align 'left
(markup-body n))))
(linebreak)))
e)))
:after "
")
;; slide-vspace
(markup-writer 'slide-vspace he
:action (lambda (n e) (display "
"))))
;*---------------------------------------------------------------------*/
;* latex */
;*---------------------------------------------------------------------*/
(define &latex-slide #f)
(define &latex-pause #f)
(define &latex-embed #f)
(define &latex-record #f)
(define &latex-play #f)
(define &latex-play* #f)
(let ((le (find-engine 'latex)))
;; slide-vspace
(markup-writer 'slide-vspace le
:options '(:unit)
:action (lambda (n e)
(display "\n\\vspace{")
(output (markup-body n) e)
(printf " ~a}\n\n" (markup-option n :unit))))
;; slide-slide
(markup-writer 'slide le
:options '(:title :number :transition :vfill :toc :vspace :image)
:action (lambda (n e)
(if (procedure? &latex-slide)
(&latex-slide n e))))
;; slide-pause
(markup-writer 'slide-pause le
:options '()
:action (lambda (n e)
(if (procedure? &latex-pause)
(&latex-pause n e))))
;; slide-embed
(markup-writer 'slide-embed le
:options '(:alt :command :geometry-opt :geometry
:rgeometry :transient :transient-opt)
:action (lambda (n e)
(if (procedure? &latex-embed)
(&latex-embed n e))))
;; slide-record
(markup-writer 'slide-record le
:options '(:tag :play)
:action (lambda (n e)
(if (procedure? &latex-record)
(&latex-record n e))))
;; slide-play
(markup-writer 'slide-play le
:options '(:tag :color)
:action (lambda (n e)
(if (procedure? &latex-play)
(&latex-play n e))))
;; slide-play*
(markup-writer 'slide-play* le
:options '(:tag :color :scolor)
:action (lambda (n e)
(if (procedure? &latex-play*)
(&latex-play* n e)))))
;*---------------------------------------------------------------------*/
;* %slide-seminar-setup! ... */
;*---------------------------------------------------------------------*/
(define (%slide-seminar-setup!)
(skribe-message "Seminar slides setup...\n")
(let ((le (find-engine 'latex))
(be (find-engine 'base)))
;; latex configuration
(define (seminar-slide n e)
(let ((nb (markup-option n :number))
(t (markup-option n :title)))
(display "\\begin{slide}\n")
(if nb (printf "~a/~a -- " nb (slide-number)))
(output t e)
(display "\\hrule\n"))
(output (markup-body n) e)
(if (markup-option n :vill) (display "\\vfill\n"))
(display "\\end{slide}\n"))
(engine-custom-set! le 'documentclass
"\\documentclass[landscape]{seminar}\n")
(let ((o (engine-custom le 'predocument)))
(engine-custom-set! le 'predocument
(if (string? o)
(string-append &slide-seminar-predocument o)
&slide-seminar-predocument)))
(engine-custom-set! le 'maketitle
&slide-seminar-maketitle)
(engine-custom-set! le 'hyperref-usepackage
"\\usepackage[setpagesize=false]{hyperref}\n")
;; slide-slide
(set! &latex-slide seminar-slide)))
;*---------------------------------------------------------------------*/
;* %slide-advi-setup! ... */
;*---------------------------------------------------------------------*/
(define (%slide-advi-setup!)
(skribe-message "Generating `Advi Seminar' slides...\n")
(let ((le (find-engine 'latex))
(be (find-engine 'base)))
(define (advi-geometry geo)
(let ((r (pregexp-match "([0-9]+)x([0-9]+)" geo)))
(if (pair? r)
(let* ((w (cadr r))
(w' (string->integer w))
(w'' (number->string (/ w' *skribe-slide-advi-scale*)))
(h (caddr r))
(h' (string->integer h))
(h'' (number->string (/ h' *skribe-slide-advi-scale*))))
(values "" (string-append w "x" h "+!x+!y")))
(let ((r (pregexp-match "([0-9]+)x([0-9]+)[+](-?[0-9]+)[+](-?[0-9]+)" geo)))
(if (pair? r)
(let ((w (number->string (/ (string->integer (cadr r))
*skribe-slide-advi-scale*)))
(h (number->string (/ (string->integer (caddr r))
*skribe-slide-advi-scale*)))
(x (cadddr r))
(y (car (cddddr r))))
(values (string-append "width=" w "cm,height=" h "cm")
"!g"))
(values "" geo))))))
(define (advi-transition trans)
(cond
((string? trans)
(printf "\\advitransition{~s}" trans))
((and (symbol? trans)
(memq trans '(wipe block slide)))
(printf "\\advitransition{~s}" trans))
(else
#f)))
;; latex configuration
(define (advi-slide n e)
(let ((i (markup-option n :image))
(n (markup-option n :number))
(t (markup-option n :title))
(lt (markup-option n :transition))
(gt (engine-custom e 'transition)))
(if (and i (engine-custom e 'advi))
(printf "\\advibg[global]{image=~a}\n"
(if (and (pair? i)
(null? (cdr i))
(string? (car i)))
(car i)
i)))
(display "\\begin{slide}\n")
(advi-transition (or lt gt))
(if n (printf "~a/~a -- " n (slide-number)))
(output t e)
(display "\\hrule\n"))
(output (markup-body n) e)
(if (markup-option n :vill) (display "\\vfill\n"))
(display "\\end{slide}\n\n\n"))
;; advi record
(define (advi-record n e)
(display "\\advirecord")
(when (markup-option n :play) (display "[play]"))
(printf "{~a}{" (markup-option n :tag))
(output (markup-body n) e)
(display "}"))
;; advi play
(define (advi-play n e)
(display "\\adviplay")
(let ((c (markup-option n :color)))
(when c
(display "[")
(display (skribe-get-latex-color c))
(display "]")))
(printf "{~a}" (markup-option n :tag)))
;; advi play*
(define (advi-play* n e)
(let ((c (skribe-get-latex-color (markup-option n :color)))
(d (skribe-get-latex-color (markup-option n :scolor))))
(let loop ((lbls (markup-body n))
(last #f))
(when last
(display "\\adviplay[")
(display d)
(printf "]{~a}" last))
(when (pair? lbls)
(let ((lbl (car lbls)))
(match-case lbl
((?id ?col)
(display "\\adviplay[")
(display (skribe-get-latex-color col))
(printf "]{" ~a "}" id)
(skribe-eval (slide-pause) e)
(loop (cdr lbls) id))
(else
(display "\\adviplay[")
(display c)
(printf "]{~a}" lbl)
(skribe-eval (slide-pause) e)
(loop (cdr lbls) lbl))))))))
(engine-custom-set! le 'documentclass
"\\documentclass{seminar}\n")
(let ((o (engine-custom le 'predocument)))
(engine-custom-set! le 'predocument
(if (string? o)
(string-append &slide-seminar-predocument o)
&slide-seminar-predocument)))
(engine-custom-set! le 'maketitle
&slide-seminar-maketitle)
(engine-custom-set! le 'usepackage
(string-append "\\usepackage{advi}\n"
(engine-custom le 'usepackage)))
;; slide
(set! &latex-slide advi-slide)
(set! &latex-pause
(lambda (n e) (display "\\adviwait\n")))
(set! &latex-embed
(lambda (n e)
(let ((geometry-opt (markup-option n :geometry-opt))
(geometry (markup-option n :geometry))
(rgeometry (markup-option n :rgeometry))
(transient (markup-option n :transient))
(transient-opt (markup-option n :transient-opt))
(cmd (markup-option n :command)))
(let* ((a (string-append "ephemeral="
(symbol->string (gensym))))
(c (cond
(geometry
(string-append cmd " "
geometry-opt " "
geometry))
(rgeometry
(multiple-value-bind (aopt dopt)
(advi-geometry rgeometry)
(set! a (string-append a "," aopt))
(string-append cmd " "
geometry-opt " "
dopt)))
(else
cmd)))
(c (if (and transient transient-opt)
(string-append c " " transient-opt " !p")
c)))
(printf "\\adviembed[~a]{~a}\n" a c)))))
(set! &latex-record advi-record)
(set! &latex-play advi-play)
(set! &latex-play* advi-play*)))
;*---------------------------------------------------------------------*/
;* %slide-prosper-setup! ... */
;*---------------------------------------------------------------------*/
(define (%slide-prosper-setup!)
(skribe-message "Generating `Prosper' slides...\n")
(let ((le (find-engine 'latex))
(be (find-engine 'base))
(overlay-count 0))
;; transitions
(define (prosper-transition trans)
(cond
((string? trans)
(printf "[~s]" trans))
((eq? trans 'slide)
(printf "[Blinds]"))
((and (symbol? trans)
(memq trans '(split blinds box wipe dissolve glitter)))
(printf "[~s]"
(string-upcase (symbol->string trans))))
(else
#f)))
;; latex configuration
(define (prosper-slide n e)
(let* ((i (markup-option n :image))
(t (markup-option n :title))
(lt (markup-option n :transition))
(gt (engine-custom e 'transition))
(pa (search-down (lambda (x) (is-markup? x 'slide-pause)) n))
(lpa (length pa)))
(set! overlay-count 1)
(if (>= lpa 1) (printf "\\overlays{~a}{%\n" (+ 1 lpa)))
(display "\\begin{slide}")
(prosper-transition (or lt gt))
(display "{")
(output t e)
(display "}\n")
(output (markup-body n) e)
(display "\\end{slide}\n")
(if (>= lpa 1) (display "}\n"))
(newline)
(newline)))
(engine-custom-set! le 'documentclass "\\documentclass[pdf,skribe,slideColor,nototal]{prosper}\n")
(let* ((cap (engine-custom le 'slide-caption))
(o (engine-custom le 'predocument))
(n (if (string? cap)
(format "~a\\slideCaption{~a}\n"
&slide-prosper-predocument
cap)
&slide-prosper-predocument)))
(engine-custom-set! le 'predocument
(if (string? o) (string-append n o) n)))
(engine-custom-set! le 'hyperref-usepackage "\\usepackage{hyperref}\n")
;; writers
(set! &latex-slide prosper-slide)
(set! &latex-pause
(lambda (n e)
(set! overlay-count (+ 1 overlay-count))
(printf "\\FromSlide{~s}%\n" overlay-count)))))
;*---------------------------------------------------------------------*/
;* Setup ... */
;*---------------------------------------------------------------------*/
(let* ((opt &slide-load-options)
(p (memq :prosper opt)))
(if (and (pair? p) (pair? (cdr p)) (cadr p))
;; prosper
(set! %slide-latex-mode 'prosper)
(let ((a (memq :advi opt)))
(if (and (pair? a) (pair? (cdr a)) (cadr a))
;; advi
(set! %slide-latex-mode 'advi)))))