% This file is part of the Lecturer package.
% Paul Isambert -- July 2010.
% 
\countdef\slideno=0
\slideno=1
\def\advanceslideno{\global\advance\slideno1 }
\def\slidenumber{\the\slideno}
%
%
%
% ATTRIBUTES
%
\def\ltr@slide_restrictions{width height background foreground image transition bookmark everyslide anchor font scale
  vsize vpos hpos top left right bottom parindent parskip hsize baselineskip topskip pdftitle bookmarklevel bookmarkstyle areas areas* }
\def\ltr@slide_deleteattributes{%
  \passexpanded{\ltr@attribute_deletion{ltr@inner_slide}}\ltr@slide_restrictions
  }
\passexpandednobraces{\restrictparameter slide ltr@inner_slide:}\ltr@slide_restrictions\par
\ltr@restrictattribute slide:vpos; top center bottom\par
\ltr@restrictattribute ltr@inner_slide:vpos; top center bottom\par
\ltr@restrictattribute slide:hpos; ff rr fr rf\par
\ltr@restrictattribute ltr@inner_slide:hpos; ff rr fr rf\par
\ltr@boolean_attr{slide:bookmark}
\ltr@boolean_attr{ltr@inner_slide:bookmark}
\ltr@boolean_attr{slide:scale}
\ltr@boolean_attr{ltr@inner_slide:scale}
\def\ltr@slide_parameter#1{%
  \ltr@todim_loop{#1}{width height vsize hsize top left bottom right parindent baselineskip topskip }%
  \ltr@delete_empty{#1:font}%
  \ltr@delete_empty{#1:hsize}\ltr@delete_empty{#1:left}\ltr@delete_empty{#1:right}%
  \ltr@delete_empty{#1:vsize}\ltr@delete_empty{#1:top}\ltr@delete_empty{#1:bottom}%
  \ltr@dimen_set{#1}{right}{left}{hsize}{\ltr@usevalueor #1:width;\pdfpagewidth}%
  \ltr@dimen_set{#1}{bottom}{top}{vsize}{\ltr@usevalueor #1:height;\pdfpageheight}%
  \ltr@deleteattribute #1:right;%
  \ltr@deleteattribute #1:bottom;%
  }
\defactiveparameter slide {%
  \ltr@slide_parameter{#1}%
  }
% #1 parameter (e.g. slide)
% #2 ordering attribute (e.g. right (for slide))
% #3 first obeying attribute (e.g. left)
% #4 second obeying attribute (e.g. hsize)
% #5 reference (e.g. (page)width)
\def\ltr@dimen_set#1#2#3#4#5{%
    \nometa\ltr@ifattribute #1:#2;
      {\ltr@passvalue{\defcs{ltr@#1:inner_#2}}#1:#2;%
       \nometa\ltr@ifattribute #1:#3;
         {\ltr@setattribute #1:#4; = {\dimexpr(#5-\dimexpr(\usecs{ltr@#1:inner_#2}+\ltr@usevalue #1:#3;))\relax} }% SPACE
         {\nometa\ltr@ifattribute #1:#4;
             {\ltr@setattribute #1:#3; = {\dimexpr(#5-\dimexpr(\usecs{ltr@#1:inner_#2}+\ltr@usevalue #1:#4;))\relax} }% SPACE
             {\ltr@passvalue{\ltr@setattribute #1:#3;=}#1:#2; % SPACE
              \ltr@setattribute #1:#4; = {\dimexpr(#5-\dimexpr(\usecs{ltr@#1:inner_#2}+\ltr@usevalue #1:#3;))\relax} }}}% SPACE
      {}%
  }
% Defaults
\vsize=\maxdimen % So no unwanted output occurs
\setparameter slide:
  vpos           = center
  background     = white
  foreground     = black
  bookmark       = true
  bookmarklevel  = 1
  scale          = false

\setparameter ltr@inner_slide:
  meta = slide

\long\def\setslide#1#2\par{%
  \ltr@space_loop{\ltr@setslide_do{#2}}{#1 }%
  }
\long\def\ltr@setslide_do#1#2{%
  \ltr@ifattribute {ltr@#2@inner_slide}:meta;
    {\setparameter{ltr@#2@inner_slide}:}
    {\ltr@setslide_new{#2}}%
    #1\par
  }
\def\ltr@setslide_new#1{%
  \defcs{#1}{%
    \ltr@setattribute ltr@inner_slide:meta;={ltr@#1@inner_slide}
    \slide}%
  \letcs{end#1}\endslide
  \ifnum\formatnumber=3 % ConTeXt
    \letcstocs{start#1}{#1}%
    \letcs{stop#1}\endslide
  \fi
  \passexpandednobraces{\restrictparameter ltr@#1@inner_slide:}\ltr@slide_restrictions\par
  \ltr@restrictattribute ltr@#1@inner_slide:vpos; top center bottom\par
  \ltr@boolean_attr{ltr@#1@inner_slide:bookmark}%
  \defactiveparameter ltr@#1@inner_slide {%
    \ltr@slide_parameter{##1}%
    }%
  \setparameter{ltr@#1@inner_slide}:
    meta = slide
  }
%
%
%
%
%
%
% The \slide command.
% Attributes (beside those in the slide parameter):
% pdftitle; and a value without a = sign is taken
% as the slide title and recorded in \slidetitle;
% it is also recorded as pdftitle if there is this
% entry is missing.
%
\def\slidetitle{}\def\ltr@slide_pdftitle{}
\def\ltr@ltr@inner_slide_usepair#1#2{% Used by option_launchloop.
  \ltr@setattribute ltr@inner_slide:#1;={#2} %
  }
\def\ltr@ltr@inner_slide_useatom#1{% Idem. (Literate programming, he said?)
  \def\slidetitle{#1}%
  }
\def\slide{%
  \ifnextnospace[{\ltr@slide}{\ltr@slide[]}%
  }
\ifnum\formatnumber=3
  \let\startslide\slide
\fi
\def\ltr@slide[#1]{%
  \def\slidetitle{}
  \ltr@option_launchloop{ltr@inner_slide}{#1}%
  \ltr@slide_parameter{ltr@inner_slide}%
  \edef\ltr@slide_pdftitle{%
    \ltr@usevalueor ltr@inner_slide:pdftitle;{\slidetitle}%
    }%
  \pdfdest name {ltr@linktopage_\the\slideno} fit
  \ltr@ifvalue ltr@inner_slide:bookmark;= true
     {\ltr@ifattribute ltr@inner_slide:anchor;
        {\createbookmark[\ltr@usevalue ltr@inner_slide:bookmarkstyle;]{\ltr@usevalue ltr@inner_slide:bookmarklevel;}[\ltr@usevalue ltr@inner_slide:anchor;]{\ltr@slide_dotitle}}
        {\createbookmark[\ltr@usevalue ltr@inner_slide:bookmarkstyle;]{\ltr@usevalue ltr@inner_slide:bookmarklevel;}{\ltr@slide_dotitle}}}
     {\ltr@passvalue\anchor ltr@inner_slide:anchor;}
  %
  \ltr@usevalueor ltr@inner_slide:font;{\ltr@usevalue job:font;}%
  % Set the page dimensions.
  \baselineskip=\ltr@usevalueor ltr@inner_slide:baselineskip;{12pt}\relax
  \topskip=\ltr@usevalueor ltr@inner_slide:topskip;{12pt}\relax
  \parskip=\ltr@usevalueor ltr@inner_slide:parskip;{0pt}\relax
  \pdfpagewidth=\ltr@usevalueor ltr@inner_slide:width;{15cm}\relax
  \pdfpageheight=\ltr@usevalueor ltr@inner_slide:height;{12cm}\relax
  \pdfhorigin=\ltr@usevalueor ltr@inner_slide:left;{2cm}\relax
  \pdfvorigin=\ltr@usevalueor ltr@inner_slide:top;{1cm}\relax
  \hsize=\ltr@usevalueor ltr@inner_slide:hsize;{\dimexpr(\pdfpagewidth-2\pdfhorigin)\relax}\relax
  \parindent=\ltr@usevalueor ltr@inner_slide:parindent;{0pt}\relax
  \leftskip=0pt \rightskip=0pt plus 1fill\relax
  \ltr@ifcasevalue ltr@inner_slide:hpos;
    \val ff \rightskip=0pt
    \val rr \leftskip=0pt plus 1fill\relax
    \val rf \leftskip=0pt plus 1fill\rightskip=0pt
  \endval
  \ltr@usevalue ltr@inner_slide:everyslide;%
  }
\def\ltr@slide_dotitle{%
  \ifemptycommand\ltr@slide_pdftitle{Page \the\slideno}{\ltr@slide_pdftitle}%
  }
\def\endslide{%
  \par
  \ltr@step_clear
  \ifdim\pagetotal=0pt
    \hbox{\vrule width 0pt}% If the slide is empty, there might be material in areas.
  \fi  % Close the previous step, if any.
  \addtopageresources{%
    /Properties << \ltr@page_properties >>
    /Shading    << \ltr@page_shading    >>
    /ExtGState  << \ltr@page_extgstate  >>
    }%
  \addtopageobject{%
    \iffcs{ltr@inner_transition:\ltr@usevalueor ltr@inner_slide:transition;{ltr@no_value}}
          {/Trans \usecs{ltr@inner_transition:\ltr@usevalueor ltr@inner_slide:transition;{ltr@no_value}} 0 R}
    \ltr@pageattr_global}%
                                   % End up as /Order [ [(Page 1) 1 0 R 2 0 R...] [(Page 2)...]...] in the catalog.
  \global\eaddright\ltr@order_OCGs{[(\ltr@slide_dotitle) \ltr@page_OCGs] }%
  % Here we go.
  \penalty\ltr@output_penalty
  \ltr@page_clear
  }
\ifnum\formatnumber=3 % ConTeXt
  \let\stopslide\endslide
\fi
%
% Resource management.
% Should be usable by anybody. Returns the list of /<name> <number> 0 R pairs
% in /Page ... /Resources << /Properties ... >>.
% Using \pdfpageresources would ruin everything.
%
\def\ltr@catalog_OCGs{} \def\ltr@page_OCGs{}        \def\ltr@order_OCGs{}
\def\ltr@visible_OCGs{} \def\ltr@page_visibleOCGs{} \def\ltr@page_invisibleOCGs{}
\edef\ltr@page_PA{}
\def\ltr@page_properties{} \def\ltr@page_steplist{}
\def\ltr@page_shading{} \def\ltr@page_extgstate{}
\def\ltr@pageattr_global{}
\def\addshading#1#2{%
  \global\eaddright\ltr@page_shading{/#1 #2 0 R }%
  }
\def\addgstate#1#2{%
  \global\eaddright\ltr@page_extgstate{/#1 #2 0 R }%
  }
\def\addproperties#1#2{%
  \global\eaddright\ltr@page_properties{/#1 #2 0 R }%
  }
\def\addtopageresources#1{%
  \begingroup
    \edef\ltr@temp{\global\pdfpageresources{\the\pdfpageresources\spacecs #1 }}%
    \ltr@temp
  \endgroup
  }
\def\addOCG#1{%
  \global\eaddright\ltr@catalog_OCGs{#1 0 R }%
  \global\eaddright\ltr@page_OCGs{#1 0 R }%
  \global\eaddright\ltr@page_invisibleOCGs{#1 0 R }%
  }
\def\addvisibleOCG#1{%
  \global\eaddright\ltr@catalog_OCGs{#1 0 R }%
  \global\eaddright\ltr@visible_OCGs{#1 0 R }%
  \global\eaddright\ltr@page_OCGs{#1 0 R }%
  \global\eaddright\ltr@page_visibleOCGs{#1 0 R }%
  }
\def\addtopageobject#1{%
  \begingroup
    \edef\ltr@temp{\global\pdfpageattr{#1\the\pdfpageattr}}%
    \ltr@temp
  \endgroup
  }
\def\addtoeachpageobject#1{%
  \global\eaddright\ltr@pageattr_global{#1}%
  }
\def\ltr@page_clear{%
  \gdef\ltr@page_OCGs{}%
  \gdef\ltr@page_visbleOCGs{}%
  \gdef\ltr@page_invisbleOCGs{}%
  \gdef\ltr@page_PA{}%
  \gdef\ltr@page_properties{}%
  \gdef\ltr@page_steplist{}%
  \global\pdfpageattr={}%
  \global\def\ltr@step_current{}%
  \global\ltr@steps_count=0
  \global\ltr@activesteps_count=0
  \ltr@setattribute ltr@inner_slide:meta; = slide
  \ltr@slide_deleteattributes
  }

\endinput