diff options
author | Karl Berry <karl@freefriends.org> | 2010-04-03 23:40:24 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2010-04-03 23:40:24 +0000 |
commit | 759203ce6f83471a48a123af53f0bb82d76e65ce (patch) | |
tree | 75aa312332f3653d7e4bb79bf081d0b1830830ce /Master/texmf-dist/tex | |
parent | b6d3742bf9b7d7d36dc702c754be45dbdd1f8e1d (diff) |
new generic package librarian (3apr10)
git-svn-id: svn://tug.org/texlive/trunk@17675 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
3 files changed, 1216 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/librarian/librarian.sty b/Master/texmf-dist/tex/generic/librarian/librarian.sty new file mode 100644 index 00000000000..f36c42518b7 --- /dev/null +++ b/Master/texmf-dist/tex/generic/librarian/librarian.sty @@ -0,0 +1,16 @@ +% This is librarian.sty, a style file to load +% the librarian package in LaTeX. Useful 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. + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{librarian}[2010/03/01 v.1.0 Bibliographies all in TeX.] +\makeatletter +\let\lb@input\@@input +\makeatother +\input librarian.tex +\endinput
\ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/librarian/librarian.tex b/Master/texmf-dist/tex/generic/librarian/librarian.tex new file mode 100644 index 00000000000..6d9bd7120c7 --- /dev/null +++ b/Master/texmf-dist/tex/generic/librarian/librarian.tex @@ -0,0 +1,1176 @@ +% 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}% + }% + \tracingmacros3 \tracingcommands3 + \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 +\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
\ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/librarian/t-librarian.tex b/Master/texmf-dist/tex/generic/librarian/t-librarian.tex new file mode 100644 index 00000000000..0517f6597b2 --- /dev/null +++ b/Master/texmf-dist/tex/generic/librarian/t-librarian.tex @@ -0,0 +1,24 @@ +% This is t-librarian, a third-party file to load +% the librarian package in ConTeXt. Useful 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. +% +%D \module +%D [ file=t-librarian, +%D version=2010.03.01, +%D title=\CONTEXT\ User Module, +%D subtitle=librarian, +%D author=Paul Isambert, +%D date=\currentdate, +%D copyright=Paul Isambert, +%D email=zappathustra@free.fr, +%D license=LaTeX Project Public License] + +\writestatus{loading}{ConTeXt User Module / librarian} +\expandafter\let\csname lb@unexpanded\endcsname\normalunexpanded +\input librarian.tex +\endinput |