summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/biblatex-contrib/biblatex-source-division/biblatex-source-division.sty
blob: 938b3403d6a0ecdda844dacbf34699f490820906 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
%% Copyright 2013-… Maïeul Rouquette
%
% 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
%
% This work consists of the file biblatex-source-division.sty

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{biblatex-source-division}[2017/09/21 v2.4.2 source division for biblatex]
\RequirePackage{xpatch}

% The options
\RequirePackage{kvoptions}
\SetupKeyvalOptions{family=@biblatexsourcedivision@,prefix=biblatexsourcedivision@}
\DeclareStringOption[maintitle]{after}
\ProcessKeyvalOptions*
% 


% Test if the package biblatex-true-citepages-omit is loaded
\@ifpackageloaded{biblatex-true-citepages-omit}{\PackageError{biblatex-true-citepages-omit}{You must load biblatex-true-citepages-omit AFTER biblatex-source-division}{}}{}
% Prepare in the case of <x>volcite commands

\newtoggle{volcite}{}
\apptocmd{\volcitecmd}{\AtNextCite{\toggletrue{volcite}}}{}{}
\apptocmd{\multivolcitecmd}{\AtNextMultiCite{\toggletrue{volcite}}}{}{}
% Call the source division getting
\AtEveryCitekey{%
	\usebibmacro{getsourcedivision}%
}{}{}

% Get source division, put in in titladdon field, and delete source division from the postnote field
\newbibmacro{getsourcedivision}{%
  \iffieldundef{postnote}{}{%
     \global\undef\blxsd@volpostnote%
     \usefield{\getsourcedivision@}{postnote}%
     \ifdefempty{\blxsd@titleaddon}%
       {}%
       {%
       \ifboolexpr{test {\iffieldundef{maintitle}} or test{\ifdefstring{\biblatexsourcedivision@after}{title}}}%
         {\restorefield{titleaddon}{\blxsd@titleaddon}}
         {\restorefield{maintitleaddon}{\blxsd@titleaddon}}%
       }%
     \ifdefempty{\blxsd@postnote}%
       {\clearfield{postnote}}%
       {\restorefield{postnote}{\blxsd@postnote}}%
   }%
 }
 
% Analyse of the source division

%% Main command
\newrobustcmd*{\getsourcedivision@}[1]{\getsourcedivision@i#1++} 

%% Are there parenthesis ?
\def\getsourcedivision@i{%
  \@ifnextchar(%)
    {\getsourcedivision@ii}%
    {\getsourcedivision@ii()}}

%% Put the source division and "true" postnote in macro
\def\getsourcedivision@ii(#1)#2++{%
  \ifdefmacro{\blxsd@volpostnote}{%
    \gdef\blxsd@titleaddon{#1}%
    \gdef\blxsd@postnote{{\volvol}{#2}}%
   }{%
     \iftoggle{volcite}{%
		   \volgetsourcedivision@#2%
		}%
		{%
		  \gdef\blxsd@titleaddon{#1}%
		  \gdef\blxsd@postnote{#2}%
		}%
	}%
 }
\newrobustcmd*{\volgetsourcedivision@}[2]{%
  \gdef\blxsd@volpostnote{#2}%
  \gdef\volvol{#1}%
  \ifdefempty{\blxsd@volpostnote}%
    {\clearfield{volpostnote}}%
    {\restorefield{volpostnote}{\blxsd@volpostnote}}%
  \usefield{\getsourcedivision@}{volpostnote}%
}

% Insert source division in bibmacro for abreviated forms
\newcommand{\sourcedivision@failtopatch}[1]{\PackageError{biblatex-source-division}{Fail to patch `#1` bibmacro}{}}

\def\do#1{%
  \ifcsvoid{abx@macro@#1}{}{%
    \xapptobibmacro{#1}%
      {\newunit\printfield{titleaddon}\printfield{maintitleaddon}}%
      {}%
      {\sourcedivision@failtopatch{#1}}%
  }
}

\docsvlist{cite:ibid,cite:opcit,cite:short,cite:title}


\endinput