%D \module %D [ file=scrn-int, %D version=1995.01.01, %D title=\CONTEXT\ Core Macros, %D subtitle=Interaction, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA / Hans Hagen \& Ton Otten}] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. \writestatus{loading}{ConTeXt Screen Macros / Interaction} \registerctxluafile{scrn-int}{1.001} \unprotect %D This is an update of \MKII\ code. In the process profiles and versions %D were removed as I never used them (although they were kind of cool at %D that time). % a bit complex due to papercomment (see imposition code) \newtoks\everysetupinteractionscreen \unexpanded\def\setupinteractionscreen {\dosingleempty\dosetupinteractionscreen} \def\dosetupinteractionscreen[#1]% {\getparameters[\??sc][#1]% \the\everysetupinteractionscreen} \def\synchronizepaperdimensionssimple % simple version {\bgroup \ifx\@@ppleft \empty \ifx\@@ppright \empty \ifx\@@pptop \empty \ifx\@@ppbottom \empty \ifx\@@pcstate\v!start \locationfalse\fi\else \locationfalse\fi\else \locationfalse\fi\else \locationfalse\fi\else \locationfalse\fi \iflocation % without screen settings \ctxlua{backends.codeinjections.setupcanvas { paperwidth = \number\paperwidth, paperheight = \number\paperheight }}% \else \ctxlua{backends.codeinjections.setupcanvas { paperwidth = \number\printpaperwidth, paperheight = \number\printpaperheight }}% \fi \egroup} \def\synchronizepaperdimensionscomplex % complex version {\bgroup \edef\@@scwidth {\@@scwidth}% \edef\@@scheight{\@@scheight}% \ifx\@@scwidth\v!fit \!!widtha\leftcombitotal \ifdim\backspace>\!!widtha\ifdim\backspace>\zeropoint\relax \advance\backspace -\!!widtha \fi\fi \advance\!!widtha\dimexpr\rightcombitotal+2\dimexpr\@@scbackspace+\@@schoroffset\relax\relax \else\ifx\@@scwidth\v!max \!!widtha\printpaperwidth \else \!!widtha\@@scwidth \fi\fi \ifx\@@scheight\v!fit \!!heighta\dimexpr\topheight+\topdistance\relax \ifdim\topspace>\!!heighta\ifdim\topspace>\zeropoint\relax \advance\topspace -\!!heighta \fi\fi \advance\!!heighta\dimexpr\makeupheight+\bottomdistance+\bottomheight+2\dimexpr\@@sctopspace+\@@scveroffset\relax\relax \else\ifx\@@scheight\v!max \!!heighta\printpaperheight \else \!!heighta\@@scheight \fi\fi \doif\@@scdelay\v!none{\let\@@scdelay\zerocountervalue}% \ifdim\!!widtha>\paperwidth\ifdim\!!widtha>\zeropoint \paperwidth\!!widtha \fi\fi \ifdim\!!heighta>\paperheight\ifdim\!!heighta>\zeropoint \paperheight\!!heighta \fi\fi \ctxlua{backends.codeinjections.setupcanvas { mode = "\@@scoption", % doublesided = \ifsinglesided false\else\ifdoublesided true\else false\fi\fi, singlesided = \ifsinglesided true\else false\fi, doublesided = \ifdoublesided true\else false\fi, leftoffset = \number\dimexpr\backoffset\relax, topoffset = \number\dimexpr\topoffset \relax, width = \number\dimexpr\!!widtha \relax, height = \number\dimexpr\!!heighta \relax, paperwidth = \number\paperwidth, paperheight = \number\paperheight }}% \egroup} \let\synchronizepaperdimensions \synchronizepaperdimensionscomplex \appendtoks \ifproductionrun \doifelse\@@pcstate\v!start {\let\synchronizepaperdimensions\synchronizepaperdimensionssimple} {\let\synchronizepaperdimensions\synchronizepaperdimensionscomplex}% \fi \to \everysetupinteractionscreen \appendtoks \synchronizepaperdimensions \to \everyshipout %D The next mechanism, linked lists, is quite old and %D is \MKIV'd for completeness. I will finish the %D confuguration part when I need it. % todo: a kind of button that gets a tag passed (\??tk) % \starttext % \setupinteraction[state=start] % \definelinkedlist[demo] % \dorecurse{10}{\linkedlistelement[demo]{link \recurselevel} \page} % \stoptext \def\linkedlistparameter #1{\csname\dolinkedlistparameter{\??lk\currentlinkedlist}#1\endcsname} \def\dolinkedlistparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dolinkedlistparentparameter\csname#1\s!parent\endcsname#2\fi} \def\dolinkedlistparentparameter#1#2{\ifx#1\relax\s!empty\else\dolinkedlistparameter#1#2\fi} \unexpanded\def\definelinkedlist{\dodoubleargument\dodefinelinkedlist} \unexpanded\def\setuplinkedlist {\dodoubleargument\dosetuplinkedlist } \unexpanded\def\setuplinkedlists{\dosingleargument\dosetuplinkedlists} \def\dodefinelinkedlist[#1][#2]% {\ctxlua{interactions.definelinkedlist("#1")}% \getparameters[\??lk#1][\s!parent=\??lk,#2]} \def\dosetuplinkedlist[#1][#2]% {\getparameters[\??lk#1][#2]} \def\dosetuplinkedlists[#1]% {\getparameters[\??lk][#1]} \def\setlinkproperties#1#2#3#4#5#6% {\def\currentlink {#1}% \def\noflinks {#2}% \def\firstlink {#3}% \def\previouslink{#4}% \def\nextlink {#5}% \def\lastlink {#6}} \def\linkedlistelement[#1]#2% currently no view support {\dontleavehmode\hbox\bgroup #2% \iflocation \edef\currentlinkedlist{#1}% \ifcsname\??lk\currentlinkedlist\s!parent\endcsname \hskip\linkedlistparameter\c!distance \ctxlua{interactions.addlinktolist("\currentlinkedlist")}% \expanded{\ctxlatelua{interactions.enhancelinkoflist("\currentlinkedlist",\currentlink)}}% \dogotosomepage {\??lk\currentlinkedlist}\gotobegincharacter \firstlink \ifnum\noflinks>\plustwo \dogotosomepage{\??lk\currentlinkedlist}\gobackwardcharacter\previouslink \dogotosomepage{\??lk\currentlinkedlist}\goforwardcharacter \nextlink \fi \dogotosomepage {\??lk\currentlinkedlist}\gotoendcharacter \lastlink \else \writestatus\m!interactions{no such linked list: \currentlinkedlist}% \fi \fi \egroup} \setuplinkedlists [\c!distance=.25em, \c!width=\v!fit, \c!location=\v!low, \c!color=\@@iacolor, \c!frame=\v!off, \c!background=, \c!backgroundcolor=] \def\koppeling {\linkedlistelement} \def\stelkoppelingenin {\setuplinkedlists} \def\definieerkoppeling{\definelinkedlist} %D Conditional page breaks: \def\screen {\dosingleempty\doscreen} \def\doscreen[#1]% {\iflocation\page[#1]\fi} %D Page transitions: \let\askedpagetransitions\empty \unexpanded\def\setuppagetransitions {\dosingleempty\dosetuppagetransitions} \def\dosetuppagetransitions[#1]% {\edef\askedpagetransitions{#1}} \def\setpagetransition {\iflocation \ifx\askedpagetransitions\empty \else \ctxlua{backends.codeinjections.setpagetransition{ n = "\askedpagetransitions", delay = "\@@scdelay" }}% \fi \fi} \prependtoks \setpagetransition \to \everyshipout \setuppagetransitions [\v!reset] %D Comments: \newbox\commentcollection \newbox\commentbox \newbox\commentboxone \newbox\commentboxtwo \def\raisedcommentanchors#1#2{#1{\hbox{\raise\strutht#2}}} \setvalue{\??cc:\c!location:\v!inmargin }{\raisedcommentanchors\inmargin } \setvalue{\??cc:\c!location:\v!leftedge }{\raisedcommentanchors\inleftedge } \setvalue{\??cc:\c!location:\v!rightedge }{\raisedcommentanchors\inrightedge } \setvalue{\??cc:\c!location:\v!leftmargin }{\raisedcommentanchors\inleftmargin } \setvalue{\??cc:\c!location:\v!rightmargin}{\raisedcommentanchors\inrightmargin} \let\flushcommentanchors\relax \def\doflushcommentanchors {\global\let\flushcommentanchors\relax \ifvoid\commentbox\else\dodoflushcommentanchors\fi} % in everypar so indirect \def\dodoflushcommentanchors {\executeifdefined{\??cc:\c!location:\@@cclocation}\hbox{\box\commentbox}} \unexpanded\def\setupcomment {\dodoubleargument\getparameters[\??cc]} \unexpanded\def\placecomments{\box\commentcollection} % when option=buffer \def\doinsertcomment#1% {\begingroup \ctxlua{backends.codeinjections.presetsymbollist("\@@ccsymbol")}% % in between predefined symbols are dealt with \ctxlua{backends.codeinjections.registercomment { title = "\@@cctitle", width = \number\dimexpr\@@ccwidth \relax, height = \number\dimexpr\@@ccheight\relax, colormodel = \number\currentcolormodel, colorvalue = \thecolorattribute{\@@cccolor}, open = \@@ccopen, symbol = "\@@ccsymbol", buffer = "#1", layer = "\@@cctextlayer" }}% \box\commentboxone \doif\@@ccoption\v!buffer {\setbox\scratchbox\vbox to \@@ccheight{\forgetall\vss\box\commentboxtwo}% \wd\scratchbox\@@ccwidth \global\setbox\commentcollection\vbox {\startoverlay{\box\commentcollection}{\box\scratchbox}\stopoverlay}}% \endgroup} \setvalue{\e!start\v!comment}{\dotripleempty\dostartcomment}% the dummy triple gobbles trailing spaces \def\dostartcomment[#1][#2][#3]% {\bgroup \doifassignmentelse{#1}{\getparameters[\??cc][#1]}{\getparameters[\??cc][\c!title=#1,#2]}% \doifelse\@@ccoption\v!max{\let\@@ccopen\s!true}{\let\@@ccopen\s!false}% \setcurrentbuffer{\v!comment\v!buffer}% \dostartbuffer[\v!comment\v!buffer][\v!comment\v!buffer][\e!start\v!comment][\e!stop\v!comment]} \unexpanded\def\stopcomment {\doif\@@ccstate\v!start {\global\let\flushcommentanchors\doflushcommentanchors \global\setbox\commentbox\frozenhbox {\hbox to \zeropoint{\struttedbox{\tbox{\doinsertcomment{\v!comment\v!buffer}}}\hss}% \hskip\ifvoid\commentbox\@@ccmargin\else\@@ccdistance\fi \box\commentbox}}% \egroup} \def\comment {\dodoubleempty\docomment} \def\docomment[#1][#2]#3% {\doif\@@ccstate\v!start {\hbox to \zeropoint {\doifassignmentelse{#1}{\getparameters[\??cc][#1]}{\getparameters[\??cc][\c!title=#1,#2]}% \hskip-\@@ccmargin \ctxlua{buffers.set("\v!comment\v!buffer", \!!bs\detokenize{#3}\!!es)}% \struttedbox{\tbox{\doinsertcomment{\v!comment\v!buffer}}\hss}}}% \ignorespaces} % test % % \startcomment % hello beautiful\\world % \stopcomment % % test % % \startcomment[hello] % hello << eerste >> % beautiful % world % \stopcomment % % test % % \startcomment[hello][color=green,width=10cm,height=3cm] % hello \leftguillemot\ \'e\'erste \rightguillemot\ % beautiful % world % \stopcomment % % test % % \startcomment[hello][color=red,width=4cm,height=3cm] % hello \leftguillemot\ \'e\'erste \rightguillemot\ test % % beautiful % % world % \stopcomment % % test % % \startcomment[symbol=Balloon] % Do we want this kind of rubish? And, why isn't this and % some more features related to text annotations so poorly % (actually not) documented? Anyhow, by providing this % functionality we demonstrate that \pdfTeX\ can do it. By % the way, it's funny that when in Acrobat we scale up the % text, the symbols scale down. % \stopcomment % % test % % \definesymbol [comment-normal][{\externalfigure[cow.pdf]}] % \definesymbol [comment-down] [{\externalfigure[cow.pdf]}] % % \def\CowSymbol#1#2% % {\scale % [\c!height=#1] % {\startMPcode % loadfigure "koe.mp" number 1 ; % refill currentpicture withcolor #2 ; % \stopMPcode}} % % \definesymbol [comment-normal] % [\CowSymbol{4ex}{red}] % % \definesymbol [comment-down] % [\CowSymbol{4ex}{green}] % % \setupcomment % [\c!symbol={comment-normal,comment-down}, % \c!option=\v!buffer] % % \startcomment[hello] % oeps % \stopcomment % % test % % \setupcomment % [\c!symbol=normal, % \c!option=max,width=10cm] % % \startcomment[hello] % oeps % \stopcomment % % test \setupcomment [\c!state=\v!start, \c!margin=2.5em, \c!distance=1em, \c!width=.3\textwidth, \c!height=.2\textheight, \c!color=\@@iacolor, \c!title=, \c!space=\v!no, \c!symbol=\v!normal, \c!location=\v!inmargin, \c!option=, \c!textlayer=] %D Attachments: % \setupinteraction[state=start] % % \useattachment[test.tex] % \useattachment[whatever][test.tex] % \useattachment[whatever][newname][test.tex] % \useattachment[whatever][title][newname][test.tex] % % % \setupattachments[\c!symbol={symbol-normal,symbol-down}] % % \starttext \attachment[whatever] \stoptext \def\useattachment {\doquadrupleempty\douseattachment} \def\douseattachment[#1][#2][#3][#4]% tag title newname filename {\iffourthargument \ctxlua{interactions.registerattachment{ label="#1", title="#2", newname="#3", filename="#4" }}% \else\ifthirdargument \ctxlua{interactions.registerattachment{ label="#1", title="#2", newname="#2", filename="#3" }}% \else\ifsecondargument \ctxlua{interactions.registerattachment{ label="#1", title="#2", newname="#2", filename="#2" }}% \else \ctxlua{interactions.registerattachment{ label="#1", title="#1", newname="#1", filename="#1" }}% \fi\fi\fi} \def\attachment {\dodoubleempty\doattachment} \def\doattachment[#1][#2]% [tag] [settings] {\iflocation \doif\@@atstate\v!start {\bgroup \setupattachments[#2]% \ctxlua{backends.codeinjections.presetsymbollist("\@@atsymbol")}% % we cannot yet ask for the wd/ht/dp of an xform else we could use those \setbox\scratchbox\hbox{\symbol[\lastpredefinedsymbol]}% \doif\@@atwidth \v!fit{\edef\@@atwidth {\the\wd\scratchbox}}% \doif\@@atheight\v!fit{\edef\@@atheight{\the\ht\scratchbox}}% \doif\@@atdepth \v!fit{\edef\@@atdepth {\the\dp\scratchbox}}% % \setbox\scratchbox\hbox {\getvalue{\??at:\@@atalternative}{\ctxlua{backends.codeinjections.attachfile{ label = "#1", width = \number\dimexpr\@@atwidth \relax, height = \number\dimexpr\@@atheight\relax, depth = \number\dimexpr\@@atdepth \relax, color = "\@@atcolor", symbol = "\@@atsymbol", layer = "\@@attextlayer", }}}}% \wd\scratchbox\@@atwidth \ht\scratchbox\@@atheight \dp\scratchbox\@@atdepth \box\scratchbox \egroup}% \fi} \setvalue{\??at:\v!high}#1{\struttedbox{\tbox{#1}}} \unexpanded\def\setupattachments {\dodoubleempty\getparameters[\??at]} \setupattachments [\c!state=\v!start, \c!color=\@@iacolor, \c!textlayer=, \c!width=\v!fit, \c!height=\v!fit, \c!depth=\v!fit, \c!alternative=\v!high, \c!symbol=] %D Defining sound tracks: %D %D \starttyping %D \useexternalsoundtrack[label][file] %D \stoptyping %D %D associated actions: StartSound StopSound PauseSound ResumeSound %D %D Todo: like external figures, also search on path, %D although, they need to be present ar viewing time, so ... \def\useexternalsoundtrack {\dodoubleargument\douseexternalsoundtrack} \def\douseexternalsoundtrack[#1][#2]% {\ctxlua{interactions.registersound{ label="#1", filename="#2" }}} \def\checksoundtrack#1% yet untested in mkiv (also move management to lua) {\iflocation \ctxlua{codeinjections.insertsound{ label = "#1", repeat = "\@@sdoption", % not entirely ok but works }}% \fi} \unexpanded\def\setupexternalsoundtracks {\dodoubleargument\getparameters[\??sd]} \setupexternalsoundtracks [\c!option=] %D Multi Media: % todo: multiple instances, dus indirect \let\currentrendering\empty \definereference[StartCurrentRendering] [\v!StartRendering {\currentrendering}] \definereference[StopCurrentRendering] [\v!StopRendering {\currentrendering}] \definereference[PauseCurrentRendering] [\v!PauseRendering {\currentrendering}] \definereference[ResumeCurrentRendering][\v!ResumeRendering{\currentrendering}] \newcounter\nofexternalrenderings \def\useexternalrendering{\doquadrupleempty\douseexternalrendering} \def\setinternalrendering{\dodoubleempty \dosetinternalrendering} \def\douseexternalrendering[#1][#2][#3][#4]% tag mime file options {\ctxlua{interactions.registerrendering { kind = "external", label = "#1", mime = "#2", filename = "#3", options = "#4", }}} \def\dosetinternalrendering[#1][#2]% tag options {content} {\bgroup \dowithnextbox {\ctxlua{interactions.registerrendering { kind = "internal", label = "#1", mime = "IRO", filename = "#1", options = "#2", }}% \let\objectoffset\zeropoint \setobject{IRO}{#1}\hbox{\box\nextbox}% \egroup}% \hbox} \def\renderingtype #1{\ctxlua{interactions.renderingvar("#1","kind")}} \def\renderingoptions#1{\ctxlua{interactions.renderingvar("#1","options")}} \def\renderingwidth {8cm} \def\renderingheight {6cm} \unexpanded\def\definerenderingwindow {\dodoubleempty\dodefinerenderingwindow} \def\dodefinerenderingwindow[#1][#2]% {\presetlocalframed[\??rw#1]% \getparameters [\??rw#1]% [\c!openpageaction=,\c!closepageaction=,% \c!width=\renderingwidth,\c!height=\renderingheight,% #2]} \unexpanded\def\setuprenderingwindow {\dodoubleargument\dosetuprenderingwindow} \def\dosetuprenderingwindow[#1]% {\getparameters[\??rw#1]} \unexpanded\def\placerenderingwindow {\dodoubleempty\doplacerenderingwindow} \def\doplacerenderingwindow[#1][#2]% {\bgroup \edef\currentrendering{\ifsecondargument#2\else#1\fi}% \doifelse{\renderingtype\currentrendering}{internal} % an object {\getobjectdimensions{IRO}\currentrendering \edef\renderingheight{\the\dimexpr\objectheight+\objectdepth\relax}% \edef\renderingwidth{\objectwidth}% \dogetobjectreferencepage{IRO}\currentrendering\renderingpage}% {\def\renderingheight{\vsize}% \def\renderingwidth{\hsize}% \def\renderingpage{\realpageno}}% % create fall back if needed \ifcsname\??rw#1\c!width\endcsname \def\currentrenderingwindow{#1}% \else \let\currentrenderingwindow\s!default \definerenderingwindow[\currentrenderingwindow]% \fi % todo % \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!openpageaction }}\dosetuprenderingopenpageaction % \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!closepageaction}}\dosetuprenderingclosepageaction \localframed [\??rw\currentrenderingwindow][\c!offset=\v!overlay]% {\ctxlua{backends.codeinjections.insertrenderingwindow { label = "\currentrendering", width = \number\dimexpr\renderingwidth\relax, height = \number\dimexpr\renderingheight\relax, options = "\renderingoptions\currentrendering", page = \number\renderingpage, }}}% \egroup} \setupinteractionscreen [\c!width=\printpaperwidth, \c!height=\printpaperheight, \c!horoffset=\!!zeropoint, \c!veroffset=\!!zeropoint, \c!backspace=\backspace, \c!topspace=\topspace, \c!option=\v!auto, \c!delay=\v!none] \protect \endinput