strc-bkm.mkiv /size: 5629 b    last modification: 2020-07-01 14:35
1%D \module
2%D   [       file=strc-bkm,
3%D        version=2009.04.01,
4%D          title=\CONTEXT\ Structure Macros,
5%D       subtitle=Bookmarks,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14\writestatus{loading}{ConTeXt Structure Macros / Bookmarks}
15
16\registerctxluafile{strc-bkm}{}
17
18% \enabledirectives[references.bookmarks.preroll]
19
20\unprotect
21
22%D Bookmarks are a very viewer dependent feature. They are mostly used
23%D as additional table of contents and therefore relate directly to lists.
24%D
25%D A bookmark list is added to the document only when interaction is
26%D enabled. The given lists are bookmarked and a second argument specifies
27%D the opened bookmark trees.
28%D
29%D \starttyping
30%D \placebookmarks
31%D   [chapter,section,subsection,mylist]
32%D   [chapter]
33%D \stoptyping
34%D
35%D You can overloads the last set bookmark in a sectioning command:
36%D
37%D \starttyping
38%D \chapter {the first chapter}
39%D \bookmark {the first bookmark}
40%D \stoptyping
41%D
42%D However, in practice you can better use \type {\startchapter} and set the
43%D \type {bookmark} parameter.
44%D
45%D You can add entries to the bookmarklist:
46%D
47%D \starttyping
48%D \bookmark[mylist]{whatever}
49%D \stoptyping
50%D
51%D Use force to get titles in the bookmarklist. This is somewhat tricky as
52%D one does not want "Contents" in a table of contents but it has to be in
53%D the bookmark list.
54
55\installcorenamespace{bookmark}
56
57\installsetuponlycommandhandler \??bookmark {bookmark} % installdirectparametersethandler
58
59\setupbookmark
60  [\c!force=\v!no,        % it's easier to force that to inhibit
61   \c!number=\v!yes,      % might become v!no
62   \c!sectionblock=\v!no] % show sectionblock level + title
63
64\let\setupbookmarks\setupbookmark
65
66\unexpanded\def\bookmark
67  {\dosingleempty\strc_bookmarks_bookmark}
68
69\def\strc_bookmarks_bookmark
70  {\iflocation
71     \expandafter\strc_bookmarks_bookmark_yes
72   \else
73     \expandafter\strc_bookmarks_bookmark_nop
74   \fi}
75
76\def\strc_bookmarks_bookmark_yes[#1]#2%
77  {\begingroup
78   \simplifycommands
79   \ifnum\thenamedheadlevel{#1}>\zerocount
80     \clf_overloadbookmark{#1}{\detokenize\expandafter{\normalexpanded{#2}}}%
81   \else
82     \strc_lists_write_to[#1][]{#2}{}% todo: a dedicated bookmark writer
83   \fi
84   \endgroup}
85
86\def\strc_bookmarks_bookmark_nop[#1]#2%
87  {}
88
89\unexpanded\def\placebookmarks
90  {\dotripleempty\strc_bookmarks_place}
91
92\def\strc_bookmarks_place
93  {\iflocation
94     \expandafter\strc_bookmarks_place_yes
95   \else
96     \expandafter\gobblethreeoptionals
97   \fi}
98
99\let\m_bookmarks_names \empty
100\let\m_bookmarks_opened\empty
101
102\def\strc_bookmarks_place_yes[#1][#2][#3]%
103  {\begingroup
104   \edef\m_bookmarks_names{#1}%
105   \edef\m_bookmarks_opened{#2}%
106   \ifx\m_bookmarks_names\empty
107     \edef\m_bookmarks_names{\namedlistparameter\v!content\c!list}%
108   \fi
109   \ifx\m_bookmarks_names\empty
110     \let\m_bookmarks_names\v!all
111   \fi
112   \ifthirdargument
113     \setupcurrentbookmark[#3]% no every so not all possible
114   \else\ifsecondargument
115     \doifelseassignment{#2}{\let\m_bookmarks_opened\empty\setupcurrentbookmark[#2]}\donothing
116   \fi\fi
117   \clf_registerbookmark
118     names  {\m_bookmarks_names}%
119     opened {\m_bookmarks_opened}%
120     force  {\bookmarkparameter\c!force}%
121     number {\bookmarkparameter\c!number}%
122   \relax
123   \endgroup}
124
125\appendtoks
126    \clf_setupbookmarks
127      separatorset   {\bookmarkparameter\c!numberseparatorset}%
128      conversionset  {\bookmarkparameter\c!numberconversionset}%
129      starter        {\bookmarkparameter\c!numberstarter}%
130      stopper        {\bookmarkparameter\c!numberstopper}%
131      segments       {\bookmarkparameter\c!numbersegments}%
132      showblocktitle {\bookmarkparameter\c!sectionblock}%
133    \relax
134\to \everysetupbookmark
135
136%D There is a plugin mechanism but this is for experts only. The intermediate
137%D data structures are stable.
138%D
139%D \starttyping
140%D \startluacode
141%D     structures.bookmarks.installhandler("check before","before",function(levels)
142%D         logs.report("extra bookmarks","before (normal bookmarks)")
143%D         inspect(levels)
144%D         logs.report("extra bookmarks","before (extra bookmarks)")
145%D         inspect(structures.bookmarks.extras.get())
146%D         return levels
147%D     end)
148%D     structures.bookmarks.installhandler("check after", "after", function(levels)
149%D         logs.report("extra bookmarks","after (merged bookmarks)")
150%D         inspect(levels)
151%D         return levels
152%D     end)
153%D \stopluacode
154%D \starttyping
155%D
156%D This mechanism was added when bookmark inclusion became (optional) part of graphic
157%D inclusion (which is needed by Taco).
158%D
159%D \starttyping
160%D \getfiguredimensions[somefile.pdf]
161%D \dorecurse {\noffigurepages} {
162%D     \startTEXpage
163%D         \externalfigure[somefile.pdf][interaction=bookmark,page=\recurselevel]
164%D     \stopTEXpage
165%D }
166%D \starttyping
167
168\protect \endinput
169
170% \starttext
171% \setupinteraction[state=start]\setupinteractionscreen[option=bookmark]
172% \placebookmarks[chapter,section,subsection][chapter]
173% \chapter{First}
174% \bookmark{The First Indeed}
175% \section{alpha}
176% \bookmark[chapter]{The First Indeed Again}
177% \section{beta}
178% \chapter{Second}
179% \bookmark{The Second Indeed}
180% \section{gamma \tex{radiation}}
181% \subsection{a}
182% \subsection{b}
183% \section{delta}
184% \section{epsilon}
185% \chapter{Third \relax}
186% \chapter{我〈能吞下玻璃而不傷身〉體。} % whatever that means
187% \chapter{Idris Samawi Hamid ادريس سماوي حامد}
188% \stoptext
189