% This is the librarian package. % Relevant information can be found in librarian-doc.pdf % % Author: Paul Isambert. % E-mail: zappathustra AT free DOT fr % Comments and suggestions are welcome. % Date: April 2010. \csname lb@alreadyloaded\endcsname \expandafter\let\csname lb@alreadyloaded\endcsname\endinput \expandafter\edef\csname lb@restoreat\endcsname{% \catcode`\noexpand\@=\the\catcode`\@ } \catcode`\@=11 \def\lb@error#1{\errmessage{Librarian error: #1}} \def\lb@badengine{% \lb@error{No proper engine. Use pdfTeX (v.1.4 at least), XeTeX or LuaTeX. I quit}% \lb@restoreat \endinput } \ifx\scantokens\lb@undefined \expandafter\lb@badengine \fi \let\lb@next\relax %%% Shamelessly stolen from Heiko Oberdiek's pdftexcmds. \ifcsname directlua\endcsname \directlua{% librarian = { } function librarian.strcmp(A,B) if A == B then tex.write("0") elseif A < B then tex.write("-1") else tex.write("1") end end }% \def\lb@strcmp#1#2{% \directlua{% librarian.strcmp("\luaescapestring{#1}","\luaescapestring{#2}") }% } \else \ifcsname XeTeXversion\endcsname \let\lb@strcmp\strcmp \else \ifcsname pdfstrcmp\endcsname \let\lb@strcmp\pdfstrcmp \else \let\lb@next\lb@badengine \fi \fi \fi \lb@next \unless\ifcsname lb@unexpanded\endcsname \let\lb@unexpanded\unexpanded \fi \unless\ifcsname lb@input\endcsname \let\lb@input\input \fi %%% TRIMMING (Vilely lifted from Will Robertson's trimspaces.) \def\lb@trimleft#1{% \expandafter\def\expandafter#1\expandafter{% \romannumeral-`\.\expandafter\noexpand#1% }% } \bgroup \catcode`\Q=3 \gdef\lb@trimright#1{% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter#1% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter{% \expandafter\lb@@trimright#1Q Q}% } \gdef\lb@@trimright#1 Q{% \lb@@@trimright#1Q% } \gdef\lb@@@trimright#1Q#2{% #1% } \egroup \def\lb@trim#1{% \lb@trimleft#1% \lb@trimright#1% } %%% KEYWORDS AND GENERAL MACROS \def\lb@comment{comment} \def\lb@string{string} \def\lb@preamble{preamble} \def\lb@requested{requested} \def\lb@author{author} \def\lb@editor{editor} \def\lb@namestring{name} \def\lb@endstring{lb@end} \def\lb@eoe{\lb@eoe} \def\lb@gobbletoeoe#1\lb@eoe,{} \def\lb@gobble#1{} {\def\:{\global\let\lb@space= }\: } \def\lb@@space{ } \def\lb@empty{} \def\lb@ifcs#1#2#3#4{% \ifcsname#1:lb@#2\endcsname #3% \else #4% \fi } \def\lb@defcs#1#2{% \expandafter\def\csname#1:lb@#2\endcsname } \def\lb@gdefcs{% \global\lb@defcs } \def\lb@edefcs#1#2{% \expandafter\edef\csname#1:lb@#2\endcsname } \def\lb@xdefcs{% \global\lb@edefcs } \def\lb@cs#1#2{% \csname#1:lb@#2\endcsname }% \def\lb@uncs#1#2{% \lb@unexpanded\expandafter\expandafter\expandafter{% \csname#1:lb@#2\endcsname }% }% \def\lb@apptocs#1#2#3{% \expandafter\expandafter\expandafter#1\csname#2:lb@#3\endcsname } %%% ADDING AND RETRIEVING FIELD \def\lb@addfield#1#2{% \lb@ifcs{#1}{retrieve}% {}% {\lb@makeretrieve{#1}% \WriteImmediateInfo{\noexpand\lb@makeretrieve{#1}}}% \lb@edefcs\lb@entrykey{fields}{% \lb@unexpanded{[[#1=#2]]}% \lb@uncs{\lb@entrykey}{fields}% }% }% \def\lb@addvalue#1#2{\lb@addfield{#2}{#1}} \def\lb@makeretrieve#1{% \lowercase{\lb@defcs{#1}{retrieve}##1[[#1=##2]]##3\lb@eoe{##2}}% \lowercase{\lb@defcs{#1}{retrievein}##1[[#1=##2]]##3\lb@eoe##4{\def##4{##2}}}% } \def\CreateField#1{% \lowercase{\lb@ifcs{#1}{retrieve}}% {}% {\lb@makeretrieve{#1}}% } \def\lb@@makeretrieve#1,{% \def\lb@temp{#1}% \unless\ifx\lb@temp\lb@eoe \lb@makeretrieve{#1}% \expandafter\lb@@makeretrieve \fi } \lb@@makeretrieve address,annote,author,booktitle,chapter,crossref,% edition,editor,howpublished,institution,journal,% key,month,note,number,organization,pages,publisher,% school,series,title,type,volume,year,file,% % These are specific to Librarian. entrytype,authornumber,editornumber,name,namenumber,nametype,\lb@eoe,% \def\RetrieveField#1{% \RetrieveFieldFor{#1}\EntryKey } \def\RetrieveFieldFor#1#2{% \lowercase{\lb@retrievefield{#1}{#2}}% } \def\lb@retrievefield#1#2{% \lb@ifcs{#1}{retrieve}% {\lb@apptocs\lb@retrieve{#2}{fields}\lb@eoe{#1}}% {\lb@error{Unknown field: `#1'}}% } \def\lb@retrieve#1\lb@eoe#2{% \lb@cs{#2}{retrieve}#1[[#2=]]\lb@eoe } \def\RetrieveFieldIn#1{% \RetrieveFieldInFor{#1}\EntryKey } \def\RetrieveFieldInFor#1#2{% \lowercase{\lb@retrievefieldin{#1}{#2}}% }% \def\lb@retrievefieldin#1#2#3{% \lb@ifcs{#1}{retrieve}% {\lb@apptocs\lb@retrievein{#2}{fields}\lb@eoe{#1}#3}% {\lb@error{Unknown field: `#1'}}% } \def\lb@retrievein#1\lb@eoe#2#3{% \lb@cs{#2}{retrievein}#1[[#2=]]\lb@eoe#3% } \def\EntryNumber{% \EntryNumberFor\EntryKey } \def\EntryNumberFor#1#2{% \lowercase{\lb@ifcs{#1@#2}{entrynumber}}% {\lowercase{\lb@cs{#1@#2}{entrynumber}}}% {\lb@error{`#1' doesn't belong to `#2'}}% } \def\EntryNumberIn{% \EntryNumberInFor\EntryKey } \def\EntryNumberInFor#1#2#3{% \lowercase{\lb@ifcs{#1@#2}{entrynumber}}% {\lowercase{\edef#3{\lb@cs{#1@#2}{entrynumber}}}}% {\lb@error{`#1' doesn't belong to `#2'}}% } \def\TypesetField#1{% \TypesetFieldFor{#1}\EntryKey }% \def\TypesetFieldFor#1#2#3#4{% \def\lb@temp{}% \RetrieveFieldInFor{#1}{#2}\lb@temp \ifx\lb@temp\lb@empty \def\lb@next{#4}% \else \def\lb@next{% \expandafter#3\expandafter{\lb@temp}% }% \fi \lb@next } %%% CITATION \newcount\lb@entrycount \newif\iflb@requested \def\lb@mainlist{}% \def\Cite#1{% \lowercase{\lb@cite{#1}}% }% \def\lb@cite#1#2{% \lb@ifcs{#2}{entrylist}% {\lb@ifcs{#1@#2}{entrynumber}% {}% {\lb@xdefcs{#2}{entrycount}{\the\numexpr(\lb@cs{#2}{entrycount}+1)}% \lb@xdefcs{#1@#2}{entrynumber}{\lb@cs{#2}{entrycount}}% \lb@xdefcs{#2}{entrylist}{\lb@cs{#2}{entrylist}#1,}% \lb@ifcs{#1}{fields}% {}% {\lb@ifcs{#2}{newentries}% {\lb@xdefcs{#2}{newentries}{% \lb@cs{#2}{newentries}#1,}}% {\lb@xdefcs{#2}{newentries}{#1,}}}}}% {\lb@gdefcs{#2}{entrycount}{1}% \lb@gdefcs{#1@#2}{entrynumber}{1}% \lb@gdefcs{#2}{entrylist}{#1,}% \lb@ifcs{#1}{fields}% {}% {\lb@ifcs{#2}{newentries}% {\lb@xdefcs{#2}{newentries}{% \lb@cs{#2}{newentries}#1,}}% {\lb@xdefcs{#2}{newentries}{#1,}}}}% \lb@ifcs{#1}{fields}% {\lb@ifcs{#1}{done}% {}% {\lb@cs{#1}{done}% \lb@storeentry{#1}}% \def\EntryKey{#1}% \let\lb@next\lb@first}% {\lb@ifcs{#1}{requested}% {}% {\lb@xdefcs{#1}{requested}{}% \xdef\lb@mainlist{\lb@mainlist#1,}% \global\lb@requestedtrue}% \let\lb@next\lb@second}% \lb@next } \def\lb@first#1#2{#1} \def\lb@second#1#2{#2} %%% READING ENTRIES IN BIB FILES \def\Preamble{}% \def\lb@checktype#1#{% \lowercase{\def\lb@temp{#1}}% \ifx\lb@temp\lb@endoffile \let\lb@next\endinput \else \ifx\lb@next\lb@string \def\lb@next{\expandafter\lb@gotoat\lb@gobble}% \else \ifx\lb@temp\lb@comment \def\lb@next{\expandafter\lb@gotoat\lb@gobble}% \else \ifx\lb@temp\lb@preamble \xdef\Preamble{\lb@unexpanded\expandafter{\Preamble}#1}% \else \def\lb@next{\lb@getentry{#1}}% \fi \fi \fi \fi \lb@next } \def\lb@getentry#1#2{% \lb@readentry{#1}#2,=\lb@eoe,% } \def\lb@readentry#1#2,{% \lowercase{\def\lb@temp{#2}}% \lb@ifcs\lb@temp{requested}% {\let\lb@entrykey\lb@temp \lb@defcs\lb@entrykey{fields}{}% \lowercase{\lb@addfield{entrytype}{#1}}% \let\lb@next\lb@analyzeentry}% {\def\lb@next{\expandafter\lb@gotoat\lb@gobbletoeoe}}% \lb@next } \def\lb@analyzeentry#1={% \lowercase{\def\lb@field{#1}}% \futurelet\lb@nextchar\lb@@analyzeentry } \def\lb@@analyzeentry{% \ifx\lb@nextchar\lb@eoe \RetrieveFieldInFor{author}\lb@entrykey\lb@temp \ifx\lb@temp\lb@empty \RetrieveFieldInFor{editor}\lb@entrykey\lb@temp \unless\ifx\lb@temp\lb@empty \expandafter\lb@addvalue\expandafter{\lb@temp}{name}% \RetrieveFieldInFor{editornumber}\lb@entrykey\lb@temp \expandafter\lb@addvalue\expandafter{\lb@temp}{namenumber}% \lb@addfield{nametype}{editor}% \fi \else \expandafter\lb@addvalue\expandafter{\lb@temp}{name}% \RetrieveFieldInFor{authornumber}\lb@entrykey\lb@temp \expandafter\lb@addvalue\expandafter{\lb@temp}{namenumber}% \lb@addfield{nametype}{author}% \fi \lb@xdefcs{\lb@entrykey}{fields}{\lb@uncs\lb@entrykey{fields}}% \def\lb@next{\expandafter\lb@gotoat\lb@gobbletoeoe}% \else \lb@trim\lb@field \def\lb@next{\futurelet\lb@nextchar\lb@getvalue}% \fi \lb@next } \def\lb@getvalue{% \if\noexpand\lb@nextchar\lb@space \def\lb@next{% \def\lb@next{\futurelet\lb@nextchar\lb@getvalue}% \afterassignment\lb@next\let\lb@nextchar= }% \else \if\noexpand\lb@nextchar"% \let\lb@next\lb@readvalue \else \if\noexpand\lb@nextchar\bgroup \let\lb@next\lb@@readvalue \else \let\lb@next\lb@@@readvalue \fi \fi \fi \lb@next } \def\lb@readvalue"#1"#2,{\lb@dovalue{#1}} \def\lb@@readvalue#1#2,{\lb@dovalue{#1}} \def\lb@@@readvalue#1,{\lb@dovalue{#1}} \def\lb@dovalue#1{% \ifx\lb@field\lb@author \def\lb@tempname{}% \lb@namecount=0 \lb@splitnames#1 and lb@end and % \expandafter\lb@addvalue\expandafter{\lb@tempname}{author}% \expandafter\lb@addvalue\expandafter{\the\lb@namecount}{authornumber}% \else \ifx\lb@field\lb@editor \def\lb@tempname{}% \lb@namecount=0 \lb@splitnames#1 and lb@end and % \lb@trim\lb@tempname \expandafter\lb@addvalue\expandafter{\lb@tempname}{editor}% \expandafter\lb@addvalue\expandafter{\the\lb@namecount}{editornumber}% \else \expandafter\lb@addfield\expandafter{\lb@field}{#1}% \fi \fi \lb@analyzeentry } %%% ANALYZING NAMES \newcount\lb@namecount \newcount\lb@tempcount \newif\iflb@von \newif\iflb@group \def\lb@splitnames#1 and {% \def\lb@temp{#1}% \unless\ifx\lb@temp\lb@endstring \def\lb@name{}\def\lb@lastname{}% \def\lb@firstname{}\def\lb@von{}% \def\lb@junior{}\def\lb@temporary{}% \lb@vonfalse \advance\lb@namecount1 \lb@scanname#1,\lb@eoe,\lb@eoe,% \expandafter\lb@splitnames \fi } \def\lb@scanname#1,#2,#3,{% \def\lb@temp{#2}% \ifx\lb@temp\lb@eoe \let\lb@getrest\lb@withfirst \def\lb@next{\futurelet\lb@nextchar\lb@analyzename#1 \lb@eoe}% \else\let\lb@next\relax \let\lb@getrest\lb@nofirst \def\lb@temp{#3}% \ifx\lb@temp\lb@eoe \expandafter\def\expandafter\lb@firstname\expandafter{\romannumeral-`\:\noexpand#2}% \def\lb@next{% \def\lb@next{\futurelet\lb@nextchar\lb@analyzename#1 \lb@eoe}% \expandafter\lb@next\lb@commagobble }% \else \expandafter\def\expandafter\lb@junior\expandafter{\romannumeral-`\:\noexpand#2}% \expandafter\def\expandafter\lb@firstname\expandafter{\romannumeral-`\:\noexpand#3}% \def\lb@next{% \def\lb@next{\futurelet\lb@nextchar\lb@analyzename#1 \lb@eoe}% \expandafter\expandafter\expandafter\lb@next\expandafter\lb@commagobble\lb@commagobble }% \fi \fi\lb@next } \def\lb@commagobble#1,{}% \def\lb@analyzename#1{% \def\lb@temp{#1}% \ifx\lb@temp\lb@eoe \def\lb@next{\expandafter\lb@getlast\lb@name\lb@eoe}% \else \if\noexpand\lb@nextchar\bgroup \def\lb@next{\lb@grabword{{#1}}}% \else \def\lb@next{\lb@grabword#1}% \fi \fi\lb@next } \def\lb@getlast#1{% \def\lb@lastname{#1}% \lb@trim\lb@lastname \lb@getrest } \def\lb@grabword#1#2 {% \edef\lb@name{{\lb@unexpanded{#1#2}}\lb@unexpanded\expandafter{\lb@name}}% \futurelet\lb@nextchar\lb@analyzename } \def\lb@checkbrace#1\lb@eoe{% \if\noexpand\lb@nextchar\bgroup \lb@grouptrue \else \lb@groupfalse \fi } \def\lb@withfirst#1{% \def\lb@temp{#1}% \ifx\lb@temp\lb@eoe \expandafter\def\expandafter\lb@firstname\expandafter{\lb@temporary}% \let\lb@next\lb@storename \else \futurelet\lb@nextchar\lb@checkbrace#1\lb@eoe \let\lb@next\lb@withfirst \iflb@group \edef\lb@temporary{\lb@unexpanded{#1}% \unless\ifx\lb@temporary\lb@empty \lb@@space \lb@unexpanded\expandafter{\lb@temporary}% \fi}% \else \lb@getfirstletter#1 % \fi \fi\lb@next } \def\lb@empty{} \def\lb@getfirstletter#1#2 {% \ifnum\lccode`#1=`#1 \iflb@von \edef\lb@von{\lb@unexpanded{#1#2}% \unless\ifx\lb@temporary\lb@empty \lb@@space\lb@unexpanded\expandafter{\lb@temporary}\lb@@space \fi \lb@unexpanded\expandafter{\lb@von}}% \def\lb@temporary{}% \else \lb@vontrue \edef\lb@lastname{% \unless\ifx\lb@temporary\lb@empty \lb@@space\lb@unexpanded\expandafter{\lb@temporary}% \fi \lb@unexpanded\expandafter{\lb@lastname}% }% \def\lb@temporary{}% \def\lb@von{#1#2}% \fi \else \edef\lb@temporary{% \lb@unexpanded{#1#2}% \unless\ifx\lb@temporary\lb@empty \lb@@space\lb@unexpanded\expandafter{\lb@temporary}% \fi}% \fi }% \def\lb@nofirst#1{% \def\lb@temp{#1}% \ifx\lb@temp\lb@eoe \let\lb@next\lb@storename \else \futurelet\lb@nextchar\lb@checkbrace#1\lb@eoe \let\lb@next\lb@nofirst \iflb@von \edef\lb@von{% \lb@unexpanded{#1}% \unless\ifx\lb@von\lb@empty \lb@@space\lb@unexpanded\expandafter{\lb@von}% \fi}% \else \iflb@group \edef\lb@lastname{% \lb@unexpanded{#1}% \unless\ifx\lb@lastname\lb@empty \lb@@space\lb@unexpanded\expandafter{\lb@lastname}% \fi}% \else \lb@@getfirstletter#1 % \fi \fi \fi\lb@next } \def\lb@@getfirstletter#1#2 {% \ifnum\lccode`#1=`#1 \lb@vontrue \edef\lb@von{% \lb@unexpanded{#1#2}% \unless\ifx\lb@von\lb@empty \lb@@space\lb@unexpanded\expandafter{\lb@von}% \fi }% \else \edef\lb@lastname{% \lb@unexpanded{#1#2}% \unless\ifx\lb@lastname\lb@empty \lb@@space\lb@unexpanded\expandafter{\lb@lastname}% \fi }% \fi } \def\lb@storename{% \edef\lb@tempname{% \unless\ifx\lb@tempname\lb@empty \lb@unexpanded\expandafter{\lb@tempname}% \fi {{\lb@unexpanded\expandafter{\lb@firstname}}% {\lb@unexpanded\expandafter{\lb@von}}% {\lb@unexpanded\expandafter{\lb@lastname}}% {\lb@unexpanded\expandafter{\lb@junior}}}% }% } %%% SORTING \def\SortingOrder#1#2{% \def\lb@sortingorder{}% \expandafter\lb@makesortingorder#1,\lb@eoe,% % \edef\lb@tempnameorder{#2}% \def\lb@nameorder{}% \lb@namesortingorder#2\lb@eoe } \def\lb@makesortingorder#1,{% \def\lb@temp{#1}% \unless\ifx\lb@temp\lb@eoe \unless\ifx\lb@temp\lb@empty \lb@ifcs{#1}{retrieve}% {}% {\lb@makeretrieve{#1}}% \edef\lb@sortingorder{\lb@sortingorder#1,}% \fi \expandafter\lb@makesortingorder \fi } \def\lb@nameorderdef{\gdef\lb@nameorder_1_2_3_4}% \def\lb@namesortingorder#1{% \ifx#1\lb@eoe \bgroup \catcode`\_=6 \catcode`\@=11 \scantokens\expandafter\expandafter\expandafter{% \expandafter\lb@nameorderdef\expandafter{\lb@nameorder}% A space is created here. Why? }% \egroup \let\lb@next\relax \else \let\lb@next\lb@namesortingorder \if#1f% \edef\lb@nameorder{\lb@unexpanded\expandafter{\lb@nameorder} _1}% \else\if#1v% \edef\lb@nameorder{\lb@unexpanded\expandafter{\lb@nameorder} _2}% \else\if#1l% \edef\lb@nameorder{\lb@unexpanded\expandafter{\lb@nameorder} _3}% \else\if#1j% \edef\lb@nameorder{\lb@unexpanded\expandafter{\lb@nameorder} _4}% \else \lb@error{`#1' is not valid in \SortingOrder}% \fi\fi\fi\fi \fi\lb@next } \SortingOrder{}{} \newcount\lb@sortnumber \newif\iflb@tie \newif\iflb@puttie \def\lb@tie{\lb@tie} \def\lb@endtie{\lb@endtie} \def\lb@addtosorted#1{% \xdef\lb@sortedentries{\lb@unexpanded\expandafter{\lb@sortedentries}#1,}% } \def\lb@@addtosorted#1{% \xdef\lb@sortedentries{\lb@unexpanded\expandafter{\lb@sortedentries}#1}% } \def\lb@sort#1,{% \def\lb@temp{#1}% \ifx\lb@temp\lb@eoe \lb@addtosorted\lb@entrykey \let\lb@next\relax \else \ifx\lb@temp\lb@tie \lb@tietrue \lb@puttietrue \let\lb@next\lb@sort \else \ifx\lb@temp\lb@endtie \ifnum\lb@sortnumber=0 \lb@addtosorted{\lb@entrykey,\noexpand\lb@endtie}% \let\lb@next\lb@finishlist \else \lb@addtosorted{\noexpand\lb@endtie}% \let\lb@next\lb@sort \fi \lb@tiefalse \else \def\lb@currententry{#1}% \expandafter\lb@sortby\lb@sortingorder,\lb@eoe,% \ifnum\lb@sortnumber=0 \iflb@tie \iflb@puttie \lb@addtosorted{\noexpand\lb@tie}% \lb@puttiefalse \fi \ifnum\lb@cs{\lb@entrykey @\lb@currentlist}{entrynumber}<\lb@cs{#1@\lb@currentlist}{entrynumber}% \lb@addtosorted{\lb@entrykey,#1}% \let\lb@next\lb@finishlist \else \lb@addtosorted{#1}% \let\lb@next\lb@sort \fi \else \ifnum\lb@cs{\lb@entrykey @\lb@currentlist}{entrynumber}<\lb@cs{#1@\lb@currentlist}{entrynumber}% \lb@addtosorted{\noexpand\lb@tie,\lb@entrykey,#1,\noexpand\lb@endtie}% \else \lb@addtosorted{\noexpand\lb@tie,#1,\lb@entrykey,\noexpand\lb@endtie}% \fi \let\lb@next\lb@finishlist \fi \else \ifnum\lb@sortnumber\lb@sign0 \lb@tiefalse \lb@addtosorted\lb@entrykey \iflb@puttie \lb@addtosorted{\noexpand\lb@tie}% \lb@puttiefalse \fi \lb@addtosorted{#1}% \let\lb@next\lb@finishlist \else \iflb@puttie \lb@addtosorted{\noexpand\lb@tie}% \lb@puttiefalse \fi \lb@addtosorted{#1}% \let\lb@next\lb@sort \fi \fi \fi \fi \fi \lb@next } \def\lb@finishlist#1\lb@eoe,{% \def\lb@temp{#1}% \unless\ifx\lb@temp\lb@empty \lb@@addtosorted{\lb@unexpanded{#1}}% \fi }% \def\lb@sign{<}% \def\lb@sortby#1,{% \def\lb@temp{#1}% \ifx\lb@temp\lb@empty \let\lb@next\lb@sortby \else \ifx\lb@temp\lb@eoe \lb@sortnumber=0 \let\lb@next\relax \else \bgroup \edef\lb@temp{#1}% \expandafter\lb@preparesort\lb@temp\lb@eoe \egroup \ifnum\lb@sortnumber=0 \let\lb@next\lb@sortby \else \let\lb@next\lb@gobbletoeoe \fi \fi \fi \lb@next } \def\lb@preparesort#1#2\lb@eoe{% \if#1-% \gdef\lb@sign{>}% \def\lb@temp{#2}% \else \gdef\lb@sign{<}% \def\lb@temp{#1#2}% \fi \expandafter\RetrieveFieldInFor\expandafter{\lb@temp}\lb@entrykey\lb@firstfield \expandafter\RetrieveFieldInFor\expandafter{\lb@temp}\lb@currententry\lb@secondfield \ifx\lb@temp\lb@author \lb@preparenames{author}\lb@entrykey\lb@firstfield \lb@preparenames{author}\lb@currententry\lb@secondfield \else\ifx\lb@temp\lb@editor \lb@preparenames{editor}\lb@entrykey\lb@firstfield \lb@preparenames{editor}\lb@currententry\lb@secondfield \else\ifx\lb@temp\lb@namestring \lb@preparenames{name}\lb@entrykey\lb@firstfield \lb@preparenames{name}\lb@currententry\lb@secondfield \else \catcode`\ =9 \fi\fi\fi \expandafter\expandafter\expandafter\lb@compare \expandafter\lb@firstfield\expandafter\lb@eoe\lb@secondfield\lb@eoe } \def\lb@preparenames#1#2#3{% \expandafter\RetrieveFieldInFor\expandafter{#1number}#2\lb@@temp \ifx\lb@@temp\lb@empty \def\lb@@temp{0}% \fi \expandafter\ifnum\lb@@temp=1 \def\lb@@temp{}% \expandafter\lb@loopover\expandafter{#3}\lb@eoe \else \def\lb@@temp{}% \expandafter\lb@loopover#3\lb@eoe \fi \let#3\lb@@temp } \def\lb@loopover#1{% \def\lb@temp{#1}% \ifx\lb@temp\lb@eoe \let\lb@next\relax \else \lb@makename#1% \let\lb@next\lb@loopover \fi\lb@next } \def\lb@makename#1#2#3#4{% \edef\lb@@temp{% \lb@unexpanded\expandafter{\lb@@temp} \lb@unexpanded\expandafter{\lb@nameorder{#1}{#2}{#3}{#4}}% }% } \def\lb@compare#1\lb@eoe#2\lb@eoe{% \catcode`\<=1 \catcode`\>=2 \catcode`\{=13 \catcode`\}=13 \catcode`\@=11 \lb@changemacros \everyeof={}% \scantokens{% \let{\lb@empty \let}\lb@empty \lowercase<\global\lb@sortnumber=\lb@strcmp<#1><#2>>% }% } \def\lb@changemacros{}% \def\SortDef#1#2{% \edef\lb@changemacros{% \lb@unexpanded\expandafter{\lb@changemacros% \def#1{#2}}% }% } %%% BIB FILES \def\lb@readbib#1{% \iflb@requested \global\lb@requestedfalse \openin\lb@read=#1\relax \ifeof\lb@read \lb@error{I can't find file `#1'}% \else \bgroup \endlinechar=`\ % \catcode`\%=12 \lb@makeendoffile \catcode`\@=12 \expandafter\lb@gotoat\lb@input#1\relax \egroup \fi \expandafter\lb@checkentrylist\lb@mainlist\lb@eoe,% \fi } \def\BibFile#1{% \lb@bibfile#1,\lb@eoe,% \iflb@requested \expandafter\lb@checkmissingentries\lb@mainlist\lb@eoe,% \fi } {\catcode`\#=12 \gdef\hash{#}} \def\lb@storelist#1,{% \def\lb@temp{#1}% \unless\ifx\lb@temp\lb@eoe \lb@ifcs{#1}{fields}% {\lb@storeentry{#1}}% {}% \expandafter\lb@storelist \fi } \def\lb@bibfile#1,{% \def\lb@temp{#1}% \ifx\lb@temp\lb@eoe \let\lb@next\relax \else \let\lb@next\lb@bibfile \unless\ifx\@temp\lb@empty \def\lb@file{#1}% \lb@checkextension#1.\lb@eoe \lb@readbib\lb@file \fi \fi \lb@next } \def\lb@checkextension#1.#2\lb@eoe{% \def\lb@temp{#2}% \ifx\lb@temp\lb@empty \def\lb@file{#1.bib}% \fi } \bgroup \catcode`\@=12 \expandafter\xdef\csname lb@gotoat\endcsname#1@{% \csname lb@unexpanded\endcsname\expandafter{\csname lb@checktype\endcsname}% } \expandafter\gdef\csname lb@makeendoffile\endcsname{% \everyeof={@lb@endoffile{}}% } \expandafter\gdef\csname lb@endoffile\endcsname{lb@endoffile} \long\expandafter\gdef\csname lb@readlbr\endcsname#1@lb@endoffile{% \expandafter\gdef\csname lb@dolbr\endcsname{#1}} \egroup \def\lb@checkentrylist#1,{% \def\lb@temp{#1}% \unless\ifx\lb@temp\lb@eoe \lb@ifcs{#1}{fields}% {\lb@storeentry{#1}}% {\global\lb@requestedtrue}% \expandafter\lb@checkentrylist \fi } \def\lb@checkmissingentries#1,{% \def\lb@temp{#1}% \unless\ifx\lb@temp\lb@eoe \lb@ifcs{#1}{fields}% {}% {\lb@error{Entry `#1' wasn't found}}% \expandafter\lb@checkmissingentries \fi } %%% SORTING AND READING LISTS \newif\iflb@resort \def\SortList#1{% \def\lb@sortedentries{}% \def\lb@currentlist{#1}% \lb@ifcs{#1}{entrylist}% {\unless\ifx\lb@sortingorder\lb@empty \lb@resorttrue \expandafter\ifx\csname#1:lb@prevorder\endcsname\lb@sortingorder \expandafter\ifx\csname#1:lb@prevnameorder\endcsname\lb@tempnameorder \lb@resortfalse \fi \fi \iflb@resort \bgroup \tracingmacros0 \tracingcommands0 \tracingrestores0 \tracingscantokens0 \tracingassigns0 \tracingifs0 \tracinggroups0 \tracingnesting0 \def\lb@sortedentries{}% \lb@apptocs\lb@sortlist{#1}{entrylist}\lb@eoe,% \egroup \else \def\lb@sortedentries{}% \lb@apptocs\lb@removeold{#1}{prevsorted}\lb@eoe,% \unless\ifx\lb@sortedentries\lb@empty \let\lb@temp\lb@sortedentries \def\lb@sortedentries{}% \expandafter\lb@checkties\lb@temp\lb@tie,\lb@eoe\lb@endtie,% \fi \edef\lb@newentries{% \lb@ifcs{#1}{newentries}% {\lb@cs{#1}{newentries}}% {}% \lb@cs{#1}{prevoldnew}% }% \expandafter\lb@sortlist\lb@newentries\lb@eoe,% \fi \expandafter\let\csname#1:lb@entrylist\endcsname\lb@sortedentries \fi \WriteImmediateInfo{\noexpand\lb@makelist{#1}% {\lb@ifcs{#1}{oldnew}% {\lb@cs{#1}{oldnew}}% {}}% {\lb@sortingorder}{\lb@tempnameorder}% {\lb@uncs{#1}{entrylist}}}}% {\lb@error{List `#1' doesn't exist}}% } \def\lb@removeold#1,{% \def\lb@temp{#1}% \ifx\lb@temp\lb@eoe \let\lb@next\relax \else \let\lb@next\lb@removeold \ifx\lb@temp\lb@tie \lb@addtosorted{\noexpand\lb@tie}% \else \ifx\lb@temp\lb@endtie \lb@addtosorted{\noexpand\lb@endtie}% \else \lb@ifcs{#1@\lb@currentlist}{entrynumber}% {\lb@addtosorted{#1}}% {}% \fi \fi \fi\lb@next } \newif\iflb@onetie \def\lb@checkties#1\lb@tie,#2\lb@endtie,{% \def\lb@temp{#1}% \unless\ifx\lb@temp\lb@empty \lb@@addtosorted{#1}% \fi \def\lb@temp{#2}% \ifx\lb@temp\lb@eoe \let\lb@next\relax \else \let\lb@next\lb@checkties \unless\ifx\lb@temp\lb@empty \lb@countties#2\lb@eoe,% \iflb@onetie \lb@@addtosorted{#2}% \else \def\lb@templist{}% \lb@sortties#2\lb@eoe,% \let\lb@next\lb@checkties \lb@addtosorted{\noexpand\lb@tie,\lb@templist\noexpand\lb@endtie}% \fi \fi \fi\lb@next } \def\lb@countties#1,#2,{% \def\lb@temp{#2}% \ifx\lb@temp\lb@eoe \lb@onetietrue \else \lb@onetiefalse \expandafter\lb@gobbletoeoe \fi }% \def\lb@sortties#1,{% \def\lb@temp{#1}% \ifx\lb@temp\lb@eoe \let\lb@next\relax \else \let\lb@temp\lb@templist \def\lb@templist{}% \def\lb@entrykey{#1}% \expandafter\lb@@sortties\lb@temp\lb@eoe,% \let\lb@next\lb@sortties \fi\lb@next } \def\lb@@sortties#1,{% \def\lb@temp{#1}% \ifx\lb@temp\lb@eoe \edef\lb@templist{\lb@templist\lb@entrykey,}% \let\lb@next\relax \else \ifnum\lb@cs{\lb@entrykey @\lb@currentlist}{entrynumber}<\lb@cs{#1@\lb@currentlist}{entrynumber}% \edef\lb@templist{\lb@templist\lb@entrykey,#1,}% \let\lb@next\lb@finishties \else \edef\lb@templist{\lb@templist#1,}% \let\lb@next\lb@@sortties \fi \fi \lb@next } \def\lb@finishties#1\lb@eoe,{% \def\lb@temp{#1}% \unless\ifx\lb@temp\lb@empty \edef\lb@templist{\lb@templist#1}% \fi }% \def\lb@sortlist#1,{% \def\lb@temp{#1}% \unless\ifx\lb@temp\lb@eoe \lb@ifcs{#1}{fields}% {\def\lb@entrykey{#1}% \let\lb@temp\lb@sortedentries \def\lb@sortedentries{}% \expandafter\lb@sort\lb@temp\lb@eoe,}% {\lb@ifcs{\lb@currentlist}{oldnew}% {\lb@xdefcs\lb@currentlist{oldnew}{% \lb@cs{\lb@currentlist}{oldnew}#1,}}% {\lb@xdefcs\lb@currentlist{oldnew}{#1,}}}% \expandafter\lb@sortlist \fi } \newif\ifequalentry \def\ReadList#1{% \lb@ifcs{#1}{entrylist}% {\let\lb@makecitename\MakeCiteName \let\MakeCiteName\MakeRefName \lb@apptocs\lb@loopoverentries{#1}{entrylist}\lb@eoe,% \let\MakeCiteName\lb@makecitename}% {\lb@error{List `#1' doesn't exist}}% } \def\lb@loopoverentries#1,{% \def\lb@temp{#1}% \ifx\lb@temp\lb@eoe \let\lb@next\relax \else \let\lb@next\lb@loopoverentries \ifx\lb@temp\lb@tie \equalentrytrue \else \ifx\lb@temp\lb@endtie \equalentryfalse \else \def\EntryKey{#1}% \MakeReference \let\lb@next\lb@loopoverentries \fi \fi \fi\lb@next } \let\MakeReference\relax \def\CheckEntry#1#2{% \ifcs{#1}{fields}% {\def\lb@next{#2}% \expandafter\lb@next}% {}% } \def\ReadAuthor{% \ReadAuthorFor\EntryKey } \def\ReadAuthorFor{% \lb@readandloop{author}% }% \let\ReadAuthors\ReadAuthor \let\ReadAuthorsFor\ReadAuthorFor \def\ReadEditor{% \ReadEditorFor\EntryKey } \def\ReadEditorFor{% \lb@readandloop{editor}% }% \let\ReadEditors\ReadEditor \let\ReadEditorsFor\ReadEditorFor \def\ReadName{% \ReadNameFor\EntryKey } \def\ReadNameFor{% \lb@readandloop{name}% }% \let\ReadNames\ReadName \let\ReadNamesFor\ReadNameFor \newcount\NameCount \def\lb@readandloop#1#2#3{% \def\lb@makerefname{#3}% \NameCount=0 \RetrieveFieldInFor{#1number}{#2}\lb@temp \ifx\lb@temp\lb@empty \def\lb@temp{0}% \fi \ifcase\lb@temp\relax \or \RetrieveFieldInFor{#1}{#2}\lb@temp \expandafter\lb@loopovernames\expandafter{\lb@temp}\lb@eoe \else \RetrieveFieldInFor{#1}{#2}\lb@temp \expandafter\lb@loopovernames\lb@temp\lb@eoe \fi } \def\lb@loopovernames#1{% \def\lb@temp{#1}% \unless\ifx\lb@temp\lb@eoe \advance\NameCount1 \lb@@loopovernames#1% \expandafter\lb@loopovernames \fi } \def\lb@@loopovernames#1#2#3#4{% \iflb@abbreviate \def\Firstname{}% \lb@abbreviate#1 lb@end \else \def\Firstname{#1}% \fi \def\Von{#2}\def\Lastname{#3}\def\Junior{#4}% \lb@makerefname } \newif\iflb@abbreviate \def\lb@abbreviate#1 {% \def\lb@temp{#1}% \ifx\lb@temp\lb@endstring \lb@trim\Firstname \else \lb@checkhyphen#1--\lb@eoe,% \expandafter\lb@abbreviate \fi } \def\lb@checkhyphen#1-#2-{% \lb@makeinitial#1\lb@eoe \edef\Firstname{\Firstname\lb@@space\lb@temp}% \def\lb@temp{#2}% \unless\ifx\lb@temp\lb@empty \lb@makeinitial#2\lb@eoe \edef\Firstname{\Firstname-\lb@temp}% \fi \lb@gobbletoeoe } \def\lb@makeinitial#1#2\lb@eoe{% \def\lb@temp{#1\spacefactor1000.}% } \def\AbbreviateFirstname{\lb@abbreviatetrue} %%% EXTERNAL FILE \def\lb@makelist#1#2#3#4#5{% \lb@defcs{#1}{prevoldnew}{#2}% \lb@defcs{#1}{prevorder}{#3}% \lb@defcs{#1}{prevnameorder}{#4}% \lb@defcs{#1}{prevsorted}{#5}% }% \def\WriteImmediateInfo{% \immediate\write\lb@write } \def\WriteInfo{% \write\lb@write } \def\lb@storeentry#1{% \WriteImmediateInfo{% \noexpand\lb@defcs{#1}{fields}{\lb@uncs{#1}{fields}}% }% } \newread\lb@read \openin\lb@read=\jobname.lbr \ifeof\lb@read \closein\lb@read \let\lb@dolbr\relax \else \closein\lb@read \bgroup \lb@makeendoffile \expandafter\lb@readlbr\lb@input\jobname.lbr \egroup \fi \newwrite\lb@write \immediate\openout\lb@write=\jobname.lbr \lb@dolbr \lb@restoreat \endinput