%D \module %D [ file=strc-bkm, %D version=2009.04.01, %D title=\CONTEXT\ Structure Macros, %D subtitle=Bookmarks, %D author=Hans Hagen, %D date=\currentdate, %D copyright=\PRAGMA] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. %D This might become scrn-bkm.mkiv. \writestatus{loading}{ConTeXt Structure Macros / Bookmarks} \registerctxluafile{strc-bkm}{1.001} \unprotect %D Due to requests I finally decided to support bookmarks, a %D driver dependant way of showing tables of content. The most %D simple way of support is hooking bookmark generation into %D the existing list mechanisms. That way users can generate %D bookmarks automatically, although its entirely valid to add %D bookmarks by defining alternative ones. These will be added %D at the appropriate place in the list. % \hoofdstuk{het eerste hoofdstuk} % % \bookmark {de eerste bookmark} % optional overruled hoofdstuk % % .... text .... % % \placebookmarks [hoofdstuk,paragraaf,subparagraaf,subsubparagraaf,mylist] % [open list] % % \bookmark[mylist]{whatever} %D This will go away. \let\flushpostponedbookmark\relax %D We have better ways now. \unexpanded\def\bookmark {\dosingleempty\dobookmark} \def\dobookmark[#1]#2% {\begingroup \simplifycommands \ctxlua{structures.bookmarks.overload("#1",\!!bs\detokenize\expandafter{\normalexpanded{#2}}\!!es)}% \endgroup} %D Placement \unknown\ look how simple compared to \MKII: \newtoks \everysetupbookmarks \def\bookmarkparameter#1{\ifcsname\??bm#1\endcsname\csname\??bm#1\endcsname\fi} \unexpanded\def\setupbookmarks[#1]% {\getparameters[\??bm][#1]% \the\everysetupbookmarks} \unexpanded\def\placebookmarks {\dotripleempty\doplacebookmarks} % Use force to get titles in the bookmarklist. This is somewhat tricky as one % does not want "Contents" in a table of contents but it has to be in the % bookmark list. \def\doplacebookmarks[#1][#2][#3]% {\iflocation \begingroup \edef\askednames{#1}% \edef\askedopened{#2}% \ifx\askednames\empty \edef\askednames{\getvalue{\??ih\v!content\c!list}}% \fi \ifx\askednames\empty \let\askednames\v!all \fi \ifthirdargument \getparameters[\??bm][#3]% \else\ifsecondargument \doifassignmentelse{#2}{\let\askedopened\empty\getparameters[\??bm][#2]}\donothing \fi\fi \ctxlua{structures.bookmarks.register { names = "\askednames", opened = "\askedopened", force = "\bookmarkparameter\c!force", number = "\bookmarkparameter\c!number", }}% \endgroup \fi} \setupbookmarks [\c!force=\v!no, % it's easier to force that to inhibit \c!number=\v!yes] % might become v!no \appendtoks \ctxlua{structures.bookmarks.setup { separatorset = "\bookmarkparameter\c!numberseparatorset", conversionset = "\bookmarkparameter\c!numberconversionset", starter = \!!bs\bookmarkparameter\c!numberstarter\!!es, stopper = \!!bs\bookmarkparameter\c!numberstopper\!!es, segments = "\bookmarkparameter\c!numbersegments", }}% \to \everysetupbookmarks % \prependtoks\ctxlua{structures.bookmarks.place()}\to\everystoptext % too late % \prependtoks\ctxlua{structures.bookmarks.place()}\to\everylastbackendshipout % okay but not nice \protect \endinput % \starttext % \setupinteraction[state=start]\setupinteractionscreen[option=bookmark] % \placebookmarks[chapter,section,subsection][chapter] % \chapter{First} % \bookmark{The First Indeed} % \section{alpha} % \bookmark[chapter]{The First Indeed Again} % \section{beta} % \chapter{Second} % \bookmark{The Second Indeed} % \section{gamma \tex{radiation}} % \subsection{a} % \subsection{b} % \section{delta} % \section{epsilon} % \chapter{Third \relax} % \chapter{我〈能吞下玻璃而不傷身〉體。} % whatever that means % \chapter{Idris Samawi Hamid ادريس سماوي حامد} % \stoptext