%D \module %D [ file=publ-ini, %D version=2013.05.12, %D title=\CONTEXT\ Publication Support, %D subtitle=Initialization, %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: s! vs v! for default and neutral key/values % todo: too many refs in list % TODO A.-B. Foo (dash as connector, see JMH) % todo: no need for all these %'s % todo: tagging % todo: we cannot use 'default' as this wipes metadata names (maybe no longer do that) % todo: \v!cite => \s!cite % todo: interface with (ml)bibtex (export -> call -> import) % todo: check if 'all' etc are ok ... either use list or use other criterium % todo: \the\everysetupbtxciteplacement probably too often % \definecolor[btx:field] [darkred] % \definecolor[btx:crossref][darkblue] % \definecolor[btx:key] [darkgreen] % \definecolor[btx:todo] [darkyellow] %D We operate on several axis: %D %D \startitemize[packed] %D \startitem we can have several databases (or combinations) \stopitem %D \startitem we can add entries to them if needed (coded in tex) \stopitem %D \startitem we can have several lists each using one of the databases \stopitem %D \startitem we can render each list or citation independently \stopitem %D \stopitemize %D %D We assume that the rendering of a list entry is consistent in a document, %D although one can redefine properties if needed. Adding more granularity would %D complicate the user interface beyond comprehension. \writestatus{loading}{ConTeXt Publication Support / Initialization} \registerctxluafile{publ-dat}{1.001} \registerctxluafile{publ-ini}{1.001} \registerctxluafile{publ-sor}{1.001} \registerctxluafile{publ-aut}{1.001} \registerctxluafile{publ-usr}{1.001} \registerctxluafile{publ-oth}{1.001} % this could become an option \registerctxluafile{publ-fnd}{1.001} % new method (for the moment only local) \registerctxluafile{publ-jrn}{1.001} \registerctxluafile{publ-reg}{1.001} \unprotect \startcontextdefinitioncode \def\s!btx {btx} \def\v!btxcite {btxcite} \def\v!btxlist {btxlist} \def\v!btxrendering {btxrendering} \def\s!btxset {btxset} \def\s!btxref {btxref} \def\s!btxint {btxint} \def\s!btxbck {btxbck} \def\s!btxltx {btxltx} \def\s!btxrtx {btxrtx} \def\s!btxatx {btxatx} \def\s!btxbtx {btxbtx} \def\s!btxspc {btxspc} \def\s!btxlst {btxlst} \def\s!btxcom {btxcom} \definelabelclass[btxlabel][2] \clf_definelabels{btxlabel}{btx}\s!false\relax % It is not that trivial to come up with a proper organization of setup % and control commands for publications. This is because we have complex % inline as well as extensive list rendering. The rules are partially % driven by somewhat archaic bibtex specifications and evolving journal % (or field) specific demands. The logic in the standards is often so % complex that it looks like manual rendering is assumed. But, we want to % automate the process as much as possible. % % Another complication is that in manuals we want to demonstrate different % properties of the implementation and therefore we need a way to handle % independent standards, databases, etc. This has resulted in the following % organization: % % - general setup (rather minimal) % - list setup (rendering) % - cite setup % - dataset setup % % The rendering is mostly driven by setups. In there we can call for fields % in the database but also for virtual fields or combinations. % The main rendering style (standard driven). %D We assume that a specification is global or used grouped. It doesn't make much sense %D to split between cite and list here as it only complicates matters (timing) and is %D not clear either. \let\currentbtxspecification\empty \unexpanded\def\startbtxrenderingdefinitions[#1]% {\unprotect \pushmacro\currentbtxspecification \edef\currentbtxspecification{#1}} \unexpanded\def\stopbtxrenderingdefinitions {\popmacro\currentbtxspecification \protect} \unexpanded\def\loadbtxdefinitionfile [#1]{\clf_btxloaddefinitionfile {#1}} \unexpanded\def\loadbtxreplacementfile[#1]{\clf_btxloadreplacementfile{#1}} \unexpanded\def\publ_specification_push#1% {\pushmacro\currentbtxspecification \pushmacro\currentbtxspecificationfallback \edef\currentbtxspecification{#1}% \edef\currentbtxspecificationfallback{\namedbtxparameter\currentbtxspecification\c!default}% \ifx\currentbtxspecificationfallback\currentbtxspecification \let\currentbtxspecificationfallback\empty \fi \clf_btxsetspecification{\currentbtxspecification}} \unexpanded\def\publ_specification_pop {\popmacro\currentbtxspecificationfallback \popmacro\currentbtxspecification \clf_btxsetspecification{\currentbtxspecification}} \unexpanded\def\publ_specification_set#1% beware: is global {\edef\currentbtxspecification{#1}% \edef\currentbtxspecificationfallback{\namedbtxparameter\currentbtxspecification\c!default}% \ifx\currentbtxspecificationfallback\currentbtxspecification \let\currentbtxspecificationfallback\empty \fi % has to be done explicitly: \loadbtxdefinitionfile[\currentbtxspecification]% \ifx\currentbtxspecification\empty % we set default at the end \else \clf_btxsetspecification{\currentbtxspecification}% \fi}% todo: ,true == also load \installcorenamespace {btx} \installswitchcommandhandler \??btx {btx} \??btx % because we have lots of setups we provide a checker for sloppy users \unexpanded\def\btx_check_chain#1#2#3% {\doifelsesomething{#3} {\writestatus{btx #1}{defining\space"#2"\space as\space descendant\space of\space"#3"}% we're in definition regime (no space) \definebtx[#2][#3]} {\writestatus{btx #1}{defining\space"#2"}% \definebtx[#2]}} % \unexpanded\def\btxcheckdefine#1#2{\doifelsecommandhandler\??btx{#1}\donothing{\btx_check_chain{define}{#1}{#2}}} % \unexpanded\def\btxchecksetup #1#2{\doifelsecommandhandler\??btx{#1}\donothing{\btx_check_chain {setup}{#1}{#2}}} \unexpanded\def\btxcheckdefine#1{\doifelsecommandhandler\??btx{#1}\gobbleoneargument{\btx_check_chain{define}{#1}}} % {#2} \unexpanded\def\btxchecksetup #1{\doifelsecommandhandler\??btx{#1}\gobbleoneargument{\btx_check_chain {setup}{#1}}} % {#2} % for the moment experimental: \unexpanded\def\btxenableautodefine {\prependtoks \clf_checkinterfacechain{\currentbtx}{btxcheckdefine}% \to \everydefinebtx \prependtoks \ifnum\btxsetupmode=\doingrootsetupnamed \clf_checkinterfacechain{\currentbtx}{btxchecksetup}% \fi \to \everysetupbtx \let\btxenableautodefine\relax} \appendtoks \ifnum\btxsetupmode=\doingrootsetuproot \publ_specification_set{\btxparameter\c!specification}% \else\ifnum\btxsetupmode=\doingrootsetupnamed \doifelsecommandhandler\??btx\currentbtx {\publ_specification_set{\btxparameter\c!specification}}% {}% maybe a warning \fi\fi \to \everysetupbtx \appendtoks \ifnum\btxsetupmode=\doingrootsetuproot \edef\currentbtxdataset{\clf_btxsetdataset{\btxparameter\c!dataset}{\currentbtxdataset}}% \fi \to \everysetupbtx \appendtoks \publ_specification_set{\btxparameter\c!specification}% \to \everyjob \unexpanded\def\startusingbtxspecification[#1]% {\publ_specification_push{#1}} \let\stopusingbtxspecification\publ_specification_pop % \setupbtxlist[alternative=paragraph,width=auto,distance=\emwidth] % \setupbtxlist[alternative=paragraph,width=auto,distance=\emwidth,margin=2em] % useless % \setupbtxlist[alternative=paragraph,width=fit,distance=\emwidth] % \setupbtxlist[alternative=paragraph,width=fit,distance=\emwidth,margin=2em] % here starts the bib stuff \installcorenamespace {btxdataset} \installcorenamespace {btxrendering} \installcorenamespace {btxregister} \installcorenamespace {btxcommand} \installcorenamespace {btxrenderingdefinition} \installcommandhandler \??btxdataset {btxdataset} \??btxdataset \installcommandhandler \??btxregister {btxregister} \??btxregister \installcommandhandler \??btxrendering {btxrendering} \??btxrendering \let\currentbtxcitealternative\empty \let\currentbtxspecificationfallback\empty \unexpanded\def\setbtxparameterset#1#2% {\edef\currentbtx {\ifcsname\??btx\currentbtxspecification:#1:#2:\s!parent\endcsname \currentbtxspecification:% \else\ifx\currentbtxspecificationfallback\empty \else\ifcsname\??btx\currentbtxspecificationfallback:#1:#2:\s!parent\endcsname \currentbtxspecificationfallback:% \fi\fi\fi#1:#2}} \unexpanded\def\setbtxparametersetroot#1% {\edef\currentbtx {\ifcsname\??btx\currentbtxspecification:#1:\s!parent\endcsname \currentbtxspecification:#1% \else\ifx\currentbtxspecificationfallback\empty \else\ifcsname\??btx\currentbtxspecificationfallback:#1:\s!parent\endcsname \currentbtxspecificationfallback:#1% \fi\fi\fi}} \unexpanded\def\setbtxrendering {\edef\currentbtxrendering {\ifcsname\??btx\currentbtxspecification:\s!parent\endcsname \currentbtxspecification \else\ifx\currentbtxspecificationfallback\empty \else\ifcsname\??btx\currentbtxspecificationfallback:\s!parent\endcsname \currentbtxspecificationfallback \fi\fi\fi}} \unexpanded\def\setbtxlist % maybe simplify this one, always list=rendering? {\edef\currentbtxlist {\ifcsname\??btx\currentbtxrendering:\s!parent\endcsname \currentbtxrendering \else\ifcsname\??btx\currentbtxspecification:\s!parent\endcsname \currentbtxspecification \else\ifx\currentbtxspecificationfallback\empty \else\ifcsname\??btx\currentbtxspecificationfallback:\s!parent\endcsname \currentbtxspecificationfallback \fi\fi\fi\fi}% \edef\currentlist{\s!btx:\currentbtxlist}} \unexpanded\def\usebtxdataset {\begingroup \dotripleempty\publ_use_dataset} \def\publ_use_dataset[#1][#2][#3]% {\getdummyparameters[\c!specification=\currentbtxspecification,#3]% \ifsecondargument \clf_btxusedataset specification {\dummyparameter\c!specification}% dataset {#1}% filename {#2}% \relax \else\iffirstargument \clf_btxusedataset specification {\dummyparameter\c!specification}% dataset {\v!default}% filename {#1}% \relax \fi\fi \endgroup} \definebtxdataset [\v!default] % [\c!language=] % nothing set so use current % \usebtxdataset % [default] % [mybibs.bib] \let\startpublication\relax \let\stoppublication \relax \unexpanded\def\startpublication {\dodoubleempty\publ_set_publication} \def\publ_set_publication[#1][#2]% {\begingroup \catcode\commentasciicode\othercatcode \ifsecondargument \expandafter\publ_set_publication_indeed \else\iffirstargument \doubleexpandafter\publ_set_publication_checked \else \doubleexpandafter\publ_set_publication_default \fi\fi{#1}{#2}} \def\publ_set_publication_default#1#2% {\publ_set_publication_indeed\v!default{#1}} \def\publ_set_publication_checked#1#2% {\doifelseassignment{#1} {\publ_set_publication_indeed\v!default{#1}} {\publ_set_publication_indeed{#1}{}}} \def\publ_set_publication_indeed#1#2#3\stoppublication {\clf_btxaddentry{#1}{#2}{\detokenize{#3}}% \endgroup \ignorespaces} % commands \unexpanded\def\btxcommand#1% {\ifcsname\??btxcommand#1\endcsname \expandafter\publ_command_yes \else \expandafter\publ_command_nop \fi{#1}} \let\btxcmd\btxcommand \def\publ_command_yes#1% {\csname\??btxcommand#1\endcsname} \def\publ_command_nop#1% {\ifcsname#1\endcsname \showmessage\m!publications{10}{#1,#1}% \global\expandafter\let\csname\??btxcommand#1\expandafter\endcsname\csname#1\endcsname \else\ifcsname\utfupper{#1}\endcsname \showmessage\m!publications{10}{#1}{\utfupper{#1}}% \global\expandafter\let\csname\??btxcommand#1\expandafter\endcsname\csname\utfupper{#1}\endcsname \else \showmessage\m!publications{11}{#1}% \setugvalue{\??btxcommand#1}{\underbar{\tttf#1}}% \fi\fi \publ_command_yes{#1}} \unexpanded\def\definebtxcommand#1% {body} #1..#n{body} {\setuvalue{\??btxcommand\csstring#1}}% % tracing \installtextracker {publications.crosslinks} {\let\btx_trace_list_cross\strc_references_tracer} {\let\btx_trace_list_cross\gobbletwoarguments} \let\btx_trace_list_cross\gobbletwoarguments % access \let\currentbtxtag \empty \let\currentbtxdataset\v!default \unexpanded\def\setbtxentry[#1]% or maybe btxsetentry {\edef\currentbtxtag{\clf_btxsetentry{\currentbtxdataset}{#1}}} % \let\btxsetdataset\setbtxdataset % \let\btxsetentry \setbtxentry % todo: no need for the currents as we can keep them at the lua end so we will have % % \btxfield : current % \btxspecificfield : dataset,tag,key \def\btxfield #1{\clf_btxfield {\currentbtxdataset}{\currentbtxtag}{#1}} \def\btxdetail #1{\clf_btxdetail {\currentbtxdataset}{\currentbtxtag}{#1}} \def\btxflush #1{\clf_btxflush {\currentbtxdataset}{\currentbtxtag}{#1}} \def\btxdirect #1{\clf_btxdirect {\currentbtxdataset}{\currentbtxtag}{#1}} \def\btxfieldname #1{\clf_btxfieldname {\currentbtxdataset}{\currentbtxtag}{#1}} \def\btxfieldtype #1{\clf_btxfieldtype {\currentbtxdataset}{\currentbtxtag}{#1}} \def\btxfoundname #1{\clf_btxfoundname {\currentbtxdataset}{\currentbtxtag}{#1}} \def\btxfoundtype #1{\clf_btxfoundtype {\currentbtxdataset}{\currentbtxtag}{#1}} \def\btxauthorfield#1{\clf_btxauthorfield \currentbtxauthorindex{#1}} \def\btxdoifelse #1{\clf_btxdoifelse {\currentbtxdataset}{\currentbtxtag}{#1}} \def\btxdoif #1{\clf_btxdoif {\currentbtxdataset}{\currentbtxtag}{#1}} \def\btxdoifnot #1{\clf_btxdoifnot {\currentbtxdataset}{\currentbtxtag}{#1}} \let\btxsetup\fastsetup %D How complex will we go? Can we assume that e.g. an apa style will not be mixed %D with another one? I think this assumption is okay. For manuals we might want to %D mix but we can work around it. %D Rendering. \unexpanded\def\btxspace {\removeunwantedspaces\space} \unexpanded\def\btxnobreakspace {\removeunwantedspaces\nobreakspace} % these two are \unexpanded\def\btxnbsp {\removeunwantedspaces\nbsp} % the same anyway \unexpanded\def\btxperiod {\removeunwantedspaces.\space} \unexpanded\def\btxcomma {\removeunwantedspaces,\space} \unexpanded\def\btxcommabreak {\removeunwantedspaces,\hskip\zeropoint plus .5\emwidth\relax} \unexpanded\def\btxcolon {\removeunwantedspaces:\space} \unexpanded\def\btxsemicolon {\removeunwantedspaces;\space} \unexpanded\def\btxlparent {\removeunwantedspaces\space(} % obsolete \unexpanded\def\btxrparent {\removeunwantedspaces)\space} % obsolete \unexpanded\def\btxleftparenthesis {\removeunwantedspaces\space(} \unexpanded\def\btxrightparenthesis {\removeunwantedspaces)\space} \unexpanded\def\btxrightparenthesisperiod{\removeunwantedspaces).\space} \unexpanded\def\btxrightparenthesiscomma {\removeunwantedspaces),\space} \unexpanded\def\btxleftbracket {\removeunwantedspaces\space[} \unexpanded\def\btxrightbracket {\removeunwantedspaces]\space} \unexpanded\def\btxrightbracketperiod {\removeunwantedspaces].\space} \unexpanded\def\btxrightbracketcomma {\removeunwantedspaces],\space} %D Variables: \let\currentbtxbacklink \empty \unexpanded\def\btxsetbacklink {\def\currentbtxbacklink} \let\currentbtxbacktrace \empty \unexpanded\def\btxsetbacktrace {\def\currentbtxbacktrace} \let\currentbtxcategory \empty \unexpanded\def\btxsetcategory {\def\currentbtxcategory} \let\currentbtxcombis \empty \unexpanded\def\btxsetcombis {\def\currentbtxcombis} \let\currentbtxdataset \empty \unexpanded\def\btxsetdataset {\def\currentbtxdataset} \let\currentbtxfirst \empty \unexpanded\def\btxsetfirst {\def\currentbtxfirst} \let\currentbtxsecond \empty \unexpanded\def\btxsetsecond {\def\currentbtxsecond} %let\currentbtxthird \empty \unexpanded\def\btxsetthird {\def\currentbtxthird} \let\currentbtxsuffix \empty \unexpanded\def\btxsetsuffix {\def\currentbtxsuffix} \let\currentbtxinternal \empty \unexpanded\def\btxsetinternal {\def\currentbtxinternal} \let\currentbtxlefttext \empty \unexpanded\def\btxsetlefttext {\def\currentbtxlefttext} \let\currentbtxrighttext \empty \unexpanded\def\btxsetrighttext {\def\currentbtxrighttext} \let\currentbtxbefore \empty \unexpanded\def\btxsetbefore {\def\currentbtxbefore} \let\currentbtxafter \empty \unexpanded\def\btxsetafter {\def\currentbtxafter} \let\currentbtxlanguage \empty \unexpanded\def\btxsetlanguage {\def\currentbtxlanguage} \let\currentbtxtag \empty \unexpanded\def\btxsettag {\def\currentbtxtag} \let\currentbtxnumber \empty \unexpanded\def\btxsetnumber {\def\currentbtxnumber} \let\currentbtxauthorvariant\v!normal \unexpanded\def\btxsetauthorvariant{\def\currentbtxauthorvariant} \let\currentbtxfirstnames \empty \unexpanded\def\btxsetfirstnames{\let\currentbtxfirstnames\currentbtxfirstnames_indeed} \let\currentbtxinitials \empty \unexpanded\def\btxsetinitials {\let\currentbtxinitials \currentbtxinitials_indeed } \let\currentbtxjuniors \empty \unexpanded\def\btxsetjuniors {\let\currentbtxjuniors \currentbtxjuniors_indeed } \let\currentbtxsurnames \empty \unexpanded\def\btxsetsurnames {\let\currentbtxsurnames \currentbtxsurnames_indeed } \let\currentbtxvons \empty \unexpanded\def\btxsetvons {\let\currentbtxvons \currentbtxvons_indeed } \newconstant\currentbtxoverflow \unexpanded\def\btxsetoverflow #1{\currentbtxoverflow #1\relax} \newconstant\currentbtxconcat \unexpanded\def\btxsetconcat #1{\currentbtxconcat #1\relax} \newconstant\currentbtxcount \unexpanded\def\btxsetcount #1{\currentbtxcount #1\relax} \newconstant\currentbtxauthorindex %unexpanded\def\btxsetauthorindex#1{\currentbtxauthorindex#1\relax} % passed directly \newconstant\currentbtxauthorcount %unexpanded\def\btxsetauthorcount#1{\currentbtxauthorcount#1\relax} % passed directly \newconstant\currentbtxauthorstate \unexpanded\def\btxsetauthorstate#1{\currentbtxauthorstate#1\relax} \unexpanded\def\currentbtxfirstnames_indeed{\clf_btxcurrentfirstnames\numexpr\currentbtxauthorindex\relax} \unexpanded\def\currentbtxinitials_indeed {\clf_btxcurrentinitials \numexpr\currentbtxauthorindex\relax} \unexpanded\def\currentbtxjuniors_indeed {\clf_btxcurrentjuniors \numexpr\currentbtxauthorindex\relax} \unexpanded\def\currentbtxsurnames_indeed {\clf_btxcurrentsurnames \numexpr\currentbtxauthorindex\relax} \unexpanded\def\currentbtxvons_indeed {\clf_btxcurrentvons \numexpr\currentbtxauthorindex\relax} \let\currentbtxfirstpage \empty \unexpanded\def\btxsetfirstpage #1{\def\currentbtxfirstpage{\btx_page_number{#1}}} \let\currentbtxlastpage \empty \unexpanded\def\btxsetlastpage #1{\def\currentbtxlastpage {\btx_page_number{#1}}} \let\currentbtxfirstinternal\empty \unexpanded\def\btxsetfirstinternal {\def\currentbtxfirstinternal} \let\currentbtxlastinternal \empty \unexpanded\def\btxsetlastinternal {\def\currentbtxlastinternal} \def\currentbtxauthorvariant{normal} \unexpanded\def\btx_reset_list % not needed as we're grouped {\let\currentbtxcombis \empty \let\currentbtxcategory \empty \let\currentbtxinternal \empty \let\currentbtxlefttext \empty \let\currentbtxrighttext\empty \let\currentbtxbefore \empty \let\currentbtxafter \empty \let\currentbtxbacklink \empty \let\currentbtxbacktrace\empty \let\currentbtxlanguage \empty \let\currentbtxsuffix \empty %\let\currentbtxdataset \empty % will always be set %\let\currentbtxtag \empty % will always be set \let\currentbtxnumber \empty} \unexpanded\def\btx_reset_cite % check for less .. not all resets needed when we're grouped (only subcites) {\let \currentbtxfirst \empty \let \currentbtxsecond \empty \let \currentbtxsuffix \empty \let \currentbtxinternal \empty \let \currentbtxlefttext \empty \let \currentbtxrighttext \empty \let \currentbtxbefore \empty \let \currentbtxafter \empty \let \currentbtxbacklink \empty \let \currentbtxbacktrace \empty % not used here \let \currentbtxlanguage \empty %\let \currentbtxdataset \empty % will always be set, beware of local reset ~ %\let \currentbtxtag \empty % will always be set, beware of local reset ~ \let \currentbtxnumber \empty \setconstant\currentbtxoverflow \zerocount \setconstant\currentbtxconcat \zerocount \setconstant\currentbtxcount \zerocount} \unexpanded\def\btx_reset_page % probably not needed {\let \currentbtxfirstpage \empty \let \currentbtxlastpage \empty \let \currentbtxfirstinternal\empty \let \currentbtxlastinternal \empty \setconstant\currentbtxoverflow \zerocount \setconstant\currentbtxconcat \zerocount \setconstant\currentbtxcount \zerocount} \unexpanded\def\btx_reset_numbering % probably not needed {\let \currentbtxfirst \empty \let \currentbtxsecond\empty \let \currentbtxsuffix\empty \setconstant\currentbtxconcat\zerocount} %D Pages: \unexpanded\def\btx_page_number#1% {\def\currentlistindex{#1}% \structurelistpagenumber} %D Language: \def\mainbtxlanguage{\currentmainlanguage} \unexpanded\def\btx_check_language {\let\mainbtxlanguage\currentlanguage \ifx\currentbtxlanguage\empty \let\currentbtxlanguage\currentlanguage \else \btx_check_language_indeed \fi} \unexpanded\def\btx_check_language_indeed {\edef\currentbtxlanguage{\reallanguagetag\currentbtxlanguage}% \ifx\currentbtxlanguage\empty \let\currentbtxlanguage\currentlanguage \else\ifx\currentbtxlanguage\currentlanguage\else \setcurrentlanguage\currentmainlanguage\currentbtxlanguage \fi\fi} %D Tracing \newconditional\c_btx_trace % not used yet \installtextracker {btxrendering} {\settrue \c_btx_trace} {\setfalse\c_btx_trace} %D Rendering lists and citations. \unexpanded\def\btxtodo#1% {[#1]} %D Lists: \newdimen\d_publ_number_width \ifdefined\btxblock \else \newcount\btxblock \fi \btxblock\plusone \ifdefined\btxcitecounter \else \newcount\btxcitecounter \fi % maybe pass this to lua \newtoks \everysetupbtxlistplacement % name will change \newtoks \everysetupbtxciteplacement % name will change \definelist % only used for selecting [\s!btx] \setuplist [\s!btx] [\c!prefixstopper=:, \c!state=\v!start, \c!alternative=a, %\c!alternative=\v!paragraph, %\c!width=\v!auto, %\c!distance=\emwidth, \c!before=\blank, \c!after=\blank] \unexpanded\def\setupbtxlist {\dodoubleempty\publ_setup_list} \unexpanded\def\publ_setup_list[#1][#2]% {\ifsecondargument \setuplist[\s!btx:#1][#2]% \else\iffirstargument \setuplist[\s!btx][#1]% \fi\fi} \appendtoks \ifx\currentbtxrenderingparent\empty \definelist [\s!btx:\currentbtxrendering]% [\s!btx]% \else\ifx\currentbtxrenderingparent\s!btx \definelist [\s!btx:\currentbtxrendering]% [\s!btx]% \else \definelist [\s!btx:\currentbtxrendering]% [\s!btx:\currentbtxrenderingparent]% \fi\fi \to \everydefinebtxrendering \newconditional\c_btx_list_texts \appendtoks \doifelse{\btxrenderingparameter\c!textstate}\v!start \settrue\setfalse\c_btx_list_texts \to \everysetupbtxlistplacement \newconditional\c_btx_list_pages \appendtoks \doifelse{\btxrenderingparameter\c!pagestate}\v!start \settrue\setfalse\c_btx_list_pages \to \everysetupbtxlistplacement \unexpanded\def\btx_entry_inject_pages % for the moment only normal {\dontleavehmode \begingroup \setbtxlist % probably already set \btx_reset_page \setbtxparameterset\s!list\s!page \btxparameter\c!command {\usebtxstyleandcolor\c!style\c!color \btxparameter\c!left \clf_btxflushpages{\currentbtxdataset}{\currentbtxtag}% \btxparameter\c!right}% \endgroup} \unexpanded\def\btxpagesetup#1% there will b eno left|right|command|style at this inner level {\begingroup \publ_fast_setup\plusfive\s!list\s!page \endgroup \btx_reset_page} % probably not needed \unexpanded\def\btxnumberingsetup#1% {\begingroup \setbtxparameterset{\c!list:\s!numbering}\currentbtxnumbering % brrrr \setbtxlist \btxparameter\c!left % \btxparameter\c!command{\publ_fast_setup\plusthree{\s!list:\s!numbering}{#1}}% \publ_fast_setup\plusthree{\s!list:\s!numbering}{#1}% \btxparameter\c!right \endgroup \btx_reset_numbering} % probably not needed % end of page stuff \unexpanded\def\btx_entry_inject {\begingroup \redoconvertfont % see (**) in strc-lst, this will become an configuration option \edef\currentbtxcategory{\btxfield{category}}% \ignorespaces \ifconditional\c_btx_list_texts \currentbtxbefore \fi \begingroup \usebtxstyleandcolor\c!style\c!color \ignorespaces \publ_fast_setup\plusfour\s!list\currentbtxcategory \removeunwantedspaces \endgroup \ifx\currentbtxcombis\empty \else \btxrenderingparameter\c!separator % maybe move this loop to lua \begingroup \processcommacommand[\currentbtxcombis]\btx_entry_inject_combi \endgroup \fi \ifconditional\c_btx_list_pages \btx_entry_inject_pages \fi \ifconditional\c_btx_list_texts \currentbtxafter \fi \endgroup} \unexpanded\def\btxshowentryinline {\dodoubleempty\btx_entry_show_inline} \unexpanded\def\btx_entry_show_inline[#1][#2]% {\ifsecondargument \ctxcommand{showbtxentry("#1","#2")} \else\iffirstargument \ctxcommand{showbtxentry("\currentbtxdataset","#1")} \else \ctxcommand{showbtxentry("\currentbtxdataset","\currentbtxtag")} \fi\fi} \unexpanded\def\btxstartcombientry {\begingroup} \unexpanded\def\btxstopcombientry {\endgroup} \unexpanded\def\btxhandlecombientry {\btx_reference_indeed} \def\btx_entry_inject_combi#1% {\begingroup \def\currentbtxtag{#1}% \ignorespaces \publ_fast_setup\plusfour\s!list\currentbtxcategory \removeunwantedspaces \endgroup} % uses reference when set % \def\btx_entry_inject_combi#1% % {\begingroup % \def\currentbtxtag{#1}% % \ignorespaces % \btxdoifelsecombiinlist\currentbtxdataset\currentbtxtag % {\clf_btxflushlistcombi{\currentbtxdataset}{\currentbtxtag}} % {\publ_fast_setup\plusfour\s!list\currentbtxcategory}% % \removeunwantedspaces % \endgroup} \unexpanded\def\completebtxrendering{\dodoubleempty\publ_place_list_complete} \unexpanded\def\placebtxrendering {\dodoubleempty\publ_place_list_standard} \let\completelistofpublications\completebtxrendering \let\placelistofpublications \placebtxrendering \newtoks\everybtxlistrendering \appendtoks \setbtxlist % \edef\currentbtxcriterium{\btxrenderingparameter\c!criterium}% \v!cite will become \s!cite \ifx\currentbtxcriterium\empty \let\currentbtxcriterium\v!previous \else\ifx\currentbtxcriterium\v!cite \let\currentbtxcriterium\v!here \fi\fi % \iflocation \letinteractionparameter\c!style\empty \fi \to \everybtxlistrendering \def\nofbtxlistentries {0} \def\currentbtxlistentry{0} \def\currentbtxlistindex{0} % only for internal use (points back to big list) \newconditional\c_publ_prefixed \unexpanded\def\btxsetnoflistentries #1{\edef\nofbtxlistentries {#1}} \unexpanded\def\btxsetcurrentlistentry#1{\edef\currentbtxlistentry{#1}} \unexpanded\def\btxsetcurrentlistindex#1{\edef\currentbtxlistindex{#1}} \unexpanded\def\btxdoifelsesameaspreviouschecked#1#2% #1 == always | doublesided {\clf_btxdoifelsesameasprevious {\currentbtxdataset}% \currentbtxlistentry% {#2}% \c_btx_list_reference {#1}} \unexpanded\def\btxdoifelsesameasprevious {\btxdoifelsesameaspreviouschecked\v!doublesided} \unexpanded\def\btxdoifelsecombiinlist#1#2% {\clf_btxdoifelsecombiinlist{#1}{#2}} \let\btxdoifsameaspreviouscheckedelse\btxdoifelsesameaspreviouschecked \let\btxdoifsameaspreviouselse \btxdoifelsesameasprevious \let\btxdoifcombiinlistelse \btxdoifelsecombiinlist \def\publ_place_list_indeed#1[#2][#3]% {\begingroup \ifsecondargument % [rendering] [settings] \edef\currentbtxrendering{#2}% \setupcurrentbtxrendering[#3]% \edef\p_specification{\btxrenderingparameter\c!specification}% \ifx\p_specification\empty\else \let\currentbtxspecification\p_specification \fi \else\iffirstargument \doifelseassignment{#2} {% [settings] \let\currentbtxrendering\currentbtxspecification \setupcurrentbtxrendering[#2]% \edef\p_specification{\btxrenderingparameter\c!specification}% \ifx\p_specification\empty\else \let\currentbtxspecification\p_specification \let\currentbtxrendering\currentbtxspecification % tricky \fi} {\edef\currentbtxrendering{#2}% \edef\p_specification{\btxrenderingparameter\c!specification}% \ifx\p_specification\empty\else \let\currentbtxspecification\p_specification \fi}% \else \let\currentbtxrendering\currentbtxspecification \fi\fi \setbtxparameterset\currentbtxspecification\s!list \the\everybtxlistrendering \ifconditional#1\relax \edef\currentbtxrenderingtitle{\btxrenderingparameter\c!title}% \ifx\currentbtxrenderingtitle\empty \normalexpanded{\startnamedsection[\v!chapter][\c!reference=\currentbtxrendering,\c!title={\headtext{\currentbtxrendering}}]}% \else \normalexpanded{\startnamedsection[\v!chapter][\c!reference=\currentbtxrendering,\c!title={\currentbtxrenderingtitle}]}% \fi \fi \ifx\currentbtxrendering\empty \setbtxrendering % hm \fi \btxrenderingparameter\c!before \edef\currentbtxdataset{\btxrenderingparameter\c!dataset}% \uselanguageparameter\btxdatasetparameter % new \setbtxlist \the\everystructurelist \the\everysetupbtxlistplacement \forgetall % why not pass this with collect .. todo % here we just collect items \clf_btxcollectlistentries names {\s!btx}% criterium {\currentbtxcriterium}% reference {\btxrenderingparameter\c!reference}% method {\btxrenderingparameter\c!method}% dataset {\currentbtxdataset}% keyword {\btxrenderingparameter\c!keyword}% sorttype {\btxrenderingparameter\c!sorttype}% repeated {\btxrenderingparameter\c!repeat}% ignored {\btxrenderingparameter\c!ignore}% group {\btxrenderingparameter\c!group}% \relax \ifnum\nofbtxlistentries>\zerocount \startpacked[\v!blank]% % sorting and so \clf_btxpreparelistentries{\currentbtxdataset}% could be put in collect % next we analyze the width \ifx\currentbtxnumbering\empty \else \edef\p_width{\listparameter\c!width}% \ifx\p_width\v!auto \setbox\scratchbox\vbox \bgroup \settrialtypesetting \clf_btxfetchlistentries{\currentbtxdataset}% \egroup \d_publ_number_width\wd\scratchbox \letlistparameter\c!width\d_publ_number_width \fi \fi \doifelse{\listparameter\c!prefix}\v!yes\settrue\setfalse\c_publ_prefixed % this actually typesets them, we loop here as otherwise the whole % bunch gets flushed at once \dorecurse\nofbtxlistentries {\let\currentbtxlistentry\recurselevel \clf_btxflushlistentry{\currentbtxdataset}\currentbtxlistentry\relax}% \stoppacked \fi \btxrenderingparameter\c!after \global\advance\btxblock\plusone \ifconditional#1\relax \stopnamedsection \fi \endgroup} \def\publ_place_list_complete{\publ_place_list_indeed\conditionaltrue} \def\publ_place_list_standard{\publ_place_list_indeed\conditionalfalse} \def\currentbtxblock{\number\btxblock} % called at the lua end, for determining the width \unexpanded\def\btxchecklistentry {\begingroup % todo, switch to font \hbox{\btx_reference_checked}% \par \endgroup} % called at the lua end, the real rendering % we could have a yes and no where o nils the btx_reference_indeed ... saves a check there \installstructurelistprocessor{\s!btx} {\let\currentlistentrynumber \btx_reference_indeed \let\currentlistentrytitle \btx_entry_indeed \let\currentlistentrypagenumber\btx_page_indeed \strc_lists_apply_renderingsetup} \def\btx_entry_indeed {\btx_list_reference_inject \btx_entry_inject} \def\btx_page_indeed {} \unexpanded\def\btxhandlelistentry {\strc_lists_entry_process} \unexpanded\def\btxstartlistentry % maybe pass i {\begingroup \global\advance\c_btx_list_reference\plusone} \unexpanded\def\btxstoplistentry {\iftrialtypesetting \global\advance\c_btx_list_reference\minusone \fi \endgroup} \newtoks\everybtxlistentry \unexpanded\def\btxlistsetup#1% used for the reference in the list {\the\everybtxlistentry \everybtxlistentry\emptytoks % so only once per entry to be sure \publ_fast_setup\plusfour\s!list{#1}} \appendtoks \btx_check_language \to \everybtxlistentry \unexpanded\def\btx_reference_indeed {\begingroup % redundantm will go away: \setbtxparameterset{\c!list:\s!numbering}\currentbtxnumbering % \ifx\currentbtxnumbering\empty % nothing \else\ifx\currentbtxnumbering\v!no % nothing \else \usebtxstyleandcolor\c!style\c!color % new, needed? \ifconditional\c_publ_prefixed\btxlistprefixednumber\fi \clf_btxlistvariant % some can go {\currentbtxdataset}% {\currentbtxblock}% {\currentbtxtag}% {\currentbtxnumbering}% {\currentbtxnumber}% \relax \fi\fi \endgroup} \unexpanded\def\btxlistprefixednumber % hack but alan needs it {\clf_listprefixednumber {\currentlist}% \currentbtxlistindex {% prefix {\listparameter\c!prefix}% separatorset {\listparameter\c!prefixseparatorset}% conversionset {\listparameter\c!prefixconversionset}% starter {\listparameter\c!prefixstarter}% stopper {\listparameter\c!prefixstopper}% set {\listparameter\c!prefixset}% segments {\listparameter\c!prefixsegments}% connector {\listparameter\c!prefixconnector}% }% \relax} \unexpanded\def\btx_reference_checked {\dontleavehmode\hbox\bgroup \btx_reference_indeed \egroup} \newcount\c_btx_list_reference \unexpanded\def\btx_list_reference_inject {\dontleavehmode\begingroup % no box \iftrialtypesetting\else \btx_list_reference_inject_now \fi % \btx_reference_indeed % else double entry in list \endgroup} \def\btx_list_reference_inject_now {\btx_trace_list_cross\empty\currentbtxbacktrace \strc_references_direct_full_user {\ifx\currentbtxdataset\v!default\else\s!btxset=\currentbtxdataset,\fi% \s!btxref=\currentbtxtag,% \s!btxspc=\currentbtxspecification,% \s!btxlst=\number\c_btx_list_reference,% check if needed %\ifx\currentbtxcombis\empty\else\s!btxcom={\currentbtxcombis},\fi% \ifx\currentbtxbefore\empty\else\s!btxbtx={\currentbtxbefore},\fi% \ifx\currentbtxafter \empty\else\s!btxatx={\currentbtxafter },\fi% \ifx\currentbtxbacklink\currentbtxbacktrace\s!btxint=\currentbtxbacklink\else\s!btxbck=\currentbtxbacktrace\fi}% {\s!btx::\v!list::\number\c_btx_list_reference}% {\currentbtxnumber}} \newconditional\c_btx_cite_reference_injected \unexpanded\def\btx_cite_reference_inject {\ifconditional\c_btx_cite_reference_injected \else \dontleavehmode \iftrialtypesetting \else \ifx\currentbtxbacklink\empty % can be made empty when combining author / year \else \btx_cite_reference_inject_indeed \settrue\c_btx_cite_reference_injected \fi \fi \fi} \newtoks\t_btx_reference_inject \def\btx_cite_reference_inject_indeed {\btx_trace_list_cross\currentbtxbacklink\empty \the\t_btx_reference_inject \strc_lists_inject_direct % todo: make like \btx_list_reference_inject_now with { } [\s!btx]% [\c!type=\s!btx]% \c!location=\v!none [\ifx\currentbtxdataset\v!default\else\s!btxset=\currentbtxdataset,\fi% \s!btxref=\currentbtxtag,% %\ifx\currentbtxcombis\empty\else\s!btxcom={\currentbtxcombis},\fi% \ifx\currentbtxbefore\empty\else\s!btxbtx={\currentbtxbefore},\fi% \ifx\currentbtxafter \empty\else\s!btxatx={\currentbtxafter },\fi% \s!btxint=\number\currentbtxbacklink \ifx\currentbtxciteuservariables\empty\else,\currentbtxciteuservariables\fi]} \def\currentbtxuservariable #1{\clf_btxuservariable {\currentbtxdataset}{#1}} \def\btxdoifelseuservariable#1{\clf_btxdoifelseuservariable{\currentbtxdataset}{#1}} \let\btxdoifuservariableelse\btxdoifelseuservariable \let\btxcitereference\btx_cite_reference_inject \let\currentbtxnumbering\empty \appendtoks \edef\currentbtxnumbering{\btxrenderingparameter\c!numbering}% \ifx\currentbtxnumbering\v!yes \def\currentbtxnumbering{num}% convenient alias \letbtxrenderingparameter\c!numbering\currentbtxnumbering \letlistparameter\c!headnumber\v!always \else\ifx\currentbtxnumbering\v!no \letlistparameter\c!headnumber\v!no \let\currentbtxnumbering\empty % \letlistparameter\c!textcommand\outdented % needed? we can use titlealign \letlistparameter\c!symbol \v!none \letlistparameter\c!aligntitle \v!yes \letlistparameter\c!numbercommand\firstofoneargument % for the moment, no doubling needed \else \letlistparameter\c!headnumber\v!always \fi\fi \let\currentlistmethod\s!btx \to \everysetupbtxlistplacement \unexpanded\def\btxremapauthor {\dodoubleargument\btx_remap_author} \def\btx_remap_author[#1][#2]% {\clf_btxremapauthor{#1}{#2}} \unexpanded\def\btxflushauthor {\doifelsenextoptionalcs\btx_flush_author_yes\btx_flush_author_nop} \unexpanded\def\btxflushsuffix {\ifx\currentbtxsuffix\empty % nothing \else \characters{\currentbtxsuffix}% todo : rendering specific converter \fi} \def\btx_flush_author_yes[#1]{\btx_flush_author{#1}} \def\btx_flush_author_nop {\btx_flush_author{\btxparameter\c!authorconversion}} \unexpanded\def\btx_flush_author#1#2% {\begingroup \edef\currentbtxfield{#2}% \setbtxparameterset\s!list\currentbtxfield % \let\currentbtxlistvariant\currentbtxfield \clf_btxauthor {\currentbtxdataset}% {\currentbtxtag}% {\currentbtxfield}% {% combiner {#1}% kind {list}% etallimit {\btxparameter\c!etallimit}% etaldisplay {\btxparameter\c!etaldisplay}% etaloption {\btxparameter\c!etaloption}% symbol {\btxparameter{\c!stopper:initials}}% connector {\btxparameter{\c!connector:initials}}% }% \relax \endgroup} % yes or no: maybe just \flushauthor{...}{...} \unexpanded\def\btxflushauthorname {\btx_flush_author{name}} % #1 \unexpanded\def\btxflushauthornormal {\btx_flush_author{normal}} % #1 \unexpanded\def\btxflushauthornormalshort {\btx_flush_author{normalshort}} % #1 \unexpanded\def\btxflushauthorinverted {\btx_flush_author{inverted}} % #1 \unexpanded\def\btxflushauthorinvertedshort{\btx_flush_author{invertedshort}} % #1 \unexpanded\def\currentbtxciteauthor % always author {\begingroup %\setbtxparameterset\s!cite\s!author % the alternatives inherit from cite:author % and APA distinguishes authoryears from authoryear ("and" vs. "&") \setbtxparameterset\s!cite\currentbtxcitealternative \clf_btxauthor {\currentbtxdataset}% {\currentbtxtag}% {\s!author}% {% combiner {\btxparameter\c!authorconversion}% kind {cite}% etallimit {\btxparameter\c!etallimit}% etaldisplay {\btxparameter\c!etaldisplay}% etaloption {\btxparameter\c!etaloption}% symbol {\btxparameter{\c!stopper:initials}}% }% \relax \endgroup} \unexpanded\def\btxstartauthor#1#2#3% a state > 0 signals that some authors can clash {\begingroup \currentbtxauthorindex#1\relax \currentbtxauthorcount#2\relax \currentbtxauthorstate#3\relax} \unexpanded\def\btxstopauthor {\endgroup} \unexpanded\def\btxciteauthorsetup#1{\fastsetup{\s!btx:\s!cite:\s!author:#1}} \unexpanded\def\btxlistauthorsetup#1{\fastsetup{\s!btx:\s!list:\s!author:#1}} % \btxflushauthor{author} % \btxflushauthor{editor} % % \btxflushauthor[name]{author} % \btxflushauthor[normal]{author} % \btxflushauthor[normalshort]{author} % \btxflushauthor[inverted]{author} % \btxflushauthor[invertedshort]{author} % \btxflushauthor{author} % \btxflushauthor{editor} % % \btxflushauthor[name]{author} % \btxflushauthor[normal]{author} % \btxflushauthor[normalshort]{author} % \btxflushauthor[inverted]{author} % \btxflushauthor[invertedshort]{author} % Interaction \newconditional\btxinteractive \newconditional\btx_interactive % of maybe modes? \appendtoks \iflocation \edef\p_interaction{\btxparameter\c!interaction}% \ifx\p_interaction\v!stop \setfalse\btxinteractive \else \settrue\btxinteractive \ifx\p_interaction\v!all \settrue\btx_interactive \else \setfalse\btx_interactive \fi \fi \else \setfalse\btxinteractive \setfalse\btx_interactive \fi \to \everysetupbtxlistplacement \appendtoks \iflocation \edef\p_interaction{\btxparameter\c!interaction}% \ifx\p_interaction\v!stop \setfalse\btxinteractive \else \settrue\btxinteractive \fi \else \setfalse\btxinteractive \fi \to \everysetupbtxciteplacement %D When a publication is cited, we need to signal that somehow. This is done with the %D following (not user) command. We could tag without injecting a node but this way %D we also store the location, which makes it possible to ask local lists. %D \macros{cite,nocite,citation,nocitation,usecitation} %D %D The inline \type {\cite} command creates a (often) short reference to a publication %D and for historic reasons uses a strict test for brackets. This means, at least %D in the default case that spaces are ignored in the argument scanner. The \type %D {\citation} commands is more liberal but also gobbles following spaces. Both %D commands insert a reference as well as a visual clue. %D %D The \type {no} commands all do the same (they are synonyms): they make sure that %D a reference is injected but show nothing. However, they do create a node so best %D attach them to some text in order to avoid spacing interferences. A slightly %D less efficient alternative is \type {\cite[none][tag]}. % [tags] % [settings|variant][tags] % [base::tags] % [settings|variant][base::tags] % these need to be sort of protected: % methods: % % hidden : mark for list, don't show in text % list : mark for list, show in text only when in list % text : not to list, show in text % always : mark for list, show in text \let\p_publ_cite_before \empty \let\p_publ_cite_after \empty \let\p_publ_cite_lefttext \empty \let\p_publ_cite_righttext\empty \let\currentbtxciteuservariables\empty \unexpanded\def\btxhybridcite % so one can alias the old {\dontleavehmode \begingroup \strictdoifelsenextoptional\publ_cite_tags_options\publ_cite_tags_indeed} \unexpanded\def\publ_cite_tags_options[#1]% {\strictdoifelsenextoptional{\publ_cite_tags_options_indeed{#1}}{\publ_cite_tags_indeed{#1}}} \unexpanded\def\publ_cite_tags_indeed#1% {\letinteractionparameter\c!style\empty \setbtxparametersetroot\s!cite % we need to get the default \edef\currentbtxcitealternative{\btxparameter\c!alternative}% \setbtxparameterset\s!cite\currentbtxcitealternative \edef\currentbtxcitetag{#1}% \the\everysetupbtxciteplacement \publ_cite_variant \endgroup} \unexpanded\def\publ_cite_tags_options_indeed#1% {\doifelseassignment{#1}\publ_cite_tags_settings_indeed\publ_cite_tags_variants_indeed{#1}} \def\publ_cite_tags_settings_indeed#1[#2]% {\letinteractionparameter\c!style\empty %\letinteractionparameter\c!color\empty \letdummyparameter\c!reference \empty \letdummyparameter\c!alternative\empty \letdummyparameter\c!before \empty \letdummyparameter\c!after \empty \letdummyparameter\c!lefttext \empty \letdummyparameter\c!righttext \empty \getdummyparameters[#1]% \edef\p_reference{\dummyparameter\c!reference}% \ifx\p_reference\empty \edef\currentbtxcitetag{#2}% \else \let\currentbtxcitetag\p_reference \edef\currentbtxciteuservariables{#2}% \fi \edef\p_alternative{\dummyparameter\c!alternative}% \ifx\p_alternative\empty \setbtxparametersetroot\s!cite \edef\currentbtxcitealternative{\btxparameter\c!alternative}% \else \let\currentbtxcitealternative\p_alternative \fi \setbtxparameterset\s!cite\currentbtxcitealternative \setupcurrentbtx[#1]% % \edef\p_publ_cite_before {\dummyparameter\c!before}% \edef\p_publ_cite_after {\dummyparameter\c!after}% \edef\p_publ_cite_lefttext {\dummyparameter\c!lefttext}% \edef\p_publ_cite_righttext{\dummyparameter\c!righttext}% % \the\everysetupbtxciteplacement \publ_cite_variant \endgroup} \def\publ_cite_tags_variants_indeed#1[#2]% {\letinteractionparameter\c!style\empty \edef\currentbtxcitealternative{#1}% \edef\currentbtxcitetag{#2}% \setbtxparameterset\s!cite\currentbtxcitealternative \the\everysetupbtxciteplacement \publ_cite_variant \endgroup} \newconditional\btxcitecompress \let\currentbtxreference\empty \let\currentbtxcitemethod\v!hidden \def\publ_cite_variant {\begingroup \publ_cite_handle_variant_indeed[\currentbtxcitetag]} \unexpanded\def\publ_cite_handle_variant#1% {\begingroup \edef\currentbtxcitealternative{#1}% \setbtxparameterset\s!cite\currentbtxcitealternative \the\everysetupbtxciteplacement \dosingleargument\publ_cite_handle_variant_indeed} \unexpanded\def\publ_cite_handle_variant_blob {\clf_btxhandlecite dataset {\currentbtxdataset}% reference {\currentbtxreference}% method {\currentbtxcitemethod}% variant {\currentbtxcitealternative}% sorttype {\btxparameter\c!sorttype}% compress {\btxparameter\c!compress}% author {\btxparameter\c!author}% authorconversion {\c!authorconversion}% lefttext {\p_publ_cite_lefttext}% righttext {\p_publ_cite_righttext}% before {\p_publ_cite_before}% after {\p_publ_cite_after}% \relax \iftrialtypesetting\else %\clf_btxflushmarked \fi} \let\dobtxcitevariantblob\publ_cite_handle_variant_blob % command can use it via lua \def\publ_cite_handle_variant_indeed[#1]% {\letbtxparameter\c!alternative\currentbtxcitealternative \edef\currentbtxreference{#1}% \usebtxstyleandcolor\c!style\c!color \uselanguageparameter\btxdatasetparameter % new \btxparameter\c!left \btxparameter\c!command{\dobtxcitevariantblob}% {\publ_cite_handle_variant_blob}% \btxparameter\c!right \endgroup} \unexpanded\def\btxlistcitation {\dontleavehmode \begingroup \let\currentbtxcitemethod\v!list \dodoubleempty\publ_citation} \unexpanded\def\btxtextcitation {\dontleavehmode \begingroup \let\btxcitereference\relax % a bit of a hack but ok \let\currentbtxcitemethod\v!text \dodoubleempty\publ_citation} \unexpanded\def\btxalwayscitation {\dontleavehmode \begingroup \let\currentbtxcitemethod\v!always \dodoubleempty\publ_citation} \def\publ_citation[#1][#2]% could be made more efficient but not now {\ifsecondargument \publ_cite_tags_options_indeed{#1}[#2]% \else \publ_cite_tags_indeed{#1}% \fi} \unexpanded\def\btxhiddencitation {\dosingleempty\publ_cite_hidden} \unexpanded\def\publ_cite_hidden[#1]% {\iftrialtypesetting \else \begingroup \let\currentbtxcitemethod\v!hidden \edef\currentbtxreference{#1}% \clf_btxhandlenocite method {\currentbtxcitemethod}% dataset {\currentbtxdataset}% reference {\currentbtxreference}% \relax %\clf_btxflushmarked \endgroup \fi} \unexpanded\def\btxmissing#1% {\dontleavehmode{\tttf<#1>}} %D Compatibility: \let\hiddencitation\btxhiddencitation \let\hiddencite\hiddencitation \let\listcitation \btxlistcitation \let\listcite \listcitation \let\textcitation \btxtextcitation \let\textcite \textcitation \let\alwayscitation\btxalwayscitation \let\alwayscite\alwayscitation \unexpanded\def\citation {\doifelsenextoptionalcs\btxlistcitation \btxdirectlistcite} \unexpanded\def\nocitation{\doifelsenextoptionalcs\btxhiddencitation\btxdirecthiddencite} \let\cite \citation \let\nocite\nocitation \unexpanded\def\publ_entry_citation {\doifelsenextoptionalcs\btxlistcitation \btxdirectlistcite} \unexpanded\def\publ_entry_nocitation{\doifelsenextoptionalcs\btxhiddencitation\btxdirecthiddencite} \appendtoks \let\cite \publ_entry_citation \let\nocite\publ_entry_nocitation \to \everybtxlistrendering \unexpanded\def\btxdirectlistcite #1{\btxlistcitation [#1]\relax} % no optional arguments \unexpanded\def\btxdirecthiddencite#1{\btxhiddencitation[#1]\relax} % no optional arguments %D Setup helpers, beware, we need to wrap this .. now we need to know %D how setups are implemented. \setvalue{\??setup:\s!btx:\s!unknown}#1{\inframed{\tttf#1}} \def\publ_fast_setup_yes#1#2% {\csname\??setup:\s!btx:% \ifcsname\??setup:\s!btx:\currentbtxspecification:#1:#2\endcsname \currentbtxspecification:#1:#2% \else\ifcsname\??setup:\s!btx:\currentbtxspecificationfallback:#1:#2\endcsname \currentbtxspecificationfallback:#1:#2% \else\ifcsname\??setup:\s!btx:#1:#2\endcsname #1:#2% \else\ifcsname\??setup:\s!btx:\currentbtxspecification:#1:\s!unknown\endcsname \currentbtxspecification:#1:\s!unknown \else\ifcsname\??setup:\s!btx:\currentbtxspecificationfallback:#1:\s!unknown\endcsname \currentbtxspecificationfallback:#1:\s!unknown \else #1:\s!unknown \fi\fi\fi\fi\fi \endcsname{#2}} \def\publ_fast_setup_nop#1#2% {\csname\??setup:\s!btx:% \ifcsname\??setup:\s!btx:\currentbtxspecification:#1:#2\endcsname \currentbtxspecification:#1:#2% \else\ifcsname\??setup:\s!btx:#1:#2\endcsname #1:#2% \else\ifcsname\??setup:\s!btx:\currentbtxspecification:#1:\s!unknown\endcsname \currentbtxspecification:#1:\s!unknown \else #1:\s!unknown \fi\fi\fi \endcsname{#2}} \newconstant\btxsetuptype % 0 = unknown darkred % 1 = cite darkblue % 2 = subcite darkgreen % 3 = numbering darkorange % 4 = list darkcyan % 5 = page darkmagenta % 6 = unknown darkred \unexpanded\def\publ_fast_btx_setup_chain_inbetween {\allowbreak->\allowbreak} \unexpanded\def\publ_fast_btx_setup_colon_inbetween {\allowbreak:\allowbreak} \unexpanded\def\publ_fast_btx_setup_chain_yes#1#2% {\dontleavehmode\begingroup \let\:\publ_fast_btx_setup_colon_inbetween \infofont \ifcase\btxsetuptype\darkred\or\darkblue\or\darkgreen\or\darkcyan\or\darkmagenta\else\darkred\fi [\prewordbreak \currentbtxspecification \:#1\:#2\ifcsname\??setup:\s!btx:\currentbtxspecification:#1:#2\endcsname\else \publ_fast_btx_setup_chain_inbetween \currentbtxspecificationfallback\:#1\:#2\ifcsname\??setup:\s!btx:\currentbtxspecificationfallback:#1:#2\endcsname\else \publ_fast_btx_setup_chain_inbetween #1\:#2\ifcsname\??setup:\s!btx:#1:#2\endcsname\else \publ_fast_btx_setup_chain_inbetween \currentbtxspecification \:#1\:\s!unknown\ifcsname\??setup:\s!btx:\currentbtxspecification:#1:\s!unknown\endcsname\else \publ_fast_btx_setup_chain_inbetween \currentbtxspecificationfallback\:#1\:\s!unknown\ifcsname\??setup:\s!btx:\currentbtxspecificationfallback:#1:\s!unknown\endcsname\else \publ_fast_btx_setup_chain_inbetween unset\fi\fi\fi\fi\fi \space @\space \currentbtx \prewordbreak]% \endgroup} \unexpanded\def\publ_fast_btx_setup_chain_nop#1#2% {\dontleavehmode\begingroup \let\:\publ_fast_btx_setup_colon_inbetween \infofont \darkred [\prewordbreak \currentbtxspecification\:#1\:#2\ifcsname\??setup:\s!btx:\currentbtxspecification:#1:#2\endcsname\else \publ_fast_btx_setup_chain_inbetween #1\:#2\ifcsname\??setup:\s!btx:#1:#2\endcsname\else \publ_fast_btx_setup_chain_inbetween \currentbtxspecification\:#1\:\s!unknown\ifcsname\??setup:\s!btx:\currentbtxspecification:#1:\s!unknown\endcsname\else \publ_fast_btx_setup_chain_inbetween unset\fi\fi\fi \space @\space \currentbtx \prewordbreak]% \endgroup} \unexpanded\def\publ_fast_btx_setup_normal#1% {\btxsetuptype#1\relax \ifx\currentbtxspecificationfallback\empty \expandafter\publ_fast_setup_nop \else \expandafter\publ_fast_setup_yes \fi} \unexpanded\def\publ_fast_btx_setup_visual#1#2#3% {\btxsetuptype#1\relax \ifx\currentbtxspecificationfallback\empty \expandafter\publ_fast_btx_setup_chain_nop \else \expandafter\publ_fast_btx_setup_chain_yes \fi{#2}{#3}% \ifx\currentbtxspecificationfallback\empty \expandafter\publ_fast_setup_nop \else \expandafter\publ_fast_setup_yes \fi{#2}{#3}} \installtextracker {publications.setups} {\let\publ_fast_setup\publ_fast_btx_setup_visual} {\let\publ_fast_setup\publ_fast_btx_setup_normal} \let\publ_fast_setup\publ_fast_btx_setup_normal %D Cite helpers: \newtoks\everybtxciteentry \prependtoks \setfalse\c_btx_cite_reference_injected \to \everybtxciteentry \unexpanded\def\btxcitesetup#1% {\the\everybtxciteentry \everybtxciteentry\emptytoks % tricky maybe not when subcites \publ_fast_setup\plusone\s!cite{#1}} % no \btxcitereset as we loose dataset and such \unexpanded\def\btxsubcitesetup#1% {\the\everybtxciteentry \everybtxciteentry\emptytoks % tricky maybe not when subcites \publ_fast_setup\plustwo\s!cite{#1}} % no \btxcitereset as we loose dataset and such \appendtoks \btx_check_language \to \everybtxciteentry \unexpanded\def\btxstartsubcite#1% {\begingroup \btx_reset_cite % todo: limited set \def\currentbtxcitealternative{#1}% \setbtxparameterset\s!cite\currentbtxcitealternative \usebtxstyleandcolor\c!style\c!color \btxparameter\c!left \relax} \unexpanded\def\btxstopsubcite {\relax \btxparameter\c!right \endgroup} \unexpanded\def\btxstartciterendering[#1]% {\begingroup \edef\currentbtxcitealternative{#1}% \setbtxparameterset\s!cite\currentbtxcitealternative \usebtxstyleandcolor\c!style\c!color \btxparameter\c!left \relax} \unexpanded\def\btxstopciterendering {\relax \btxparameter\c!right \endgroup} \let\btxstartciteauthor\begingroup \let\btxstopciteauthor \endgroup \unexpanded\def\btxstartcite{\begingroup\btx_reset_cite} \let\btxstopcite \endgroup %D Whatever helpers: \unexpanded\def\btxsingularplural#1{\clf_btxsingularorplural{\currentbtxdataset}{\currentbtxtag}{#1}} \unexpanded\def\btxoneorrange #1{\clf_btxoneorrange {\currentbtxdataset}{\currentbtxtag}{#1}} \unexpanded\def\btxfirstofrange #1{\clf_btxfirstofrange {\currentbtxdataset}{\currentbtxtag}{#1}} \let\btxsingularorplural\btxsingularplural \stopcontextdefinitioncode %D Journals \unexpanded\def\btxloadjournallist [#1]{\clf_btxloadjournallist{#1}} \unexpanded\def\btxsavejournallist [#1]{\clf_btxsavejournallist{#1}} \unexpanded\def\btxaddjournal [#1][#2]{\clf_btxaddjournal{#1}{#2}} \def\btxexpandedjournal #1{\clf_btxexpandedjournal{#1}} % \unexpanded ? \def\btxabbreviatedjournal#1{\clf_btxabbreviatedjournal{#1}} % \unexpanded ? % \installcorenamespace{btxjournal} % % \letvalue{\s!btxjournal\v!long }\btxexpandedjournal % \letvalue{\s!btxjournal\v!short }\btxabbreviatedjournal % \letvalue{\s!btxjournal\v!normal}\firstofoneargument % % \unexpanded\def\btxcheckedjournal % {\expandnamespaceparameter\s!btxjournal\btxrenderingparameter\c!journalconversion} % \btxloadjournallist[list.txt] % Foo Journal of Bars = FBJ \n .... % % \btxexpandedjournal[fbj] % \btxabbreviatedjournal[foo journal of bars] %D Saving data: \unexpanded\def\savebtxdataset {\dotripleargument\publ_save_dataset} \unexpanded\def\publ_save_dataset[#1][#2][#3]% {\ifthirdargument \publ_save_dataset_indeed[#1][#2][#3]% \else\ifsecondargument \doifelseassignment{#2}% {\publ_save_dataset_indeed[\s!default][#1][#2]}% {\publ_save_dataset_indeed[#1][#2][]}% \else\iffirstargument \doifelseassignment{#1}% {\publ_save_dataset_indeed[\s!default][\jobname-saved.bib][#1]}% {\publ_save_dataset_indeed[\s!default][#1][]}% % \else % % bad news \fi\fi\fi} \unexpanded\def\publ_save_dataset_indeed[#1][#2][#3]% {\begingroup \getdummyparameters [\c!criterium=\v!all,% \c!type=,% \c!dataset=#1,% \c!file=#2,% #3]% % all or used \clf_btxsavedataset dataset {\dummyparameter\c!dataset}% filename {\dummyparameter\c!file}% filetype {\dummyparameter\c!type}% criterium {\dummyparameter\c!criterium}% \relax \endgroup} % \savebtxdataset[default][e:/tmp/foo.bib] % \savebtxdataset[default][e:/tmp/foo.lua] % \savebtxdataset[default][e:/tmp/foo.xml] %D In-text entries: \unexpanded\def\placecitation{\citation[entry]} % [#1] \unexpanded\def\btxhandleciteentry {\dontleavehmode \begingroup \def\currentbtxcitealternative{entry}% \setbtxparameterset\s!cite\currentbtxcitealternative % needs checking \btxcitereference \btx_entry_inject \endgroup} %D Registers % \setupbtxregister % [\c!state=\v!start, % \c!dataset=\v!all, % \c!method=\v!always] \unexpanded\def\publ_registers_set {\ifx\currentbtxregister\empty \else \clf_btxsetregister specification {\currentbtxspecification}% name {\currentbtxregister}% state {\btxregisterparameter\c!state}% dataset {\btxregisterparameter\c!dataset}% field {\btxregisterparameter\c!field}% register {\btxregisterparameter\c!register}% method {\btxregisterparameter\c!method}% alternative {\btxregisterparameter\c!alternative}% \relax \fi} \appendtoks \publ_registers_set \to \everydefinebtxregister \appendtoks \publ_registers_set \to \everysetupbtxregister \appendtoks \normalexpanded{% \defineprocessor [\s!btx:r:\currentbtxregister]% [\c!style=\noexpand\namedbtxregisterparameter{\currentbtxregister}\noexpand\c!style, \c!color=\noexpand\namedbtxregisterparameter{\currentbtxregister}\noexpand\c!color]}% \to \everydefinebtxregister \appendtoks \clf_btxtoregister{\currentbtxdataset}{\currentbtxtag}% \to \t_btx_reference_inject \unexpanded\def\btxindexedauthor#1#2#3#4#5#6% alternative von last initials first junior {\begingroup \def\currentbtxcitealternative{#1}% \ifx\currentbtxcitealternative\empty \edef\currentbtxcitealternative{invertedshort}% maybe we need some default here too? \fi %let\currentbtxlistvariant\currentbtxcitealternative % we inherit \the\everysetupbtxciteplacement \def\currentbtxvons {#2}% \def\currentbtxsurnames {#3}% \def\currentbtxinitials {#4}% \def\currentbtxfirstnames {#5}% \def\currentbtxjuniors {#6}% \setbtxparameterset\s!cite\currentbtxcitealternative \fastsetup{\s!btx:\s!cite:\s!author:\currentbtxcitealternative}% \endgroup} \unexpanded\def\btxregisterauthor {\doifelsenextoptionalcs\publ_register_author_yes\publ_register_author_nop} \def\publ_register_author_yes[#1]#2% {\clf_btxauthortoregister{#1}{#2}\relax} \def\publ_register_author_nop#1% {\clf_btxauthortoregister{\currentbtxdataset}{#1}\relax} %D We hook some setters in the definition sets: % \installdefinitionsetmember \??btx {btxspecification} \??btxcitevariant {btxcitevariant} % \installdefinitionsetmember \??btx {btxspecification} \??btxlistvariant {btxlistvariant} % \installdefinitionsetmember \??btx {btxspecification} \??btxlist {btxlist} % \installdefinitionsetmember \??btx {btxspecification} \??btxrendering {btxrendering} % \installdefinitionsetmember \??btx {btxspecification} \??btx {btx} %D And more helpers ... a never ending story these publications: % \definebtx % [btx:apa:list:article:title] % [style=bolditalic, % command=\WORD] % % \btxstartstyle[btx:apa:list:article:title] % \btxusecommand[btx:apa:list:article:title]{foo} % \btxstopstyle \let\savedcurrentbtx\empty \unexpanded\def\btxstartstyle[#1]% {\begingroup \let\savedcurrentbtx\currentbtx \def\currentbtx{#1}% \usebtxstyle\c!style \let\currentbtx\savedcurrentbtx} \unexpanded\def\btxstartcolor[#1]% {\begingroup \let\savedcurrentbtx\currentbtx \def\currentbtx{#1}% \usebtxcolor\c!color \let\currentbtx\savedcurrentbtx} \unexpanded\def\btxstartstyleandcolor[#1]% {\begingroup \let\savedcurrentbtx\currentbtx \def\currentbtx{#1}% \usebtxstyleandcolor\c!style\c!color \let\currentbtx\savedcurrentbtx} \let\btxstopstyle \endgroup \let\btxstopcolor \endgroup \let\btxstopstyleandcolor\endgroup \unexpanded\def\btxusecommand[#1]#2% using #2 permits space after [] {\namedbtxparameter{#1}\c!command{#2}} %D Defaults: \setupbtxrendering [\c!interaction=\v!start, % \v!all \c!specification=\btxparameter\c!specification, \c!dataset=\v!default, \c!repeat=\v!no, \c!continue=\v!no, \c!method=\v!global, % \c!setups=btx:\btxrenderingparameter\c!alternative:initialize, % not the same usage as cite ! \c!sorttype=\v!default, \c!criterium=\v!text, \c!refcommand=authoryears, % todo \c!numbering=\v!yes, %\c!saveinlist=\v!no, % maybe for before/after \c!pagestate=\v!stop, \c!textstate=\v!start, \c!width=\v!auto, \c!separator={\btxsemicolon}, \c!distance=1.5\emwidth] % Quite some interpunction and labels are the same of at least consistent within % a standard when citations and list entries are involved. We assume that each % standard defines its own set but it can fall back on these defaults. \setupbtx [\c!interaction=\v!start, \c!alternative=num, % default cite form, normally defined in the cite namespace \c!inbetween=\btxspace, % \c!range=\endash, % separator:range? \c!range=\directdiscretionary\endash, \c!compress=\v!yes, % was no? \c!authorconversion=normal, \c!sorttype=normal, % normal, reverse or none \c!etallimit=3, \c!etaldisplay=\btxparameter\c!etallimit, \c!otherstext={\btxspace et al.}, \c!separator:firstnames={\btxspace}, \c!separator:juniors={\btxspace}, \c!separator:vons={\btxspace}, \c!separator:initials={\btxspace}, \c!stopper:initials={.}, %\c!surnamesep={\btxcomma}, % is this used anywhere? \c!separator:invertedinitials={\btxcomma}, \c!separator:invertedfirstnames={\btxcomma}, \c!separator:names:2={\btxcomma}, % separates multiple names \c!separator:names:3=\btxparameter{\c!separator:2}, % before last name in a list \c!separator:names:4=\btxparameter{\c!separator:2}, % between only two names \c!separator:2={\btxsemicolon}, % aka pubsep - separates multiple objects \c!separator:3=\btxparameter{separator:2}, % before last object in a list \c!separator:4=\btxparameter{separator:2}] % between only two objects % Do we want these in the format? Loading them delayed is somewhat messy. \loadbtxdefinitionfile[commands] \loadbtxdefinitionfile[definitions] \loadbtxdefinitionfile[cite] \loadbtxdefinitionfile[list] \loadbtxdefinitionfile[page] \loadbtxdefinitionfile[author] % we assume that the users sets up the right specification and if not ... well, % hope for the best that something shows up and consult the manual otherwise \unexpanded\def\usebtxdefinitions[#1]% {\loadbtxdefinitionfile[#1]% % for hh \setupbtx[\c!specification=#1]} % for ab \setupbtx [\c!specification=\s!default, \c!dataset=\v!default, \c!default=\v!default] \loadbtxdefinitionfile [\s!default] \protect