diff options
Diffstat (limited to 'tex/context/base/mkiv/strc-ref.mklx')
-rw-r--r-- | tex/context/base/mkiv/strc-ref.mklx | 2196 |
1 files changed, 0 insertions, 2196 deletions
diff --git a/tex/context/base/mkiv/strc-ref.mklx b/tex/context/base/mkiv/strc-ref.mklx deleted file mode 100644 index 2f3475e50..000000000 --- a/tex/context/base/mkiv/strc-ref.mklx +++ /dev/null @@ -1,2196 +0,0 @@ -%D \module -%D [ file=strc-ref, -%D version=2008.10.20, -%D title=\CONTEXT\ Structure Macros, -%D subtitle=Cross Referencing, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -% todo: (1) configure references, (2) rendering => with presets -% -% \defineconversionset[default][Character,number,Romannumerals,Character][number] -% \defineseparatorset [default][.,.,--][.] -% \setuphead[subsection][sectionstopper=),sectionsegments=4:4] -% \setupreferencestructureprefix[default][prefixsegments=2:4] -% \setupreferencestructureprefix[figure][default][prefixsegments=3:4] -% \chapter {One} -% \section {One} -% \subsection[sec:test]{Two} -% See \in[sec:test] and \in[fig:xx] and \in[fig:yy] -% \placefigure[here][fig:xx]{}{} -% \placefigure[here][fig:yy]{}{} - -\writestatus{loading}{ConTeXt Structure Macros / Cross Referencing} - -\registerctxluafile{strc-rsc}{} -\registerctxluafile{strc-ref}{} -\registerctxluafile{node-ref}{optimize} - -\unprotect - -% todo : unknown/illegal reference no arg -% todo : +n pages check on 'samepage' (contrastcolor) -% todo : multiple text in reference - -% Makes more sense to build action data first, especially now openaction etc are -% supported. -% -% \definespecial\doexecuteactionchain w h -% \definespecial\dosetgotolocation -% \definespecial\dosetexecuteJScode -% ... - -%D This module deals with referencing. In \CONTEXT\ referencing is one of the core -%D features, although at a first glance probably nobody will notice. This is good, -%D because referencing should be as hidden as possible. -%D -%D Before we start implementing functionality we provide a way to set up this -%D mechanism. -%D -%D \showsetup{setupreferencing} -%D -%D In interactive documents verbose references don't always make sense (what is a -%D page number in an unnumbered document). By setting the \type{interaction} -%D variable, one can influences the way interactive references are set. - -\let\referenceprefix\empty - -\installcorenamespace{referencing} - -\installdirectcommandhandler \??referencing {referencing} % \??referencing - -\newif\ifreferencing \referencingtrue - -\appendtoks - \edef\p_state{\referencingparameter\c!state}% - \ifx\p_state\v!start - \referencingtrue - \else - \referencingfalse - \fi -\to \everysetupreferencing - -%D In paper documents, referencing comes down to cross referencing, but in -%D their interactive counterparts, is also involves navigation. Many features -%D implemented here are therefore closely related to navigation. -%D -%D Many \CONTEXT\ commands can optionally be fed with a reference. Such a -%D reference, when called upon, returns the number of a figure, table, chapter -%D etc, a piece of text, or a pagenumber. -%D -%D There are three ways of defining a reference: -%D -%D \starttyping -%D \pagereference[here] -%D \textreference[here]{some text} -%D \stoptyping -%D -%D the third alternative combines them in: -%D -%D \starttyping -%D \reference[here]{some text} -%D \stoptyping - -\permanent\protected\def\showreferences{\enabletrackers[nodes.references.show,nodes.destinations.show]} - -%D These are implemented in a low level form as: - -\permanent\tolerant\protected\def\textreference [#labels]{\strc_references_set_named_reference\s!text{#labels}{}} -\permanent\tolerant\protected\def\pagereference [#labels]{\strc_references_set_named_reference\s!page{#labels}{}{}} -\permanent\tolerant\protected\def\reference [#labels]{\strc_references_set_named_reference\s!full{#labels}{}} -\permanent\tolerant\protected\def\setreference [#labels]#spacer[#settings]{\strc_references_set_named_reference\s!user{#labels}{#settings}{}} - -\permanent\protected\def\dosetdirectpagereference#1{\strc_references_set_named_reference\s!page{#1}{}{}} % low level, maybe use _ - -\permanent\protected\def\usereferenceparameter#1% faster local variant - {\edef\m_strc_references_asked{#1\c!reference}% - \ifempty\m_strc_references_asked\else - \dosetdirectpagereference\m_strc_references_asked - \fi} - -%D Actually there is not much difference between a text and a full reference, but -%D it's the concept that counts. The low level implementation is: - -\newcount\lastreferenceattribute -\newcount\lastdestinationattribute - -\def\strc_references_finish#prefix#reference#internal% gets expanded anyway - {\normalexpanded{\clf_deferredenhancereference{#prefix}{#reference}}} - -\permanent\let\dofinishreference\strc_references_finish % used at lua end - -%D This is somewhat tricky: we want to keep the reference with the following word but -%D that word should also hyphenate. We need to find a better way. - -% 0 = nothing -% 1 = bind to following word - -\setnewconstant\c_strc_references_bind_state\plusone - -\def\strc_references_inject_before - {} - -\def\strc_references_inject_after - {\ifcase\c_strc_references_bind_state - % nothing - \or - \prewordbreak % to be tested: \removeunwantedspaces\permithyphenation - \fi} - - -\protected\def\strc_references_set_named_reference - {\ifreferencing - \expandafter\strc_references_set_named_reference_indeed - \else - \expandafter\gobblefourarguments - \fi} - -\newbox\b_strc_destination_nodes - -\protected\def\strc_references_flush_destination_nodes - {\ifvoid\b_strc_destination_nodes \else - \unhbox\b_strc_destination_nodes - \fi} - -\def\strc_references_placeholder - {\ifempty\dotaggedplaceholder\else - \c_attr_destination\lastdestinationattribute - \dotaggedplaceholder - \fi} - -\protected\def\strc_references_destination_point_yes - {\strc_references_inject_before % new - \dostarttagged\t!reference\empty - \dontleavehmode\hbox attr \destinationattribute\lastdestinationattribute\bgroup - \strc_references_flush_destination_nodes - \strc_references_placeholder - \egroup - \dostoptagged - \strc_references_inject_after} - -\protected\def\strc_references_destination_point_nop - {\strc_references_inject_before % new - \dostarttagged\t!reference\empty - \dontleavehmode\hbox \bgroup - \strc_references_flush_destination_nodes - \strc_references_placeholder - \egroup - \dostoptagged - \strc_references_inject_after} - -\protected\def\strc_references_start_destination_nodes % messy but we need the delay - {\setbox\b_strc_destination_nodes\hbox\bgroup} % also sets lastdestinationattribute - -\protected\def\strc_references_stop_destination_nodes - {\normalexpanded{\egroup\lastdestinationattribute\the\lastdestinationattribute\relax}} - -\protected\def\strc_references_set_named_reference_indeed#kind#labels#userdata#text% labels userdata text -> todo: userdata - {\ifreferencing - % we could have a more efficient one for page references but for the moment - % we don't care too much - \edef\currentreferencekind {#kind}% - \edef\currentreferencelabels {#labels}% - \edef\currentreferenceuserdata {#userdata}% - \edef\currentreferenceexpansion{\referencingparameter\c!expansion}% {\referenceparameter\c!expansion} - \ifempty\currentreferencelabels - \lastdestinationattribute\attributeunsetvalue - \else - \ifx\currentreferenceexpansion\s!xml - \xmlstartraw - \xdef\currentreferencedata{#text}% data, no text else conflict - \xmlstopraw - \glet\currentreferencecoding\s!xml - \else - \ifx\currentreferenceexpansion\v!yes - \xdef\currentreferencedata{#text}% - \else - \xdef\currentreferencedata{\detokenize{#text}}% - \fi - \glet\currentreferencecoding\s!tex - \fi - % beware, the structures.references.set writes a - \setnextinternalreference - \strc_references_start_destination_nodes - \clf_setdestinationattribute - {% - references {% - internal \locationcount - % block {\currentsectionblock}% - view {\interactionparameter\c!focus}% - \ifempty\referenceprefix\else - prefix {\referenceprefix}% - \fi - reference {\currentreferencelabels}% - }% - metadata {% - kind {\currentreferencekind}% - \ifx\currentreferencekind\s!page\else - \ifx\currentreferencecoding\s!xml - xmlroot {\xmldocument}% - \fi - catcodes \catcodetable - \fi - }% - \ifempty\currentreferencedata\else - entries {% - text {\currentreferencedata}% - }% - \fi - \ifempty\currentreferenceuserdata\else - userdata {\detokenize{#userdata}}% - \fi - }% - \relax - \strc_references_stop_destination_nodes - \fi - \else - \setbox\b_strc_destination_nodes\emptyhbox - \lastdestinationattribute\attributeunsetvalue - \fi - % will become obsolete: - \xdef\currentdestinationattribute{\number\lastdestinationattribute}% - % will become an option: - \ifnum\lastdestinationattribute>\zerocount - \strc_references_destination_point_yes - \orelse\ifvoid\b_strc_destination_nodes\else - \strc_references_destination_point_nop - \fi} - -\def\strc_references_set_page_only_destination_attribute#labels% could in fact be fully expandable - {\ifreferencing - \edef\currentreferencelabels{#labels}% - \ifempty\currentreferencelabels - \setbox\b_strc_destination_nodes\emptyhbox - \lastdestinationattribute\attributeunsetvalue - \else - \strc_references_start_destination_nodes - \setnextinternalreference - \clf_setdestinationattribute - {% - references {% - internal \locationcount - % block {\currentsectionblock}% - view {\interactionparameter\c!focus}% - \ifempty\referenceprefix\else - prefix {\referenceprefix}% - \fi - reference {\currentreferencelabels}% - }% - metadata {% - kind {page}% - }% - }% - \relax - \strc_references_stop_destination_nodes - \fi - \else - \setbox\b_strc_destination_nodes\emptyhbox - \lastdestinationattribute\attributeunsetvalue - \fi} - -\protected\def\strc_references_direct_full_user#user#labels#text% - {\ifreferencing - \strc_references_start_destination_nodes - \setnextinternalreference - \edef\m_strc_references_user{#user}% - \edef\m_strc_references_text{#text}% - \clf_setdestinationattribute - {% - references {% - internal \locationcount - % block {\currentsectionblock}% - view {\interactionparameter\c!focus}% - \ifempty\referenceprefix\else - prefix {\referenceprefix}% - \fi - reference {#labels}% - }% - metadata {% - kind {\s!full}% - }% - \ifempty\m_strc_references_text \else - entries {% - text {\m_strc_references_text}% - }% - \fi - \ifempty\m_strc_references_user \else - userdata {\m_strc_references_user}% \detokenize\expandafter{\normalexpanded{...}} - \fi - }% - \relax - \strc_references_stop_destination_nodes - \else - \setbox\b_strc_destination_nodes\emptyhbox - \lastdestinationattribute\attributeunsetvalue - \fi - % will become obsolete: - \xdef\currentdestinationattribute{\number\lastdestinationattribute}% - % will become an option: - \ifnum\lastdestinationattribute>\zerocount - \strc_references_destination_point_yes - \orelse\ifvoid\b_strc_destination_nodes\else - \strc_references_destination_point_nop - \fi} - -\protected\def\strc_references_direct_full - {\strc_references_direct_full_user\empty} - -\permanent\let\dodirectfullreference\strc_references_direct_full % for at lua end (no longer) - -\def\strc_references_set_page_only_destination_box_attribute#cs#labels% - {\strc_references_set_page_only_destination_attribute{#labels}% - \ifnum\lastdestinationattribute>\zerocount - \edef#cs{attr \destinationattribute\number\lastdestinationattribute}% - \else - \let#cs\empty - \fi} - -%D It's about time to clean up references .. stable enough now. - -\permanent\protected\def\boxreference[#1]% - {\begingroup - \dowithnextbox - {\strc_references_set_page_only_destination_attribute{#1}% - \hpack % \hbox - \ifnum\lastdestinationattribute=\attributeunsetvalue\else attr \destinationattribute \lastdestinationattribute \fi - {\box\b_strc_destination_nodes\box\nextbox}% - \endgroup}} - -\permanent\protected\def\hboxreference[#1]{\boxreference[#1]\hbox} -\permanent\protected\def\vboxreference[#1]{\boxreference[#1]\vbox} - -% \ifx\currentdestinationattribute\empty -% \begingroup\c_attr_destination\currentdestinationattribute\emptyhbox\endgroup % todo -% \fi - -\def\defaultreferencepage#text{[[[#text]]]} -\def\defaultreferencetext#text{[[[#text]]]} - -%D For internal usage: - -\def\strc_references_set_simple_reference#label% - {\iflocation - \strc_references_start_destination_nodes - \setnextinternalreference - \clf_setdestinationattribute - {% - references {% - view {\interactionparameter\c!focus}% - \ifempty\referenceprefix\else - prefix {\referenceprefix}% - \fi - reference {#label}% - internal \locationcount - }% - metadata {% - kind {\s!page}% - }% - }% - \relax - \strc_references_stop_destination_nodes - \xdef\currentdestinationattribute{\number\lastdestinationattribute}% - \else - \setbox\b_strc_destination_nodes\emptyhbox - \xdef\currentdestinationattribute{\number\attributeunsetvalue}% - \fi} - -\def\strc_references_set_simple_internal_reference#label% no prefix - {\iflocation - \strc_references_start_destination_nodes - \setnextinternalreference - \clf_setdestinationattribute - {% - references {% - view {\interactionparameter\c!focus}% - reference {#label}% - internal \locationcount - }% - metadata {% - kind {\s!page}% - }% - }% - \relax - \strc_references_stop_destination_nodes - \xdef\currentdestinationattribute{\number\lastdestinationattribute}% - \else - \setbox\b_strc_destination_nodes\emptyhbox - \xdef\currentdestinationattribute{\number\attributeunsetvalue}% - \fi} - -\def\strc_references_get_simple_reference#label% - {\iflocation - \clf_injectreference - {\referenceprefix}% - {#label}% - {% - height \ht\strutbox - depth \dp\strutbox - \extrareferencearguments - }% - \relax - \xdef\currentreferenceattribute{\number\lastreferenceattribute}% - \else - \xdef\currentreferenceattribute{\number\attributeunsetvalue}% - \fi} - -%D \macros -%D {contentreference} -%D -%D \starttyping -%D \setupinteraction -%D [state=start, -%D focus=standard] -%D -%D \setupheader -%D [state=stop] -%D -%D See page \goto{page 2}[page2] \page -%D -%D \contentreference -%D [page2] -%D [offset=1cm,toffset=2cm,frame=on] -%D {\externalfigure[cow.pdf][factor=fit]} -%D -%D \stoptyping - -\permanent\tolerant\protected\def\contentreference[#1]#*[#2]% - {\ifarguments - \expandafter\gobbletwoarguments - \or - \expandafter\strc_references_content_pickup_nop - \else - \expandafter\strc_references_content_pickup_yes - \fi{#1}{#2}} - -\def\strc_references_content_pickup_yes#1#2% - {\hbox\bgroup\dowithnextbox{\strc_references_content_yes_finish{#1}{#2}}\hbox} - -\def\strc_references_content_pickup_nop#1#2% - {\hbox\bgroup\dowithnextbox{\strc_references_content_nop_finish{#1}{#2}}\hbox} - -\def\strc_references_content_yes_finish#1#2% - {\scratchwidth \wd\nextbox - \scratchheight\ht\nextbox - \scratchdepth \dp\nextbox - \setbox\nextbox\hpack - {\framed[\c!frame=\v!off,#2]{\box\nextbox}}% - \strc_references_set_simple_reference{#1}% - \setbox\nextbox\hpack attr \destinationattribute \currentdestinationattribute % \hpack ? - {\strc_references_flush_destination_nodes - \box\nextbox}% - \setbox\nextbox\hpack{\box\nextbox}% - \wd\nextbox\scratchwidth - \ht\nextbox\scratchheight - \dp\nextbox\scratchdepth - \box\nextbox - \egroup} - -\def\strc_references_content_nop_finish#1#2% - {\strc_references_set_simple_reference{#1}% - \hpack attr \destinationattribute \currentdestinationattribute % \hpack ? - {\strc_references_flush_destination_nodes - \box\nextbox}% - \egroup} - -%D \macros -%D {everyreference} -%D -%D For rather tricky purposes, one can assign sanitizing macros to \type -%D {\everyreference} (no longer that relevant). - -\newevery \everyreference \relax - -%D This is really needed, since for instance Polish has a different alphabet and -%D needs accented entries in registers. - -\appendtoks - \cleanupfeatures -\to \everyreference - -%D We did not yet discuss prefixing. Especially in interactive documents, it's not -%D always easy to keep track of duplicate references. The prefix mechanism, which we -%D will describe later on, solves this problem. By (automatically) adding a prefix -%D one keeps references local, but the global ones in view. To enable this feature, -%D we explictly split the prefix from the reference. - -\let\referenceprefix\empty - -%D For a long time the only way to access an external file was to use the file -%D prefix (\type {somefile::}. However, when you split up a document, redefining the -%D references may be such a pain, that another approach is feasible. By setting the -%D \type {autofile} variable to \type {yes} or \type {page}, you can access the -%D reference directly. -%D -%D \starttabulate[||||] -%D \NC filename::tag \NC page(filename::pnum) \NC tag \NC\NR -%D \NC $\star$ \NC \NC \NC\NR -%D \NC $\star$ \NC $\star$ \NC $\star$ \NC\NR -%D \NC \NC $\star$ \NC \NC\NR -%D \stoptabulate - -\permanent\protected\def\usereferences[#filename]{} % obsolete - -%D As mentioned we will also use the cross reference mechanism for navigational -%D purposes. The main reason for this is that we want to treat both categories -%D alike: -%D -%D \starttyping -%D \goto{go back}[PreviousJump] -%D \goto{colofon}[colofon page] -%D \stoptyping -%D -%D Here \type{PreviousJump} is handled by the viewer, while the -%D \type{colofon page} reference is, apart from hyperlinking, a -%D rather normal reference. -%D -%D We already saw that cross refences are written to and read from a file. The pure -%D navigational ones don't need to be written to file, but both for fast processing -%D and transparant integration, they are saved internally as a sort of reference. We -%D can easily distinguish such system references from real cross reference ones by -%D their tag. -%D -%D We also use the odd/even characteristic to determine the page state. - -\let\currentrealreference \empty -\let\currentpagereference \empty -\let\currenttextreference \empty -\let\currentreferenceorder \empty -\let\currentsubtextreference \empty -\let\currentsubsubtextreference\empty - -\newcount\referencehastexstate % set in backend - -% referencepagestate: -% -% 0 = no page ref, 1=same page, 2=before, 3=after - -%D Cross references appear as numbers (figure~1.1, chapter~2) or pagenumbers -%D (page~2, page 3--2), and are called with \type {\in} and \type {\at}. In -%D interactive documents we also have \type {\goto}, \type {\button} and alike. -%D These are more versatile and look like: -%D -%D \starttyping -%D \goto[reference] -%D \goto[outer reference::] -%D \goto[outer reference::inner reference] -%D \goto[operation(argument)] -%D \goto[operation(action{argument,argument})] -%D \goto[action] -%D \goto[action{argument}] -%D \stoptyping -%D -%D The first one is a normal reference, the second and third are references to a -%D file or \URL. The brace delimited references for instance refer to a \JAVASCRIPT. -%D The last example shows that we can pass arguments to the actions. -%D -%D Now we've come to the testing step. As we can see below, this macro does bit more -%D than testing: it also resolves the reference. This means that whenever we test -%D for the existance of a reference at an outer level, we have all the relevant -%D properties of that reference avaliable inside the true branche~(\type {#2}). -%D -%D The prefix has to do with localizing references. When a prefix is set, looking -%D for a reference comes to looking for the prefixed one, and when not found, -%D looking for the non prefixed one. Consider for instance the prefix set to \type -%D {sidetrack}. -%D -%D \starttyping -%D \pagereference[important] -%D \pagereference[unimportant] -%D \setupreferencing[prefix=sidetrack] -%D \pagereference[important] -%D \stoptyping -%D -%D results in saving (writing) the references -%D -%D \starttyping -%D ...{}{important} -%D ...{}{unimportant} -%D ...{sidetrack}{important}... -%D \stoptyping -%D -%D Now when we call for \type{unimportant}, we will indeed get the pagenumber -%D associated to this reference. But when we call for \type{important}, while the -%D prefix is still set, we will get the pagenumber bound to the prefixed one. -%D -%D {\em Some day, when processing time and memory are no longer -%D performance factors, we will introduce multi||level -%D prefixes.} -%D -%D Before we start analyzing, I introduce a general definition macro. Consider: -%D -%D \starttyping -%D \goto{do}[JS(My_Script{"test",123}),titlepage] -%D \stoptyping -%D -%D This can also be achieved by: -%D -%D \starttyping -%D \definereference[startup][JS(My_Script{"test",123}),titlepage] -%D \goto{do}[startup] -%D \stoptyping -%D -%D Now is this is a handy feature or not? -%D -%D \showsetup{definereference} -%D -%D We can trace references by setting the next switch to true. - -\permanent\tolerant\protected\def\definereference[#name]#spacer[#specification]% - {\clf_definereference{\referenceprefix}{#name}{\detokenize{#specification}}} - -\permanent\protected\def\resetreference[#name]% - {\clf_resetreference{\referenceprefix}{#name}} - -\permanent\def\setpagereference#name#specification% hm,. low level ? - {\clf_definereference{}{#name}{\v!page(\detokenize{#specification}}} % is detokenize needed here? - -%D Chained references are defined as: -%D -%D \starttyping -%D \goto{somewhere}[JS(somescript),nextpage,JS(anotherscript)] -%D \stoptyping -%D -%D Actually supporting chains is up to the special driver. Here we only provide the -%D hooks. - -%D \macros -%D {highlighthyperlinks} -%D -%D The next switch can be used to make user hyperlinks are not highlighted when -%D clicked on. - -\newconditional\highlighthyperlinks \settrue\highlighthyperlinks - -%D \macros -%D {gotonewwindow} -%D -%D To make the {\em goto previous jump} feature more convenient when using more than -%D one file, it makes sense to force the viewer to open a new window for each file -%D opened. - -\newconditional\gotonewwindow \setfalse\gotonewwindow - -\permanent\def\expandtexincurrentreference % will happen in lua some time - {\ifcase\referencehastexstate\else\clf_expandcurrentreference\fi} - -\permanent\def\expandreferenceoperation#tag#content{\clf_setreferenceoperation#tag{#content}} -\permanent\def\expandreferencearguments#tag#content{\clf_setreferencearguments#tag{#content}} - -\permanent\def\doifelsereferencefound#label#yes#nop% - {\clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}% - {\expandtexincurrentreference - #yes}% - {#nop}} - -\aliased\let\doifreferencefoundelse\doifelsereferencefound - -%D The tester only splits the reference in components but does not look into them. -%D The following macro does a preroll and determines for instance the current real -%D reference pagenumber. The \type {\currentrealreference} macro does the same so -%D unless one wants to use the pagestate the next macro seldom needs to be called. -%D -%D The inner case is simple. Only two cases have to be taken -%D care of: -%D -%D \starttyping -%D \goto{some text}[reference] -%D \goto{some text}[prefix:reference] -%D \stoptyping -%D -%D References to other files however are treated strict or tolerant, depending on -%D their loading and availability: -%D -%D \starttyping -%D \useexternaldocument[somefile][filename][a nice description] -%D -%D \goto{checked reference}[somefile::reference] -%D \goto{unchecked reference}[somefile::] -%D \goto{unchecked reference}[anotherfile::reference] -%D \stoptyping -%D -%D An unknown reference is reported on the screen, in the log file and, when -%D enabled, in the left margin of the text. - -\let\unknownreference\gobbleoneargument - -%D When a reference is not found, we typeset a placeholder (two glyphs are often -%D enough to represent the reference text). - -\def\dummyreference{{\tttf ??}} -\def\emptyreference{{\tttf !!}} - -\installtextracker - {structures.referencing.show} - {\let\strc_references_dummy\strc_references_dummy_yes} - {\let\strc_references_dummy\strc_references_dummy_nop} - -\def\strc_references_dummy_nop - {\dummyreference} - -\def\strc_references_dummy_yes - {\dummyreference - \margindata - [\referencingparameter\c!labelalternative]% alternative? - [\c!style=\referencingparameter\c!labelstyle, - \c!color=\referencingparameter\c!labelcolor] - {\askedreference}} - -\let\strc_references_dummy\strc_references_dummy_nop - -\setupreferencing - [\c!labelalternative=\v!inleft, - \c!labelcolor=darkred, - \c!labelstyle=\smallinfofont] - -%D To prevent repetitive messages concerning a reference being defined, we set such -%D an unknown reference to an empty one after the first encounter. -%D -%D Apart from cross references supplied by the user, \CONTEXT\ generates cross -%D references itself. Most of them are not saved as a reference, but stored with -%D their source, for instance a list or an index entry. Such automatically -%D generated, for the user invisible, references are called {\em internal -%D references}. The user supplied ones are labeled as {\em external references}. -%D -%D A second important characteristic is that when we want to support different -%D backends (viewers), we need to support named destinations as well as page -%D numbers. I invite readers to take a glance at the special driver modules to -%D understand the fine points of this. As a result we will deal with {\em locations} -%D as well as {\em real page numbers}. We explictly call this pagenumber a real one, -%D because it is independant of the page numbering scheme used in the document. -%D -%D One of the reasons for \CONTEXT\ being the first \TEX\ base macropackage to -%D support sophisticated interactive \PDF\ files, lays in the mere fact that real -%D page numbers are available in most two pass data, like references, list data and -%D index entries. -%D -%D We will speak of \type {thisis...} when we are marking a location, and -%D \type {goto...} when we point to such a location. The latter one can be seen as a -%D hyperlink to the former one. In the next macros one we use constructs like: -%D -%D \starttyping -%D \dostart... -%D \dostop... -%D \stoptyping -%D -%D The flag \type {\iflocation} signals if we're in interactive mode. - -\ifdefined\buttonheight \else \newdimen\buttonheight \fi -\ifdefined\buttonwidth \else \newdimen\buttonwidth \fi - -%D Internal references can best be set using the next few macros. Setting such -%D references to unique values is completely up to the macros that call them. -%D -%D \starttyping -%D \thisissomeinternal{tag}{identifier} -%D \gotosomeinternal {tag}{identifier}{pagenumber}{text} -%D \stoptyping -%D -%D We could do this in \LUA\ \unknown - -\newif \iflocation -\newcount\locationcount -\newcount\locationorder -\newbox \locationbox - -\permanent\def\nextinternalreference {\the\locationcount} -\permanent\def\nextinternalorderreference{\the\locationorder} - -\permanent\def\setnextinternalreference - {\global\advance\locationcount\plusone} - -\permanent\def\setnextinternalreferences#kind#name% plural - {\clf_setnextinternalreference{#kind}{#name}} - -\permanent\def\getinternalorderreference#kind#name% - {\clf_currentreferenceorder{#kind}{#name}} - -\permanent\def\thisissomeinternal#kind#name% only for old time sake, will go away - {\begingroup - \clf_setinternalreference - reference {#kind:#name}% no view - \relax - \hpack attr \destinationattribute\lastdestinationattribute{}% - \endgroup} - -\installcorenamespace{savedinternalreference} - -\letvalue{\??savedinternalreference\s!default}\!!zerocount - -\permanent\protected\def\storeinternalreference#1#2% - {\setxvalue{\??savedinternalreference\currentstructurename}{\number#2}} - -\newconditional\preferpagereferences - -\permanent\def\gotosomeinternal#kind#name#target#text% - {\ifconditional\preferpagereferences - \directgoto{#text}[page(#target)]% - \else - \directgoto{#text}[#kind:#name]% - \fi} - -\permanent\def\gotonextinternal#text#target% - {\directgoto{#text}[internal(#target)]} - -%D In this module we define three system references: one for handling navigational, -%D viewer specific, commands, another for jumping to special pages, like the first -%D or last one, and a third reference for linking tree like lists, like tables of -%D contents. The latter two adapt themselves to the current state. -%D -%D An example of an action is: -%D -%D \starttyping -%D \goto{some action}[PreviousJump] -%D \stoptyping -%D -%D as well as: -%D -%D \starttyping -%D \goto{some text}[\v!action(PreviousJump] -%D \stoptyping -%D -%D One can also activate an automatic prefix mechanism. By setting the -%D \type {\prefix} variable to \type {+}, the prefix is incremented, when set to -%D \type {-} or empty, the prefix is reset. Other values become the prefix. - -\newcount\prefixcounter - -\newconditional\autocrossfilereferences - -\appendtoks - \edef\p_autofile{\referencingparameter\c!autofile}% - \ifx\p_autofile\v!yes - \settrue \autocrossfilereferences - \else - \setfalse\autocrossfilereferences - \fi -\to \everysetupreferencing - -\appendtoks - \edef\p_export{\referencingparameter\c!export}% - \ifx\p_export\v!yes - \clf_exportreferences - \fi -\to \everygoodbye - -\permanent\protected\def\setupglobalreferenceprefix[#prefix]% - {\xdef\referenceprefix{#prefix}} - -\permanent\protected\def\globalpushreferenceprefix#prefix% - {\xdef\referenceprefix{\clf_pushreferenceprefix{#prefix}}} - -\permanent\protected\def\globalpopreferenceprefix - {\xdef\referenceprefix{\clf_popreferenceprefix}} - -\permanent\protected\def\pushreferenceprefix#prefix% - {\edef\referenceprefix{\clf_pushreferenceprefix{#prefix}}} - -\permanent\protected\def\popreferenceprefix - {\edef\referenceprefix{\clf_popreferenceprefix}} - -\def\m_strc_references_prefix_yes{+} -\def\m_strc_references_prefix_nop{-} - -\permanent\protected\def\setupreferenceprefix[#prefix]% - {\edef\p_prefix{#prefix}% - \ifempty\p_prefix - \let\referenceprefix\empty - \orelse\ifx\p_prefix\m_strc_references_prefix_yes - \letreferencingparameter\c!prefix\s!unknown - \global\advance\prefixcounter\plusone - \edef\referenceprefix{\the\prefixcounter}% - \orelse\ifx\p_prefix\m_strc_references_prefix_nop - \letreferencingparameter\c!prefix\s!unknown - \let\referenceprefix\empty - \orelse\ifx\p_prefix\s!unknown - % forget about it - \else - \let\referenceprefix\p_prefix - \fi} - -\appendtoks - \setupreferenceprefix[\referencingparameter\c!prefix] -\to \everysetupreferencing - -%D We can typeset a reference using \type {\in}, \type {\at} and \type {\about} and -%D goto specific locations using \type {\goto}. The last one does not make that much -%D sense in a paper document. To complicate things, \PLAIN\ \TEX\ also implements an -%D \type {\in} but fortunately that one only makes sense in math mode. -%D -%D Typesetting the reference is a bit more complicated than one would at first sight -%D expect. This is due to the fact that we distinguish three (five) alternative -%D calls: -%D -%D \placefigure -%D [here][three calls] -%D {Three alternatives reference calls.} -%D {\startcombination[1*3] -%D {\framed{\type{ \in }}} {a} -%D {\framed{\type{ \at }}} {b} -%D {\framed{\type{\goto}}} {c} -%D \stopcombination} -%D -%D \startbuffer -%D \in figure[fig:three calls] -%D \in{figure}[fig:three calls] -%D \in figure a[fig:three calls] -%D \in{figure}{a}[fig:three calls] -%D figure~\in[fig:three calls] -%D \stopbuffer -%D -%D \typebuffer -%D -%D This turns up as: -%D -%D \startlines -%D \getbuffer -%D \stoplines -%D -%D The dual \type {{}} results in a split reference. In a document meant for paper, -%D one is tempted to use the last (most straightforward) alternative. When a -%D document is also meant voor electronic distribution, the former alternatives have -%D preference, because everything between the \type {\in} and~\type {[} becomes -%D active (and when asked for, typeset in a different color and typeface). - -\appendtoks - \ifdefined\in \let\normalmathin \in \protected\def\in {\mathortext\normalmathin \strc_references_in } \else \let\in \strc_references_in \fi - \ifdefined\at \let\normalmathat \at \protected\def\at {\mathortext\normalmathat \strc_references_at } \else \let\at \strc_references_at \fi - \ifdefined\about \let\normalmathabout\about \protected\def\about{\mathortext\normalmathabout\strc_references_about} \else \let\about\strc_references_about \fi - \ifdefined\from \let\normalmathfrom \from \protected\def\from {\mathortext\normalmathfrom \strc_references_from } \else \let\from \strc_references_from \fi - \ifdefined\over \let\normalmathover \over \protected\def\over {\mathortext\normalmathover \strc_references_about} \else \let\over \strc_references_about \fi -\to \everydump - -\permanent \def\filterreference #key{\clf_filterreference{#key}} % no checking, expanded -\permanent\protected\def\getreferenceentry#key{\clf_filterreference{#key}} % no checking, unexpanded - -\def\currentreferencenumber {\clf_filterreference{number}} -\def\currentreferencepage {\clf_filterreference{page}} -\def\currentreferencetitle {\clf_filterreference{title}} -\def\currentreferencetext {\clf_filterreference{text}} -\def\currentreferencedefault {\clf_filterreference{default}} -\def\currentreferencerealpage{\clf_filterreference{realpage}} - -%D The most straightforward way of retrieving references is using \type {\ref}. - -\permanent\tolerant\protected\def\getreference[#key]#spacer[#label]% #key = number page title text default realpage ... - {\ifarguments\or - \strc_references_dummy - \else - \doifelsereferencefound{#label}{\clf_filterreference{#key}}\strc_references_dummy - \fi} - -\aliased\let\ref\getreference - -%D Special cases: - -\protected\def\strc_references_about[#label]% - {\dontleavehmode - \begingroup - \enforced\let\crlf\space - \enforced\let\\\space - \postponenotes % might go - \referencingparameter\c!left - \doifelsereferencefound{#label} - {\goto{\limitatetext\currentreferencetitle{\referencingparameter\c!width}\unknown}[#label]}% not so efficient (dup lookup) - {}% todo - \flushnotes % might go - \referencingparameter\c!right - \endgroup} - -%D The previously discussed setup macro lets us specify the representation of -%D references. A symbol reference does not show the specific data, like the number -%D of a figure, but shows one of: \hbox {$^\goforwardcharacter$ -%D $^\gobackwardcharacter$ $^\gonowherecharacter$}, depending on the direction to -%D go. -%D -%D \starttyping -%D ... \somewhere{backward text}{forward text}[someref] ... -%D ... \atpage[someref] ... -%D \stoptyping - -% standard detail -% -% 0 = unknown unknown -% 1 = same on same page -% 2 = before preceding page -% 3 = after following page -% -% 4 = above above on same page -% 5 = below below on same page - -% todo: optimize for use in pagebody -% todo: maybe make it optional - -% \setuppagenumbering[alternative=doublesided] -% \setupreferencing [doublesided=no] % yes is default -% -% \somewhere{backward}{foreward}[label] -% \someplace{preceding}{backward}{current}{foreward}{following}[label] -% \atpage[#label] -% \doifcheckedpagestate{label}{preceding}{backward}{current}{foreward}{following}{otherwise} -% -% \dorecurse {20} { -% \placefigure[here][fig:#1]{}{\externalfigure[dummy]} -% \dorecurse {20} { -% ##1: \atpage[fig:##1] / -% \doifcheckedpagestate -% {fig:##1} -% {preceding}{backward}{current}{foreward}{following} -% {otherwise} -% } -% } - -\newcount \nofreferencestates -\newconditional\pagestatespread - -\appendtoks - \doifelse{\referencingparameter\c!doublesided}\v!yes\settrue\setfalse\pagestatespread -\to \everysetupreferencing - -\setupreferencing - [\c!doublesided=\v!yes] - -\permanent\def\referencepagestate - {\numexpr\clf_referencepagestate - {rst::\number\nofreferencestates}% - \relax} - -\permanent\def\referencepagedetail - {\numexpr\clf_referencepagedetail - {rst::\number\nofreferencestates}% - true % - \ifconditional\pagestatespread false\ifdoublesided true\else false\fi\fi - \relax} - -\permanent\def\referencerealpage {\clf_referencerealpage} % todo: no need for wrapping -\permanent\def\referencecolumnnumber{\clf_referencecolumn} % todo: no need for wrapping - -% So we need : instead of \ but that's only lmtx: -% -% \def\referencecolumnnumber -% {\numexpr\dimexpr\clf_referenceposx-\cutspace\relax:\dimexpr\makeupwidth/\nofcolumns\relax+\plusone\relax} -% -% Tacos patch of the older one, kept here as illustration -% -% \def\referencecolumnnumber -% {\numexpr -% \dimexpr\clf_referenceposx-\cutspace-\makeupwidth/(2*\nofcolumns)\relax -% /\dimexpr \makeupwidth/ \nofcolumns \relax -% +\plusone -% \relax} - - -\permanent\protected\def\tracedpagestate - {{\blue\tttf(\ifcase\referencepagedetail unknown\or same\or previous\or next\or above\or below\else unknown\fi)}} - -\permanent\protected\def\markreferencepage - {\dontleavehmode\begingroup - \iftrialtypesetting - % issue warning that not stable - \else - % needs checking ... but probably never in trialmode - \global\advance\nofreferencestates\plusone - \xypos{rst::\number\nofreferencestates}% - % \tracedpagestate - \fi - \endgroup} - -\permanent\protected\def\doifcheckedpagestate#label% #preceding#backward#current#foreward#following#otherwise% - {\doifelsereferencefound{#label}\strc_references_handle_page_state_yes\strc_references_handle_page_state_nop} - -\let\strc_references_handle_page_state_nop\sixthofsixarguments - -\def\strc_references_handle_page_state_yes - {\markreferencepage - \ifcase\referencepagedetail - \expandafter\sixthofsixarguments \or - \expandafter\thirdofsixarguments \or - \expandafter\firstofsixarguments \or - \expandafter\fifthofsixarguments \or - \expandafter\secondofsixarguments\or - \expandafter\fourthofsixarguments\else - \expandafter\sixthofsixarguments \fi} - -\permanent\protected\def\referencesymbol - {\hpack\bgroup - \strut - \markreferencepage - \high - {\setupsymbolset[\interactionparameter\c!symbolset]% - \symbol[\ifcase\referencepagedetail\v!somewhere\or\v!nowhere\or\v!previous\or\v!next\or\v!previous\or\v!next\else\v!somewhere\fi]}% - \egroup} - -%D Hereafter the \type {\ignorespaces} binds the state node to next character (more likely -%D than a preceding one) and one can always add an explicit space. - -\permanent\protected\def\somewhere#backward#foreward#dummy[#label]% #dummy gobbles space around #foreward - {\doifcheckedpagestate{#label}% - {\goto{#backward}[#label]}% - {\goto{#backward}[#label]}% - {\ignorespaces}% - {\goto{#foreward}[#label]}% - {\goto{#foreward}[#label]}% - {#label}}% - -\permanent\protected\def\someplace#preceding#backward#current#foreward#following#dummy[#label]% #dummy gobbles space around #foreward - {\doifcheckedpagestate{#label}% - {\doifelsenothing{#preceding}{\goto{#preceding}[#label]}\ignorespaces}% - {\doifelsenothing {#backward}{\goto {#backward}[#label]}\ignorespaces}% - {\doifelsenothing {#current}{\goto {#current}[#label]}\ignorespaces}% - {\doifelsenothing {#foreward}{\goto {#foreward}[#label]}\ignorespaces}% - {\doifelsenothing{#following}{\goto{#following}[#label]}\ignorespaces}% - {#label}} - -\permanent\protected\def\atpage[#label]% todo - {\doifcheckedpagestate{#label}% - {\goto{\labeltext\v!precedingpage}[#label]}% - {\goto{\labeltext\v!hencefore}[#label]}% - {\ignorespaces}% - {\goto{\labeltext\v!hereafter}[#label]}% - {\goto{\labeltext\v!followingpage}[#label]}% - {\goto{\labeltexts\v!page\strc_references_dummy}[#label]}} - -% Someone requested this but in retrospect didn't need it so we keep it as example. -% Beware: a node is injected which is why we add ignorespaces! -% -% \protected\def\strc_references_conditional#action#text[#condition]#dummy[#label]% -% {\doifcheckedpagestate{#label}% -% {\doifelse{#condition}\v!precedingpage{#action{#text}[#label]}\ignorespaces}% -% {\doifelse{#condition}\v!hencefore {#action{#text}[#label]}\ignorespaces}% -% {\doifelse{#condition}\v!current {#action{#text}[#label]}\ignorespaces}% -% {\doifelse{#condition}\v!hereafter {#action{#text}[#label]}\ignorespaces}% -% {\doifelse{#condition}\v!followingpage{#action{#text}[#label]}\ignorespaces}% -% {#label}} -% -% \protected\def\conditionalat {\strc_references_conditional\at} -% \protected\def\conditionalin {\strc_references_conditional\in} -% \protected\def\conditionalabout{\strc_references_conditional\about} - -%D The other alternatives just conform their names: only the label, only the text, or the -%D label and the text. - -% \dounknownreference -> \dummyreference - -\permanent\def\symbolreference[#label]% for old times sake - {\goto{\referencesymbol}[#label]} - -% \referencecontentmode 0=all 1=label 2=text 3=symbol - -\newtoks\leftreferencetoks -\newtoks\rightreferencetoks -\newtoks\defaultleftreferencetoks -\newtoks\defaultrightreferencetoks - -\permanent\let\rightofreferencecontent\empty -\permanent\let\leftofreference \empty -\permanent\let\rightofreference \empty - -\permanent\protected\def\leftofreferencecontent - {\removeunwantedspaces - \nonbreakablespace - \ignorespaces} - -\installcorenamespace{referencinginteraction} - -\def\strc_references_interaction_all - {\the\leftreferencetoks - \doifelsesometoks\leftreferencetoks \leftofreferencecontent \donothing - \leftofreference - \doifelsesometoks\leftreferencetoks\onlynonbreakablespace\relax % new, replace space by nonbreakable if present - \currentreferencecontent - \rightofreference - \doifelsesometoks\rightreferencetoks\rightofreferencecontent\donothing - \the\rightreferencetoks} - -\letvalue{\??referencinginteraction\v!all}\strc_references_interaction_all - -\setvalue{\??referencinginteraction\v!label}% - {\leftofreference - \the\leftreferencetoks - \the\rightreferencetoks - \rightofreference} - -\setvalue{\??referencinginteraction\v!text}% - {\leftofreference - \currentreferencecontent - \rightofreference} - -\setvalue{\??referencinginteraction\v!symbol}% - {\referencesymbol} - -\def\referencesequence - {\ifcsname\??referencinginteraction\referencingparameter\c!interaction\endcsname - \expandafter\lastnamedcs - \else - \expandafter\strc_references_interaction_all - \fi} - -\newtoks\everyresetinatreference - -\appendtoks - \enforced\glet\leftofreference \relax - \enforced\glet\rightofreference\relax -\to \everyresetinatreference - -\def\strc_references_start_goto - {\dontleavehmode - \begingroup} - -\def\strc_references_stop_goto - {\the\everyresetinatreference - \endgroup} - -\def\strc_references_pickup_goto - {\dodoublegroupempty\strc_references_pickup_goto_indeed} - -\def\strc_references_pickup_goto_indeed#left#right#dummy[#label]% #dummy gobbles spaces (really needed) - {\leftreferencetoks - \iffirstargument - {#left}% - \else - \defaultleftreferencetoks - \enforced\let\leftofreferencecontent\empty - \fi - \rightreferencetoks - \ifsecondargument - {#right}% - \else - \defaultrightreferencetoks - \enforced\let\rightofreferencecontent\empty - \fi - % inefficient: double resolve - \doifelsereferencefound{#label} % we need to resolve the text - {\goto{\referencesequence}[#label]} - {\let\currentreferencecontent\strc_references_dummy - \goto{\referencesequence}[#label]}% - \strc_references_stop_goto} - -\protected\def\strc_references_in - {\strc_references_start_goto - \let\currentreferencecontent\currentreferencedefault - \strc_references_pickup_goto} - -\protected\def\strc_references_at - {\strc_references_start_goto - \let\currentreferencecontent\currentreferencepage - \strc_references_pickup_goto} - -%D \macros -%D {definereferenceformat} -%D -%D The next few macros were made for for David Arnold and Taco Hoekwater. They can -%D be used for predefining reference texts, and thereby stimulate efficiency. -%D -%D \starttyping -%D \definereferenceformat[informula] [left=(,right=),text=formula] -%D \definereferenceformat[informulas] [left=(,right=),text=formulas] -%D \definereferenceformat[andformula] [left=(,right=),text=and] -%D \definereferenceformat[andformulas][left=(,right=),text=and] -%D -%D \informula [b] and \informula [for:c] -%D the \informula {formulas}[b] \informula {and} [for:c] -%D the \informulas {formulas}[b] \informula {and} [for:c] -%D the \informulas [b] \informula {en} [for:c] -%D the \informulas [b] \andformula [for:c] -%D \stoptyping -%D -%D Instead of a text, one can specify a label, which should be defined with \type -%D {\setuplabeltext}. -%D -%D Watch out: the second argument is somewhat special and mostly meant for a suffix -%D to a number: -%D -%D \startbuffer -%D \definereferenceformat [intesta] [left=(,right=),text=Whatever~] -%D \definereferenceformat [intestb] [left=(,right=),label=figure] -%D -%D \placeformula[x]\startformula a \stopformula -%D -%D \starttabulate[|||||] -%D \NC \in [x] \NC \in {left}[x] \NC \in {}{right}[x] \NC \in {left}{right}[x] \NC \NR -%D \NC \intesta[x] \NC \intesta{left}[x] \NC \intesta{}{right}[x] \NC \intesta{left}{right}[x] \NC \NR -%D \NC \intestb[x] \NC \intestb{left}[x] \NC \intestb{}{right}[x] \NC \intestb{left}{right}[x] \NC \NR -%D \stoptabulate -%D \stopbuffer -%D -%D \typebuffer \getbuffer - -% to be done: interfaced - -\installcorenamespace{referenceformat} - -\installcommandhandler \??referenceformat {referenceformat} \??referenceformat - -\appendtoks - \setuevalue\currentreferenceformat{\strc_references_apply_format{\currentreferenceformat}}% -\to \everydefinereferenceformat - -\setupreferenceformat - [\c!left=, - \c!right=, - \c!text=, - \c!label=, - \c!autocase=\v!no, - \c!style=, - \c!type=default, % to be done: interfaced - \c!setups=, - \c!color=] - -\protected\def\strc_references_apply_format#name% - {\strc_references_start_goto - \edef\currentreferenceformat{#name}% - \enforced\gdef\leftofreference {\referenceformatparameter\c!left }% - \enforced\gdef\rightofreference {\referenceformatparameter\c!right }% - \edef\currentreferenceformatlabel {\referenceformatparameter\c!label }% - \edef\currentreferenceformattype {\referenceformatparameter\c!type }% - \edef\currentreferenceformatsetups {\referenceformatparameter\c!setups }% - \edef\currentreferenceformatautocase{\referenceformatparameter\c!autocase}% - \usereferenceformatstyleandcolor\c!style\c!color - \ifempty\currentstyleparameter \else - \resetinteractionparameter\c!style - \fi - \ifempty\currentcolorparameter \else - \resetinteractionparameter\c!contrastcolor - \resetinteractionparameter\c!color - \fi - \ifx\currentreferenceformatlabel\autoreferencelabeltextflag - \edef\currentreferenceformatlabel{\autoreferencelabeltext}% - \fi - \ifx\currentreferenceformatautocase\v!yes - \setcharactercleaning[1]% - \fi - \ifempty\currentreferenceformatlabel - \defaultleftreferencetoks {\referenceformatparameter\c!text}% - \defaultrightreferencetoks\emptytoks - \else - \defaultleftreferencetoks {\leftlabeltext \currentreferenceformatlabel}% - \defaultrightreferencetoks{\rightlabeltext\currentreferenceformatlabel}% - \fi - \ifempty\currentreferenceformattype - \def\currentreferenceformattype{default}% - \fi - % - \ifempty\currentreferenceformatsetups - \def\currentreferencecontent{\filterreference\currentreferenceformattype}% - \else - \def\currentreferencecontent{\directsetup\currentreferenceformatsetups}% - \fi - % - \enforced\let\leftofreferencecontent \empty - \enforced\let\rightofreferencecontent\empty - \strc_references_pickup_goto} - -\def\autoreferencelabeltextflag{*} % a proper key like 'auto' or 'name' can clash with a label key - -\permanent\protected\def\autoreferencelabeltext - {\clf_getcurrentreferencemetadata{name}} - -% \starttext -% \definereferenceformat[inxx] [left=(,right=),text=txt] -% \setupinteraction[state=start] -% \chapter[one]{xx} -% [\goto{state}[file(mk-last-state)]] -% [\goto{state} [file(mk-last-state)]] -% [\at{page} [one]] -% [\at{page}[one]] -% [\at{page}{okay}[one]] -% [\inxx{a}{b}[one]] -% \stoptext - -% \startsetups referenceformat:numberplustext -% \filterreference{number}, \filterreference{title} -% \stopsetups -% -% \definereferenceformat[hellup][text=Hellup ,setups=referenceformat:numberplustext] - -%D In interactive documents going to a specific location is not bound to cross -%D references. The \type {\goto} commands can be used to let users access another -%D part of the document. In this respect, interactive tables of contents and -%D registers can be considered goto's. Because in fact a \type {\goto} is just a -%D reference without reference specific data, the previous macros are implemented -%D using the goto functionality. -%D -%D \showsetup{goto} -%D -%D One important characteristic is that the first argument of \type {\goto} (and -%D therefore \type {\at} and \type {\in} is split at spaces. This means that, -%D although hyphenation is prevented, long references can cross line endings. - -% \starttext -% \setupinteraction[state=start] -% [\goto{state}[file(mk-last-state)]] -% [\goto{state} [file(mk-last-state)]] -% \stoptext - -\newconditional\uselocationstrut \settrue\uselocationstrut - -\permanent\def\extrareferencearguments - {highlight \luaconditional\highlighthyperlinks\space - newwindow \luaconditional\gotonewwindow\space - layer {\currentviewerlayer}} - -\permanent\protected\def\directgoto - {\ifconditional\uselocationstrut - \expandafter\strc_references_direct_goto - \else - \expandafter\strc_references_direct_goto_htdp - \fi} - -\permanent\protected\def\goto - {\ifconditional\uselocationstrut - \expandafter\strc_references_goto - \else - \expandafter\strc_references_goto_htdp - \fi} - -% The unbox trick is needed in order to permit \par inside a reference. Otherwise -% the reference attribute migrates to the outer boxes. - -\newcount\lastsavedreferenceattribute - -\newbox\referencebox - -\permanent\def\revivesavedreferenceattribute % sometimes handy as no test etc needed - {\c_attr_reference\lastsavedreferenceattribute} - -\def\strc_references_direct_goto#content[#label]% no test for valid references - {\dontleavehmode - \begingroup - \c_attr_reference\attributeunsetvalue - \global\lastsavedreferenceattribute\attributeunsetvalue - \iflocation - \clf_injectreference - {\referenceprefix}% - {#label}% - {% - height \ht\strutbox - depth \dp\strutbox - \extrareferencearguments - }% - \relax - \setlocationattributes - \setstrut % can be option - \global\lastsavedreferenceattribute\lastreferenceattribute - \c_attr_reference\lastreferenceattribute - \dostarttagged\t!link\empty % not here - #content% - \dostoptagged - \else - #content% - \fi - \endgroup} - -\def\strc_references_direct_goto_htdp#content[#label]% no test for valid references - {\dontleavehmode - \begingroup - \global\lastsavedreferenceattribute\attributeunsetvalue - \c_attr_reference\attributeunsetvalue - \iflocation - \clf_injectreference - {\referenceprefix}% - {#label}% - {% - height \dimexpr\interactionparameter\c!height\relax - depth \dimexpr\interactionparameter\c!depth \relax - \extrareferencearguments - }% - \relax - \setlocationattributes - \c_attr_reference\lastreferenceattribute - \global\lastsavedreferenceattribute\lastreferenceattribute - \dostarttagged\t!link\empty - #content% - \dostoptagged - \else - #content% - \fi - \endgroup} - -\def\strc_references_goto#content#dummy[#label]% #dummy gobbles spaces - {\dontleavehmode - \begingroup - %\setbox\referencebox\hbox\bgroup % experiment, might change again to non \par support - \global\lastsavedreferenceattribute\attributeunsetvalue - \c_attr_reference\attributeunsetvalue - \iflocation - \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}% - {\expandtexincurrentreference - \clf_injectcurrentreferencehtdp - \ht\strutbox - \dp\strutbox - \relax - \setlocationattributes - \setstrut % can be option - \global\lastsavedreferenceattribute\lastreferenceattribute - \c_attr_reference\lastreferenceattribute - \dostarttagged\t!link\empty - #content% - \dostoptagged}% - {#content}% - \else - #content% - \fi - %\egroup\unhbox\referencebox} - \endgroup} - -\def\strc_references_goto_internal#content#dummy[#internal]% #dummy gobbles spaces - {\dontleavehmode - \begingroup - \global\lastsavedreferenceattribute\attributeunsetvalue - \c_attr_reference\attributeunsetvalue - \iflocation - \setstrut % can be option - \strc_references_get_simple_reference{#internal}% - \global\lastsavedreferenceattribute\currentreferenceattribute - \c_attr_reference\currentreferenceattribute - \setlocationattributes - \dostarttagged\t!link\empty - #content% - \dostoptagged - \else - #content% - \fi - \endgroup} - -\permanent\protected\def\startgoto[#label]% - {\dontleavehmode - \begingroup - \iflocation - \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}% - {\expandafter\strc_references_start_goto_yes}% - {\expandafter\strc_references_start_goto_nop}% - \else - \expandafter\strc_references_start_goto_nop - \fi} - -\permanent\protected\def\strc_references_start_goto_nop - {\let\stopgoto\strc_references_stop_goto_nop} - -\permanent\protected\def\strc_references_stop_goto_nop - {\endgroup} - -\protected\def\strc_references_start_goto_yes - {\expandtexincurrentreference - \clf_injectcurrentreferencehtdp - \ht\strutbox - \dp\strutbox - \relax - \setlocationattributes - \setstrut % can be option - \global\lastsavedreferenceattribute\lastreferenceattribute - \c_attr_reference\lastreferenceattribute - \dostarttagged\t!link\empty - \let\stopgoto\strc_references_stop_goto_yes} - -\protected\def\strc_references_stop_goto_yes - {\dostoptagged - \endgroup} - -\def\strc_references_goto_htdp#content#dummy[#label]% dummy gobbles spaces - {\dontleavehmode - \begingroup - \global\lastsavedreferenceattribute\attributeunsetvalue - \c_attr_reference\attributeunsetvalue - \iflocation - \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}% - {\expandtexincurrentreference - \clf_injectcurrentreferencehtdp - \dimexpr\interactionparameter\c!height\relax - \dimexpr\interactionparameter\c!depth \relax - \relax - \setlocationattributes - \global\lastsavedreferenceattribute\lastreferenceattribute - \c_attr_reference\lastreferenceattribute - \dostarttagged\t!link\empty - #content% - \dostoptagged}% - {#content}% - \else - #content% - \fi - \endgroup} - -\permanent\protected\def\directgotobox#content[#label]% no test for valid references - {\dontleavehmode - \begingroup - \global\lastsavedreferenceattribute\attributeunsetvalue - \c_attr_reference\attributeunsetvalue - \iflocation - \clf_injectreference - {\referenceprefix}% - {#label}% - {\extrareferencearguments}% - \relax - \setlocationattributes - \global\lastsavedreferenceattribute\lastreferenceattribute - \dostarttagged\t!link\empty - \hbox attr \referenceattribute \lastreferenceattribute {#content}% - \dostoptagged - \else - #content% - \fi - \endgroup} - -\permanent\protected\def\directgotospecbox#resolver#content[#label]% no test for valid references - {\dontleavehmode - \begingroup - \global\lastsavedreferenceattribute\attributeunsetvalue - \c_attr_reference\attributeunsetvalue - \iflocation - \clf_injectreference - {\referenceprefix}% - {#label}% - {\extrareferencearguments}% - \relax - \setlocationcolorspec{#resolver}% no consequence for strut - \global\lastsavedreferenceattribute\lastreferenceattribute - \dostarttagged\t!link\empty - \hbox attr \referenceattribute \lastreferenceattribute {#content}% - \dostoptagged - \else - #content% - \fi - \endgroup} - -\permanent\protected\def\directgotodumbbox#content[#label]% no test for valid references - {\dontleavehmode - \begingroup - \global\lastsavedreferenceattribute\attributeunsetvalue - \c_attr_reference\attributeunsetvalue - \iflocation - \clf_injectreference - {\referenceprefix}% - {#label}% - {\extrareferencearguments}% - \relax - \global\lastsavedreferenceattribute\lastreferenceattribute - \dostarttagged\t!link\empty - \hbox attr \referenceattribute \lastreferenceattribute {#content}% - \dostoptagged - \else - #content% - \fi - \endgroup} - -\permanent\protected\def\gotobox#content[#label]% - {\dontleavehmode - \begingroup - \global\lastsavedreferenceattribute\attributeunsetvalue - \c_attr_reference\attributeunsetvalue - \iflocation - \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}% - {\expandtexincurrentreference - \clf_injectcurrentreference - \setlocationattributes - \global\lastsavedreferenceattribute\lastreferenceattribute - \dostarttagged\t!link\empty - \hbox attr \referenceattribute \lastreferenceattribute {#content}% - \dostoptagged}% - {#content}% - \else - #content% - \fi - \endgroup} - -\permanent\protected\def\gotowdhtbox#width#height[#label]% fast variant for overlays - {\dontleavehmode - \begingroup - \setbox\scratchbox\emptyhbox - \wd\scratchbox#width% - \ht\scratchbox#height% - \global\lastsavedreferenceattribute\attributeunsetvalue - \c_attr_reference\attributeunsetvalue - \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}% - {\clf_injectcurrentreference - \global\lastsavedreferenceattribute\lastreferenceattribute - \hpack attr \referenceattribute \lastreferenceattribute {\box\scratchbox}} - {\box\scratchbox}% - \endgroup} - -%D An reference to another document can be specified as a file or as an \URL. Both -%D are handled by the same mechanism and can be issued by saying something like: -%D -%D \starttyping -%D \goto[dictionary::the letter a] -%D \stoptyping -%D -%D One can imagine that many references to such a dictionary are made, so in most -%D cases such a document reference in an indirect one. -%D -%D \showsetup{useexternaldocument} -%D -%D For example: -%D -%D \starttyping -%D \useexternaldocument -%D [dictionary][engldict] -%D [The Famous English Dictionary] -%D \stoptyping -%D -%D The next macro implements these relations, and also take care of loading the -%D document specific references. -%D -%D The \URL\ alternative takes four arguments: -%D -%D \showsetup{useURL} -%D -%D like: -%D -%D \starttyping -%D \useURL -%D [dictionary][http://www.publisher.com/public][engldict] -%D [The Famous English Dictionary] -%D \stoptyping -%D -%D Several specifications are possible: -%D -%D \starttyping -%D \useURL [id] [url] [file] [description] -%D \useURL [id] [url] [file] -%D \useURL [id] [url] -%D \stoptyping -%D -%D This time we don't load the references when no file is specified. This is logical -%D when one keeps in mind that a valid \URL\ can also be a mail address. - -\permanent\tolerant\protected\def\useurl[#label]#spacer[#url]#spacer[#file]#spacer[#description]% - {\clf_useurl{#label}{\detokenize{#url}}{\detokenize{#file}}{\detokenize{#description}}} - -\permanent\tolerant\protected\def\usefile[#label]#spacer[#file]#spacer[#description]% - {\clf_usefile{#label}{\detokenize{#file}}{\detokenize{#description}}} - -\aliased\let\useURL \useurl -\aliased\let\useexternaldocument\usefile - -\permanent\def\doifelseurldefined #label{\clf_doifelseurldefined {#label}} % todo: no wrap -\permanent\def\doifelsefiledefined#label{\clf_doifelsefiledefined{#label}} % todo: no wrap - -\aliased\let\doifurldefinedelse \doifelseurldefined -\aliased\let\doiffiledefinedelse\doifelsefiledefined - -%D \macros -%D {url,setupurl} -%D -%D We also have: \type {\url} for directly calling the description. So we can say: -%D -%D \starttyping -%D \useURL [one] [http://www.test.nl] -%D \useURL [two] [http://www.test.nl] [] [Some Site] -%D -%D \url[one] or \from[two] or \goto{Whatever Site}[URL(two)] -%D \stoptyping -%D -%D An \URL\ can be set up with -%D -%D \showsetup{setupurl} - -\installcorenamespace{url} - -\installdirectcommandhandler \??url {url} - -\setupurl - [\c!style=\v!type, - \c!color=] - -\permanent\protected\def\url[#label]% move \hyphenatedurl to lua end (is already lua) - {\dontleavehmode - \begingroup - \useurlstyleandcolor\c!style\c!color - \hyphenatedurl{\clf_geturl{#label}}% - \endgroup} - -%D This macro is hooked into a support macro, and thereby \URL's break ok, according -%D to the setting of a switch, -%D -%D \startbuffer -%D \useURL -%D [test] -%D [sentence_sentence~sentence//sentence:sentence.sentence] -%D \stopbuffer -%D -%D \typebuffer -%D -%D Such an \URL\ is, depending on the settings, hyphenated as: -%D -%D \getbuffer - -%D When defining the external source of information, one can also specify a suitable -%D name (the last argument). This name can be called upon with: -%D -%D \showsetup{from} -%D -%D We keep this for compatibility reasons, hence the hackery. - -\permanent\tolerant\protected\def\strc_references_from[#label]% - {\dontleavehmode - \goto{\clf_from{#label}}[fileorurl(#label)]} - -\permanent\def\dofromurldescription#content% called at the lua end - {#content} - -\permanent\def\dofromurlliteral#content% called at the lua end - {\useurlstyleandcolor\c!style\c!color - \hyphenatedurl{#content}} - -\aliased\let\dofromfiledescription\dofromurldescription -\aliased\let\dofromfileliteral \dofromurlliteral % maybe some day setupfile that inherits from url - -%D We also support: -%D -%D \starttyping -%D \goto{some text}[file(identifier{location}] -%D \stoptyping -%D -%D which is completely equivalent with -%D -%D \starttyping -%D \goto{some text}[identifier::location] -%D \stoptyping - -%D A special case of references are those to programs. These, very system dependant -%D references are implemented by abusing some of the previous macros. -%D -%D \showsetup{setupprograms} -%D \showsetup{defineprogram} -%D \showsetup{program} % changed functionality ! -%D -%D The latter gives access to the description of the program, -%D being the last argument to the definition command. - -% also lua, like urls and files - -\installcorenamespace{programs} - -\installdirectcommandhandler \??programs {programs} - -\permanent\tolerant\protected\def\defineprogram[#name]#spacer[#program]#spacer[#description]% - {\clf_defineprogram{#name}{#program}{#description}} - -\permanent\protected\def\program[#name]% incompatible, more consistent, hardy used anyway - {\dontleavehmode - \begingroup - \useprogramsstyleandcolor\c!style\c!color - \clf_getprogram{#name}% - \endgroup} - -%D As we can see, we directly use the special reference mechanism, which means that -%D -%D \starttyping -%D \goto{some text}[program(name{args})] -%D \stoptyping -%D -%D is valid. - -%D The next macro provides access to the actual pagenumbers. When documenting and -%D sanitizing the original reference macros, I decided to keep the present meaning -%D as well as to make this meaning available as a special reference method. So now -%D one can use: -%D -%D \starttyping -%D \gotopage{some text}[location] -%D \gotopage{some text}[number] -%D \gotopage{some text}[file::number] -%D \stoptyping -%D -%D as well as: -%D -%D \starttyping -%D \goto{some text}[page(location)] -%D \goto{some text}[page(number)] -%D \goto{some text}[file::page(number)] -%D \stoptyping -%D -%D Here location is a keyword like \type{nextpage}. -%D -%D \showsetup{gotopage} - -\permanent\tolerant\protected\def\definepage[#name]#spacer[#target]% - {\definereference[#name][page(#target)]} - -\permanent\protected\def\gotopage#text[#target]% - {\goto{#text}[\v!page(#target)]} - -%D The previous definitions are somewhat obsolete so we don't use it here. - -%D We can cross link documents by using: -%D -%D \showsetup{coupledocument} -%D -%D like: -%D -%D \starttyping -%D \coupledocument[print][somefile][chapter,section] -%D \stoptyping -%D -%D After which when applicable, we have available the references: -%D -%D \starttyping -%D \goto{print version}[print::chapter] -%D \stoptyping -%D -%D and alike. The title placement definition macros have a key \type {file}, which -%D is interpreted as the file to jump to, that is, when one clicks on the title. - -\permanent\tolerant\protected\def\coupledocument[#name]#spacer[#file]#spacer[#sections]#spacer[#description]% - {\ifthirdargument - % this will be done differently (when it's needed) - \fi} - -%D \macros -%D {dotextprefix} -%D -%D In previous macros we used \type {\dotextprefix} to generate a space between -%D a label and a number. -%D -%D \starttyping -%D \dotextprefix{text} -%D \stoptyping -%D -%D Only when \type {text} is not empty, a space is inserted. - -\permanent\protected\def\dotextprefix#text% - {\begingroup - \setbox\scratchbox\hbox{#text}% to be solved some day - \ifdim\wd\scratchbox>\zeropoint - \unhbox\scratchbox - \edef\p_separator{\referencingparameter\c!separator}% - \ifempty\p_separator \else - \removeunwantedspaces % remove is new - \p_separator - \fi - \else - \unhbox\scratchbox - \fi - \endgroup} - -%D In the next settings we see some variables that were not used here and that -%D concern the way the pagenumbers refered to are typeset. - -\setupreferencing - [\c!state=\v!start, - \c!autofile=\v!no, - \v!part\c!number=\v!yes, - \v!chapter\c!number=\v!no, - \c!interaction=\v!all, - \c!convertfile=\v!no, - %\c!strut=\v!no, % some day an option - \c!prefix=, - \c!width=.75\makeupwidth, - \c!left=\quotation\bgroup, - \c!right=\egroup, - \c!global=\v!no, - \c!expansion=\v!no, - \c!separator=\nonbreakablespace, - \c!export=\v!no] - -\setupprograms - [\c!directory=, - \c!style=\v!type, - \c!color=] - -\definereference [\v!CloseDocument ] [action(close)] -\definereference [\v!ExitViewer ] [action(exit)] -\definereference [\v!FirstPage ] [action(first)] -\definereference [\v!LastPage ] [action(last)] -\definereference [\v!NextJump ] [action(forward)] -\definereference [\v!NextPage ] [action(next)] -\definereference [\v!PauseMovie ] [action(pausemovie)] -\definereference [\v!PauseSound ] [action(pausesound)] -\definereference [\v!PauseRendering ] [action(pauserendering)] -\definereference [\v!PreviousJump ] [action(backward)] -\definereference [\v!PreviousPage ] [action(previous)] -\definereference [\v!PrintDocument ] [action(print)] -\definereference [\v!SaveForm ] [action(exportform)] -\definereference [\v!LoadForm ] [action(importform)] -\definereference [\v!ResetForm ] [action(resetform)] -\definereference [\v!ResumeMovie ] [action(resumemovie)] -\definereference [\v!ResumeSound ] [action(resumesound)] -\definereference [\v!ResumeRendering ] [action(resumerendering)] -\definereference [\v!SaveDocument ] [action(save)] -\definereference [\v!SaveNamedDocument] [action(savenamed)] -\definereference [\v!OpenNamedDocument] [action(opennamed)] -\definereference [\v!SearchDocument ] [action(search)] -\definereference [\v!SearchAgain ] [action(searchagain)] -\definereference [\v!StartMovie ] [action(startmovie)] -\definereference [\v!StartSound ] [action(startsound)] -\definereference [\v!StartRendering ] [action(startrendering)] -\definereference [\v!StopMovie ] [action(stopmovie)] -\definereference [\v!StopSound ] [action(stopsound)] -\definereference [\v!StopRendering ] [action(stoprendering)] -\definereference [\v!SubmitForm ] [action(submitform)] -\definereference [\v!ToggleViewer ] [action(toggle)] -\definereference [\v!ViewerHelp ] [action(help)] -\definereference [\v!HideField ] [action(hide)] -\definereference [\v!ShowField ] [action(show)] -\definereference [\v!GotoPage ] [action(gotopage)] -\definereference [\v!Query ] [action(query)] -\definereference [\v!QueryAgain ] [action(queryagain)] -\definereference [\v!FitWidth ] [action(fitwidth)] -\definereference [\v!FitHeight ] [action(fitheight)] -\definereference [\v!ShowThumbs ] [action(thumbnails)] -\definereference [\v!ShowBookmarks ] [action(bookmarks)] - -\definereference [\v!HideLayer ] [action(hidelayer)] -\definereference [\v!VideLayer ] [action(videlayer)] -\definereference [\v!ToggleLayer ] [action(togglelayer)] - -\definereference [\v!firstpage] [page(firstpage)] -\definereference [\v!previouspage] [page(previouspage)] -\definereference [\v!nextpage] [page(nextpage)] -\definereference [\v!lastpage] [page(lastpage)] -\definereference [\v!forward] [page(forward)] -\definereference [\v!backward] [page(backward)] -\definereference [\v!firstsubpage] [page(firstsubpage)] -\definereference [\v!previoussubpage] [page(previoussubpage)] -\definereference [\v!nextsubpage] [page(nextsubpage)] -\definereference [\v!lastsubpage] [page(lastsubpage)] - -% we can do this but only when later in resolve (else problems with \chapter[first]{...} -% -% \definereference [\v!first] [page(firstpage)] -% \definereference [\v!previous] [page(prevpage)] -% \definereference [\v!next] [page(nextpage)] -% \definereference [\v!last] [page(lastpage)] -% \definereference [\v!first\v!sub] [page(firstsubpage)] -% \definereference [\v!previous\v!sub] [page(prevsubpage)] -% \definereference [\v!next\v!sub] [page(nextsubpage)] -% \definereference [\v!last\v!sub] [page(lastsubpage)] - -%D We cannot set up buttons (not yet, this one calls a menu macro): - -%D New (and experimental): - -% \starttext -% \chapter{test} -% \placefigure[here][xx:1]{}{\framed{one}} \placefigure[here][xx:2]{}{\framed{three}} -% \placetable [here][xx:3]{}{\framed{two}} \placetable [here][xx:4]{}{\framed{four}} -% \start -% \in{fig}[xx:1] and \in{fig}[xx:2] \in{tab}[xx:3] and \in{tab}[xx:4] -% \stop \blank \start -% \setupreferencestructureprefix[default][prefix=no] -% \in{fig}[xx:1] and \in{fig}[xx:2] \in{tab}[xx:3] and \in{tab}[xx:4] -% \stop \blank \start -% \setupreferencestructureprefix[float][default][prefix=no] -% \in{fig}[xx:1] and \in{fig}[xx:2] \in{tab}[xx:3] and \in{tab}[xx:4] -% \stop \blank \start -% \setupreferencestructureprefix[figure][default][prefix=no] -% \in{fig}[xx:1] and \in{fig}[xx:2] \in{tab}[xx:3] and \in{tab}[xx:4] -% \stop \blank -% \stoptext - -% todo: parameterhandler - -\installcorenamespace{referencingprefix} - -\permanent\def\getreferencestructureprefix#kind#name#category% name will change - {{% - prefix {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefix}% - separatorset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixseparatorset}% - conversion {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversion}% - conversionset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversionset}% - starter {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixstarter}% - stopper {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixstopper}% - set {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixset}% - segments {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixsegments}% - connector {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconnector}% - }% - {% - separatorset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberseparatorset}% - conversion {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberconversion}% - conversionset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberconversionset}% - starter {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberstarter}% - stopper {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberstopper}% - segments {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numbersegments}% - }} - -\permanent\tolerant\protected\def\setupreferencestructureprefix[#kind]#spacer[#category]#spacer[#settings]% - {\ifarguments\or\or - \getparameters[\??referencingprefix:#kind][#category]% - \else - \getparameters[\??referencingprefix#kind:#category][#settings]% - \fi} - -\def\referencestructureprefixparameter#kind#name#category#parameter% - {\ifcsname\??referencingprefix#name:#category#parameter\endcsname - \lastnamedcs - \orelse\ifcsname\??referencingprefix#kind:#category#parameter\endcsname - \lastnamedcs - \orelse\ifcsname\??referencingprefix:#category#parameter\endcsname - \lastnamedcs - \fi} - -\permanent\def\currentreferencedefault % for some reason we need to explicitly expand - {\normalexpanded{\noexpand\clf_filterdefaultreference - {\s!default}% - \noexpand\getreferencestructureprefix\clf_getcurrentprefixspec{\s!default}% returns #kind#name#category - \relax}} - -%D Not all support is visible by looking at the \TEX\ code; here is one of those:^ -%D -%D \starttyping -%D \startinteractionmenu[right] -%D \startbut [section(first {chapter})] first chapter \stopbut -%D \startbut [section(previous{chapter})] previous chapter \stopbut -%D \startbut [section(next {chapter})] next chapter \stopbut -%D \startbut [section(last {chapter})] last chapter \stopbut -%D \blank[2*big] -%D \startbut [section(first {section})] first section \stopbut -%D \startbut [section(previous{section})] previous section \stopbut -%D \startbut [section(next {section})] next section \stopbut -%D \startbut [section(last {section})] last section \stopbut -%D \stopinteractionmenu -%D \stoptyping - -%D Relatively new: -%D -%D \starttyping -%D \chapter{The never ending story} -%D -%D \section{An ending story} -%D -%D \in{chapter}[match(complex bibliographies)] -%D \in{chapter}[match(never ending)] -%D \in{chapter}[match(ending)] -%D \in{chapter}[match(chapter:never ending)] -%D \in{chapter}[match(chapter:ending)] -%D \in{section}[match(section:ending)] -%D \in{figure}[match(float:mess)] -%D \in{figure}[match(figure:mess)] -%D \in{figure (not found)}[match(section:mess)] -%D \in{figure (not found)}[match(section:xxxx)] -%D \in{figure}[match(mess)] -%D -%D \placefigure{What a mess}{} -%D -%D \chapter{About complex bibliographies} -%D -%D \in{chapter}[match(complex bibliographies)] -%D \in{chapter}[match(never ending)] -%D \in{figure}[match(mess)] -%D \stoptyping - -\protect \endinput - -% tricky: -% -% \enabletrackers[nodes.references] -% \setupinteraction[state=start] -% \def\KnuthTest{\input knuth } -% \def\KnuthTest{\input tufte } -% \def\TufteTest{\input tufte } -% \defineoverlay[xxx][\overlaybutton{page(3)}] -% \setupbackgrounds[text][background=xxx] -% \starttext -% test {\red \KnuthTest} test \par -% \button{test}[page(1)] \par -% \goto{page 2 \TeX}[page(2)] \goto{page 2 \TeX}[page(2)] \goto{\TufteTest}[page(2)] test \page -% test \goto{page 3}[page(3)] \goto{\TufteTest\space\par\TufteTest}[page(4)] test \page -% \goto{page 1}[page(1)] \goto{\TufteTest\space test}[page(1)] \page -% \goto{page 1}[page(1)] \goto{\KnuthTest\space test}[page(1)] \page -% test \goto{page 1}[page(1)] {\goto{\KnuthTest\space test}[page(1)]} test -% \goto{page 1}[page(1)] \goto{\TufteTest}[page(1)] test \page -% \stoptext |