summaryrefslogtreecommitdiff
path: root/tex/context/base/publ-ini.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/publ-ini.mkiv')
-rw-r--r--tex/context/base/publ-ini.mkiv849
1 files changed, 849 insertions, 0 deletions
diff --git a/tex/context/base/publ-ini.mkiv b/tex/context/base/publ-ini.mkiv
new file mode 100644
index 000000000..dafb0dca3
--- /dev/null
+++ b/tex/context/base/publ-ini.mkiv
@@ -0,0 +1,849 @@
+%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: 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)
+
+% \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-aut}{1.001}
+\registerctxluafile{publ-usr}{1.001}
+\registerctxluafile{publ-ini}{1.001}
+\registerctxluafile{publ-oth}{1.001} % this could become an option
+
+\unprotect
+
+\installcorenamespace {btxdataset}
+\installcorenamespace {btxlistvariant}
+\installcorenamespace {btxcitevariant}
+\installcorenamespace {btxrendering}
+\installcorenamespace {btxcommand}
+\installcorenamespace {btxnumbering}
+
+\installcommandhandler \??btxdataset {btxdataset} \??btxdataset
+\installcommandhandler \??btxlistvariant {btxlistvariant} \??btxlistvariant
+\installcommandhandler \??btxcitevariant {btxcitevariant} \??btxcitevariant
+\installcommandhandler \??btxrendering {btxrendering} \??btxrendering
+
+\unexpanded\def\usebtxdataset
+ {\dodoubleargument\publ_use_dataset}
+
+\def\publ_use_dataset[#1][#2]%
+ {\ifsecondargument
+ \ctxcommand{usebtxdataset("#1","#2")}%
+ \else
+ \ctxcommand{usebtxdataset("\v!standard","#1")}%
+ \fi}
+
+\definebtxdataset
+ [\v!standard]
+
+% \usebtxdataset
+% [standard]
+% [mybibs.bib]
+
+\unexpanded\def\startpublication
+ {\dodoubleempty\publ_set_publication}
+
+\let\stoppublication\relax
+
+\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!standard{#1}}
+
+\def\publ_set_publication_checked#1#2%
+ {\doifassignmentelse{#1}
+ {\publ_set_publication_indeed\v!standard{#1}}
+ {\publ_set_publication_indeed{#1}{}}}
+
+\def\publ_set_publication_indeed#1#2#3\stoppublication
+ {\ctxcommand{addbtxentry("#1",\!!bs#2\!!es,\!!bs\detokenize{#3}\!!es)}%
+ \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
+ \writestatus\m!publications{unknown command: #1, using built-in context variant #1}%
+ %\setuxvalue{\??btxcommand#1}{\expandafter\noexpand\csname#1\endcsname}%
+ \global\expandafter\let\csname\??btxcommand#1\expandafter\endcsname\csname#1\endcsname
+ \else\ifcsname\utfupper{#1}\endcsname
+ \writestatus\m!publications{unknown command: #1, using built-in context variant \utfupper{#1}}%
+ %\setuxvalue{\??btxcommand#1}{\expandafter\noexpand\csname\utfupper{#1}\endcsname}%
+ \global\expandafter\let\csname\??btxcommand#1\expandafter\endcsname\csname\utfupper{#1}\endcsname
+ \else
+ \writestatus\m!publications{unknown command: #1}%
+ \setugvalue{\??btxcommand#1}{\underbar{\tttf#1}}%
+ \fi\fi
+ \publ_command_yes{#1}}
+
+\unexpanded\def\definebtxcommand#1% {body} #1..#n{body}
+ {\setuvalue{\??btxcommand\strippedcsname#1}}%
+
+% access
+
+\let\currentbtxtag \empty
+\let\currentbtxdataset\v!standard
+
+\unexpanded\def\setbtxdataset[#1]%
+ {\edef\currentbtxdataset{\ctxcommand{setbtxdataset("#1")}}}
+
+\unexpanded\def\setbtxentry[#1]%
+ {\edef\currentbtxtag{\ctxcommand{setbtxentry("\currentbtxdataset","#1")}}}
+
+% \let\btxsetdataset\setbtxdataset
+% \let\btxsetentry \setbtxentry
+
+\def\btxfield #1{\ctxcommand{btxfield("\currentbtxdataset","\currentbtxtag","#1")}}
+\def\btxdetail #1{\ctxcommand{btxdetail("\currentbtxdataset","\currentbtxtag","#1")}}
+\def\btxflush #1{\ctxcommand{btxflush("\currentbtxdataset","\currentbtxtag","#1")}}
+%def\btxrendering#1{\ctxcommand{btxrendering("\currentbtxdataset","\currentbtxtag","#1","\btxrenderingparameter\c!interaction")}}
+\def\btxdoifelse #1{\ctxcommand{btxdoifelse("\currentbtxdataset","\currentbtxtag","#1")}}
+\def\btxdoif #1{\ctxcommand{btxdoif("\currentbtxdataset","\currentbtxtag","#1")}}
+\def\btxdoifnot #1{\ctxcommand{btxdoifnot("\currentbtxdataset","\currentbtxtag","#1")}}
+
+\let\btxsetup \directsetup
+
+%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\btxperiod {\removeunwantedspaces.\space}
+\unexpanded\def\btxcomma {\removeunwantedspaces,\space}
+\unexpanded\def\btxlparent {\removeunwantedspaces\space(}
+\unexpanded\def\btxrparent {\removeunwantedspaces)\space}
+\unexpanded\def\btxlbracket{\removeunwantedspaces\space[}
+\unexpanded\def\btxrbracket{\removeunwantedspaces]\space}
+
+%D Rendering lists and citations.
+
+\newconditional\c_btx_trace
+
+\installtextracker
+ {btxrendering}
+ {\settrue \c_btx_trace}
+ {\setfalse\c_btx_trace}
+
+\unexpanded\def\startbtxrendering
+ {\begingroup
+ \dosingleempty\btx_start_rendering}
+
+\def\btx_start_rendering[#1]%
+ {\edef\currentbtxrendering{#1}}
+
+\unexpanded\def\stopbtxrendering
+ {\endgroup}
+
+\unexpanded\def\btxtodo#1%
+ {[#1]}
+
+%D Specific rendering definitions (like apa):
+
+\unexpanded\def\loadbtxdefinitionfile[#1]%
+ {\ctxcommand{loadbtxdefinitionfile("#1")}}
+
+%D Lists:
+
+\newdimen\d_publ_number_width
+\newdimen\d_publ_number_distance
+
+\ifdefined\btxblock \else \newcount\btxblock \fi \btxblock\plusone
+\ifdefined\btxcounter \else \newcount\btxcounter \fi
+
+\newtoks \everysetupbtxlistplacement % name will change
+\newtoks \everysetupbtxciteplacement % name will change
+
+\def\btxlistnumberbox
+ {\hbox \ifzeropt\d_publ_number_width\else to \d_publ_number_width\fi}
+
+% \def\publ_list_processor % bibref -> btx (old method, keep as reference)
+% {\ctxcommand{btxaddtolist("\currentbtxrendering",\currentlistindex,"btxref")}}
+
+\definelist
+ [btx]
+ [\c!before=,
+ %\c!inbetween=,
+ \c!after=]
+
+\appendtoks
+ \definelist
+ [btx:\currentbtxrendering]%
+ [btx]
+ \setuplist
+ [btx:\currentbtxrendering]%
+ [\c!state=\v!start]%
+ % \installstructurelistprocessor
+ % {\currentbtxrendering:userdata}%
+ % {\publ_list_processor}%
+\to \everydefinebtxrendering
+
+\unexpanded\def\btx_entry_inject
+ {\begingroup
+ \edef\currentbtxcategory{\btxfield{category}}%
+ \ignorespaces
+ \directsetup{btx:\currentbtxalternative:\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
+
+\def\publ_place_list_check_criterium
+ {\edef\p_criterium{\btxrenderingparameter\c!criterium} % \v!cite will become \s!cite
+ \ifx\p_criterium\empty
+ \letlistparameter\c!criterium\v!previous
+ \else\ifx\p_criterium\v_cite
+ \letlistparameter\c!criterium\v!here
+ \else
+ \letlistparameter\c!criterium\v_cite
+ \fi\fi}
+
+\def\publ_place_list_complete[#1][#2]% title might become obsolete, just headtext
+ {\begingroup
+ \edef\currentbtxrendering{#1}%
+ \setupcurrentbtxrendering[#2]%
+ \edef\currentlist{btx:\currentbtxrendering}%
+ \publ_place_list_check_criterium
+ \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
+ \publ_place_list_indeed
+ \stopnamedsection
+ \endgroup}
+
+\def\publ_place_list_standard[#1][#2]%
+ {\begingroup
+ \edef\currentbtxrendering{#1}%
+ \setupcurrentbtxrendering[#2]%
+ \edef\currentlist{btx:\currentbtxrendering}%
+ \publ_place_list_check_criterium
+ \publ_place_list_indeed
+ \endgroup}
+
+\newconditional\c_publ_place_all
+\newconditional\c_publ_place_register % to be interfaced
+\newconditional\c_publ_place_check % to be interfaced
+
+\appendtoks
+ \ifx\currentbtxcriterium\v!all % move this check to lua ... easier to test there anyway
+ \settrue\c_publ_place_all
+ \else
+ \setfalse\c_publ_place_all
+ \fi
+\to \everysetupbtxlistplacement
+
+\def\publ_place_list_indeed
+ {\startbtxrendering[\currentbtxrendering]%
+ \directsetup{\btxrenderingparameter\c!setups}%
+ % \determinelistcharacteristics[\currentbtxrendering]%
+ \edef\currentbtxalternative{\btxrenderingparameter\c!alternative}%
+ \edef\currentbtxdataset{\btxrenderingparameter\c!dataset}%
+ \edef\currentlist{btx:\currentbtxrendering}%
+ \the\everysetupbtxlistplacement
+ \forgetall
+ \ctxcommand{btxsetlistmethod("\currentbtxdataset","\btxrenderingparameter\c!method")}%
+ \startpacked[\v!blank]%
+ % here we just collect items
+ % \strc_lists_analyze
+ % {btx}%
+ % {\currentbtxcriterium}%
+ % {\namedlistparameter\currentbtxrendering\c!number}%
+ \ctxcommand{btxcollectlistentries {
+ names = "btx",
+ criterium = "\currentbtxcriterium",
+ number = "\namedlistparameter\currentbtxrendering\c!number",
+ btxdataset = "\currentbtxdataset",
+ }}%
+ % next we analyze the width
+ \ifx\btx_reference_inject_indeed\relax
+ \d_publ_number_width \zeropoint
+ \d_publ_number_distance\zeropoint
+ \else
+ \edef\p_width{\btxrenderingparameter\c!width}%
+ \ifx\p_width\v!auto
+ \scratchcounter\btxcounter
+ \setbox\scratchbox\vbox{\ctxcommand{btxfetchlistentries("\currentbtxdataset")}}%
+ \d_publ_number_width\wd\scratchbox
+ \global\btxcounter\scratchcounter
+ \else
+ \d_publ_number_width\p_width
+ \fi
+ \d_publ_number_distance\btxrenderingparameter\c!distance
+ \fi
+ \letlistparameter\c!width \d_publ_number_width
+ \letlistparameter\c!distance\d_publ_number_distance
+ % this actually typesets them
+ \letlistparameter\c!interaction\v!none
+ \ctxcommand{btxflushlistentries("\currentbtxdataset","\btxrenderingparameter\c!sorttype")}%
+ \stoppacked
+ \stopbtxrendering
+ \global\advance\btxblock\plusone}
+
+\def\currentbtxblock{\number\btxblock}
+
+\def\publ_place_list_entry_checked
+ {\ctxcommand{btxdoifelselistentryplaced("\currentbtxdataset","\currentbtxtag")}\donothing\publ_place_list_entry}
+
+\def\publ_place_list_entry_register
+ {\ctxcommand{btxregisterlistentry("\currentbtxdataset","\currentbtxtag")}}
+
+\unexpanded\def\btxhandlelistentry#1% called at the lua end
+ {\begingroup
+ \edef\currentbtxtag{#1}%
+ \ifconditional\c_publ_place_all
+ \publ_place_list_entry
+ \else\ifconditional\c_publ_place_check
+ \publ_place_list_entry_checked
+ \else
+ \publ_place_list_entry
+ \fi\fi
+ \endgroup}
+
+\unexpanded\def\publ_place_list_entry
+ {%\dontleavehmode
+ %\begstrut
+ \global\advance\btxcounter\plusone
+ \ifconditional\c_publ_place_register
+ \publ_place_list_entry_register
+ \fi
+ \edef\currentlist {btx:\currentbtxrendering}%
+ \let\currentlistentrynumber \btx_reference_inject
+ \let\currentlistentrytitle \btx_entry_inject
+ \let\currentlistentrypagenumber\empty
+ \strc_lists_apply_renderingsetup
+ }%\endstrut}
+
+\unexpanded\def\btxchecklistentry#1% called at the lua end
+ {\begingroup
+ \edef\currentbtxtag{#1}%
+ \ifx\currentbtxcriterium\v!all % move this check to lua ... easier to test there anyway
+ \publ_check_list_entry
+ \else
+ \ctxcommand{btxdoifelselistentryplaced("\currentbtxdataset","\currentbtxtag")}\donothing\publ_check_list_entry
+ \fi
+ \endgroup}
+
+\unexpanded\def\publ_check_list_entry
+ {\global\advance\btxcounter\plusone
+ % todo, switch to font
+ \hbox{\btx_reference_inject}%
+ \par}
+
+\unexpanded\def\btx_reference_inject % we can use a faster \reference
+ {\btxlistnumberbox\bgroup
+% \btxlistvariantparameter\c!left
+% {\tttf d>\currentbtxdataset:\currentbtxblock:\currentbtxtag}%
+ \ctxcommand{btxdestination("\currentbtxdataset","\currentbtxblock","\currentbtxtag","\number\btxcounter")}%
+ \btx_reference_inject_indeed
+% \btxlistvariantparameter\c!right
+ \egroup}
+
+\setuvalue{\??btxnumbering\v!short }{\btxlistvariant{short}} % these will be setups
+\setuvalue{\??btxnumbering\v!bib }{\btxlistvariant{num}} % these will be setups
+\setuvalue{\??btxnumbering\s!unknown}{\btxlistvariant{num}} % these will be setups
+\setuvalue{\??btxnumbering\v!yes }{\btxlistvariant{num}} % these will be setups
+
+\appendtoks
+ \edef\p_btx_numbering{\btxrenderingparameter\c!numbering}%
+ \letlistparameter\c!numbercommand\firstofoneargument % for the moment, no doubling needed
+ \ifx\p_btx_numbering\v!no
+ \letlistparameter\c!textcommand\outdented % needed? we can use titlealign
+ \letlistparameter\c!symbol \v!none
+ \letlistparameter\c!aligntitle \v!yes
+ \let\btx_reference_inject_indeed\relax
+ \else
+ \ifcsname\??btxnumbering\p_btx_numbering\endcsname \else
+ \let\p_btx_numbering\s!unknown
+ \fi
+ \letlistparameter\c!headnumber\v!always
+ \expandafter\let\expandafter\btx_reference_inject_indeed\csname\??btxnumbering\p_btx_numbering\endcsname
+ \fi
+\to \everysetupbtxlistplacement
+
+\appendtoks
+ \edef\currentbtxcriterium{\btxrenderingparameter\c!criterium}%
+\to \everysetupbtxlistplacement
+
+\unexpanded\def\btxflushauthor
+ {\doifnextoptionalelse\btx_flush_author_yes\btx_flush_author_nop}
+
+\def\btx_flush_author_yes[#1]{\btx_flush_author{#1}}
+\def\btx_flush_author_nop {\btx_flush_author{\btxlistvariantparameter\c!author}}
+
+\unexpanded\def\btx_flush_author#1#2%
+ {\edef\currentbtxfield{#2}%
+ \let\currentbtxlistvariant\currentbtxfield
+ \ctxcommand{btxauthor("\currentbtxdataset","\currentbtxtag","\currentbtxfield",{
+ combiner = "#1",
+ etallimit = \number\btxlistvariantparameter\c!etallimit,
+ etaldisplay = \number\btxlistvariantparameter\c!etaldisplay,
+ })}}
+
+\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
+
+% \btxflushauthor{author}
+% \btxflushauthor{artauthor}
+% \btxflushauthor{editor}
+%
+% \btxflushauthor[normal]{author}
+% \btxflushauthor[normalshort]{author}
+% \btxflushauthor[inverted]{author}
+% \btxflushauthor[invertedshort]{author}
+
+% Interaction
+
+\newconditional\btxinteractive
+
+\unexpanded\def\btxdoifelseinteraction
+ {\iflocation
+ \edef\p_interaction{\btxcitevariantparameter\c!interaction}%
+ \ifx\p_interaction\v!stop
+ \doubleexpandafter\secondoftwoarguments
+ \else
+ \doubleexpandafter\firstoftwoarguments
+ \fi
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\appendtoks
+ \iflocation
+ \edef\p_interaction{\btxlistvariantparameter\c!interaction}%
+ \ifx\p_interaction\v!stop
+ \let\doifelsebtxinteractionelse\secondoftwoarguments
+ \setfalse\btxinteractive
+ \else
+ \let\doifelsebtxinteractionelse\firstoftwoarguments
+ \settrue\btxinteractive
+ \fi
+ \else
+ \let\doifelsebtxinteractionelse\secondoftwoarguments
+ \setfalse\btxinteractive
+ \fi
+\to \everysetupbtxlistplacement
+
+% bib -> btx
+
+\unexpanded\def\btxgotolink#1[#2]{\doifreferencefoundelse{\bibrefprefix#2}{\goto{#1}[\bibrefprefix#2]}{#1}}
+\unexpanded\def\btxatlink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\at [\bibrefprefix#1]}{#1}}
+\unexpanded\def\btxinlink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\expanded{\goto{\currentreferencetext}}[\bibrefprefix#1]}{#1}}
+
+\unexpanded\def\btxdirectlink#1#2{\goto{#2 {\tttf[#1]}}[#1]}
+\unexpanded\def\btxdirectlink#1#2{\goto{#2}[#1]}
+
+\let\gotobiblink\btxgotolink
+\let\atbiblink \btxatlink
+\let\inbiblink \btxinlink
+
+\unexpanded\def\btxnumberedreference[#1]% \bibtexnumref (replaced by \cite[num])
+ {\dontleavehmode
+ \begingroup
+ \btxcitevariantparameter\v!left
+ \penalty\plustenthousand % todo
+ \ctxcommand{btxresolvelistreference("\currentbtxdataset","#1")}% todo: split dataset from #1, so another call
+ \btxcitevariantparameter\v!right
+ \endgroup}
+
+% \def\btxnumberedplaceholder[#1]% \nobibtexnumref
+% {[#1]}
+
+\appendtoks
+ % for old times sake, for a while at least
+ \let\maybeyear\gobbleoneargument
+ \let\noopsort \gobbleoneargument
+\to \everysetupbtxlistplacement
+
+\appendtoks
+ % for old times sake, for a while at least
+ \let\maybeyear\gobbleoneargument
+ \let\noopsort \gobbleoneargument
+\to \everysetupbtxciteplacement
+
+\appendtoks
+ \doifnot{\btxlistvariantparameter\c!option}\v!continue
+ {\global\btxcounter\zerocount}%
+\to \everysetupbtxlistplacement
+
+%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.
+
+\newconditional\c_publ_cite_write
+
+% for reference, but split now done at the lua end
+%
+% \def\publ_cite_write#1% not used
+% {\splitstring#1\at::\to\askedbtxrendering\and\askedbtxtag
+% \ifx\askedbtxtag\empty
+% \let\currentbtxtag \askedbtxrendering
+% \else
+% \let\currentbtxtag \askedbtxtag
+% \let\currentbtxrendering\askedbtxrendering
+% \fi
+% \iftrialtypesetting \else
+% \processcommacommand[\currentbtxtag]{\publ_cite_indeed\currentbtxrendering}%
+% \fi}
+
+\def\publ_cite_indeed#1#2%
+ {\expanded{\writedatatolist[btx][btxset=#1,btxref=#2]}}
+
+\def\dobtxmarkcitation#1#2% called from lua end
+ {\iftrialtypesetting \else
+ \writedatatolist[btx][btxset=#1,btxref=#2]% \c!location=\v!here
+ \fi}
+
+%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]
+
+\unexpanded\def\btxcite
+ {\dontleavehmode
+ \begingroup
+ \strictdoifnextoptionalelse\publ_cite_tags_options\publ_cite_tags_indeed}
+
+\unexpanded\def\publ_cite_tags_indeed#1%
+ {\letinteractionparameter\c!style\empty
+ \edef\currentbtxcitevariant{\btxcitevariantparameter\c!alternative}%
+ \edef\currentbtxcitetag{#1}%
+ \publ_cite_variant
+ \endgroup}
+
+\let\publ_citation_tags_indeed\publ_cite_tags_indeed
+
+\unexpanded\def\publ_cite_tags_options[#1]%
+ {\strictdoifnextoptionalelse{\publ_cite_tags_options_indeed{#1}}{\publ_cite_tags_indeed{#1}}}
+
+\unexpanded\def\publ_cite_tags_options_indeed#1[#2]%
+ {\edef\currentbtxcitetag{#2}%
+ \doifassignmentelse{#1}
+ {\publ_cite_tags_settings_indeed{#1}}
+ {\publ_cite_tags_variants_indeed{#1}}}
+
+\def\publ_cite_tags_settings_indeed#1%
+ {\letinteractionparameter\c!style\empty
+ %\letinteractionparameter\c!color\empty
+ \getdummyparameters[\c!alternative=,\c!extras=,#1]%
+ \edef\p_alternative{\dummyparameter\c!alternative}%
+ \ifx\p_alternative\empty \else
+ \let\currentbtxcitevariant\p_alternative
+ \fi
+ \setupcurrentbtxcitevariantparameters[#1]%
+ \edef\p_extras{\dummyparameter\c!extras}%
+ \ifx\p_extras\empty \else
+ \edef\p_right{\btxcitevariantparameter\c!right}%
+ \ifx\p_right\empty \else
+ \setexpandedbtxcitevariantparameter\p_right{\p_extras\p_right}%
+ \fi
+ \fi
+ \publ_cite_variant
+ \endgroup}
+
+\def\publ_cite_tags_variants_indeed#1%
+ {\letinteractionparameter\c!style\empty
+ \edef\currentbtxcitevariant{#1}%
+ \publ_cite_variant
+ \endgroup}
+
+\newconditional\btxcitecompress
+
+\def\publ_cite_variant
+ {\edef\p_compress{\btxcitevariantparameter\c!compress}%
+ % \ifx\p_compress\v!no
+ % \setfalse\btxcitecompress
+ % \else
+ % \settrue\btxcitecompress
+ % \fi
+ \begingroup
+ \settrue\c_publ_cite_write
+ \publ_cite_handle_variant_indeed[\currentbtxcitetag]}
+
+\unexpanded\def\publ_cite_handle_variant#1%
+ {\begingroup
+ \the\everysetupbtxciteplacement
+ \edef\currentbtxcitevariant{#1}%
+ \dosingleargument\publ_cite_handle_variant_indeed}
+
+\def\publ_cite_handle_variant_indeed[#1]%
+ {\usebtxcitevariantstyleandcolor\c!style\c!color
+ \letbtxcitevariantparameter\c!alternative\currentbtxcitevariant
+ \ctxcommand{btxhandlecite(%
+ "\currentbtxdataset",%
+ "#1",%
+ \iftrialtypesetting false\else true\fi,%
+ "\currentbtxcitevariant",%
+ "\btxcitevariantparameter\c!sorttype",%
+ "\btxcitevariantparameter\c!setups"%
+ )}%
+ \endgroup}
+
+\unexpanded\def\btxcitation
+ {\dontleavehmode
+ \begingroup
+ \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\btxnocite
+ {\dosingleempty\publ_cite_no}
+
+\unexpanded\def\publ_cite_no[#1]%
+ {\iftrialtypesetting \else
+ \ctxcommand{btxhandlenocite("\currentbtxdataset","#1")}%
+ \fi}
+
+%D Compatibility:
+
+\let\cite \btxcite
+\let\citation \btxcitation
+\let\nocite \btxnocite
+\let\nocitation \btxnocite
+\let\usepublication\btxnocite
+
+%D Cite: helpers
+
+\unexpanded\def\btxcitevariant#1%
+ {\ctxcommand{btxcitevariant("\currentbtxdataset","\currentbtxblock","\currentbtxtag","#1")}}
+
+%D List: helpers
+
+\def\currentbtxindex{0}
+
+\unexpanded\def\btxlistvariant#1%
+ {\ctxcommand{btxlistvariant("\currentbtxdataset","\currentbtxblock","\currentbtxtag","#1","\currentbtxindex")}} % some can go
+
+%D Loading variants:
+
+\appendtoks
+ \loadbtxdefinitionfile[\btxrenderingparameter\c!alternative]
+\to \everysetupbtxrendering
+
+%D Defaults:
+
+\setupbtxrendering
+ [\c!dataset=\v!standard,
+ \c!method=\v!global,
+ \c!setups=btx:rendering:\btxrenderingparameter\c!alternative,
+ \c!alternative=apa,
+ \c!sorttype=,
+ \c!criterium=,
+ \c!refcommand=authoryears, % todo
+ \c!numbering=\v!yes,
+% \c!autohang=\v!no,
+ \c!width=\v!auto,
+ \c!distance=1.5\emwidth]
+
+\definebtxrendering
+ [\v!standard]
+
+\setupbtxcitevariant
+ [\c!interaction=\v!start,
+ \c!setups=btx:cite:\btxcitevariantparameter\c!alternative,
+ \c!alternative=num,
+ \c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left=,
+ \c!right=]
+
+\definebtxcitevariant
+ [author]
+ [%c!sorttype=,
+ \c!left={(},
+ \c!middle={, },
+ \c!right={)}]
+
+\definebtxcitevariant
+ [authoryear]
+ [\c!compress=\v!yes,
+ \c!inbetween={, },
+ \c!left={(},
+ \c!middle={, },
+ \c!right={)}]
+
+\definebtxcitevariant
+ [authoryears]
+ [authoryear]
+
+\definebtxcitevariant
+ [authornum]
+ [author]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtxcitevariant
+ [year]
+ [\c!left={(},
+ \c!right={)}]
+
+\definebtxcitevariant
+ [key]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtxcitevariant
+ [serial]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtxcitevariant
+ [page]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtxcitevariant
+ [short]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtxcitevariant
+ [type]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtxcitevariant
+ [doi]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtxcitevariant
+ [url]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtxcitevariant
+ [page]
+ [\c!left=,
+ \c!right=,
+ \c!inbetween=\endash]
+
+\definebtxcitevariant
+ [num]
+ [\c!compress=\v!yes,
+ \c!inbetween={--},
+ \c!left={[},
+ \c!right={]}]
+
+% \c!artauthor=invertedshort % todo
+% \c!editor =invertedshort % todo
+% \c!author =invertedshort % todo
+
+\setupbtxlistvariant
+ [\c!namesep={, },
+ \c!lastnamesep={ and },
+ \c!finalnamesep={ and },
+ \c!firstnamesep={ },
+ \c!juniorsep={ },
+ \c!vonsep={ },
+ \c!surnamesep={, },
+ \c!etallimit=5,
+ \c!etaldisplay=5,
+ \c!etaltext={ et al.},
+ \c!monthconversion=\v!number,
+ \c!authorconversion=\v!normal]
+
+\definebtxlistvariant
+ [author]
+
+\definebtxlistvariant
+ [editor]
+ [author]
+
+\definebtxlistvariant
+ [artauthor]
+ [author]
+
+% Do we want these in the format? Loading them delayed is somewhat messy.
+
+\loadbtxdefinitionfile[apa]
+\loadbtxdefinitionfile[cite]
+\loadbtxdefinitionfile[commands]
+\loadbtxdefinitionfile[definitions]
+
+\protect