diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/biblatex-contrib/biblatex-ext/biblatex-ext-oa.sty |
Initial commit
Diffstat (limited to 'macros/latex/contrib/biblatex-contrib/biblatex-ext/biblatex-ext-oa.sty')
-rw-r--r-- | macros/latex/contrib/biblatex-contrib/biblatex-ext/biblatex-ext-oa.sty | 450 |
1 files changed, 450 insertions, 0 deletions
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-ext/biblatex-ext-oa.sty b/macros/latex/contrib/biblatex-contrib/biblatex-ext/biblatex-ext-oa.sty new file mode 100644 index 0000000000..b50f981b74 --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-ext/biblatex-ext-oa.sty @@ -0,0 +1,450 @@ +\ProvidesPackage{biblatex-ext-oa} + [2019/08/25 v0.8 mark open access in biblatex bibliographies (MW)] + +\protected\def\extblx@oa@error#1#2{% + \PackageError{biblatex-ext-oa}{#1}{#2.}} + +\protected\def\extblx@oa@warning@noline{% + \PackageWarningNoLine{biblatex-ext-oa}} + +\let\extblx@oa@warning\extblx@oa@warning@noline +\AtEndOfPackage{% + \protected\def\extblx@oa@warning{% + \PackageWarning{biblatex-ext-oa}}} + +\@ifpackageloaded{biblatex} + {} + {\extblx@oa@error + {biblatex not loaded!\MessageBreak + This package must be loaded after biblatex.\MessageBreak + This is a fatal error, the package will not\MessageBreak + be loaded} + {Load biblatex with '\string\usepackage{biblatex}' before + you load 'biblatex-ext-oa'.\MessageBreak + Please see the documentation of biblatex-ext for more + information}% + \endinput} + +% xpatch has xapptobibmacro, +% but I did not want to buy into all of expl3 just for this one macro +% ... at least for the moment +% note that this is not nearly as sophisticated as xpatch and does not +% deal with optional arguments +\newcommand*{\extblx@oa@apptobibmcro}[1]{% + \expandafter\apptocmd + \expandafter{\csname abx@macro@\detokenize{#1}\endcsname}} + +\newtoggle{extblx@oa@opt@forcedoiapi} +\DeclareBibliographyOption[string]{openaccess}[true]{% + \ifstrequal{#1}{forcedoiapi} + {\@firstoftwo} + {\ifstrequal{#1}{forceonlydoiapi} + {\@firstoftwo} + {\@secondoftwo}} + {\toggletrue{extblx@oa@opt@forcedoiapi}} + {}% + \extblx@oa@blxopt@openaccess{#1}} +\DeclareTypeOption[string]{openaccess}[true]{% + \ifstrequal{#1}{forcedoiapi} + {\toggletrue{extblx@oa@opt@forcedoiapi}% + \csletcs{extblx@oa@url@from}{extblx@oa@url@from@forcedoiapi}} + {}% + \ifstrequal{#1}{forcedoiapi} + {\toggletrue{extblx@oa@opt@forceonlydoiapi}% + \csletcs{extblx@oa@url@from}{extblx@oa@url@from@forceonlydoiapi}} + {}% + \iftoggle{extblx@oa@opt@forcedoiapi} + {} + {\extblx@oa@blxopt@openaccess{#1}}} +\DeclareEntryOption[string]{openaccess}[true]{% + \iftoggle{extblx@oa@opt@forcedoiapi} + {} + {\extblx@oa@blxopt@openaccess{#1}}} + +\def\extblx@oa@blxopt@openaccess#1{% + \ifcsundef{extblx@oa@url@from@#1} + {\ifcsundef{extblx@oa@warn@field@\abx@field@entrykey @#1} + {\extblx@oa@warning@noline{% + Field '#1' not set up for\MessageBreak + open access detection.\MessageBreak + Ignoring the option\MessageBreak + 'openaccess=#1'\MessageBreak + for entry '\abx@field@entrykey'}% + \global\cslet{extblx@oa@warn@field@\abx@field@entrykey @#1} + \@empty} + {}} + {\csletcs{extblx@oa@url@from}{extblx@oa@url@from@#1}}% + \ifcsequal{extblx@oa@url@from}{extblx@oa@url@from@onlydoiapi} + {\@firstoftwo} + {\ifcsequal{extblx@oa@url@from}{extblx@oa@url@from@doiapi} + {\@firstoftwo} + {\@secondoftwo}} + {\ifextblx@oa@opt@doiapi + \else + \extblx@oa@error + {'openaccess=#1' requires 'doiapi=true'\MessageBreak + and LuaLaTeX} + {If you want to use 'openaccess=#1', you must load the + 'biblatex-ext-oa'\MessageBreak + package with the option 'doiapi=true'. + That option also requires LuaLaTeX.\MessageBreak + Please see the documentation of biblatex-ext for more + information} + \fi} + {}% +} + +% define special detection settings +% auto, all (=:true), none (=:false), +% doiapi, forcedoiapi (=doiapi, but overrides more specific options) +% onlydoiapi, forceonlydoiapi +\csdef{extblx@oa@url@from@auto}{auto} +\csdef{extblx@oa@url@from@all}{all} +\csletcs{extblx@oa@url@from@true}{extblx@oa@url@from@all} +\csdef{extblx@oa@url@from@none}{none} +\csletcs{extblx@oa@url@from@false}{extblx@oa@url@from@none} +\csdef{extblx@oa@url@from@doiapi}{doiapi} +\csdef{extblx@oa@url@from@onlydoiapi}{onlydoiapi} +\csletcs{extblx@oa@url@from@forcedoiapi}{extblx@oa@url@from@doiapi} +\csletcs{extblx@oa@url@from@forceonlydoiapi} + {extblx@oa@url@from@onlydoiapi} + +% {<field_1,...,field_n>} +\newrobustcmd*{\DeclareOpenAccessUrlFieldPriority}{% + \let\extblx@oa@url@autofields\@empty + \forcsvlist{\listadd\extblx@oa@url@autofields}} + +% {<macroname>}{<field>}{<url spec>}{<openness>} +\def\extblx@oa@url@definefieldurl#1#2#3#4{% + \csdef{extblx@oa@url@from@#2}{#2}% + \ifstrequal{#4}{always} + {\csdef{extblx@oa@url@getfromfield@#1}{% + \iffieldannotation[#2]{closedaccess} + {} + {\def\extblx@oa@url{#3}}}} + {\csdef{extblx@oa@url@getfromfield@#1}{% + \iffieldannotation[#2]{closedaccess} + {\@secondoftwo} + {\iffieldannotation[#2]{openaccess} + {\@firstoftwo} + {\ifcsequal{extblx@oa@url@from}{extblx@oa@url@from@#2} + {\@firstoftwo} + {\ifcsequal{extblx@oa@url@from}{extblx@oa@url@from@all} + {\@firstoftwo} + {\@secondoftwo}}}} + {\def\extblx@oa@url{#3}} + {}}}} + +% [<openness>]{<field>}{<url spec>} +\newrobustcmd*{\DeclareOpenAccessFieldUrl}[3][conditional]{% + \extblx@oa@url@definefieldurl{#2}{#2}{#3}{#1}} +% [<openness>]{<eprint type>}{<url spec>} +\newrobustcmd*{\DeclareOpenAccessEprintUrl}[3][conditional]{% + \extblx@oa@url@definefieldurl{eprint@#2}{eprint}{#3}{#1}} + +\newrobustcmd*{\DeclareOpenAccessEprintAlias}[2]{% + \csdef{extblx@oa@url@getfromfield@eprint@#1}{% + \csuse{extblx@oa@url@getfromfield@eprint@#2}}} + +\def\extblx@oa@url@undefinefieldurl#1#2{ + \csundef{extblx@oa@url@from@#2} + \csundef{extblx@oa@url@getfromfield@#1}} + +\newrobustcmd*{\UndeclareOpenAccessFieldUrl}[1]{% + \extblx@oa@url@undefinefieldurl{#1}{#1}} +\newrobustcmd*{\UndeclareOpenAccessEprintUrl}[1]{% + \extblx@oa@url@undefinefieldurl{eprint@#1}{eprint}} + + +\def\extblx@oa@url@processfield@@generic#1{% + \csuse{extblx@oa@url@getfromfield@#1}} + +\def\extblx@oa@url@processfield@eprint#1{% + \iffieldundef{eprinttype} + {\csuse{extblx@oa@url@getfromfield@#1}} + {\csuse{extblx@oa@url@getfromfield@eprint@\thefield{eprinttype}}}} + +\def\extblx@oa@url@processfield#1{% + \iffieldundef{#1} + {} + {\ifcsundef{extblx@oa@url@processfield@#1} + {\extblx@oa@url@processfield@@generic{#1}} + {\csuse{extblx@oa@url@processfield@#1}{#1}}}} + +\newcommand*{\extblx@oa@url@getoaurl}{% + \ifcsequal{extblx@oa@url@from}{extblx@oa@url@from@onlydoiapi} + {\iffieldundef{doi} + {} + {\extblx@oa@api@getoaurl{\thefield{doi}}}} + {\ifcsequal{extblx@oa@url@from}{extblx@oa@url@from@doiapi} + {\iffieldundef{doi} + {\forlistloop{\extblx@oa@url@processfield} + {\extblx@oa@url@autofields}} + {\extblx@oa@api@getoaurl{\thefield{doi}}}} + {\ifcsequal{extblx@oa@url@from}{extblx@oa@url@from@none} + {} + {\ifcsequal{extblx@oa@url@from}{extblx@oa@url@from@all} + {\@firstoftwo} + {\ifcsequal{extblx@oa@url@from}{extblx@oa@url@from@auto} + {\@firstoftwo} + {\@secondoftwo}} + {\forlistloop{\extblx@oa@url@processfield} + {\extblx@oa@url@autofields}} + {\extblx@oa@url@processfield{\csuse{extblx@oa@url@from}}}}}}} + + +% deprecated +\newrobustcmd*{\LoadTikZOASymbol}[1][plos]{% + \extblx@oa@warning{% + Macro '\string\LoadTikZOASymbol' deprecated.\MessageBreak + Please use '\string\LoadOASymbolPackage' or\MessageBreak + '\string\DefineOASymbol' instead.\MessageBreak + Using '\string\LoadOASymbolPackage'}% + \LoadOASymbolPackage[#1]{tikz}} +\@onlypreamble\LoadTikZOASymbol + + +\newcommand*{\extblx@oa@symbolpackages}{} +\forcsvlist{\listadd\extblx@oa@symbolpackages}{pict2e,l3draw,tikz} + +\newtoggle{extblx@tempa} +\newcommand*{\extblx@oa@loadoasymbol@errorincompatible}[2]{% + \ifstrequal{#1}{#2} + {} + {\@ifpackageloaded{biblatex-ext-oasymb-#2} + {\extblx@oa@error + {Incompatible symbol method '#2' already loaded} + {Only one symbol package can be loaded.\MessageBreak + The symbol method '#2' is already loaded, so '#1' can't be + used.\MessageBreak + If you ignore this error and press on, I will ignore this + command}% + \edef\extblx@oa@tempa{\endgroup + \noexpand\@firstoftwo}% + \listbreak} + {}}} + +% [<symbol id>]{<method>} +% first step expands fully(!) +\newrobustcmd*{\LoadOASymbolPackage}[2][plos]{% + \begingroup + \edef\extblx@oa@tempa{\endgroup + \noexpand\LoadOASymbolPackage@i[#1]{#2}}% + \extblx@oa@tempa} +\@onlypreamble\LoadOASymbolPackage + +% second step gives all lowercase +\def\LoadOASymbolPackage@i[#1]#2{% + \begingroup + \lowercase{\def\extblx@oa@tempb{#1}}% + \lowercase{\def\extblx@oa@tempc{#2}} + \edef\extblx@oa@tempa{\endgroup + \noexpand\LoadOASymbolPackage@ii[\extblx@oa@tempb]{% + \extblx@oa@tempc}}% + \extblx@oa@tempa}% + +\def\LoadOASymbolPackage@ii[#1]#2{% + \ifinlist{#2}{\extblx@oa@symbolpackages} + {\begingroup + \edef\extblx@oa@tempa{\endgroup + \noexpand\@secondoftwo}% + \forlistloop + {\extblx@oa@loadoasymbol@errorincompatible{#2}} + {\extblx@oa@symbolpackages}% + \extblx@oa@tempa + {} + {\@ifpackageloaded{biblatex-ext-oasymb-#2} + {\extblx@oa@warning{% + Symbol method '#2' already loaded.\MessageBreak + I'll behave like '\string\DefineOASymbol'}% + \DefineOASymbol[#1]} + {\RequirePackage[symbol=#1]{biblatex-ext-oasymb-#2}}}} + {\extblx@oa@error + {Unknown symbol package/method '#2'} + {The symbol method '#2' (package 'biblatex-ext-oasymb-#2') is + unknown.\MessageBreak + See the documentation for a list of available values}}} + +\SetupKeyvalOptions{ + family=extblx@oa@opt, + prefix=extblx@oa@opt@, +} + +\DeclareBoolOption[true]{enable} +\DeclareBoolOption[false]{doiapi} +\DeclareStringOption[false]{symbolpackage} +\DeclareStringOption{symbol} + +% deprecated option +\DeclareStringOption{tikzsymbol}[true] + +\def\extblx@oa@opt@tikzsymbol@val@false{} +\def\extblx@oa@opt@tikzsymbol@val@true{\LoadOASymbolPackage[plos]{tikz}} + +\def\extblx@oa@opt@tikzsymbol@process#1{% + \begingroup + \edef\extblx@oa@tempa{\endgroup + \noexpand\extblx@oa@opt@tikzsymbol@process@i{#1}} + \extblx@oa@tempa} + +\def\extblx@oa@opt@tikzsymbol@process@i#1{% + \extblx@oa@warning{% + The option 'tikzsymbol' is deprecated.\MessageBreak + It has been replaced by the separate options\MessageBreak + 'symbolpackage' and 'symbol'.\MessageBreak + Setting 'symbolpackage=tikz, symbol=#1'}% + \ifcsundef{extblx@oa@opt@tikzsymbol@val@#1} + {\LoadOASymbolPackage[#1]{tikz}} + {\csuse{extblx@oa@opt@tikzsymbol@val@#1}}} + + + + +\ProcessKeyvalOptions* + +% deprecated option 'tikzsymbol' +\ifdefvoid\extblx@oa@opt@tikzsymbol + {} + {\extblx@oa@opt@tikzsymbol@process{\extblx@oa@opt@tikzsymbol}} + +% option 'symbolpackage' +\ifdefstring{\extblx@oa@opt@symbolpackage}{false} + {} + {\LoadOASymbolPackage{\extblx@oa@opt@symbolpackage}} + +% option 'symbol' +\ifdefvoid\extblx@oa@opt@symbol + {} + {\ifundef\DefineOASymbol + {\extblx@oa@error + {Option 'symbol' used, but no symbol method\MessageBreak + has been set and no symbol package loaded} + {The option 'symbol' can only be used if\MessageBreak + * the option 'symbolpackage' is set to a valid value other + than 'false', or\MessageBreak + * an open access symbol package has been loaded manually + (not recommended)}} + {\DefineOASymbol[\extblx@oa@opt@symbol]}} + + + +\ifbool{extblx@oa@opt@doiapi} + {\RequirePackage{biblatex-ext-oa-doiapi}} + {} + +\def\extbl@oa@bbl@fielddef@bestoaurl#1{% + \blx@bbl@fielddef{bestoaurl}{#1}} + +\AtDataInput{% + \undef\extblx@oa@url + \extblx@oa@url@getoaurl + \ifundef\extblx@oa@url + {} + {\expandafter\extbl@oa@bbl@fielddef@bestoaurl + \expandafter{\extblx@oa@url}}} + + + +% based on egreg's (https://tex.stackexchange.com/users/4427/egreg) +% answer to https://tex.stackexchange.com/a/123451/35864 +% originally CC BY-SA 3.0, but dual-licensed under LPPL +% see https://tex.meta.stackexchange.com/a/3333/35864 +\newcommand{\extblx@oa@marginmark}{% + \strut\vadjust{\extblx@oa@marginmark@do}} +\newcommand{\extblx@oa@marginmark@do}{% + \vbox to 0pt{% + \kern-3\dp\strutbox + \strut + \hfill + \rlap{\kern1em + \ifhyperref + {\href{\thefield{bestoaurl}}} + {\@firstofone}% + {\oasymbol}} + \vss + }% +} + + +\ifbool{extblx@oa@opt@enable} + {\csletcs{extblx@oa@url@from}{extblx@oa@url@from@auto} + \DeclareOpenAccessFieldUrl{url}{\thefield{url}} + \DeclareOpenAccessFieldUrl{doi}{https://doi.org/\thefield{doi}} + + \DeclareOpenAccessEprintUrl{jstor}{% + http://www.jstor.org/stable/\thefield{eprint}} + \DeclareOpenAccessEprintAlias{JSTOR}{jstor} + \DeclareOpenAccessEprintUrl{hdl}{% + http://hdl.handle.net/\thefield{eprint}} + \DeclareOpenAccessEprintAlias{HDL}{hdl} + \DeclareOpenAccessEprintUrl{pubmed}{% + http://www.ncbi.nlm.nih.gov/pubmed/\thefield{eprint}} + \DeclareOpenAccessEprintAlias{PubMed}{pubmed} + \DeclareOpenAccessEprintUrl[always]{arxiv}{% + https://arxiv.org/\abx@arxivpath/\thefield{eprint}} + \DeclareOpenAccessEprintAlias{arXiv}{arxiv} + + \DeclareOpenAccessUrlFieldPriority{url,eprint,doi} + + \DeclareFieldFormat{bestoaurl}{\url{#1}} + + \newbibmacro*{oamark}{% + \iffieldundef{bestoaurl} + {} + {\extblx@oa@marginmark}} + + % patch begentry bibmacro + % safer than \renewbibmacro{begentry} if it contains something, + % but uses the internal implementation of bibmacros + \extblx@oa@apptobibmcro{begentry} + {\usebibmacro{oamark}} + {} + {\extblx@oa@warning@noline{% + Failed to patch 'begentry' bibmacro.\MessageBreak + The open access logo may not be displayed at all}} + + \ifbool{extblx@oa@opt@doiapi} + {\NewBibliographyString{openaccessat} + \DefineBibliographyStrings{english}{ + openaccessat = {open access version at}, + } + \newbibmacro{api:bestoaurl}{% + \ifcsequal{extblx@oa@url@from}{extblx@oa@url@from@doiapi} + {\iffieldundef{doi} + {\@secondoftwo} + {\iffieldundef{bestoaurl} + {\@secondoftwo} + {\OpenaccessURLisDOI{\thefield{doi}} + {\@secondoftwo} + {\@firstoftwo}}}} + {\@secondoftwo} + {\bibstring{openaccessat}% + \setunit{\addspace}% + \printfield{bestoaurl}% + \newunit\newblock} + {}} + + \extblx@oa@apptobibmcro{doi+eprint+url} + {\newunit\newblock + \usebibmacro{api:bestoaurl}} + {} + {\extblx@oa@warning@noline{% + Failed to patch 'doi+eprint+url' bibmacro.\MessageBreak + The best open access URL might not be shown}}}} + {\csletcs{extblx@oa@url@from}{extblx@oa@url@from@none}} + + +\endinput +% +% This file is part of the biblatex-ext bundle. +% biblatex-ext is released under the LaTeX Project Public License v1.3c +% or later. +% +% A complete list of files included in that package can be found in +% README.md or - failing that - in ext-standard.bbx. +% +% Official releases of this package are on CTAN +% https://www.ctan.org/pkg/biblatex-ext +% development takes place on GitHub +% https://github.com/moewew/biblatex-ext +% |