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-opcit-booktitle/biblatex-opcit-booktitle.sty |
Initial commit
Diffstat (limited to 'macros/latex/contrib/biblatex-contrib/biblatex-opcit-booktitle/biblatex-opcit-booktitle.sty')
-rw-r--r-- | macros/latex/contrib/biblatex-contrib/biblatex-opcit-booktitle/biblatex-opcit-booktitle.sty | 325 |
1 files changed, 325 insertions, 0 deletions
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-opcit-booktitle/biblatex-opcit-booktitle.sty b/macros/latex/contrib/biblatex-contrib/biblatex-opcit-booktitle/biblatex-opcit-booktitle.sty new file mode 100644 index 0000000000..fb5063f624 --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-opcit-booktitle/biblatex-opcit-booktitle.sty @@ -0,0 +1,325 @@ +% Copyright 2015-... Maïeul Rouquette +% +% Inspired by Paul Stanley http://tex.stackexchange.com/a/172777/7712 +% +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Maïeul Rouquette +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{biblatex-opcit-booktitle}[2018/10/24 v1.9.0 Manage op. cit. when using subentry] +\RequirePackage{xpatch} +\RequirePackage{xkeyval}% + +\newtoggle{opcit@booktitle@bibliography@shorttitle}% +\newtoggle{opcit@booktitle@bibliography@onlyshorttitle}% +\DeclareOptionX{bibliography}[]{\toggletrue{opcit@booktitle@bibliography@#1}}% +\ProcessOptionsX% + +% Declaration of the entries concerned. Some package could have already add their own entry +\def\opcit@booktitle@entrytypes@novolume{} +\listadd\opcit@booktitle@entrytypes{inbook} +\listadd\opcit@booktitle@entrytypes{incollection} +\listadd\opcit@booktitle@entrytypes{inproceedings} +\listadd\opcit@booktitle@entrytypes{bookinbook} + + +\DeclareFieldFormat{bibhypertarget:crossref}{% + \bibhypertarget{\iffootnote{f}{t}:\cbx@resetcount:\thefield{crossref}}{#1}} + +\DeclareFieldFormat{bibhyperlink:crossref}{% + \bibhyperlink{\iffootnote{f}{t}:\cbx@resetcount:\thefield{crossref}}{#1}} + + +\newbibmacro*{cite:seen:related}{% + \ifboolexpr{test{\ifdefequal{\blx@imc@ifciteseen}{\blx@ifciteseen@context}} and togl{blx@footnote}}%Mode context + footnote? + {% + \xifinlistcs{\thefield{crossref}}{blx@fsee@\the\c@refsection}% + {}% + {\listcsxadd{blx@fsee@\the\c@refsection}{\thefield{crossref}}}% + }% + {% + \xifinlistcs{\thefield{crossref}}{blx@bsee@\the\c@refsection}% + {}% + {\listcsxadd{blx@bsee@\the\c@refsection}{\thefield{crossref}}}% + }% +}% + + +\newcommand{\ifrelatedunseen}[2]{% + \ifboolexpr{test{\ifdefequal{\blx@imc@ifciteseen}{\blx@ifciteseen@context}} and togl{blx@footnote}}%Mode context + footnote? + {% + \xifinlistcs{\thefield{crossref}}{blx@fsee@\the\c@refsection}% + {#2}% + {#1}% + }% + {% + \xifinlistcs{\thefield{crossref}}{blx@bsee@\the\c@refsection}% + {#2}% + {#1}% + }% +}% + + + +\RequirePackage{ltxcmds} +\newcommand{\opcit@booktitle@failpatch}[2]{% + \PackageError{opcit-booktitle}{Fail to patch `#1` bibmacro (#2)}{}% +} + +% verbose-trad-1 and verbose-trad2 +\ifboolexpr{% + test{\ltx@iffileloaded{verbose-trad2.cbx}}% + or test{\ltx@iffileloaded{verbose-trad1.cbx}}% + }{% + \xpatchbibmacro{cite}% + {\usebibmacro{cite:full}% + \usebibmacro{cite:save}}% + {\usebibmacro{cite:test:ifrelated}}% + {}% + {\opcit@booktitle@failpatch{cite}{verbose-trad1.cbx or verbose-trad2.cbx}}% +}% +{} + +% verbose-trad3. Not that lines must be applied AFTER the previous one +\ltx@iffileloaded{verbose-trad3.cbx}{% + \xpatchbibmacro{cite}% + {\usebibmacro{cite:full}}% + {\usebibmacro{cite:test:ifrelated:verbose-trad3}}% + {}% + {\opcit@booktitle@failpatch{cite}{verbose-trad3.cbx}}% +}{} + +\newbibmacro*{cite:test:ifrelated}% + {\ifboolexpr {% + test {\iffieldundef{crossref}}% + or not (test {\xifinlist{\thefield{entrytype}}{\opcit@booktitle@entrytypes}})}% + {\usebibmacro{cite:full}% + \usebibmacro{cite:save}}% + {\ifrelatedunseen% + {\printtext[bibhypertarget:crossref]{% + \usebibmacro{cite:seen:related}% + \usebibmacro{cite:full}% + \usebibmacro{cite:save}}}% + {\usebibmacro{related:info}}}} + +\newbibmacro*{cite:test:ifrelated:verbose-trad3}% + {\ifboolexpr {% + test {\iffieldundef{crossref}}% + or not (test {\xifinlist{\thefield{entrytype}}{\opcit@booktitle@entrytypes}})}% + {\usebibmacro{cite:full}% + }% + {\ifrelatedunseen% + {\printtext[bibhypertarget:crossref]{% + \usebibmacro{cite:seen:related}% + \usebibmacro{cite:full}% + }}% + {\usebibmacro{related:info}}}} + +% Here an hack to use the short form of the booktitle without recurring to a .dbx file in order to define new fields (because recurring to a .dbx file for such feature is complex for a little feature). +% The related:info:booktitle macro change the booktitle field to the shorttitle field of the parent entry. +% The related:info calls this macro and them call the driver of the main entry. + +\newbibmacro*{related:info:booktitle}{% + \undef\shortbooktitle% + \undef\bookentrytype% + \entrydata{\thefield{crossref}}{% + \savefield{shorttitle}{\shortbooktitle}% + \savefield{entrytype}{\bookentrytype}% + }% + \ifdef{\shortbooktitle}% + {% + \iffieldundef{crossref}% + {}% + {% + \restorefield{booktitle}{\shortbooktitle}% + \clearfield{booksubtitle}% + }% + }% + {}% +}% + +\newbibmacro*{related:info}{% + \usebibmacro{related:info:booktitle}% + \usebibmacro{cite:full:citepages}% + \printtext[bibhypertarget]{\usedriver% + {\DeclareNameAlias{sortname}{default}}% + {inbook:rel:\blx@cbxfile}}% +} + +\DeclareBibliographyDriver{inbook:rel:verbose-trad1}{% + \usebibmacro{bibindex}% + \usebibmacro{begentry}% + \ifthenelse{\ifciteidem\AND\NOT\boolean{cbx:noidem}}% + {\usebibmacro{cite:idem}}% + {\ifnameundef{labelname}% + {}% + {\usebibmacro{cite:name}}% + }% + \newblock% + \usebibmacro{title}% + \newunit + \printlist{language}% + \newunit\newblock + \usebibmacro{byauthor}% + \newunit\newblock + \usebibmacro{in:}% + \printtext[bibhyperlink:crossref]{% + \usebibmacro{inbook:rel:bookauthor}% + \usebibmacro{maintitle+booktitle}% + \newunit\newblock + \usebibmacro{byeditor+others}% + \newunit% + \iffieldundef{maintitle}% + {\xifinlist{\thefield{entrytype}}{\opcit@booktitle@entrytypes@novolume}% + {}% + {% + \printfield{volume}% + \printfield{part}}% + }% + {}% + \newunit% + \restorefield{entrytype}{\bookentrytype}% + \bibstring[\mkibid]{opcit}% + }% + \newunit\newblock + \usebibmacro{chapter+pages}% + \newunit\newblock + \setunit{\bibpagerefpunct}\newblock + \usebibmacro{pageref}% + \newunit\newblock + \iftoggle{bbx:related} + {\usebibmacro{related:init}% + \usebibmacro{related}} + {}% + \usebibmacro{finentry}} + + +\DeclareBibliographyDriver{inbook:rel:verbose-trad2}{% + \usebibmacro{bibindex}% + \usebibmacro{begentry}% + \ifthenelse{\ifciteidem\AND\NOT\boolean{cbx:noidem}}% + {\usebibmacro{cite:idem}}% + {\usebibmacro{author/translator+others}\setunit{\labelnamepunct}}% + \newblock% + \usebibmacro{title}% + \newunit + \printlist{language}% + \newunit\newblock + \usebibmacro{byauthor}% + \newunit\newblock + \usebibmacro{in:}% + \printtext[bibhyperlink:crossref]{% + \usebibmacro{inbook:rel:bookauthor}% + \usebibmacro{maintitle+booktitle}% + \newunit\newblock + \usebibmacro{byeditor+others}% + \newunit% + \iffieldundef{maintitle}% + {\xifinlist{\thefield{entrytype}}{\opcit@booktitle@entrytypes@novolume}% + {}% + {% + \printfield{volume}% + \printfield{part}}% + }% + {}% + \newunit% + \restorefield{entrytype}{\bookentrytype}% + \bibstring[\mkibid]{opcit}% + }% + \newunit\newblock + \usebibmacro{chapter+pages}% + \newunit\newblock + \setunit{\bibpagerefpunct}\newblock + \usebibmacro{pageref}% + \newunit\newblock + \iftoggle{bbx:related} + {\usebibmacro{related:init}% + \usebibmacro{related}} + {}% + \usebibmacro{finentry}} + +\DeclareBibliographyDriver{inbook:rel:verbose-trad3}{% + \usebibmacro{bibindex}% + \usebibmacro{begentry}% + \printnames{labelname}% + \setunit*{\printdelim{nametitledelim}}% + \usebibmacro{title}% + \newunit + \printlist{language}% + \newunit\newblock + \usebibmacro{byauthor}% + \newunit\newblock + \usebibmacro{in:}% + \printtext[bibhyperlink:crossref]{% + \usebibmacro{inbook:rel:bookauthor}% + \usebibmacro{maintitle+booktitle}% + \newunit\newblock + \usebibmacro{byeditor+others}% + \newunit% + \iffieldundef{maintitle}% + {\xifinlist{\thefield{entrytype}}{\opcit@booktitle@entrytypes@novolume}% + {}% + {% + \printfield{volume}% + \printfield{part}}% + }% + {}% + }% + \newunit\newblock + \usebibmacro{chapter+pages}% + \newunit\newblock + \setunit{\bibpagerefpunct}\newblock + \usebibmacro{pageref}% + \newunit\newblock + \iftoggle{bbx:related} + {\usebibmacro{related:init}% + \usebibmacro{related}} + {}% + \usebibmacro{finentry}} + +\newbibmacro{inbook:rel:bookauthor}{% + \ifnameundef{bookauthor}% + {} + {% + \usebibmacro{bybookauthor}% + \setunit{\labelnamepunct}\newblock% + }% +} + +% Patching begenentry macro to apply bibliography option +\xpretobibmacro{begentry}% + {% + \ifbibliography% + {\usebibmacro{opcitbooktitle:bibliography}}% + {}% + }% + {}% + {\opcit@booktitle@failpatch{begentry}{standard.bbx}}% + +\newbibmacro{opcitbooktitle:bibliography}{% + \iftoggle{opcit@booktitle@bibliography@shorttitle}% + {\usebibmacro{related:info:booktitle}}% + {}% + \iftoggle{opcit@booktitle@bibliography@onlyshorttitle}{% + \usebibmacro{related:info:booktitle}% + \iffieldundef{crossref}{}{% + \clearlist{publisher}% + \clearlist{location}% + \clearfield{series}% + \clearfield{number}% + \clearfield{year}% + \clearfield{month}% + \clearfield{day}% + }% + }{}% +}% +\endinput |