summaryrefslogtreecommitdiff
path: root/macros/generic/lecturer/tex/ltr-areas.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/generic/lecturer/tex/ltr-areas.tex')
-rw-r--r--macros/generic/lecturer/tex/ltr-areas.tex208
1 files changed, 208 insertions, 0 deletions
diff --git a/macros/generic/lecturer/tex/ltr-areas.tex b/macros/generic/lecturer/tex/ltr-areas.tex
new file mode 100644
index 0000000000..9e89d6696e
--- /dev/null
+++ b/macros/generic/lecturer/tex/ltr-areas.tex
@@ -0,0 +1,208 @@
+% This file is part of the Lecturer package.
+% Paul Isambert -- July 2010.
+%
+%
+% ATTRIBUTES
+%
+\def\setarea#1#2\par{%
+ \ltr@space_loop{\ltr@setarea_do{#2}}{#1 }%
+ }
+\long\def\ltr@setarea_do#1#2{%
+ \ltr@ifattribute {ltr@#2@inner_area}:visible;
+ {\setparameter {ltr@#2@inner_area}:}
+ {\ltr@setarea_new{#2}}%
+ #1\par
+ }%
+\def\ltr@area_list{}%
+\def\ltr@setarea_new#1{%
+ \global\eaddright\ltr@area_list{ltr@#1@inner_area,}%
+ \passcs{\usecs{newbox}}{ltr@#1@inner_area:box}%
+ \restrictparameter ltr@#1@inner_area:
+ width height hshift hshift* vshift vshift* left right top bottom
+ foreground background topskip baselineskip parindent parskip hpos vpos
+ visible frame frame_width frame_color frame_corner frame_dash
+ everyposition everyfreeposition font hsize vsize image
+ \par
+ \ltr@restrictattribute ltr@#1@inner_area:visible; true false step\par
+ \ltr@restrictattribute ltr@#1@inner_area:frame_corner; miter round bevel\par
+ \ltr@restrictattribute ltr@#1@inner_area:hpos; ff rr fr rf\par
+ \defactiveparameter ltr@#1@inner_area {%
+ \ltr@delete_empty{##1:background}%
+ \ltr@todim_loop{##1}{width height hshift hshift* vshift vshift* left right top bottom hsize vsize
+ topskip baselineskip parindent frame_width }%
+ \ltr@dimen_set{##1}{hshift*}{hshift}{width}{\pdfpagewidth}%
+ \ltr@dimen_set{##1}{vshift*}{vshift}{height}{\pdfpageheight}%
+ \ltr@deleteattribute ##1:hshift*;%
+ \ltr@deleteattribute ##1:vshift*;%
+ \ltr@dimen_set{##1}{right}{left}{hsize}{\ltr@area_width{##1}}%
+ \ltr@dimen_set{##1}{bottom}{top}{vsize}{\ltr@area_height{##1}}%
+ \ltr@deleteattribute ##1:right;%
+ \ltr@deleteattribute ##1:bottom;%
+ \ltr@ifattribute##1:frame;
+ {\def\ltr@area_name{#1}\ltr@passvalue{\ltr@option_launchloop{area}}##1:frame;}{}%
+ \ltr@deleteattribute##1:frame;
+ \ltr@todim_loop{##1}{frame_width }%
+ \ltr@ifattribute##1:frame_color;{}
+ {\ltr@ifattribute##1:background;
+ {\ltr@setattribute##1:frame_color; = {\ltr@usevalueor##1:background;{white}} }{}}%
+ }%
+ \setparameter {ltr@#1@inner_area}:
+ visible = true
+ }
+\def\ltr@area_usepair#1#2{%
+ \ltr@setattribute ltr@\ltr@area_name @inner_area:frame_#1;={#2}
+ }
+%
+%
+%
+\def\ltr@area_hshift#1{%
+ \ltr@usevalueor #1:hshift;{0pt}%
+ }
+\def\ltr@area_vshift#1{%
+ \ltr@usevalueor #1:vshift;{0pt}%
+ }
+\def\ltr@area_width#1{%
+ \ltr@usevalueor #1:width;{\dimexpr(\pdfpagewidth-\ltr@area_hshift{#1})}%
+ }
+\def\ltr@area_height#1{%
+ \ltr@usevalueor #1:height;{\dimexpr(\pdfpageheight-\ltr@area_vshift{#1})}%
+ }
+\def\ltr@area_left#1{%
+ \ltr@usevalueor #1:left;{0pt}%
+ }
+\def\ltr@area_top#1{%
+ \ltr@usevalueor #1:top;{0pt}%
+ }
+\def\ltr@area_hsize#1{%
+ \ltr@usevalueor #1:hsize;{\dimexpr(\ltr@area_width{#1}-\ltr@area_left{#1})\relax}%
+ }
+\def\ltr@area_vsize#1{%
+ \ltr@usevalueor #1:vsize;{\dimexpr(\ltr@area_height{#1}-\ltr@area_top{#1})\relax}%
+ }
+%
+% POSITION
+% No attributes, except the optional argument,
+% which takes the x and y (downward, \'a la TeX)
+% shifts. Most of this is box manipulation.
+%
+\newcount\ltr@temp_count
+\newcount\ltr@position_count
+\def\position#1{%
+ \ifnextnospace[{\ltr@position{#1}}{\ltr@position{#1}[]}%
+ }
+\newife\ifltr@area_do
+\long\def\ltr@position#1[#2]{%
+ \ltr@ifattribute ltr@#1@inner_area:visible;
+ {\ltr@area_check{#1}%
+ \ifltr@area_do
+ {\ltr@position_do{#2}{ltr@#1@inner_area}}
+ {\gobbleone}}
+ {\ltr@error{Area `#1' doesn't exist. Material is discarded}\gobbleone}
+ }
+\def\ltr@area_check#1{%
+ \ltr@area_dotrue
+ \ltr@ifattribute ltr@inner_slide:areas*;
+ {\ltr@ifvalue ltr@inner_slide:areas*; = all
+ {\ltr@area_dofalse}
+ {\ltr@storevalue\ltr@temp ltr@inner_slide:areas*;
+ \addright\ltr@temp{ }\addleft\ltr@temp{ }%
+ \passexpanded{\iffcontains{ #1 }}{\ltr@temp}\ltr@area_dofalse}}
+ {}%
+ \ltr@ifattribute ltr@inner_slide:areas;
+ {\ltr@ifvalue ltr@inner_slide:areas; = all
+ {}
+ {\ltr@storevalue\ltr@temp ltr@inner_slide:areas;
+ \addright\ltr@temp{ }\addleft\ltr@temp{ }%
+ \passexpanded{\ifcontains{ #1 }}{\ltr@temp}\ltr@area_dotrue\ltr@area_dofalse}}
+ {}%
+ }
+\newbox\ltr@temp_box
+\newdimen\ltr@temp_dimen
+\long\def\ltr@position_do#1#2#3{%
+ \ifemptystring{#1}
+ % Normal position.
+ {\setbox\ltr@temp_box=\ltr@position_dobox{#2}{\ltr@usevalue #2:everyposition;#3}}
+ % Free position.
+ {\setbox\ltr@temp_box=\vbox{%
+ \ltr@position_dobox{#2}{\ltr@usevalue #2:everyfreeposition;#3}}%
+ \ltr@position_getposition#1
+ \setbox\ltr@temp_box=\vbox{%
+ \kern\dimexpr(\ltr@position_top+\ltr@usevalueor #2:topskip;\topskip-\ht\ltr@temp_box)\relax
+ \moveright\ltr@position_left\box\ltr@temp_box
+ }%
+ \dp\ltr@temp_box=0pt \ht\ltr@temp_box=0pt
+ }%
+ % How to apply topskip?
+ % If the box isn't empty, that doesn't mean it shouldn't be used,
+ % since the content of the box might be material freely positioned,
+ % which doesn't exist, so to speak.
+ % We can't measure the box either, because if topskip
+ % is 0pt, one-line material without depth will fill the box
+ % with height and depth 0pt, as if there were nothing, and
+ % topskip will be applied again on the next material.
+ % Hence this pseudo-conditional turned to true the first
+ % time real material is added.
+ \ifemptystring{#1}
+ {\begingroup
+ \ltr@usevalue #2:font;% So em and ex are right.
+ \ifcsname #2:done\endcsname
+ \global\ltr@temp_dimen=\dimexpr(%
+ \dimexpr(\ltr@usevalueor #2:baselineskip;\baselineskip+\ltr@usevalueor #2:parskip;{0pt})\relax
+ -\dimexpr(\ht\ltr@temp_box+\dp\usecs{#2:box}))\relax
+ \ifdim\ltr@temp_dimen<\lineskiplimit
+ \global\ltr@temp_dimen=\lineskip
+ \fi
+ \else
+ \global\ltr@temp_dimen=\dimexpr(\ltr@usevalueor #2:topskip;\topskip-\ht\ltr@temp_box)\relax%
+ \global\letcs{#2:done}\relax
+ \fi
+ \endgroup}
+ {\edef\ltr@position_left{\the\ht\usecs{#2:box}}% I could have used special dimensions
+ \edef\ltr@position_top{\the\dp\usecs{#2:box}}}% but it's a time of austerity.
+ \global\setbox\usecs{#2:box}=\vbox{%
+ \unless\ifvoid\usecs{#2:box}
+ \unvcopy\usecs{#2:box}
+ \fi
+ \ifemptystring{#1}
+ {\kern\ltr@temp_dimen}
+ {\kern-\dimexpr(\ht\usecs{#2:box}+\dp\usecs{#2:box})\relax}
+ \ifx\ltr@step_current\emptycs
+ \ifemptystring{#1}\unvbox\box\ltr@temp_box
+ \reverse\iffcs{ltr@#2_\the\slideno @inner_area:group}
+ {\global\letcs{ltr@#2_\the\slideno @inner_area:group}\emptycs}
+ \else
+ \global\advance\ltr@position_count1
+ \pdfliteral {/OC/ltr@position_\the\ltr@position_count:content BDC}
+ \ifemptystring{#1}\unvbox\box\ltr@temp_box
+ \pdfliteral {EMC}
+ \addproperties{ltr@position_\the\ltr@position_count:content}{\ltr@step_current}
+ \reverse\iffcs{#2_\the\slideno:group}
+ {\global\letcs{#2_\the\slideno:group}\ltr@step_current
+ \addproperties{#2_\the\slideno:background}{\usecs{#2_\the\slideno:group}}}
+ \fi
+ \reverse\iffemptystring{#1} % Restore the box to its original dimensions.
+ {\prevdepth-1000pt \vbox to \ht\usecs{#2:box}{\vfil\hbox{\vrule height0pt width0pt depth\dp\usecs{#2:box}}}}%
+ }%
+ \ltr@temp_dimen=0pt
+ }
+\def\ltr@position_getposition#1,#2 {%
+ \edef\ltr@position_left{\ifemptystring{#1}{0pt}{\dimexpr(#1)}}%
+ \edef\ltr@position_top{\ifemptystring{#2}{0pt}{\dimexpr(#2)}}
+ }
+\long\def\ltr@position_dobox#1#2{%
+ \vtop{%
+ \ltr@usevalue #1:font;
+ \parindent\ltr@usevalueor #1:parindent;{0pt}\relax
+ \hsize=\ltr@area_hsize{#1}\relax
+ \ltr@settovalue\baselineskip #1:baselineskip;
+ \parskip=\ltr@usevalueor #1:parskip;{0pt}\relax
+ \leftskip=0pt \rightskip=0pt plus 1fill\relax
+ \ltr@ifcasevalue #1:hpos;
+ \val ff \rightskip=0pt
+ \val rr \leftskip=0pt plus 1fill\relax
+ \val rf \leftskip=0pt plus 1fill \rightskip=0pt
+ \endval
+ #2}%
+ }
+
+\endinput \ No newline at end of file