\unprotect \unexpanded\def\strc_references_smart {\strc_references_start_goto \let\currentreferencecontent\currentreferencedefault \strc_references_pickup_smart_goto} \def\strc_references_pickup_smart_goto {\dodoublegroupempty\strc_references_pickup_goto_smart_indeed} \starttexdefinition strc_references_pickup_goto_smart_indeed #left#right#dummy[#label] \leftreferencetoks \iffirstargument {#left} \else \defaultleftreferencetoks \let\leftofreferencecontent\empty \fi \rightreferencetoks \ifsecondargument {#right} \else \defaultrightreferencetoks \let\rightofreferencecontent\empty \fi \doifreferencefoundelse{#label} {\goto{\referencesequence}[#label] \strc_references_check_visibility \ifreferenceisvisible\else \space\strc_references_smart_string \fi} {\let\currentreferencecontent\dummyreference \goto{\referencesequence}[#label]} \strc_references_stop_goto \stoptexdefinition \newif\ifreferenceisvisible \referenceisvisiblefalse \starttexdefinition strc_references_check_visibility \def\strc_references_smart_string{\labeltext\v!atpage\currentreferencepage} \referenceisvisiblefalse \ifnum\referencepagestate=\plusone %% 1 = reference on current page \referenceisvisibletrue \else \ifsinglesided \strc_references_do_relative_else\plusone {\def\strc_references_smart_string{\labeltext\v!nextpage}} {\strc_references_do_relative\minusone {\def\strc_references_smart_string{\labeltext\v!previouspage}}{}} \else \ifodd\realpageno \strc_references_do_relative_else\minusone {\def\strc_references_smart_string{\labeltext\v!previouspage} \referenceisvisibletrue} {\strc_references_do_relative_else\plusone {\def\strc_references_smart_string{\labeltext\v!nextpage}}{}} \else \strc_references_do_relative_else\minusone {\def\strc_references_smart_string{\labeltext\v!previouspage}} {\strc_references_do_relative_else\plusone \referenceisvisibletrue{}} \fi \fi \fi \stoptexdefinition \starttexdefinition strc_references_do_relative_else #relativepagenumber \ifnum\currentreferencerealpage=\numexpr\realpageno+#relativepagenumber\relax \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi \stoptexdefinition \let\smartref\strc_references_smart \startinterface all \setinterfacevariable {previouspage} {previouspage} \setinterfacevariable {nextpage} {nextpage} \stopinterface \setuplabeltext [\s!en] [\v!atpage=on page\nobreakspace, %% “at page” sounds weird \v!previouspage=on the previous page, \v!nextpage=on the next page] \protect \useMPlibrary [dum] \setuppagenumbering [alternative=doublesided] \starttext See \smartref{figure}[fig:alpha] and \smartref{figure}[fig:gamma]. \page See \smartref{figure}[fig:alpha] and \smartref{figure}[fig:gamma]. \startplacefigure [reference=fig:alpha] \externalfigure \stopplacefigure \startplacefigure [reference=fig:beta] \externalfigure \stopplacefigure \page See \smartref{figure}[fig:alpha] and \smartref{figure}[fig:gamma]. \startplacefigure [reference=fig:gamma] \externalfigure \stopplacefigure \startplacefigure [reference=fig:delta] \externalfigure \stopplacefigure \page See \smartref{figure}[fig:alpha] and \smartref{figure}[fig:gamma]. \page See \smartref{figure}[fig:alpha] and \smartref{figure}[fig:gamma]. \stoptext