bibl-tra.mkiv /size: 53 Kb    last modification: 2021-10-28 13:50
1%D \module
2%D   [       file=bibl-tra,
3%D        version=2009.08.22,
4%D          title=\CONTEXT\ Publication Module,
5%D       subtitle=Publications,
6%D         author=Taco Hoekwater,
7%D           date=\currentdate,
8%D      copyright={Public Domain}]
9%C
10%C Donated to the public domain.
11
12
13% % % % watch out ... bibl-tra-new.mkiv is work in progress % % % %
14
15% % % % mlbibtex also supports context and we can run that instead of bibtex % % % %
16
17%D This module has been adapted to \MKIV\ by Hans Hagen so if things go wrong,
18%D he is to blame. The changes concern references and lists but teh rendering
19%D itself is unchanged. Future versions might provide variants as we have plans
20%D for an upgrade.
21%D
22%D We use a still somewhat experimental extension to the list
23%D mechanism. Eventually the bibtex module will use the bibl loader
24%D and access the data by means of lpath expressions. In that case we
25%D don't need to process the bibliography but still need to track
26%D usage as done here.
27%D
28%D A bit ongoing: make more local macros prefixed with bib, i.e. the bib
29%D namespace is reserved.
30
31%D Todo: commandhandler
32
33\writestatus{loading}{ConTeXt Bibliography Support / BibTeX}
34
35\definefilesynonym[bib][obsolete]
36
37\registerctxluafile{bibl-tra}{}
38
39%D The original was developed independantly by Taco Hoekwater while still working for Kluwer
40%D Academic publishers (it still used the dutch interface then). Development continued after
41%D he left Kluwer, and in Januari 2005, the then already internationalized file was merged
42%D with the core distribution by Hans Hagen. The current version is once again by Taco.
43%D
44%D More documentation and additional resources can be found on the contextgarden:
45%D \hyphenatedurl{http://wiki.contextgarden.net//Bibliography}.
46
47%D \subject{DONE (dd/mm/yyyy)}
48%D
49%D \startitemize
50%D \item add author definition (and associated system variable) (26/05/2005)
51%D \item add finalnamesep support for Oxford comma (17/09/2005)
52%D \item add \type{\insert...} for: doi, eprint, howpublished (19/09/2005)
53%D \item allow a defaulted \type{\setupcite} (19/11/2005)
54%D \item renamed citation type 'number' to 'serial' (19/11/2005)
55%D \item better definition of \type{\inverted...author} (19/11/2005)
56%D \item don't reset [numbercommand] in \type {\setuppublication} by default (20/11/2005)
57%D \item don't disable other \type {\setuppublication} keys if alternative is present (20/11/2005)
58%D \item drop \type{\sanitizeaccents} (20/11/2005)
59%D \item added \type{\nocite} and \type{\cite[none]} (21/11/2005)
60%D \item added headtext for it  (23/11/2005)
61%D \item make \type{\cite[url]} and \type{\cite[doi]} interactive (23/11/2005)
62%D \item make right-aligned labels in the list work even when autohang=no
63%D \item use 'et al.' instead of 'et.al.'. Pointed out by Peter M\"unster (30/12/2005)
64%D \item added headtext for cz (31/12/2005)
65%D \item Keep whitespace after \type{\cite} with single argument (31/12/2005)
66%D \item Fix broken \type{\cite{}} support (31/12/2005)
67%D \item Use \type{\readfile} inside \type{\usepublications} instead of \type{\readsysfile} (12/01/2006)
68%D \item Use \type{\currentbibyear} and \type{\currentbibauthor} instead of \type{\YR} and \type{\AU} (05/02/2006)
69%D \item Fix compressed version of authoryear style (05/02/2006)
70%D \item Rename the clashing data fields \type{\url} and \type{\type} to \type{\biburl} and \type{\bibtype} (05/02/2006)
71%D \item Added two french bibl files from Renaud Aubin (06/02/2006)
72%D \item Five new bib class and eight extra bib fields, for IEEEtran (07/02/2006)
73%D \item French keyword translation, provided by Renaud (08/02/2006)
74%D \item fix underscores in undefined keys (22/02/2006)
75%D \item Destroy interactivity in labels of the publication list (13/03/2006)
76%D \item fix multi-cite list compression (11/4/2006)
77%D \item fix \type{\getcitedata} (11/4/2006)
78%D \item magic for chapter bibs (18-25/4/2006)
79%D \item language setting (25/4/2006)
80%D \item use \type{\hyphenatedurl} for \type{\inserturl} (25/4/2006)
81%D \item Add \type{\docitation} to \type{\nocite}(26/4/2006)
82%D \item patents can have numbers, added to bst files (26/4/2006)
83%D \item \type{\docitation} needs a \type{\iftrialtypesetting} (27/4/2006)
84%D \item \type{\filllocalpublist}'s loop is bound by definedness, not resolvedness (27/4/2006)
85%D \item \type{\setuppublications[monthconversion=]} added (15/5/2006)
86%D \item use \type{\undefinedreference} instead of bare question marks (15/5/2006)
87%D \item add grouping around \type{\placepublications} commands (16/5/2006)
88%D \item fix a bug in \type{\cite{<item>}} (17/5/2006)
89%D \item support \type{\cite[authornum]} (18/5/2006)
90%D \item make \type{\cite} unexpandable (20/6/2006)
91%D \item allow hyperlinks in author\&year combo's
92%D       (cite list compression has to be off) (20/6/2006)
93%D \item fix duplicate labels for per-chapter style (20/6/2006)
94%D \item allow \type{\setupcite[interaction=(start|stop)]}
95%D \item fix the item number in the publication list with 'numbering=yes' (22/6/2006)
96%D \item make the default criterium for \type{\placepublications} be \type{previous} (23/6/2006)
97%D \item fix \type{\normalauthor} and \type{\normalshortauthor} spacing (29/6/2006)
98%D \item do not typeset empty arguments to \type{\typesetapublication} (29/6/2006)
99%D \item add \type{symbol=none} to \type{\setuplist} in unnumbered
100%D       mode to prevent typesetting of bare numbers (29/6/2006)
101%D \item remove two incorrect spaces from bibl-num.tex (1/7/2006)
102%D \item reset font styles within \type{\cite}, so that font switches
103%D       in \type{left} stay in effect (12/7/2006)
104%D \item guard added against loading bbl files multiple times (13/7/2006)
105%D \item fix \type{\cite[num]} with compression is on. (14/7/2006)
106%D \item test \type{\iflocation} before deciding to use the
107%D       interactive version of cite (18/7/2006)
108%D \item support \type{\setupcite[authoretallimit=1]} (18/7/2006)
109%D \item support use of \type{\cite} within titles and captions by
110%D       saveguarding the list item extraction and reference placement
111%D       code (19/7/2006)
112%D \item support \type{\setuppublicationlist[title=\chapter]} (4/8/2006)
113%D \item use the expansion of \type{\headtext{pubs}} (4/8/2006)
114%D \item hook added for repeated authors in publication list
115%D       \type{\setuppublicationlist[artauthorcommand=\mythreeargscommand]}
116%D       (4/8/2006)
117%D \item make the bracketed arguments of \type{\artauthor}, \type{\author}
118%D        and \type{\editor} (bbl commands) optional (4/8/2006)
119%D \item the constants \type{sorttype}, \type{compress} and
120%D        \type{autohang} have moved to the core (8/8/2006)
121%D \item bibtex is now registered as a program to be run by texexec (8/8/2006)
122%D \item fix a bug in \type{\setupcite[authoretallimit=1]} (9/8/2006)
123%D \item fix a bug inside citations that prevented lastpubsep from ever being
124%D       used due to a volatile \type{\commalistsize} (25/8/2006).
125%D \item added the possibility of \type{\placepublications[option=continue]}
126%D       (6/9/2006)
127%D \item Mojca translated Master's Thesis to Masterarbeit (bibl-apa-de.tex)
128%D       (12/9/2006)
129%D \item Added \type{\setuppublicationlist[maybeyear=off]} by request from
130%D       Thomas Schmitz (15/9/2006)
131%D \item Removed some spurious spaces pointed out by willi egger (19/9/2006)
132%D \item Add configuration of bibtex executable name (4/11/2006)
133%D \item Fix numbering=short and numbering=bib (spotted by Matthias W\"achter) (4/11/2006)
134%D \item third attempt to get a correct release (5/11/2006)
135%D \item fix a few missing dots in bibl-num.tex  (7/12/2006)
136%D \item Patch for DOI's by Tobias Burnus (17/4/2007)
137%D \item Patch for \type{\insertbiburl} and \type{\insertdoi} for  Tobias Burnus (18/4/2007)
138%D \item Added a missing \type{\relax} in \type{\dospecialbibinsert},
139%D       that made the space before the {\it et al.} text disappear.  (18/4/2007)
140%D \item Attempt to fix percent signs in bbl files. As a side-effect,
141%D       this prohibits comments in \tex{startpublication} blocks! (17/4/2008)
142%D \item Patch from Matthias W\"achter that allows arbitrary .bst
143%D        files to be used with \tex{setupbibtex} (25/9/2008)
144%D \item Extended for the new multilingual setups for the Oct 2008 current of ConTeXt (23/10/2008)
145%D \item Multilingual setups needed another fix (27/10/2008)
146%D \item Two fixes for bibl-apa by Michael Green (27/10/2008)
147%D \item Catalan translation of 'References' (10/11/2008)
148%D \item 'chapter' -> 'chapitre' in bibl-apa-fr (27/11/2008)
149%D \item Run bibtex via os.execute in  mkiv modee (01/12/2008)
150%D \item Small correction in bibl-apa's placement of volume
151%D       information in articles (05/01/2009)
152%D \item Handle multi-author (more than two) cases in \type{\cite}
153%D       (02/03/2009)
154%D \item Suppress a syntax error in \type{cont-xp} mode. The output is
155%D       probably not right, though (02/03/2009)
156%D \item Added a \tex{loadmarkfile} at the end, and two new files
157%D       from Hans. The \type{t-bib.mkiv} is needed to make the module
158%D       work with the new structure code (17/04/2009)
159%D \item Added a patch to \type{t-bib.mkiv} from Hans to make the
160%D       cross referencing between multiple citations an
161%D       bibliographies work (27/04/2009)
162%D \item Remove a superfluous \type{\unprotect} in t-bib.mkiv (11/05/2009).
163%D \item Patch of incollection in bibl-ams.tex from Xan (08/06/2009).
164%D \item Patch of unpublished in bibl-ams.tex from Xan (22/07/2009).
165%D \item Modified \type{\bibdogetupsometextprefix} so it works for undefined
166%D       language labels, from Hans (13/08/2009).
167%D \item Adapt referencing and list insertion to \MKIV. Update some code
168%D       to the latest \CONTEXT. Change some names in order to avoid conflicts
169%D       with existing core names (like \type {\insertpages}).
170%D \item All constants, variables, message etc.\ are now in the core.
171%D \item Added key: \type {method} (when \type {global}, previous shown entries are
172%D       not shown again, when \type {local} they are repeated).
173%D \stopitemize
174%D
175%D \subject{WISHLIST}
176%D
177%D \startitemize
178%D \item link back from publication list to citation
179%D \item export \type {\citation{<cited item>}}
180%D \item support mlbibtex
181%D \item don't load the whole lot, but filter entries instead
182%D \item 9 vs 10, 19 vs 20 ... prevent extra runs when only subtle changes in wd of reference
183%D \stopitemize
184
185\unprotect
186
187\def\biblistname{pubs} % for compatibility
188
189\definelist
190  [pubs]
191
192\setuplist
193  [pubs]
194  [\c!state=\v!start,
195   \c!criterium=\@@pbcriterium,
196   \c!headnumber=\v!always, % needed as we provide our own and need to force
197   \c!width=]
198
199\installstructurelistprocessor{pubs:userdata}%
200  {\ctxlua{bibtex.hacks.add(structures.lists.uservalue("\currentlist",\currentlistindex,"bibref"),\currentlistindex)}}
201
202\ifdefined\bibtexblock   \else \newcount\bibtexblock   \fi \bibtexblock\plusone
203\ifdefined\bibtexcounter \else \newcount\bibtexcounter \fi
204
205%D \macros{bibdoif,bibdoifnot,bibdoifelse}
206%D
207%D Here are a few small helpers that are used a lot in all the typesetting commands
208%D (\type{\bibinsert...}) we will encounter later.
209
210\unexpanded\def\bibdoifelse#1%
211  {\expandafter\def\expandafter\!!stringa\expandafter{#1}%
212   \ifx\!!stringa\empty
213     \expandafter\secondoftwoarguments
214   \else
215     \expandafter\firstoftwoarguments
216   \fi}
217
218\unexpanded\def\bibdoifnot#1%
219  {\expandafter\def\expandafter\!!stringa\expandafter{#1}%
220   \ifx\!!stringa\empty
221     \expandafter\firstofoneargument
222   \else
223     \expandafter\gobbleoneargument
224   \fi}
225
226\unexpanded\def\bibdoif#1%
227  {\expandafter\def\expandafter\!!stringa\expandafter{#1}%
228   \ifx\!!stringa\empty
229     \expandafter\gobbleoneargument
230   \else
231     \expandafter\firstofoneargument
232   \fi}
233
234%D Unfortunately, \BIBTEX\ is not the best configurable program
235%D around. The names of the commands it parses as well as the \type{.aux}
236%D extension to the file name are both hardwired.
237%D
238%D This means \CONTEXT\ has to write a \LATEX-style auxiliary file, yuk!
239%D The good news is that it can be rather short. We'll just ask
240%D \BIBTEX\ to output the entire database(s) into the \type{bbl} file.
241%D
242%D The \type{\bibstyle} command controls how the \type{bbl} file will
243%D be sorted. The possibilities are:
244%D
245%D \startitemize[packed]
246%D \item by author (+year, title): cont-au.bst
247%D \item by title  (+author, year): cont-ti.bst
248%D \item by short key as in abbrev.bst: cont-ab.bst
249%D \item not sorted at all: cont-no.bst
250%D \stopitemize
251
252\newtoks\everysetupbibtex
253
254\unexpanded\def\setupbibtex
255  {\dosingleempty\dosetupbibtex}
256
257\unexpanded\def\dosetupbibtex[#1]%
258  {\let\@@pbdatabase\empty
259   \getparameters[\??pb][#1]%
260   \the\everysetupbibtex}
261
262\unexpanded\def\installbibtexsorter#1#2%
263  {\setvalue{\??pb:\c!sort:#1}{#2}}
264
265\installbibtexsorter\v!no     {no}
266\installbibtexsorter\v!author {au}
267\installbibtexsorter\v!title  {ti}
268\installbibtexsorter\v!short  {ab}
269\installbibtexsorter\empty    {no}
270\installbibtexsorter\s!default{no}
271
272\def\thebibtexsorter{\executeifdefined{\??pb:\c!sort:\@@pbsort}\@@pbsort}
273
274\appendtoks
275   \ifx\@@pbdatabase\empty\else
276     \doifmode{*\v!first}{\ctxlua{bibtex.hacks.process { style="\thebibtexsorter", database="\@@pbdatabase" }}}%
277   \fi
278\to \everysetupbibtex
279
280\setupbibtex
281  [\c!sorttype=\v!cite,
282   \c!sort=no]
283
284%D \macros{iftypesetall,ifbibcitecompress}
285%D
286%D The module needs some new \type{\if} statements.
287
288\newtoks\everysetuppublications
289
290\unexpanded\def\setuppublications
291  {\dosingleargument\dosetuppublications}
292
293\unexpanded\def\dosetuppublications[#1]%
294  {\getparameters[\??pb][\c!alternative=,#1]%
295   \doifsomething\@@pbalternative
296     {\readsysfile{bibl-\@@pbalternative.tex}
297        {\showmessage\m!publications{6}{bibl-\@@pbalternative}}
298        {\showmessage\m!publications{1}{bibl-\@@pbalternative}}%
299      \let\@@pbalternative\empty}%
300   \let\setuppublicationlayout\normalsetuppublicationlayout % overloaded in bibl-num ... vadjust needs to be done with option
301   \getparameters[\??pb][#1]% as bibl-* can have set things back
302   \the\everysetuppublications
303   \ignorespaces}
304
305%D We can omit already shown references (\v!global) or use fresh
306%D lists each time (\v!local).
307
308\setnewconstant\bibtexoncemode\plusone % 0=disable, 1=local, 2=global
309
310\appendtoks
311  \doifelse\@@pbmethod\v!local
312    {\bibtexoncemode\plusone}%
313    {\bibtexoncemode\plustwo}%
314\to \everysetuppublications
315
316%D Cite lists are compressed, if possible. This is set later on.
317
318\newif\ifbibcitecompress\bibcitecompresstrue
319
320\def\@@pbinumbercommand{\executeifdefined{\??pb:\c!numbercommand:\@@pbnumbering}\firstofoneargument}
321
322\setvalue{\??pb:\c!numbercommand:\v!yes  }#1{#1}%
323\setvalue{\??pb:\c!numbercommand:\v!no   }#1{}
324\setvalue{\??pb:\c!numbercommand:\v!short}#1{\bibgetvars\currentpublicationkey}
325\setvalue{\??pb:\c!numbercommand:\v!bib  }#1{\bibgetvarn\currentpublicationkey}
326
327% to be tested
328%
329% \setvalue{\??pb:\c!numbercommand:\v!short}{\bibgetvars\currentpublicationkey\firstofoneargument}
330% \setvalue{\??pb:\c!numbercommand:\v!bib  }{\bibgetvarn\currentpublicationkey\firstofoneargument}
331
332\appendtoks
333  \processaction
334    [\@@pbrefcommand]
335    [\s!default=>\edef\@@citedefault{\@@pbrefcommand},
336     \s!unknown=>\edef\@@citedefault{\@@pbrefcommand}]%
337\to \everysetuppublications
338
339\unexpanded\def\bibleftnumber#1{#1\hfill~}
340
341%D \macros{usepublications}
342%D
343%D After discussing it with Thomas Schmitz it became clear that using external
344%D references makes no sense as one needs to refer to it in special ways and
345%D because similar numbers can be confusing. So, for the moment this is not
346%D supported in \MKIV. (So no: see reference [3-5,9] in "some other document")
347
348\unexpanded\def\usepublications[#1]%
349  {\processcommalist[#1]\dousepublications}
350
351\unexpanded\def\dousepublications#1%
352  {\doonlyonce{#1.\f!bibextension}{\dodousepublications{#1}}}
353
354\unexpanded\def\dodousepublications#1% brr, this par stuff
355  {\let\@@savedpar\par
356   \let\par\ignorespaces
357   \ifhmode\kern\zeropoint\fi
358   \pushcatcodetable
359   \setcatcodetable\ctxcatcodes
360   \readfile{#1.\f!bibextension}
361     {\showmessage\m!publications{4}{#1.\f!bibextension}}
362     {\showmessage\m!publications{2}{#1.\f!bibextension}}%
363   \popcatcodetable
364   \ifhmode\removeunwantedspaces\fi
365   \let\par\@@savedpar}
366
367%D \macros{setuppublicationlist}
368%D
369%D This will be the first command in (\BIBTEX-generated) \type{bbl}
370%D files. `samplesize' is a sample value (in case of \BIBTEX-generated
371%D files, this will be the longest `short' key). `totalnumber'
372%D is the total number of entries that will follow in this
373%D file.
374%D
375%D Both values are only needed for the label calculation
376%D if `autohang' is `true', so by default the command is
377%D not even needed, and therefore I saw no need to give
378%D it it's own system variable and it just re-uses \type{pb}.
379
380\def\publicationlistparameter#1{\csname\??pv:l:#1\endcsname}
381
382\unexpanded\def\setuppublicationlist
383  {\dosingleempty\dosetuppublicationlist}
384
385\unexpanded\def\dosetuppublicationlist[#1]%
386  {\getparameters[\??pv:l:][#1]%
387   \setuplist[pubs][\c!samplesize={AA99},\c!alternative=a,\c!interaction=,\c!pagenumber=\v!no,#1,\c!command=]}
388
389\unexpanded\def\setuppublicationlayout[#1]#2%
390  {\setvalue{\??pv:l:#1}{#2}}
391
392\let\normalsetuppublicationlayout\setuppublicationlayout
393
394\setuppublicationlist
395  [\c!title=,
396   \c!command=\dospecialbibinsert,
397   \c!maybeyear=\v!on]
398
399%D \macros{bibalternative}
400%D
401%D A nice little shorthand that will be used so we don't have to
402%D key in the weird \type{\@@pv} parameter names all the time.
403
404\def\bibalternative#1%
405  {\csname\??pv\@@currentalternative#1\endcsname}
406
407%D \macros{simplebibdef,bibcommandlist}
408%D
409%D \type{\simplebibdef} defines \type{bib@#1}, which in turn will
410%D use one argument that is stored in \type{@@pb@#1}.
411%D
412%D \type{\simplebibdef} also defines \type{bibinsert#1}, which can be
413%D used in the argument of \type{\setuppublicationlayout} to fetch
414%D one of the \type{@@pb@} data entries. \type{bibinsert#1} then has
415%D three arguments: \type{#1} are commands to be executed before the
416%D data, \type{#2} are commands to be executed after the data, and
417%D \type{#3} are commands to be executed if the data is not found.
418%D
419%D \type{\bibcommandlist} is the list of commands that is affected
420%D by this approach. Later on, it will be used to do a series
421%D of assignments from \type{#1} to \type{bib@#1}: e.g
422%D \type{\title} becomes \type{\bib@title} when used within
423%D a publication.
424
425\newtoks\initializebibdefinitions % we need to prevent clashes
426
427\unexpanded\def\simplebibdef#1% hh: funny expansion ?
428  {\expandafter\def\csname bib@#1\endcsname##1%
429     {\setvalue{\??pb @#1}{##1}\ignorespaces}%
430   \expandafter \appendtoks
431     \expandafter\let\csname insert#1\expandafter\endcsname\csname bibinsert#1\endcsname
432   \to \initializebibdefinitions
433   \expandafter\unexpanded\expandafter\def\csname bibinsert#1\endcsname##1##2##3%
434     {\expandafter\bibdoifelse\expandafter{\csname\??pb @#1\endcsname}{##1\csname\??pb @#1\endcsname##2}{##3}}}
435
436\def\bibcommandlist
437  {abstract, annotate, arttitle, assignee, bibnumber, bibtype, biburl, chapter, city,
438   comment, country, day, dayfiled, doi, edition, eprint, howpublished, isbn, issn,
439   issue, journal, keyword, keywords, lastchecked, month, monthfiled, names, nationality,
440   note, notes, organization, pages, pubname, pubyear, revision, series, size, thekey,
441   title, volume, yearfiled}
442
443\processcommacommand[\bibcommandlist]\simplebibdef
444
445\unexpanded\def\bibinsertdoi#1#2#3% let's see how this fails
446  {\bibdoifelse{\@@pb@doi}{#1\expanded{\bibgotoDOI{\@@pb@thekey}{\@@pb@doi}}#2}{#3}}
447
448\unexpanded\def\bibinsertbiburl#1#2#3% let's see how this fails
449  {\bibdoifelse{\@@pb@biburl}{#1\expanded{\bibgotoURL{\@@pb@thekey}{\@@pb@biburl}}#2}{#3}}
450
451\unexpanded\def\bibinsertmonth#1#2#3%
452  {\bibdoifelse\@@pb@month
453     {#1\doifelsenumber\@@pb@month
454       {\doifelseconversiondefined\@@pbmonthconversion
455          {\convertnumber\@@pbmonthconversion\@@pb@month}{\@@pb@month}}%
456          {\@@pb@month}#2}%
457     {#3}}
458
459\appendtoks
460    \let\inserturl \bibinsertbiburl  % for backward compat.
461    \let\inserttype\bibinsertbibtype % for backward compat.
462\to\initializebibdefinitions
463
464\unexpanded\def\newbibfield[#1]%
465  {\simplebibdef{#1}%
466   \edef\bibcommandlist{\bibcommandlist,#1}}
467
468%D \macros{complexbibdef,specialbibinsert}
469%D
470%D The commands \type{\artauthor}, \type{\author} and
471%D \type{\editor} are more complex than the other commands.
472%D Their argument lists have this form:
473%D
474%D \type{\author[junior]{firstnames}[inits]{von}{surname}}
475%D
476%D (bracketed stuff is optional)
477%D
478%D And not only that, but there also might be more than one of each of
479%D these commands. This is why a special command is needed to insert
480%D them, as well as one extra counter for each command.
481
482% todo: instead of \getvalue{bla@num} in specs we should do
483% \bibentrynum{bla} so that we can create a better namespace
484
485%D All of these \type{\expandafter}'s and \type{\csnames} make this code
486%D look far more complex than it really is. For example, the argument
487%D \type{author} defines the macro \type{\bib@author} to do two
488%D things: increment the counter \type{\author@num} (let's say to 2)
489%D and next store it's arguments in the macro \type{\@@pb@author2}.
490%D And it defines \type{\bibinsertauthors} to expand into
491%D \starttyping
492%D \specialbibinsert{author}{\author@num}{<before>}{<after>}{<not>}
493%D \stoptyping
494
495\unexpanded\def\docomplexbibdef#1%
496  {\dodoubleempty\dodocomplexbibdef[#1]}
497
498\unexpanded\def\dodocomplexbibdef[#1][#2]#3%
499  {\doquadrupleempty\dododocomplexbibdef[#1][#2][#3]}
500
501\unexpanded\def\dododocomplexbibdef[#1][#2][#3][#4]#5#6%
502  {\expandafter\increment\csname#1@num\endcsname % todo: bib in name
503   \setevalue{\??pb @#1\csname#1@num\endcsname}{{#3}{#5}{#6}{#4}{#2}}\ignorespaces}
504
505\unexpanded\def\complexbibdef#1%
506  {\expandafter\newcounter\csname #1@num\endcsname
507   \expandafter\def\csname bib@#1\endcsname{\docomplexbibdef{#1}}%
508   \expandafter \appendtoks
509     \expandafter\let\csname insert#1s\expandafter\endcsname\csname bibinsert#1s\endcsname
510   \to \initializebibdefinitions
511   \expandafter\def\csname bibinsert#1s\endcsname##1##2##3{\specialbibinsert{#1}{\csname #1@num\endcsname}{##1}{\unskip ##2}{##3}}}
512
513\processcommalist[author,artauthor,editor]\complexbibdef
514
515%D Another level of indirection is needed to control the
516%D typesetting of all of these arguments.
517
518\newcount\etallimitcounter
519\newcount\etaldisplaycounter
520\newcount\todocounter
521
522\unexpanded\def\specialbibinsert#1#2#3#4#5%
523  {\bgroup
524   \ifnum#2>\zerocount
525     \etallimitcounter  =0\bibalternative{#1etallimit}\relax
526     \etaldisplaycounter=0\bibalternative{#1etaldisplay}\relax
527     \ifnum #2>\etallimitcounter
528       \todocounter\etaldisplaycounter
529       % just in case ...
530	   \ifnum\todocounter>\etallimitcounter
531         \todocounter\etallimitcounter
532       \fi
533     \else
534       \todocounter#2\relax
535     \fi
536     \ifnum\todocounter>\zerocount
537       % find the current author list
538       \let\templist\empty
539       \dorecurse{#2}
540         {\scratchtoks\doubleexpandafter{\csname\??pb @#1\recurselevel\endcsname}%
541          \edef\templist{\ifx\templist\empty\else\templist,\fi\the\scratchtoks}}%
542       #3\publicationlistparameter\c!command{#1}{\todocounter}{\templist}#4\relax
543     \else
544       #5%
545     \fi
546   \else
547     #5%
548   \fi
549   \egroup}
550
551%D This macro does the hard work of inserting a list of people in the
552%D output, with proper regard of all the inbetween strings that can
553%D arise depending on length of the list of people.
554
555%D \#1 = type
556%D \#2 = number of items to be typeset
557%D \#3 = commacommand containing authors
558
559\unexpanded\def\doprocessauthoritem#1#2#3%
560  {\advance\scratchcounter\plusone
561   \ifnum\numexpr\scratchcounter-\plusone\relax<#2\relax
562     \publicationlistparameter{#1}#3%
563     \ifnum\scratchcounter=#2\relax
564       \ifnum\etallimitcounter<\commalistsize\relax
565         \bibalternative{#1etaltext}%
566       \fi
567     \else\ifnum\numexpr\scratchcounter+\plusone\relax=#2\relax
568        \ifnum\commalistsize>\plustwo
569          \bibalternative\c!finalnamesep
570        \else
571          \bibalternative\c!lastnamesep
572        \fi
573     \else
574       \bibalternative\c!namesep
575     \fi\fi
576   \fi}
577
578\unexpanded\def\dospecialbibinsert#1#2#3%
579  {\getcommacommandsize[#3]%
580   \scratchcounter\zerocount
581   \processcommacommand[#3]{\doprocessauthoritem{#1}{#2}}}
582
583%D \macros{invertedauthor,normalauthor,invertedshortauthor,normalshortauthor}
584%D
585%D Just some commands that can be used in \type{\setuppublicationparameters}
586%D If you want to write an extension to the styles, you might
587%D as well define some of these commands yourself.
588%D
589%D The argument list has been reordered here, and the meanings
590%D are:
591%D
592%D \startlines
593%D \type{#1} firstnames
594%D \type{#2} von
595%D \type{#3} surname
596%D \type{#4} inits
597%D \type{#5} junior
598%D \stoplines
599
600\unexpanded\def\normalauthor#1#2#3#4#5%
601  {\bibdoif{#1}{#1\bibalternative\c!firstnamesep}%
602   \bibdoif{#2}{#2\bibalternative\c!vonsep}%
603   #3%
604   \bibdoif{#5}{\bibalternative\c!surnamesep#5\unskip}}
605
606\unexpanded\def\normalshortauthor#1#2#3#4#5%
607  {\bibdoif{#4}{#4\bibalternative\c!firstnamesep}%
608   \bibdoif{#2}{#2\bibalternative\c!vonsep}%
609   #3%
610   \bibdoif{#5}{\bibalternative\c!surnamesep#5\unskip}}
611
612\unexpanded\def\invertedauthor#1#2#3#4#5%
613  {\bibdoif{#2}{#2\bibalternative\c!vonsep}%
614   #3%
615   \bibdoif{#5}{\bibalternative\c!juniorsep#5}%
616   \bibdoif{#1}{\bibalternative\c!surnamesep#1\unskip}}
617
618\unexpanded\def\invertedshortauthor#1#2#3#4#5%
619  {\bibdoif{#2}{#2\bibalternative\c!vonsep}%
620   #3%
621   \bibdoif{#5}{\bibalternative\c!juniorsep#5}%
622   \bibdoif{#4}{\bibalternative\c!surnamesep#4\unskip}}
623
624%D \macros{clearbibitem,clearbibitemtwo,bibitemdefs}
625%D
626%D These are used in \type{\typesetapublication} to do
627%D initializations and cleanups.
628
629\unexpanded\def\clearbibitem#1{\setvalue{\??pb @#1}{}}%
630
631\unexpanded\def\clearbibitemtwo#1% is this reset really needed? after all we reset the counter and we are local
632  {%\dofastrecurse\plusone{\csname#1@num\endcsname}\plusone{\expandafter\let\csname\??pb @#1\recurselevel\undefined}%
633   \letvalue{#1@num}\!!zerocount}
634
635\unexpanded\def\bibitemdefs#1%
636  {\expandafter\let\csname#1\expandafter\endcsname\csname bib@#1\endcsname}
637
638\unexpanded\def\presetbibvariables % make a fast resetter (toks)
639  {\processcommacommand[\bibcommandlist,crossref]\clearbibitem
640   \processcommalist   [artauthor,author,editor]\clearbibitemtwo
641   \processcommacommand[\bibcommandlist]\bibitemdefs
642   \processcommalist   [artauthor,author,editor,crossref]\bibitemdefs}
643
644%D \macros{startpublication}
645%D
646%D We are coming to the end of this module, to the macros that
647%D do typesetting and read the \type{bbl} file.
648
649%D Just a \type{\dosingleempty} is the most friendly
650%D of doing this: there need not even be an argument
651%D to \type{\startpublication}. Of course, then there
652%D is no key either, and it had better be an
653%D article (otherwise the layout will be all screwed up).
654%D
655%D Only specifying the key in the argument is also
656%D legal. In storing this stuff into macros, some trickery with
657%D token registers is needed to fix the expansion problems. Even so,
658%D this appears to not always be 100\% safe, so people are
659%D urgently advised to use \ETEX\ instead of traditional \TEX.
660%D
661%D In \ETEX, all expansion problems are conveniently solved by
662%D the primitive \type{\protected}. To put that another way:
663%D
664%D It's not a bug in this module if it does not appear in \ETEX!
665%D
666%D Now prohibits comments, so % can be used for urls
667
668\unexpanded\def\startpublication
669  {\dosingleempty\dostartpublication}
670
671\let\stoppublication\relax
672
673% this is rather memory hungry; some day i will rewrite this so that
674% we use the database instead
675
676%D \macros{doifbibreferencefoundelse}
677%D
678%D Some macros to fetch the information provided by
679%D \type{\startpublication}.
680
681% we can consider a faster variant in the bbl file; we can also consider
682% storing the keys in lua (and then do more in lua) and use calls to
683% fetch the variables
684
685% hm, we can store at the lua end ...
686
687\unexpanded\def\dostartpublication[#1]%
688  {\begingroup
689   \doifelseassignment{#1}%
690     {\getparameters[\??pb][k=\s!unknown,t=article,n=,s=,a=,y=,o=,u=,#1]}%
691     {\getparameters[\??pb][k=#1,t=article,n=,s=,a=,y=,o=,u=]}%
692   \ctxlua{bibtex.hacks.register(\!!bs\@@pbk\!!es,\!!bs\@@pbs\!!es)}%
693   \catcode\commentasciicode\othercatcode
694   \dodostartpublication}
695
696\unexpanded\def\dodostartpublication#1\stoppublication
697  {\setxvalue{pbd:\@@pbk}##1{\noexpand\ifcase##1\noexpand\or
698     \@@pbk\noexpand\or
699     \@@pba\noexpand\or
700     \@@pby\noexpand\or
701     \@@pbs\noexpand\or
702     \@@pbn\noexpand\or
703     \@@pbt\noexpand\or
704     \@@pbo\noexpand\or
705     \@@pbu\noexpand\or
706     \normalunexpanded{#1}\noexpand\fi}%
707   \endgroup
708   \ignorespaces}
709
710\def\bibgetvark#1{\csname pbd:#1\endcsname\plusone  }
711\def\bibgetvara#1{\csname pbd:#1\endcsname\plustwo  }
712\def\bibgetvary#1{\csname pbd:#1\endcsname\plusthree}
713\def\bibgetvars#1{\csname pbd:#1\endcsname\plusfour }
714\def\bibgetvarn#1{\csname pbd:#1\endcsname\plusfive }
715\def\bibgetvart#1{\csname pbd:#1\endcsname\plussix  }
716\def\bibgetvaro#1{\csname pbd:#1\endcsname\plusseven}
717\def\bibgetvaru#1{\csname pbd:#1\endcsname\pluseight}
718\def\bibgetvard#1{\csname pbd:#1\endcsname\plusnine }
719
720\unexpanded\def\doifelsebibreferencefound#1%
721  {\preloadbiblist
722   \doifelsedefined{pbd:#1}
723     \firstoftwoarguments
724     {\showmessage\m!publications{5}{#1,\the\inputlineno}\secondoftwoarguments}}
725
726\let\doifbibreferencefoundelse\doifelsebibreferencefound
727
728%D \macros{bib@crossref}
729%D
730%D \type{\crossref} is used in database files to point to another
731%D entry. Because of this special situation, it has to be defined
732%D separately. Since this command will not be seen until at
733%D \type{\placepublications}, it may force extra runs. The same is
734%D true for \type{\cite} commands inside of publications.
735
736% used in bib self
737
738\unexpanded\def\bib@crossref#1% called via \csname \endcsname
739  {\setvalue{\??pb @crossref}{#1}\ignorespaces}
740
741\unexpanded\def\bibinsertcrossref#1#2#3%
742  {\bibdoifelse\@@pb@crossref{#1\cite[\@@pb@crossref]#2}{#3}}
743
744\let\insertcrossref\gobblethreearguments
745
746\appendtoks\let\insertcrossref\bibinsertcrossref\to\initializebibdefinitions
747
748%D The next macro is needed because the number command of the
749%D publist sometimes needs to fetch something from the current
750%D item (like the 'short' key). For this, the ID of the current
751%D item is passed in the implict parameter \type{\currentpublicationkey}
752
753\unexpanded\def\doprocessbibtexentry#1{\typesetapublication{#1}}
754
755\unexpanded\def\typesetpubslist
756  {\begingroup
757   \startpacked[\v!blank]%
758   \preloadbiblist
759   % \the\initializebibdefinitions % COMMENTED
760   \edef\currentlist{pubs}%
761   \ctxlua{bibtex.hacks.reset(\number\bibtexoncemode)}%
762   \doifelse{\listparameter\c!criterium}\v!all
763     {\showmessage\m!publications{7}{}%
764      \ctxlua{bibtex.hacks.filterall()}}
765     {\doif{\listparameter\c!criterium}\v!cite
766        {\setuplist[pubs][\c!criterium=\v!here]}%
767      \strc_lists_place_current
768        {pubs}%
769        {\listparameter\c!criterium}%
770        {}%
771        {\listparameter\c!extras}%
772        {\listparameter\c!order}}%
773   \ctxlua{bibtex.hacks.flush("\@@pbsorttype")}%
774   \stoppacked
775   \endgroup}
776
777\newif\ifinpublist
778
779\unexpanded\def\initializepubslist
780  {\def\currentlist{pubs}%
781   \edef\@@pbnumbering{\@@pbnumbering}%
782   \doifelse\@@pbautohang\v!yes
783     {\ifx\@@pbnumbering\v!short
784        \setbox\scratchbox\hbox{\@@pbnumbercommand{\listparameter\c!samplesize}}%
785      \else
786        \doifelse{\listparameter\c!criterium}\v!all
787          {\setbox\scratchbox\hbox{\@@pbnumbercommand{\ctxlua{tex.write{bibtex.hacks.nofregistered()}}}}}
788          {\determinelistcharacteristics[pubs]%
789           \setbox\scratchbox\hbox{\@@pbnumbercommand{\structurelistsize}}}%
790      \fi
791      \edef\publistnumberbox{\hbox to \the\wd\scratchbox}%
792      \expanded{\setuplist[pubs][\c!width=\the\wd\scratchbox,\c!distance=\zeropoint]}%
793      \ifx\@@pbnumbering\v!short
794        \def\@@pblimitednumber##1{\publistnumberbox{\@@pbnumbercommand{\bibgetvars\currentpublicationkey}}}%
795      \else\ifx\@@pbnumbering\v!bib
796        \def\@@pblimitednumber##1{\publistnumberbox{\@@pbnumbercommand{\bibgetvarn\currentpublicationkey}}}%
797      \else
798        \def\@@pblimitednumber##1{\publistnumberbox{\@@pbnumbercommand{##1}}}%
799      \fi\fi}
800     {\doifelsenothing{\listparameter\c!width}
801        {\let \publistnumberbox \hbox}
802        {\edef\publistnumberbox{\hbox to \listparameter\c!width}}%
803      \ifx\@@pbnumbering\v!short
804        \def\@@pblimitednumber##1{\publistnumberbox{\@@pbnumbercommand{\bibgetvars\currentpublicationkey}}}%
805      \else\ifx\@@pbnumbering\v!bib
806        \def\@@pblimitednumber##1{\publistnumberbox{\@@pbnumbercommand{\bibgetvarn\currentpublicationkey}}}%
807      \else
808        \def\@@pblimitednumber##1{\publistnumberbox{\@@pbnumbercommand{##1}}}%
809      \fi\fi}%
810   \ifx\@@pbnumbering\v!no
811     \setuplist[pubs][\c!numbercommand=,\c!symbol=\v!none,\c!textcommand=\outdented]%
812   \else
813     \setuplist[pubs][\c!numbercommand=\@@pblimitednumber]%
814   \fi
815   \doifelse{\publicationlistparameter\c!maybeyear}{\v!off}{\def\maybeyear##1{}}{\def\maybeyear##1{##1}}%
816   \forgetall}
817
818%D The full list of publications
819
820\unexpanded\def\completepublications
821  {\dosingleempty\docompletepublications}
822
823\unexpanded\def\docompletepublications[#1]%
824  {\begingroup
825   \setuplist[pubs][#1]%
826   \edef\currentbibtexsessiontitle{\publicationlistparameter\c!title}%
827   \ifx\currentbibtexsessiontitle\empty
828     \normalexpanded{\startnamedsection[\v!chapter][\c!reference=pubs,\c!title={\headtext{pubs}}]}%
829   \else
830     \normalexpanded{\startnamedsection[\v!chapter][\c!reference=pubs,\c!title={\currentbibtexsessiontitle}]}%
831   \fi
832   \dodoplacepublications
833   \stopnamedsection
834   \endgroup}
835
836%D And the portion with the entries only.
837
838\def\bibrefprefix{\number\bibtexblock:}
839
840\unexpanded\def\placepublications
841  {\dosingleempty\doplacepublications}
842
843\unexpanded\def\doplacepublications[#1]%
844  {\begingroup
845   \setuplist[pubs][#1]%
846   \dodoplacepublications
847   \endgroup}
848
849\unexpanded\def\dodoplacepublications
850  {\determinelistcharacteristics[pubs]%
851   \initializepubslist
852   \doifnot{\namedlistparameter{pubs}\c!option}\v!continue
853     {\global\bibtexcounter\zerocount}%
854   \inpublisttrue
855   \typesetpubslist
856   \inpublistfalse
857   \global\advance\bibtexblock\plusone}
858
859%D \subsubject{What's in a publication}
860%D
861%D Watch out: here all means all publications in database, so use
862%D text when you want text only.
863
864\unexpanded\def\typesetapublication#1%
865  {\doifsomething{#1}
866     {\doifelse{\namedlistparameter{pubs}\c!criterium}\v!all
867        {\doplacepublicationindeed{#1}}%
868        {\ctxlua{bibtex.hacks.doifalreadyplaced("#1")}
869           {}
870           {\doplacepublicationindeed{#1}}}%
871      }}
872
873% for the moment we don't access the data directly but we will do that
874% later when we get away from storing the data and only deal with
875% references
876
877% we'll define proper handlers later
878
879\unexpanded\def\doplacepublicationindeed#1%
880  {\doifelsebibreferencefound{#1}
881     {\global\advance\bibtexcounter\plusone
882      \def\currentpublicationkey{#1}%
883      \ctxlua{bibtex.hacks.registerplaced("#1")}%
884      \def \currentlist               {pubs}%
885      \edef\currentlistentrynumber    {\number\bibtexcounter}%
886      \let \currentlistentrytitle     \bibtexpubtext
887      \let \currentlistentrypagenumber\empty
888      \strc_lists_apply_renderingsetup}
889     {}} % invalid
890
891\unexpanded\def\bibtexpubtext
892  {\expanded{\reference[\bibrefprefix\currentpublicationkey]{\number\bibtexcounter}}%
893   \strut\dotypesetapublication\currentpublicationkey\strut}
894
895\unexpanded\def\dotypesetapublication#1%
896  {\bgroup
897   \the\initializebibdefinitions % NEW
898   \def\@@currentalternative{:l:}%
899   \presetbibvariables
900   \let\biblanguage\empty
901   \ignorespaces
902   \bibgetvard{#1}%
903   \removeunwantedspaces
904   \ignorespaces
905   \bibalternative{\bibgetvart{#1}}%
906   \removeunwantedspaces
907   \egroup}
908
909%D An few afterthoughts:
910
911\let\maybeyear\gobbleoneargument
912\let\noopsort \gobbleoneargument
913
914%D This is the result of bibtex's `language' field.
915
916\unexpanded\def\setbiblanguage#1#2{\setvalue{\??pb\s!language#1}{#2}}
917
918\unexpanded\def\lang#1%
919   {\edef\biblanguage{#1}%
920    \ifcsname\??pb\s!language#1\endcsname
921      \language[\getvalue{\??pb\s!language#1}]%
922    \fi
923    \ignorespaces}
924
925%D \subject{Citations}
926
927%D \macros{cite,bibref}
928%D
929%D The indirection with \type{\dobibref} allows \LATEX\ style
930%D \type{\cite} commands with a braced argument (these might appear
931%D in included data from the \type{.bib} file).
932
933\unexpanded\def\cite
934  {\strictdoifelsenextoptional\dodocite\dobibref}
935
936\unexpanded\def\dobibref#1%
937  {\docite[#1][]}
938
939\unexpanded\def\dodocite[#1]%
940  {\strictdoifelsenextoptional{\docite[#1]}{\docite[#1][]}}
941
942\unexpanded\def\docite[#1][#2]%
943  {\begingroup
944   \doifelsenothing{#2}\secondargumentfalse\secondargumenttrue
945   \ifsecondargument
946     \dowhatevercite{#1}{#2}%
947   \else
948     \donumberedcite{#1}%
949   \fi
950   \endgroup}
951
952\unexpanded\def\dowhatevercite#1#2%
953  {\processcommalist[#2]\docitation
954   \setupinteraction[\c!style=]%
955   \doifelseassignment
956     {#1}%
957     {\getparameters[LO][\c!alternative=,\c!extras=,#1]%
958      \edef\@@currentalternative{\LOalternative}%
959      \ifx\@@currentalternative\empty
960        \edef\@@currentalternative{\@@citedefault}%
961      \fi
962      \ifx\LOextras\empty
963        \setupcite[\@@currentalternative][#1]%
964      \else
965        \expandafter\ifx\csname \??pv \@@currentalternative\c!right\endcsname\relax
966          % avoids tail recursion
967          \expandafter\let\csname \??pv \@@currentalternative\c!right\endcsname\empty
968        \fi
969        \expandafter\ifx\csname LOright\endcsname \relax
970          \edef\LOextras{{\LOextras\bibalternative\c!right}}%
971        \else
972          \edef\LOextras{{\LOextras\LOright}}%
973        \fi
974        \expanded{\setupcite[\@@currentalternative][#1,\c!right=\LOextras]}%
975      \fi}%
976     {\def\@@currentalternative{#1}}%
977   \doifelsevalue{@@pv\@@currentalternative\c!compress}\v!no\bibcitecompressfalse\bibcitecompresstrue
978   \getvalue{bib\@@currentalternative ref}[#2]}
979
980\unexpanded\def\donumberedcite#1%
981  {\processcommalist[#1]\docitation
982   \setupinteraction[\c!style=]%
983   \edef\@@currentalternative{\@@citedefault}%
984   \doifelsevalue{@@pv\@@currentalternative\c!compress}\v!no\bibcitecompressfalse\bibcitecompresstrue
985   \getvalue{bib\@@citedefault ref}[#1]}
986
987%D \macros{nocite}
988
989\unexpanded\def\nocite[#1]%
990  {\processcommalist[#1]\docitation}
991
992%D \macros{setupcite}
993
994\unexpanded\def\setupcite{\dodoubleempty\dosetupcite}
995
996\unexpanded\def\dosetupcite[#1][#2]%
997  {\ifsecondargument
998     \def\dodosetupcite##1{\getparameters[\??pv##1][#2]}%
999     \processcommalist[#1]\dodosetupcite
1000   \else % default case
1001     \getparameters[\??pv\@@citedefault][#1]%
1002   \fi}
1003
1004%D Low-level stuff
1005
1006\unexpanded\def\getcitedata#1[#2]#3[#4]#5to#6%
1007  {\bgroup
1008   \dofetchapublication{#4}%
1009   \doifelsedefined{\??pb @bib#2}%
1010     {\xdef#6{\getvalue{\??pb @bib#2}}}%
1011     {\xdef#6{\getvalue{\??pb @#2}}}%
1012   \egroup}
1013
1014\unexpanded\def\dofetchapublication#1%
1015  {\def\currentpublicationkey{#1}%
1016   \presetbibvariables
1017   \ignorespaces\bibgetvard{#1}}
1018
1019\unexpanded\def\docitation#1%
1020  {\iftrialtypesetting \else
1021     \expanded{\writedatatolist[pubs][bibref=#1]}%
1022   \fi}
1023
1024\let\addthisref\gobbleoneargument % keep this for compatibility
1025
1026%D \macros{ixbibauthoryear,thebibauthors,thebibyears}
1027%D
1028%D If compression of \type{\cite}'s argument expansion is on,
1029%D the macros that deal with authors and years call this internal
1030%D command to do the actual typesetting.
1031%D
1032%D Two entries with same author but with different years may
1033%D be condensed into ``Author (year1,year2)''. This is about the
1034%D only optimization that makes sense for the (author,year)
1035%D style of citations (years within one author have to be unique
1036%D anyway so no need to test for that, and ``Author1, Author2 (year)''
1037%D creates more confusion than it does good).
1038%D
1039%D In the code below,
1040%D the macro \type{\thebibauthors} holds the names of the alternative
1041%D author info fields for the current list. This is a commalist,
1042%D and \type{\thebibyears} holds the (collection of) year(s) that go with
1043%D this author (possibly as a nested commalist).
1044%D
1045%D There had better be an author for all cases, but there
1046%D does not have to be year info always. \type{\thebibyears} is
1047%D pre-initialized because this makes the insertion macros simpler.
1048%D
1049%D In normal \TEX, of course there are expansion problems again.
1050
1051%D Delegate this to \LUA.
1052
1053% \let\ixlastcommand   \relax
1054% \let\ixsecondcomman  \relax
1055% \let\ixfirstcommand  \relax
1056% \let\thebibauthors   \empty
1057% \let\thebibyears     \empty
1058% \let\authorcount     \!!zerocount
1059
1060\let\currentbibauthor\empty
1061
1062\unexpanded\def\ixbibauthoryear#1#2#3#4%
1063  {\bgroup
1064   \gdef\ixlastcommand  {#4}%
1065   \gdef\ixsecondcommand{#3}%
1066   \gdef\ixfirstcommand {#2}%
1067   \glet\thebibauthors  \empty
1068   \glet\thebibyears    \empty
1069   \getcommalistsize[#1]%
1070   \ifbibcitecompress
1071     \dorecurse\commalistsize{\xdef\thebibyears{\thebibyears,}}%
1072     \processcommalist[#1]\docompressbibauthoryear
1073   \else
1074     \processcommalist[#1]\donormalbibauthoryear
1075   \fi
1076   \egroup
1077   \dobibauthoryear}
1078
1079%D \macros{dodobibauthoryear}
1080%D
1081%D This macro only has to make sure that the lists
1082%D \type{\thebibauthors} and \type{\thebibyears} are printed.
1083
1084\unexpanded\def\dobibauthoryear
1085  {\scratchcounter\zerocount
1086   \getcommacommandsize[\thebibauthors]%
1087   \edef\authorcount{\commalistsize}%
1088   \expandafter\processcommalist\expandafter[\thebibauthors]\dodobibauthoryear}
1089
1090\unexpanded\def\dodobibauthoryear#1%
1091  {\advance\scratchcounter\plusone
1092   \edef\wantednumber{\the\scratchcounter}%
1093   \getfromcommacommand[\thebibyears][\wantednumber]%
1094   \expandafter\def\expandafter\currentbibyear\expandafter{\commalistelement}%
1095   \setcurrentbibauthor{#1}%
1096   \ifnum\scratchcounter=\plusone
1097     \ixfirstcommand
1098   \else\ifnum \scratchcounter=\authorcount\relax
1099     \ixlastcommand
1100   \else
1101     \ixsecondcommand
1102   \fi\fi}
1103
1104\unexpanded\def\setcurrentbibauthor#1% sensitive for empty entries but I don't want to touch this
1105  {\getcommacommandsize[#1]%
1106   \ifcase\commalistsize
1107    % anonymous?
1108     \let\currentbibauthor\empty
1109   \or
1110     \def\currentbibauthor{#1}%
1111   \or
1112     \expanded{\docurrentbibauthor#1}%
1113   \else
1114     \handlemultiplebibauthors{\commalistsize}{#1}%
1115   \fi}
1116
1117\newcount\citescratchcounter
1118
1119\unexpanded\def\handlemultiplebibauthors#1#2%
1120  {\citescratchcounter\zerocount
1121   \let\currentbibauthor\empty
1122   \unexpanded\def\bibprocessauthoritem##1%
1123     {\advance\citescratchcounter\plusone
1124      \ifnum \citescratchcounter=#1\relax
1125        \edef\currentbibauthor{\currentbibauthor##1}%
1126      \else\ifnum\numexpr\citescratchcounter+\plusone\relax=#1\relax
1127        \edef\currentbibauthor{\currentbibauthor##1\bibalternative{andtext}}%
1128      \else
1129        \edef\currentbibauthor{\currentbibauthor##1\bibalternative{namesep}}%
1130      \fi\fi}%
1131     \processcommalist[#2]\bibprocessauthoritem}
1132
1133\setupcite
1134  [author,authoryear,authoryears]
1135  [\c!namesep={, }]
1136
1137%D This discovery of authoretallimit is not the best one,
1138%D but it will do for now.
1139
1140\unexpanded\def\docurrentbibauthor#1,#2%
1141  {\doifelseempty{#2}
1142     {\def\currentbibauthor{#1\bibalternative{otherstext}}}
1143     {\expandafter\ifx\csname\??pv\@@currentalternative authoretallimit\endcsname\relax
1144        \edef\currentbibauthor{#1\bibalternative{andtext}#2}%
1145      \else
1146        \edef\currentbibauthor{#1%
1147        \ifcase0\bibalternative{authoretallimit}\relax\or
1148        \bibalternative{otherstext}\else\bibalternative{andtext}#2\fi}%
1149      \fi}}
1150
1151%D This is not the one Hans made for me, because I need a global
1152%D edef, and the \type{\robustdoifinsetelse} doesn't listen to
1153%D \type{\doglobal }
1154
1155\pushoverloadmode
1156
1157    \unexpanded\def\robustaddtocommalist#1#2% {item} \cs
1158      {\robustdoifelseinset{#1}#2\resetglobal
1159         {\dodoglobal\xdef#2{\ifx#2\empty\else#2,\fi#1}}}
1160
1161\popoverloadmode
1162
1163%D \macros{donormalbibauthoryear}
1164%D
1165%D Now we get to the macros that fill the two lists.
1166%D The `simple' one really is quite simple.
1167
1168\unexpanded\def\donormalbibauthoryear#1%
1169  {\def\myauthor{Xxxxxxxxxx}%
1170   \def\myyear{0000}%
1171   \doifelsebibreferencefound{#1}
1172     {\def\myauthor{{\bibgetvara{#1}}}%
1173      \def\myyear  {\bibgetvary{#1}}}%
1174     {}%
1175   \expandafter\doglobal\expandafter\appendtocommalist\expandafter{\myauthor}\thebibauthors
1176   \expandafter\doglobal\expandafter\appendtocommalist\expandafter{\myyear  }\thebibyears}
1177
1178%D \macros{docompressbibauthoryear}
1179%D
1180%D So much for the easy parts. Nothing at all will be done if
1181%D the reference is not found or the reference does not contain
1182%D author data. No questions marks o.s.s. (to be fixed later)
1183
1184\unexpanded\def\docompressbibauthoryear#1%
1185  {\def\myauthor{Xxxxxxxxxx}%
1186   \def\myyear  {0000}%
1187   \doifelsebibreferencefound{#1}
1188     {\xdef\myauthor{\bibgetvara{#1}}%
1189      \xdef\myyear  {\bibgetvary{#1}}}
1190     {}%
1191    \ifx\myauthor\empty\else
1192      \checkifmyauthoralreadyexists
1193      \findmatchingyear
1194    \fi}
1195
1196%D two temporary counters. One of these two can possibly be replaced
1197%D by \type{\scratchcounter}.
1198
1199\newcount\bibitemcounter
1200\newcount\bibitemwanted
1201
1202%D The first portion is simple enough: if this is the very first author
1203%D it is quite straightforward to add it. \type{\bibitemcounter} and
1204%D \type{\bibitemwanted} are needed later to insert the year
1205%D information in the correct item of \type{\thebibyears}
1206
1207\unexpanded\def\checkifmyauthoralreadyexists
1208  {\doifelseemptyvalue{thebibauthors}
1209     {\global\bibitemwanted \plusone
1210      \global\bibitemcounter\plusone
1211      \xdef\thebibauthors{{\myauthor}}}
1212     {% the next weirdness is because according to \getcommalistsize,
1213      % the length of \type{[{{},{}}]} is 2.
1214      \expandafter\getcommalistsize\expandafter[\thebibauthors,]%
1215      \global\bibitemcounter\numexpr\commalistsize+\minusone\relax
1216      \global\bibitemwanted \zerocount
1217      \processcommacommand[\thebibauthors]\docomparemyauthor}}
1218
1219%D The outer \type{\ifnum} accomplishes the addition of
1220%D a new author to \type{\thebibauthors}. The messing about with
1221%D the two counters is again to make sure that \type{\thebibyears}
1222%D will be updated correctly.If the author {\it was} found,
1223%D the counters will stay at their present values and everything
1224%D will be setup properly to insert the year info.
1225
1226\unexpanded\def\docomparemyauthor#1%
1227  {\global\advance\bibitemwanted \plusone
1228   \def\mytempc{#1}%
1229   \ifx\mytempc\myauthor
1230     \quitcommalist
1231   \else\ifnum\bibitemwanted=\bibitemcounter\relax
1232     \global\advance\bibitemwanted \plusone
1233     \global\bibitemcounter\bibitemwanted\relax
1234     \expandafter\doglobal\expandafter\robustaddtocommalist\expandafter{{\myauthor}}\thebibauthors
1235   \fi\fi}
1236
1237%D This macro should be clear now.
1238
1239\unexpanded\def\findmatchingyear
1240  {\edef\wantednumber{\the\bibitemwanted}%
1241   \getfromcommacommand[\thebibyears][\wantednumber]%
1242   \ifx\commalistelement\empty
1243     \edef\myyear{{\myyear}}%
1244   \else
1245     \edef\myyear{{\commalistelement,\myyear}}%
1246   \fi
1247   \edef\newcommalistelement{\myyear}%
1248   \doglobal\replaceincommalist \thebibyears \wantednumber}
1249
1250%D \macros{gotobiblink,inbiblink,atbiblink}
1251%D
1252%D The final task is looping over that list until a match is found.
1253
1254%D Beware, we can have cites without reference match.
1255
1256\unexpanded\def\gotobiblink#1[#2]{\doifelsereferencefound{\bibrefprefix#2}{\goto{#1}[\bibrefprefix#2]}{#1}}
1257\unexpanded\def\atbiblink    [#1]{\doifelsereferencefound{\bibrefprefix#1}{\at      [\bibrefprefix#1]}{#1}}
1258\unexpanded\def\inbiblink    [#1]{\doifelsereferencefound{\bibrefprefix#1}{\expanded{\goto{\currentreferencetext}}[\bibrefprefix#1]}{#1}}
1259
1260%D \macros{bibauthoryearref,bibauthoryearsref,bibauthorref,bibyearref}
1261%D
1262%D Now that all the hard work has been done, these are simple.
1263%D \type{\ixbibauthoryearref} stores the data in the macros
1264%D \type{\currentbibauthor} and \type{\currentbibyear}.
1265
1266\unexpanded\def\doifelsebibinteraction
1267  {\iflocation
1268     \edef\test{\bibalternative\c!interaction}%
1269     \ifx\test\v!stop
1270       \doubleexpandafter\secondoftwoarguments
1271     \else
1272       \doubleexpandafter\firstoftwoarguments
1273     \fi
1274   \else
1275     \expandafter\secondoftwoarguments
1276   \fi}
1277
1278\let\doifbibinteractionelse\doifelsebibinteraction
1279
1280\unexpanded\def\bibmaybeinteractive#1#2%
1281  {\doifelsebibinteraction{\gotobiblink{#2}[#1]}{#2}}
1282
1283\unexpanded\def\bibauthoryearref[#1]%
1284 {\ixbibauthoryear{#1}%
1285    {\bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween
1286     \bibalternative\v!left{\currentbibyear}\bibalternative\v!right}}
1287    {\bibalternative\c!pubsep
1288     \bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween
1289     \bibalternative\v!left  {\currentbibyear}\bibalternative\v!right}}
1290    {\bibalternative\c!lastpubsep
1291     \bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween
1292     \bibalternative\v!left {\currentbibyear}\bibalternative\v!right}}}
1293
1294\unexpanded\def\bibauthoryearsref[#1]%
1295  {\bibalternative\v!left
1296   \ixbibauthoryear{#1}
1297     {\bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween{\currentbibyear}}}
1298     {\bibalternative\c!pubsep
1299      \bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween{\currentbibyear}}}
1300     {\bibalternative\c!lastpubsep
1301      \bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween{\currentbibyear}}}%
1302   \bibalternative\v!right}
1303
1304\unexpanded\def\bibauthorref[#1]%
1305  {\bibalternative\v!left
1306   \ixbibauthoryear{#1}%
1307     {\bibmaybeinteractive{#1}{{\currentbibauthor}}}
1308     {\bibalternative\c!pubsep    \bibmaybeinteractive{#1}{{\currentbibauthor}}}
1309     {\bibalternative\c!lastpubsep\bibmaybeinteractive{#1}{{\currentbibauthor}}}%
1310   \bibalternative\v!right}
1311
1312\unexpanded\def\bibyearref[#1]%
1313  {\bibalternative\v!left
1314   \ixbibauthoryear{#1}%
1315     {\bibmaybeinteractive{#1}{{\currentbibyear}}}
1316     {\bibalternative\c!pubsep    \bibmaybeinteractive{#1}{{\currentbibyear}}}
1317     {\bibalternative\c!lastpubsep\bibmaybeinteractive{#1}{{\currentbibyear}}}%
1318   \bibalternative\v!right}
1319
1320%D \macros{bibshortref,bibkeyref,bibpageref,bibtyperef,bibserialref}
1321%D
1322%D There is hardly any point in trying to compress these. The only
1323%D thing that needs to be done is making sure that
1324%D the separations are inserted correctly. And that is
1325%D what \type{\bibinsertrefsep} does.
1326
1327\newconditional\firstbibrefsep
1328
1329\unexpanded\def\bibresetrefsep
1330  {\settrue\firstbibrefsep}
1331
1332\unexpanded\def\bibinsertrefsep
1333  {\ifconditional\firstbibrefsep
1334     \setfalse\firstbibrefsep
1335   \else
1336     \bibalternative\c!pubsep
1337   \fi}
1338
1339\unexpanded\def\bibshortref[#1]%
1340  {\bibalternative\v!left
1341   \bibresetrefsep\processcommalist[#1]\dobibshortref
1342   \bibalternative\v!right}
1343
1344\unexpanded\def\dobibshortref#1%
1345  {\bibinsertrefsep
1346   \doifelsebibreferencefound{#1}
1347     {\gotobiblink{\bibgetvars{#1}}[#1]}
1348	 {}}
1349
1350\unexpanded\def\bibserialref[#1]%
1351  {\bibalternative\v!left
1352   \bibresetrefsep\processcommalist[#1]\dobibserialref
1353   \bibalternative\v!right}
1354
1355\unexpanded\def\dobibserialref#1%
1356  {\bibinsertrefsep
1357   \doifelsebibreferencefound{#1}
1358     {\gotobiblink{\bibgetvarn{#1}}[#1]}
1359     {}}
1360
1361\unexpanded\def\bibkeyref[#1]%
1362  {\bibalternative\v!left
1363   \bibresetrefsep\processcommalist[#1]\dobibkeyref
1364   \bibalternative\v!right}
1365
1366\unexpanded\def\dobibkeyref#1%
1367  {\bibinsertrefsep
1368   \gotobiblink{#1}[#1]}
1369
1370\unexpanded\def\bibgotoDOI#1#2%
1371  {\doifelsebibinteraction
1372     {\useURL[bibfooDoi#1][#2]%
1373      \useURL[bibfoo#1][http://dx.doi.org/#2]%
1374      \goto{\url[bibfooDoi#1]}[url(bibfoo#1)]}
1375     {\hyphenatedurl{#2}}}
1376
1377\unexpanded\def\bibdoiref[#1]%
1378  {\bibalternative\v!left
1379   \bibresetrefsep\processcommalist[#1]\dobibdoiref
1380   \bibalternative\v!right}
1381
1382\unexpanded\def\dobibdoiref#1%
1383  {\bibinsertrefsep
1384   \doifelsebibreferencefound{#1}
1385     {\expanded{\bibgotoDOI{#1}{\bibgetvaro{#1}}}}
1386     {}}
1387
1388\unexpanded\def\biburlref[#1]%
1389  {\bibalternative\v!left
1390   \bibresetrefsep\processcommalist[#1]\dobiburlref
1391   \bibalternative\v!right}
1392
1393\unexpanded\def\bibgotoURL#1#2%
1394  {\doifelsebibinteraction
1395     {\useURL[bibfoo#1][#2]\goto{\url[bibfoo#1]}[url(bibfoo#1)]}
1396     {\hyphenatedurl{#2}}}
1397
1398\unexpanded\def\dobiburlref#1%
1399  {\bibinsertrefsep
1400   \doifelsebibreferencefound{#1}
1401     {\expanded{\bibgotoURL{#1}{\bibgetvaru{#1}}}}
1402     {}}
1403
1404\unexpanded\def\bibtyperef[#1]%
1405  {\bibalternative\v!left
1406   \bibresetrefsep\processcommalist[#1]\dobibtyperef
1407   \bibalternative\v!right}
1408
1409\unexpanded\def\dobibtyperef#1%
1410  {\bibinsertrefsep
1411   \doifelsebibreferencefound{#1}
1412     {\gotobiblink{\bibgetvart{#1}}[#1]}
1413     {}}
1414
1415\unexpanded\def\bibpageref[#1]%
1416  {\bibalternative\v!left
1417   \bibresetrefsep\processcommalist[#1]\dobibpageref
1418   \bibalternative\v!right}
1419
1420\unexpanded\def\dobibpageref#1%
1421  {\bibinsertrefsep
1422   \doifelsebibinteraction
1423     {\atbiblink[#1]}
1424     {{\referencingfalse\at[#1]}}}
1425
1426\unexpanded\def\bibdataref[#1]%
1427  {\bibalternative\v!left
1428   \bibresetrefsep\processcommalist[#1]\dobibdata
1429   \bibalternative\v!right}
1430
1431\unexpanded\def\dobibdata#1%
1432  {\bibinsertrefsep
1433   \doifelsebibreferencefound{#1}
1434     {\dotypesetapublication{#1}}
1435     {}}
1436
1437\let\bibnoneref\nocite
1438
1439%D \macros{bibnumref}
1440
1441\unexpanded\def\bibnumref[#1]%
1442  {\begingroup
1443   \bibalternative\v!left
1444   \penalty\plustenthousand
1445   \ctxlua{bibtex.hacks.resolve("","\number\bibtexblock","#1")}%
1446   \bibalternative\v!right
1447   \endgroup}
1448
1449\unexpanded\def\dowithbibtexnumrefconnector#1#2%
1450  {\ifnum#1>\plusone
1451     \ifnum#2>\plusone
1452       \ifnum#2=#1\relax
1453         \bibalternative{lastpubsep}%
1454       \else
1455         \bibalternative{pubsep}%
1456       \fi
1457     \fi
1458   \fi}
1459
1460\unexpanded\def\dowithbibtexnumref#1#2#3#4#5% n, i, prefix block ref
1461  {\dowithbibtexnumrefconnector{#1}{#2}%
1462   \def\bibrefprefix{#4:}%
1463   \inbiblink[#5]}
1464
1465\unexpanded\def\dowithbibtexnumrefrange#1#2#3#4#5#6#7% n, i, prefix block ref
1466  {\dowithbibtexnumrefconnector{#1}{#2}%
1467   \def\bibrefprefix{#4:}%
1468   \inbiblink[#5]%
1469   \endash
1470   \def\bibrefprefix{#6:}%
1471   \inbiblink[#7]}
1472
1473%D By request from Sanjoy. This makes it easier to implement
1474%D \type{\citeasnoun}.
1475
1476\unexpanded\def\bibauthornumref[#1]%
1477  {\getcommalistsize[#1]%
1478   \global\bibitemcounter\commalistsize
1479   \bibresetrefsep
1480   \processcommalist[#1]\dobibauthornumref}
1481
1482\unexpanded\def\dobibauthornumref#1%
1483  {\bibinsertrefsep
1484   \doifelsebibreferencefound{#1}
1485     {\begingroup
1486      \cite[\c!left=,\c!right=,\c!alternative=\v!author][#1]%
1487      \bibalternative\c!inbetween
1488      \cite[num][#1]%
1489      \endgroup}
1490     {}}
1491
1492%D And some defaults are loaded from bibl-apa:
1493
1494\setuppublications
1495  [\c!monthconversion=,
1496   \c!alternative=apa,
1497   \c!method=\v!global,
1498  %\c!criterium=\v!previous,
1499   \c!criterium=\v!cite, % mojca wants this so bother her, not me
1500   \c!refcommand=num,
1501   \c!numbercommand=\bibleftnumber]
1502
1503\unexpanded\def\preloadbiblist
1504  {\glet\preloadbiblist\relax
1505   \dousepublications\jobname}
1506
1507% \appendtoks \preloadbiblist \to \everysetuppublications
1508% \appendtoks \preloadbiblist \to \everystarttext
1509
1510\let\ifbibinteractionelse\doifbibinteractionelse
1511
1512\protect \endinput
1513