summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/biblatex-gb7714-2015/gb7714-2015ay.bbx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/biblatex-gb7714-2015/gb7714-2015ay.bbx')
-rw-r--r--Master/texmf-dist/tex/latex/biblatex-gb7714-2015/gb7714-2015ay.bbx269
1 files changed, 211 insertions, 58 deletions
diff --git a/Master/texmf-dist/tex/latex/biblatex-gb7714-2015/gb7714-2015ay.bbx b/Master/texmf-dist/tex/latex/biblatex-gb7714-2015/gb7714-2015ay.bbx
index e5e0cb13bec..f34aa1aff85 100644
--- a/Master/texmf-dist/tex/latex/biblatex-gb7714-2015/gb7714-2015ay.bbx
+++ b/Master/texmf-dist/tex/latex/biblatex-gb7714-2015/gb7714-2015ay.bbx
@@ -10,15 +10,18 @@
%% 2016/11/14 v1.0c
%% 2016/11/24 v1.0d
%% 2016/12/07 v1.0e
+%% 2016/12/31 v1.0f
+%% 2017/02/26 v1.0g
%% E-mail: hzzmail@163.com
%% Released under the LaTeX Project Public License v1.3c or later
%% ---------------------------------------------------------------
%%
-\ProvidesFile{gb7714-2015ay.bbx}[2016/12/07 v1.0e biblatex bibliography style]
+\ProvidesFile{gb7714-2015ay.bbx}[2017/02/26 v1.0g biblatex bibliography style]
%=====================================================================
%加载标准样式
\RequireBibliographyStyle{authoryear} % Load the standard style to avoid copy-pasting unnecessary material
+\RequirePackage{xstring}%为兼容texlive2015的biblatex3.0不加载xstring包的问题
%=====================================================================
%增加一些功能函数
@@ -44,15 +47,16 @@
\expandafter\testCJKfirstchar\tempa&}
%判断是否是标准
-\providetoggle{ifnoteeqstandard}
-\def\testifnoteeqstd{%
-\iffieldundef{note}{\togglefalse{ifnoteeqstandard}}%判断一下,是否是报纸和标准
- {\def\comparetmp{standard}\edef\comparetmpb{\thefield{note}}%
- \ifx\comparetmp\comparetmpb%
- \toggletrue{ifnoteeqstandard}%
- \else%
- \togglefalse{ifnoteeqstandard}%
- \fi}}
+%\providetoggle{ifnoteeqstandard}
+%\def\testifnoteeqstd{%
+%\iffieldundef{note}{\togglefalse{ifnoteeqstandard}}%判断一下,是否是报纸和标准
+% {\def\comparetmp{standard}\edef\comparetmpb{\thefield{note}}%
+% \ifx\comparetmp\comparetmpb%
+% \toggletrue{ifnoteeqstandard}%
+% \else%
+% \togglefalse{ifnoteeqstandard}%
+% \fi}}
+%\iffieldequalstr{note}{standard}{true}{false} %可以利用这一函数代替
%用于解析连续出版物,2个卷期的情况
\def\multivolumeparsetoparts#1/#2{\def\multivolumefirst{#1}\def\multivolumesecond{#2}}
@@ -102,12 +106,11 @@
%=====================================================================
%设置宏包选项
+\iftoggle{iftexlivesix}{% Alter settings that carry through from biblatex
+%biblatex3.3版后(比如texlive2016中的3.4版)的使用方式
%增加标签对齐选项,right是默认的右对齐,left是左对齐,gb7714-2015是项对齐方式
%因为在作者年制中,不需要使用,这里也增加,为了与顺序年制的兼容性考虑。
\DeclareBibliographyOption[string]{align}[right]{}%
-
-\iftoggle{iftexlivesix}{% Alter settings that carry through from biblatex
-%biblatex3.3版后(比如texlive2016中的3.4版)的使用方式
\ExecuteBibliographyOptions{
useprefix = true, %名字的信息包括前缀
%firstinits = true, %名字有缩写,参考3.1.2.3 Internal
@@ -119,6 +122,9 @@
minbibnames=3,
}}
{%biblatex3.3版前(比如texlive2015中的3.0版)的使用方式
+%增加标签对齐选项,right是默认的右对齐,left是左对齐,gb7714-2015是项对齐方式
+%因为在作者年制中,不需要使用,这里也增加,为了与顺序年制的兼容性考虑。
+\DeclareBibliographyOption{align}[right]{}%
\ExecuteBibliographyOptions{
useprefix = true, %名字的信息包括前缀
firstinits = true, %名字有缩写,参考3.1.2.3 Internal
@@ -171,16 +177,32 @@ backrefpages = {引用页:},
\step[fieldsource=title,match=\regexp{[a-zA-Z]},final]
\step[fieldsource=author,match=\regexp{佚名}, replace={NOAUTHOR}]
}
- \map{ %增加文献标识符如[M],[J]等,下面首先生成这一信息
- %\perdatasource{examples.bib}
+ \map{
\pertype{article}
+ \step[fieldset=usera, fieldvalue={J}]
+ }
+ \map{
\pertype{periodical}
\step[fieldset=usera, fieldvalue={J}]
+ \step[fieldsource=author] %有时会把version和edition混淆,这里处理后就没有这个问题,可以直接用version
+ \step[fieldset=editor, origfieldval]
+ }
+ \map{
+ \pertype{newspaper}%增加一个新闻报纸的类型newspaper
+ \step[fieldset=usera, fieldvalue={N}]%因为没有专门的驱动,这句的目的是定义一个usera域,方便映射为article后判断
+ \step[fieldset=note, fieldvalue=news]
}
\map{
\pertype{book}
\pertype{inbook}
\step[fieldset=usera, fieldvalue={M}]
+ \step[fieldsource=version] %有时会把version和edition混淆,这里处理后就没有这个问题,可以直接用version
+ \step[fieldset=edition, origfieldval]
+ }
+ \map{
+ \pertype{standard}%兼容老的standard类型
+ \step[fieldset=usera, fieldvalue={S}]%因为没有专门的驱动,这句的目的是定义一个usera域,方便映射为book和inbook后判断
+ \step[fieldset=note, fieldvalue=standard]
}
\map{
\pertype{patent}
@@ -188,7 +210,7 @@ backrefpages = {引用页:},
}
\map{
\pertype{inproceedings}
- \pertype{conference}
+ \pertype{conference}%兼容老的conference类型
\step[fieldset=usera, fieldvalue={C}]
\step[fieldsource=institution] %有时会把version和edition混淆,这里处理后就没有这个问题,可以直接用version
\step[fieldset=publisher, origfieldval]
@@ -205,14 +227,21 @@ backrefpages = {引用页:},
}
\map{
\pertype{report}
+ \pertype{techreport}%兼容老的techreport类型
\step[fieldset=usera, fieldvalue={R}]
+ \step[fieldsource=publisher] %有时会把publisher和institution混淆,这里处理后就没有这个问题,可以直接用version
+ \step[fieldset=institution, origfieldval]
}
\map{
\pertype{thesis}
+ \pertype{mastersthesis}%兼容老的mastersthesis和phdthesis类型
+ \pertype{phdthesis}
\step[fieldset=usera, fieldvalue={D}]
}
\map{
\pertype{online}
+ \pertype{electronic}%兼容老的electronic类型
+ \pertype{www}%兼容老的www类型
\step[fieldset=usera, fieldvalue={EB}]
}
\map{
@@ -262,7 +291,105 @@ backrefpages = {引用页:},
\map{%将没有设置的userb设置成en,即认为不是中文的就是英文的。
\step[fieldset=userb,fieldvalue={en}]
}
+ }
}
+
+\iftoggle{iftexlivesix}{
+ \DeclareStyleSourcemap{
+ \maps[datatype=bibtex]{
+ \map{%尝试未定义数据模型的newspaper类型映射为article,newspaper完全是针对gb7714的新类型,在biblatex中完全没有定义
+ %但从实践看,并没有什么影响,映射过来就可以了。
+ \step[typesource=newspaper, typetarget=article, final]
+ }
+ \map{%尝试未定义数据模型的standard类型映射为book,standard类型在blx-dm中有出现,但仅定义了类型,域和约束等都没有定义
+ \step[fieldsource=booktitle,final]%当存在booktitle域是映射为inbook
+ \step[typesource=standard, typetarget=inbook, final]
+ }
+ \map{%尝试未定义数据模型的standard类型映射为book,standard类型在blx-dm中有出现,但仅定义了类型,域和约束等都没有定义
+ \step[typesource=standard, typetarget=book, final]%当不存在booktitle域是映射为book
+ }
+ \map{%先于标准样式的driver层映射,将其先映射过来,并取消type设置
+ \step[typesource=mastersthesis, typetarget=thesis, final]
+ %\step[fieldset=type, fieldvalue=mathesis]
+ }
+ \map{%先于标准样式的driver层映射,将其先映射过来,并取消type设置
+ \step[typesource=phdthesis, typetarget=thesis, final]
+ %\step[fieldset=type, fieldvalue=phdthesis]
+ }
+ \map{%先于标准样式的driver层映射,将其先映射过来,并取消type设置
+ \step[typesource=techreport, typetarget=report, final]
+ %\step[fieldset=type, fieldvalue=techreport]
+ }
+ \map[overwrite, foreach={title,booktitle,journaltitle,journal,publisher,address,location,institution,organization}]{
+ \step[fieldsource=\regexp{$MAPLOOP}, match=\regexp{([^\\])\#}, replace=\regexp{$1\\\#}]
+ }
+ \map[overwrite, foreach={title,booktitle,journaltitle,journal,publisher,address,location,institution,organization}]{
+ \step[fieldsource=\regexp{$MAPLOOP}, match=\regexp{([^\\])\%}, replace=\regexp{$1\\\%}]
+ }
+ \map[overwrite, foreach={title,booktitle,journaltitle,journal,publisher,%
+ address,location,institution,organization}]{
+ \step[fieldsource=\regexp{$MAPLOOP}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
+ }
+ }
+ }
+}{
+ \DeclareStyleSourcemap{
+ \maps[datatype=bibtex]{
+ \map{%尝试未定义数据模型的newspaper类型映射为article,newspaper完全是针对gb7714的新类型,在biblatex中完全没有定义
+ %但从实践看,并没有什么影响,映射过来就可以了。
+ \step[typesource=newspaper, typetarget=article, final]
+ }
+ \map{%尝试未定义数据模型的standard类型映射为book,standard类型在blx-dm中有出现,但仅定义了类型,域和约束等都没有定义
+ \step[fieldsource=booktitle,final]%当存在booktitle域是映射为inbook
+ \step[typesource=standard, typetarget=inbook, final]
+ }
+ \map{%尝试未定义数据模型的standard类型映射为book,standard类型在blx-dm中有出现,但仅定义了类型,域和约束等都没有定义
+ \step[typesource=standard, typetarget=book, final]%当不存在booktitle域是映射为book
+ }
+ \map{%先于标准样式的driver层映射,将其先映射过来,并取消type设置
+ \step[typesource=mastersthesis, typetarget=thesis, final]
+ %\step[fieldset=type, fieldvalue=mathesis]
+ }
+ \map{%先于标准样式的driver层映射,将其先映射过来,并取消type设置
+ \step[typesource=phdthesis, typetarget=thesis, final]
+ %\step[fieldset=type, fieldvalue=phdthesis]
+ }
+ \map{%先于标准样式的driver层映射,将其先映射过来,并取消type设置
+ \step[typesource=techreport, typetarget=report, final]
+ %\step[fieldset=type, fieldvalue=techreport]
+ }
+ \map[overwrite]{%title,booktitle,journaltitle,journal,publisher,address,location,institution,organization
+ \step[fieldsource={title}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
+ }
+ \map[overwrite]{
+ \step[fieldsource={booktitle}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
+ }
+ \map[overwrite]{
+ \step[fieldsource={journaltitle}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
+ }
+ \map[overwrite]{
+ \step[fieldsource={journal}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
+ }
+ \map[overwrite]{
+ \step[fieldsource={publisher}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
+ }
+ \map[overwrite]{
+ \step[fieldsource={address}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
+ }
+ \map[overwrite]{
+ \step[fieldsource={location}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
+ }
+ \map[overwrite]{
+ \step[fieldsource={institution}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
+ }
+ \map[overwrite]{
+ \step[fieldsource={booktitle}, match=\regexp{([^\\])\#}, replace=\regexp{$1\\\#}]
+ }
+ \map[overwrite]{
+ \step[fieldsource={booktitle}, match=\regexp{([^\\])\%}, replace=\regexp{$1\\\%}]
+ }
+ }
+ }
}
%=====================================================================
@@ -338,21 +465,24 @@ backrefpages = {引用页:},
%修改域的格式
%新增文献类型标识符的格式
%\DeclareFieldFormat{gbtypeflag}{\nobreak\mkbibbrackets{\nobreak#1}\nobreak}
+
\DeclareFieldFormat{gbtypeflag}{%
-\iffieldundef{url}%当存在url时,增加一个OL标识符
-{\nobreak\printtext{[}\nobreak#1\printtext{]}\nobreak}%
-{\nobreak\printtext{[}\nobreak#1\printtext{\texttt{/}OL]}\nobreak}%
-}
+\iftoggle{bbx:url}{\iffieldundef{url}%当存在url时,增加一个OL标识符
+{\nobreak\printtext{[}\nobreak#1\nobreak\printtext{]}}%
+{\nobreak\printtext{[}\nobreak#1\nobreak\printtext{\texttt{/}OL]}}%
+}{\nobreak\printtext{[}\nobreak#1\nobreak\printtext{]}}}
+
\DeclareFieldFormat{gbtypeflagn}{%用于报纸newspaper
-\iffieldundef{url}%当存在url时,增加一个OL标识符
+\iftoggle{bbx:url}{\iffieldundef{url}%当存在url时,增加一个OL标识符
{\nobreak\printtext{[}\nobreak N\printtext{]}\nobreak}%
{\nobreak\printtext{[}\nobreak N\printtext{\texttt{/}OL]}\nobreak}%
-}
-\DeclareFieldFormat{gbtypeflags}{%用于报纸newspaper
-\iffieldundef{url}%当存在url时,增加一个OL标识符
+}{\nobreak\printtext{[}\nobreak N\printtext{]}\nobreak}}
+
+\DeclareFieldFormat{gbtypeflags}{%用于标准standard
+\iftoggle{bbx:url}{\iffieldundef{url}%当存在url时,增加一个OL标识符
{\nobreak\printtext{[}\nobreak S\printtext{]}\nobreak}%
{\nobreak\printtext{[}\nobreak S\printtext{\texttt{/}OL]}\nobreak}%
-}
+}{\nobreak\printtext{[}\nobreak S\printtext{]}\nobreak}}
%重设title的输出格式,不加emph,原格式来自biblatex.def文件
%\DeclareFieldFormat{journaltitle}{\mkbibemph{#1}}
@@ -512,16 +642,19 @@ backrefpages = {引用页:},
\iffieldundef{titleaddon}{}%判断一下titleaddon,否则直接加可能多一个空格
{\setunit{\subtitlepunct}\printfield{titleaddon}}%
\iffieldundef{note}{\printfield[gbtypeflag]{usera}}%在标题后直接给出文献标识字母,判断一下,是否是报纸和标准
- {\def\comparetmp{news}\def\comparetmpa{standard}\edef\comparetmpb{\thefield{note}}%
- \ifx\comparetmp\comparetmpb%判断是否为报纸
- \printfield[gbtypeflagn]{usera}%
- \else%
- \ifx\comparetmpa\comparetmpb%判断是否为标准
- \printfield[gbtypeflags]{usera}%
- \else%
- \printfield[gbtypeflag]{usera}%
- \fi%
- \fi%
+ {\iffieldequalstr{note}{standard}{\printfield[gbtypeflags]{usera}}%判断是否为标准
+ {\iffieldequalstr{note}{news}{\printfield[gbtypeflagn]{usera}}%判断是否为报纸
+ {\printfield[gbtypeflag]{usera}}}%其它
+% \def\comparetmp{news}\def\comparetmpa{standard}\edef\comparetmpb{\thefield{note}}%
+% \ifx\comparetmp\comparetmpb%判断是否为报纸
+% \printfield[gbtypeflagn]{usera}%
+% \else%
+% \ifx\comparetmpa\comparetmpb%判断是否为标准
+% \printfield[gbtypeflags]{usera}%
+% \else%
+% \printfield[gbtypeflag]{usera}%
+% \fi%
+% \fi%
}%
\iffieldundef{booktitle}{\newunit}{}%当title是析出时,不要标点
%\newunit
@@ -553,12 +686,27 @@ backrefpages = {引用页:},
\iffieldundef{month}{}{\bibrangedash\printtext{\thefield{month}}%
\iffieldundef{day}{}{\bibrangedash\printfield{day}}}}
}%
-\newbibmacro*{modifydate}{%新增加一个带括号的日期
+\newbibmacro*{modifydate}{%新增加一个带括号的日期,用于表示表示电子资源的更新和修改日期,而公告日期安按日期格式
+\iffieldundef{date}{%
+\iffieldundef{enddate}{%
+\printtext{%
+\iffieldundef{eventyear}{}{\mkbibparens{\printtext{\printfield{eventyear}}%
+\iffieldundef{eventmonth}{}{\bibrangedash\thefield{eventmonth}}%
+\iffieldundef{eventday}{}{\bibrangedash\printfield{eventday}}}}%
+}%
+}{%
+\printtext{%
+\iffieldundef{endyear}{}{\mkbibparens{\printtext{\printfield{endyear}}%
+\iffieldundef{endmonth}{}{\bibrangedash\thefield{endmonth}}%
+\iffieldundef{endday}{}{\bibrangedash\printfield{endday}}}}%
+}%
+}}{%
\printtext{%
\iffieldundef{year}{}{\mkbibparens{\printtext{\printfield{year}}%
\iffieldundef{month}{}{\bibrangedash\thefield{month}}%
\iffieldundef{day}{}{\bibrangedash\printfield{day}}}}%
}}%
+}%
%\DeclareFieldFormat{pages}{\mkpageprefix[bookpagination]{#1}}%页码引用格式的修改
\DeclareFieldFormat{pages}{#1}%去掉前面引导页码的pp.等字符
@@ -681,17 +829,19 @@ backrefpages = {引用页:},
%事实上title对于每个文献来说是必须的,所以用它判断是最快的,而且一般标题和出版社的语言是一样的。
\renewbibmacro*{publisher+location+date}{%
\iffieldundef{title}{}{\testCJKfirst{\thefield{title}}}%
-\testifnoteeqstd%
+%\testifnoteeqstd%
\iflistundef{location}{%\adddot
-\iftoggle{ifnoteeqstandard}{}{%
+\iffieldequalstr{note}{standard}{}{%从gbt7714-2015标准低19页看到,标准存在出版项时输出,没有时完全省略。
+%\iftoggle{ifnoteeqstandard}{}{%%}替换为上一句,尽可能用biblatex提供的函数
\iftoggle{ifCJKforgbt}{\printtext{[出版地不详]}\setunit*{\addcolon\addspace}}{\printtext{[S.l.\adddot]}\setunit*{\addcolon\addspace}}}}% \bibstring{noaddress}
{\printlist{location}\setunit*{\addcolon\addspace}}%
%\addcolon\addspace%
\iflistundef{publisher}{%
-\iftoggle{ifnoteeqstandard}{}{%
+\iffieldequalstr{note}{standard}{}{%从gbt7714-2015标准低19页看到,标准存在出版项时输出,没有时完全省略。
+%\iftoggle{ifnoteeqstandard}{}{%%}替换为上一句,尽可能用biblatex提供的函数
\iftoggle{ifCJKforgbt}{\printtext{[出版者不详]}\setunit{\adddot\addspace}\setunit*{\addcolon\addspace}}
%\mkbibbrackets
-%{\printtext{[s.n.\adddot]}\setunit{\adddot\addspace}\setunit*{\addcolon\addspace}}}}%\bibstring{nopublisher}
+%{{%{\printtext{[s.n.\adddot]}\setunit{\adddot\addspace}\setunit*{\addcolon\addspace}}}}%\bibstring{nopublisher}
{\printtext{\mkbibbrackets{s.n.}}\setunit{\adddot\addspace}\setunit*{\addcolon\addspace}}}}
{\printlist{publisher}\setunit*{\addcolon\addspace}}%
%\addcomma\addspace%
@@ -742,25 +892,28 @@ backrefpages = {引用页:},
\iffieldundef{issue}
{%\usebibmacro{date}
\iffieldundef{note}{\usebibmacro{date}}%判断一下,是否是报纸和标准
- {\def\comparetmp{news}\edef\comparetmpb{\thefield{note}}%
- \ifx\comparetmp\comparetmpb%
- \usebibmacro{newsdate}%
- \else%
- \usebibmacro{date}%
- \fi}%
- }
+ {\iffieldequalstr{note}{news}{\usebibmacro{newsdate}}%判断是否为报纸
+ {\usebibmacro{date}}%
+% \def\comparetmp{news}\edef\comparetmpb{\thefield{note}}%
+% \ifx\comparetmp\comparetmpb%
+% \usebibmacro{newsdate}%
+% \else%
+% \usebibmacro{date}%
+% \fi
+ }}%
{\printfield{issue}%
\setunit*{\addspace}%
%\usebibmacro{date}
\iffieldundef{note}{\usebibmacro{date}}%判断一下,是否是报纸和标准
- {\def\comparetmp{news}\edef\comparetmpb{\thefield{note}}%
- \ifx\comparetmp\comparetmpb%
- \usebibmacro{newsdate}%
- \else%
- \usebibmacro{date}%
- \fi}%
- }%
- }%
+ {\iffieldequalstr{note}{news}{\usebibmacro{newsdate}}%判断是否为报纸
+ {\usebibmacro{date}}%
+% \def\comparetmp{news}\edef\comparetmpb{\thefield{note}}%
+% \ifx\comparetmp\comparetmpb%
+% \usebibmacro{newsdate}%
+% \else%
+% \usebibmacro{date}%
+% \fi
+ }}}%
%\newunit
}
@@ -1005,7 +1158,7 @@ backrefpages = {引用页:},
% \usebibmacro{byauthor}%
% \newunit\newblock
% \usebibmacro{in:}%
- \printtext{\texttt{//}}%
+ \printtext{\texttt{//}\addnbthinspace}%
\usebibmacro{bybookauthor}%
\ifnameundef{bookauthor}{}{\newunit\newblock}%替换下一句
%\newunit\newblock
@@ -1112,7 +1265,7 @@ backrefpages = {引用页:},
% \usebibmacro{byauthor}%
% \newunit\newblock
% \usebibmacro{in:}%
- \printtext{\texttt{//}}%
+ \printtext{\texttt{//}\addnbthinspace}%
\usebibmacro{bybookauthor}%
\ifnameundef{bookauthor}{}{\newunit\newblock}%替换下一句
%\newunit\newblock
@@ -1496,7 +1649,7 @@ backrefpages = {引用页:},
% \usebibmacro{byauthor}%
% \newunit\newblock
%\usebibmacro{in:}%
- \printtext{\texttt{//}}%似乎顶格加百分号可以避免一些不必要的空格加入,特别是这种直接处理的语句前后
+ \printtext{\texttt{//}\addnbthinspace}%似乎顶格加百分号可以避免一些不必要的空格加入,特别是这种直接处理的语句前后
\usebibmacro{bybookauthor}%用类似inbook的方式处理
\ifnameundef{bookauthor}{}{\newunit\newblock}%替换下一句
%\newunit\newblock