summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/biblatex-gb7714-2015/example/updatehistoryold.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/latex/biblatex-gb7714-2015/example/updatehistoryold.tex')
-rw-r--r--Master/texmf-dist/doc/latex/biblatex-gb7714-2015/example/updatehistoryold.tex1055
1 files changed, 1055 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/biblatex-gb7714-2015/example/updatehistoryold.tex b/Master/texmf-dist/doc/latex/biblatex-gb7714-2015/example/updatehistoryold.tex
new file mode 100644
index 00000000000..00498bea6b3
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/biblatex-gb7714-2015/example/updatehistoryold.tex
@@ -0,0 +1,1055 @@
+%============================
+\updateinfo[2018-04-03]{update to version 1.0k}\label{up:180403}
+\begin{enumerate}
+\item 修正了gbnamefmt中的一些小错误。
+\item 修改了代码用于兼容3.11版本
+\item 页码范围的间隔符从en dash改为hyphen
+\item 修正了v3.7以上版本中专利文献中公告日期后多出点的问题,该bug是由于输入公告日期没有使用printtext导致异步标点机制破坏所致。
+\item 修正了texlive2017以上版本中beamer类中标题后面多出点的问题,由于beamer会对bibmacro\{title\}做patch导致其输出不同于普通文档类,该bug是由于beamer升级后patch的内容发生变化导致。
+\end{enumerate}
+
+%============================
+\updateinfo[2018-01-20]{update to version 1.0j}\label{up:180120}
+\begin{enumerate}
+\item 增加gbtype选项用于控制是否输出题名后的标识符,见\ref{sec:added:opt} 节。
+\item 进一步修改了版本判断机制,以使最新版本的兼容性更强,见\ref{sec:blx:compatibility}节。
+\item 根据刘小涛的需求和建议,增加了gbnamefmt选项用于控制姓名的大小写和输出格式,同时根据zotero从cnki识别输出中文文献姓名中带逗号的情况做了兼容性处理,见\ref{sec:opt:namefmt}节。
+\item 为统一样式增加的选项将原来的align选项修改为gbalign,见\ref{sec:added:opt}节。
+\item 通过正确使用nameyeardelim相关命令,修正了作者年制,标注和著录表中的中作者与年份之间的标点符号,
+ 见\ref{sec:label:fmt}节。
+\item 根据ghiclgi的建议,增加了yearcite命令以满足,作者年制中作者已经给出仅需要年份信息而不需要页码信息的情况,说明和测试见\ref{sec:test:book},\ref{sec:cite:cmd:test}节。
+\end{enumerate}
+
+%============================
+\updateinfo[2017-11-21]{update to version 1.0i}\label{up:171121}
+\begin{enumerate}
+\item 因为biblatex版本升级,3.8及以上版的set类型不再复制第一个子条目的信息,因此增加使用关联条目的解决方案,详见
+\ref{sec:multilan:implement}, \ref{sec:data:mdf:forrelated}节。
+\item 修正了一个liubenyuan发现的bug。当标题中含有\verb|\LaTeX{}|这样的宏时,cjk判断函数出错。解决如下:
+ \begin{texlist}
+ 这个问题是这样的,
+ 因为在cjk判断函数中,使用了xtring的StrChar函数来抽取字符,但这个函数默认情况下需要其参数完全展开。因为\LaTeX{}宏比较复杂,展开时会出现问题。设置该函数不展开或展开一次,都可以解决判断出错的问题。比如:
+
+ \expandarg
+ %
+ \StrChar{english}{1}[\tempa]%
+ \tempa
+
+ \StrChar{中文}{1}[\tempa]%
+ \tempa
+
+ \StrChar{english \LaTeX{} abc}{1}[\tempa]%
+ \tempa
+
+ 但解决的是直接给出文本的情况,在biblatex使用中需要用\thefield取出文本,显然\thefield不止展开一次,因此不展开或者展开一次,都会出现问题,所以无解。只能从另外一个角度出发。
+
+ 考虑到动态数据修改时,也可以利用正则表达式抽取数据,因此利用它来将title信息的第一个非特殊符号字符抽取出来,放到userd 中用于cjk判断,这样就避开了\LaTeX{}展开的问题。
+ \end{texlist}
+
+\item 针对biblatex3.8a的更新做了兼容性处理,主要是修改版本判断和处理机制,替换新的宏包选项,替换新的排序格式命令。详见第\ref{sec:blx:compatibility}节
+
+\item 重写了范围解析函数,详见\ref{sec:cjkjudge}节
+
+\end{enumerate}
+
+\updateinfo[2017-04-11]{update to version 1.0h}\label{up:170411}
+\begin{enumerate}
+\item texlive2017中biblatex3.7对于authoryear样式中的date+extrayear宏有一定的修改,从原来texlive2016中的命令printdateextralabel 转换到了printlabeldateextra。因此做一个修改。
+ \begin{texlist}
+ %设置因为mergedate默认为true时的情况,来自\bbx@opt@mergedate@compact
+%去掉作者后面包围年份的圆括号
+%这里因为biblatex版本的不同,做不同的处理,texlive2017版的在iftexliveseven=true中设置
+%2016等低版本的在iftexliveseven=false中设置
+%重设date+extrayear格式,源来自authoryear.BBX
+\iftoggle{iftexliveseven}{%
+ \renewbibmacro*{date+extrayear}{%
+ \iffieldundef{labelyear}
+ {}
+ {\printtext{%[parens]%这里把括号去掉
+ \iffieldsequal{year}{labelyear}
+ {\printlabeldateextra}%
+ {\printfield{labelyear}%
+ \printfield{extrayear}}}}}%
+}{%
+\renewbibmacro*{date+extrayear}{%
+ \iffieldundef{\thefield{datelabelsource}year}
+ {}
+ {\printtext{%[parens]%这里把括号去掉
+ \iffieldsequal{year}{\thefield{datelabelsource}year}
+ {\printdateextralabel}%
+ {\printfield{labelyear}%
+ \printfield{extrayear}}}}}%
+}
+ \end{texlist}
+
+ 当然其实这还有更简单的解决方法就是:
+ \begin{texlist}
+ \let\printdateextralabel=\printlabeldateextra
+ \end{texlist}
+ 这个方式似乎有点问题。
+
+\item 根据同学(zjsdut@163.com)发现的问题,修改一个bug,感谢。当online 类型仅有url 信息时,url前面多了一个点。这是modifydate宏设计中printtext位置导致标点异步处理机制失效所产生现象。因此作出修改,newbibmacro*\{modifydate\}宏详见\ref{sec:date:fmt}节。
+
+
+\item 增加一个选项gbnoauthor。当给出选项gbnoauthor=true时,作者年制中当作者缺省时,使用佚名或noauthor代替,即将佚名或noauthor作为作者处理。默认情况下gbnoauthor=true不处理,即当无作者进行处理,选择增加的代码详见\ref{sec:blx:compatibility}节。同时也修改了中英文排序判断和佚名代替的机制。
+ \begin{texlist}
+ \map{%因为无法进行cjk字符判断,所以用反的思路,判断没有英文字符,没有空格,没有逗号等字符情况下
+ %认为是中文的,将文献userb设置成cn,用于排序
+ \step[fieldsource=author,match=\regexp{[^a-zA-Z\s\.\,\'\{\}\-\:0-9]},final]
+ \step[fieldset=userb,fieldvalue={cn}]
+ }
+ \map{%因为无法进行cjk字符判断,所以用反的思路,判断没有英文字符,没有空格,没有逗号等字符情况下
+ %认为是中文的,将文献userb设置成cn,用于排序
+ \step[fieldsource=title,match=\regexp{[^a-zA-Z\s\.\,\'\{\}\-\:0-9]},final]
+ \step[fieldset=userb,fieldvalue={cn}]
+ }%如果没有作者和标题,那么剩下的最可能有意义的只有网址了,而网址通常是英文的,因此不用再进一步对其它域进行判断了。
+ \map{%将没有设置的userb设置成en,即认为不是中文的就是英文的。
+ \step[fieldset=userb,fieldvalue={en}]
+ }
+ \end{texlist}
+
+ \begin{texlist}
+ \def\dealnoathor{
+ \DeclareStyleSourcemap{
+ \maps[datatype=bibtex]{
+ \map{%默认情况下将空缺作者设置为佚名
+ \step[fieldsource=userb,match={cn},final]
+ \step[fieldset=author, fieldvalue={佚名}]
+ }
+ \map{%默认情况下将空缺作者设置为佚名
+ \step[fieldsource=userb,match={en},final]
+ \step[fieldset=author, fieldvalue={NOAUTHOR}]
+ }
+ }
+ }}
+ \end{texlist}
+
+ 下面是已经取消的以前的处理方式:
+ \begin{texlist}
+ \map{%默认情况下将空缺作者设置为佚名
+ \step[fieldset=author, fieldvalue={佚名}]
+ }
+ \map[overwrite]{%当标题带有英文字符,且作者为佚名的情况,设置作者为noauthor,
+ %也有一些特殊情况可能处理不到,比如标题中英混合,作者又却是
+ \step[fieldsource=title,match=\regexp{[a-zA-Z]},final]
+ \step[fieldsource=author,match=\regexp{佚名}, replace={NOAUTHOR}]
+ }
+ \map{%因为无法进行cjk字符判断,所以用反的思路,判断没有英文字符,没有空格,没有逗号等字符情况下
+ %认为是中文的,将文献userb设置成cn,用于排序
+ \step[fieldsource=author,match=\regexp{[^a-zA-Z\s\.\,\'\{\}\-]},final]
+ \step[fieldset=userb,fieldvalue={cn}]
+ }
+ \map{%将没有设置的userb设置成en,即认为不是中文的就是英文的。
+ \step[fieldset=userb,fieldvalue={en}]
+ }
+ \end{texlist}
+
+
+\item 修改多语言参考文献间的分割符号,即将par改为newline,避免采用gb7714-2015的项对齐方式时,不同语言的参考文献间的分段导致没有缩进。(测试结果见:\ref{sec:align:test}节的项对齐方式)
+
+ \begin{texlist}
+ %\renewcommand*{\entrysetpunct}{\adddot\par\nobreak}
+ \renewcommand*{\entrysetpunct}{\adddot\newline\nobreak}
+ \end{texlist}
+
+\item Zeping Lee兄发现了一个小问题,感谢,一直没有注意到这个问题。这里做出修改:主要是作者年制中,期刊析出的文献中,当卷信息不存在时,期刊名和期是连在一起的,而不是中间有个逗号,例如GB/T 7714-2015 中第10.2.4 节中的“刘彻东条目”。主要修改如下(结果测试见:\ref{sec:article:novol}节):
+
+ \begin{texlist}
+ %调整期刊名的格式,源来自standard.bbx
+ \renewbibmacro*{journal+issuetitle}{%
+ \usebibmacro{journal}%
+ %\setunit*{\addspace}%
+ %\setunit*{\addcomma\addspace}%修改为增加一个逗号
+ \iffieldundef{series}%
+ {}%
+ {\newunit%
+ \printfield{series}%
+ \setunit{\addspace}}%
+ %\usebibmacro{volume+number+eid}%
+ %\setunit{\addspace}%
+ \usebibmacro{issue+date}%
+ %\setunit{\addcolon\space}%
+ %换成逗号和空格
+ \usebibmacro{issue}%
+ \iffieldundef{volume}{}{\setunit{\addcomma\space}}%
+ \usebibmacro{volume+number+eid}%把卷期放到年份后面
+ %\newunit
+ }
+
+ %调整journal,首先判断子标题,然后在设置标点。避免直接设置标点后,当volume不存在是需要使用\nopuct去标点进而引入不必要的空格
+ \renewbibmacro*{journal}{%
+ \iffieldundef{journaltitle}%
+ {}%
+ {\printtext[journaltitle]{%
+ \printfield[titlecase]{journaltitle}%
+ \iffieldundef{journalsubtitle}{}{\setunit{\subtitlepunct}%
+ \printfield[titlecase]{journalsubtitle}}}}}
+
+ %调整issue+date,原在authoryear.BBX中\bbx@opt@mergedate@compact中定义
+ %当issue存在时,才设置newunit。避免直接设置标点后,当volume不存在是需要使用\nopuct 去标点进而引入不必要的空格
+ \renewbibmacro*{issue+date}{%
+ \iffieldundef{issue}%
+ {}%
+ {\printtext[parens]{\printfield{issue}}\newunit}}
+
+ %增加一个number带括号的格式,避免使用mkbibparens而引入一个不必要的空格
+ \DeclareFieldFormat{addnumflag}{%
+ \nobreak\printtext{(}\nobreak #1\nobreak\printtext{)}}
+
+ %调整期刊卷和期的格式,源来自standard.bbx
+ \renewbibmacro*{volume+number+eid}{%
+ \printfield{volume}%
+ %\setunit*{\adddot}%去掉点号
+ %\printfield{number}%
+ \iffieldundef{number}{}{\printfield[addnumflag]{number}}%
+ %\iffieldundef{number}{}{\printtext{\mkbibparens{\printfield{number}}}}% 增加一个圆括号
+ \iffieldundef{eid}{}{%
+ \setunit{\addcomma\space}%
+ \printfield{eid}}}
+ \end{texlist}
+
+\item wayne508同学提出了一个需求,就是不希望使用出版项缺省时的默认处理,即不使用[出版地不详],[出版者不详],[S.l.],[s.n.]等填充,因此增加了一个宏包选项gbpub,当等于false时,去掉自动处理,使用biblatex 的标准处理方式。增加选项代码见\ref{sec:blx:compatibility}节,下面给出的是具体的处理代码:
+
+ \begin{texlist}
+ %出版社和地址的处理
+ \newbibmacro*{location+institution+date}{%
+ \iftoggle{bbx:gbpub}%
+ {\testCJKfirst{\thefield{title}}
+ \iflistundef{location}{\iftoggle{ifCJKforgbt}{\printtext{[出版地不详]}}{\printtext{[S.l.\adddot]}}}%
+ {\printlist{location}}%
+ % \iflistundef{institution}
+ % {\setunit*{\addcomma\space}}
+ % {\setunit*{\addcolon\space}}%
+ % \printlist{institution}%
+ % \setunit*{\addcomma\space}%
+ \addcolon\addspace%
+ \iflistundef{institution}{%
+ \iftoggle{ifCJKforgbt}{\printtext{[出版者不详]}}{\printtext{\mkbibbrackets{s.n.}}}}% \bibstring{nopublisher}%[s.n.\adddot]
+ {\printlist{institution}}%
+ \setunit{\addcomma\addspace}%
+ %\usebibmacro{date}%
+ \printfield{year}%
+ \bibrangedash%
+ \iffieldundef{endyear}{}{\printfield{endyear}}%
+ \newunit}%
+ { \printlist{location}%
+ \iflistundef{institution}%
+ {\setunit*{\addcomma\space}}
+ {\setunit*{\addcolon\space}}%
+ \printlist{institution}%
+ \setunit*{\addcomma\space}%
+ \usebibmacro{date}%
+ \newunit}%
+ }
+
+ \renewbibmacro*{publisher+location+date}{%
+ \iftoggle{bbx:gbpub}%
+ {\testCJKfirst{\thefield{title}}%
+ %\testifnoteeqstd%
+ \iflistundef{location}{%\adddot
+ \iffieldequalstr{note}{standard}{}{%从gbt7714-2015标准低19页看到,标准存在出版项时输出,没有时完全省略。
+ %\iftoggle{ifnoteeqstandard}{}{%}替换为上一句,尽可能用biblatex提供的函数
+ \iftoggle{ifCJKforgbt}{\printtext{[出版地不详]}\addcolon\addspace}{\printtext{[S.l.\adddot]}\addcolon\addspace}%
+ }}% \bibstring{noaddress}
+ {\printlist{location}\addcolon\addspace}%
+ %\addcolon\addspace%
+ \iflistundef{publisher}{%
+ \iffieldequalstr{note}{standard}{}{%
+ %\iftoggle{ifnoteeqstandard}{}{%}替换为上一句,尽可能用biblatex提供的函数
+ \iftoggle{ifCJKforgbt}{\printtext{[出版者不详]}\setunit{\adddot\addspace}\setunit*{\addcomma\addspace}}%
+ {\printtext{\mkbibbrackets{s.n.}}\setunit{\adddot\addspace}\setunit*{\addcomma\addspace}}%
+ }}%
+ {\printlist{publisher}\setunit*{\addcomma\addspace}}%
+ %\addcomma\addspace%
+ \usebibmacro{date}%
+ %\newunit %去掉这个标点
+ }%
+ {\printlist{location}%
+ \iflistundef{publisher}
+ {\setunit*{\addcomma\space}}
+ {\setunit*{\addcolon\space}}%
+ \printlist{publisher}%
+ \setunit*{\addcomma\space}%
+ \usebibmacro{date}%
+ %\newunit
+ }%
+ }
+
+ \end{texlist}
+
+
+
+ 下面这种处理方式是有问题的,即默认处理情况不是希望的true的情况,但如果给出宏包加载选项时没有问题的。因此采用上一种方式。
+ \begin{texlist}
+ %\newtoggle{bbx:gbpub}
+ %\DeclareBibliographyOption[boolean]{gbpub}[true]{%
+ % \settoggle{bbx:gbpub}{#1}}
+ %这种机制的标识判断,能用于usemacro使用,域格式定义中,但无法用来定义macro
+ %定义宏和使用宏是两个不同的展开层级
+ %\ExecuteBibliographyOptions{gbpub}
+ %但是使用这句默认设置可以用来定义macro
+ \DeclareBibliographyOption[bool]{gbpub}[true]{%应使用这种直接的机制
+ \ifstrequal{#1}{true}{\pubaddmacroredefine}{}}
+
+ %出版社和地址的处理
+ %新增一个样式用于输出连续出版物的地址,单位,时间
+ %类似\newbibmacro*{publisher+location+date}
+ \newbibmacro*{location+institution+date}{%
+ \printlist{location}%
+ \iflistundef{institution}
+ {\setunit*{\addcomma\space}}
+ {\setunit*{\addcolon\space}}%
+ \printlist{institution}%
+ \setunit*{\addcomma\space}%
+ \usebibmacro{date}%
+ \newunit}
+ %当没有出版社地址时,直接判断title的信息是否是中文,若为中文,则写出版地不详,否则用英文的字符表示。
+ %事实上title对于每个文献来说是必须的,所以用它判断是最快的,而且一般标题和出版社的语言是一样的。
+ \def\pubaddmacroredefine{%
+ \renewbibmacro*{publisher+location+date}{%
+ \testCJKfirst{\thefield{title}}%
+ %\testifnoteeqstd%
+ \iflistundef{location}{%\adddot
+ \iffieldequalstr{note}{standard}{}{%从gbt7714-2015标准低19页看到,标准存在出版项时输出,没有时完全省略。
+ %\iftoggle{ifnoteeqstandard}{}{%}替换为上一句,尽可能用biblatex提供的函数
+ \iftoggle{ifCJKforgbt}{\printtext{[出版地不详]}\addcolon\addspace}{\printtext{[S.l.\adddot]}\addcolon\addspace}%
+ }}% \bibstring{noaddress}
+ {\printlist{location}\addcolon\addspace}%
+ %\addcolon\addspace%
+ \iflistundef{publisher}{%
+ \iffieldequalstr{note}{standard}{}{%
+ %\iftoggle{ifnoteeqstandard}{}{%}替换为上一句,尽可能用biblatex提供的函数
+ \iftoggle{ifCJKforgbt}{\printtext{[出版者不详]}\setunit{\adddot\addspace}\setunit*{\addcomma\addspace}}%
+ {\printtext{\mkbibbrackets{s.n.}}\setunit{\adddot\addspace}\setunit*{\addcomma\addspace}}%
+ }}%
+ {\printlist{publisher}\setunit*{\addcomma\addspace}}%
+ %\addcomma\addspace%
+ \usebibmacro{date}%
+ %\newunit %去掉这个标点
+ }
+ %新增一个样式用于输出连续出版物的地址,单位,时间
+ %类似与上面的\newbibmacro*{publisher+location+date}
+ \newbibmacro*{location+institution+date}{%
+ \testCJKfirst{\thefield{title}}
+ \iflistundef{location}{\iftoggle{ifCJKforgbt}{\printtext{[出版地不详]}}{\printtext{[S.l.\adddot]}}}%
+ {\printlist{location}}%
+ % \iflistundef{institution}
+ % {\setunit*{\addcomma\space}}
+ % {\setunit*{\addcolon\space}}%
+ % \printlist{institution}%
+ % \setunit*{\addcomma\space}%
+ \addcolon\addspace%
+ \iflistundef{institution}{%
+ \iftoggle{ifCJKforgbt}{\printtext{[出版者不详]}}{\printtext{\mkbibbrackets{s.n.}}}}% \bibstring{nopublisher}%[s.n.\adddot]
+ {\printlist{institution}}%
+ \setunit{\addcomma\addspace}%
+ %\usebibmacro{date}%
+ \printfield{year}%
+ \bibrangedash%
+ \iffieldundef{endyear}{}{\printfield{endyear}}%
+ \newunit}
+ }
+
+
+ \end{texlist}
+
+\end{enumerate}
+
+%============================
+\updateinfo[2017-02-26]{update to version 1.0g}\label{up:170226}
+\begin{enumerate}
+\item 进一步增加兼容性,支持条目类型比如MASTERSTHESIS,PHDTHESIS,www,electronic,standard,techreport,conference等,支持本样式增加的newspaper类型。因此在bib文件中可以直接使用这些条目类型。具体的测试详见\ref{sec:entrytype:compatibility}节。
+
+ 为了实现兼容,主要从三个方面进行修改,包括用户层数据源映射,样式层的数据源映射,驱动。关于数据源映射和数据模型的原理详见\ref{sec:biblatex:mech} 节。
+
+ 因为biblatex提供的一些类型的别名的处理是在驱动层数据源映射时处理,所以要实现完全的兼容,还需要在用户层或者样式层进一步处理,首先是标识符的问题。因为以前做的标识符处理时在用户层映射中,所以这里仍然如此:
+ \begin{texlist}
+ \map{
+ \pertype{newspaper}%增加一个新闻报纸的类型newspaper
+ \step[fieldset=usera, fieldvalue={N}]%因为没有专门的驱动,这句的目的是定义一个usera 域,方便映射为article 后判断
+ \step[fieldset=note, fieldvalue=news]
+ }
+ \map{
+ \pertype{standard}%兼容老的standard类型
+ \step[fieldset=usera, fieldvalue={S}]%因为没有专门的驱动,这句的目的是定义一个usera 域,方便映射为book和inbook后判断
+ \step[fieldset=note, fieldvalue=standard]
+ }
+ \map{
+ \pertype{inproceedings}
+ \pertype{conference}%兼容老的conference类型
+ \step[fieldset=usera, fieldvalue={C}]
+ \step[fieldsource=institution] %有时会把version和edition 混淆,这里处理后就没有这个问题,可以直接用version
+ \step[fieldset=publisher, origfieldval]
+ \step[fieldsource=editor] %
+ \step[fieldset=bookauthor, origfieldval]
+ }
+ \map{
+ \pertype{report}
+ \pertype{techreport}%techreport类型
+ \step[fieldset=usera, fieldvalue={R}]
+ }
+ \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}]
+ }
+ \end{texlist}
+
+ 其次,因为biblatex标准样式在处理条目别名是在驱动层的映射中,这里面引入了一些对于gb7714样式来说不需要的信息,比如type信息,因此需要将其去掉,所以在样式层映射中进行处理。因为standard条目可能用book也可能用inbook驱动输出,所以转换过程就需要有选择。这里有两种方式可以处理,一是用域是否存在进行判断(比如booktitle域),然后分别转换为book 类型和inbook类型,二是直接都转换成inbook类型,然后对inbook驱动进行修改,因为inbook 驱动与book驱动的差异仅在于所析出源文献那一块,所以,在驱动中用booktitle 域进行判断,如果该域不存在,那么去掉这一块的处理,inbook驱动可以等价于book驱动,但是这种方式中处理标识符后面的标点可能存在问题,biblatex 中处理标点的机制有很多好处,但是当样式作者在修改域格式是引入一些诸如[]之类符号时处理时比较麻烦的。这里采用第一种方式。
+ 样式层映射为:
+ \begin{texlist}
+ \DeclareStyleSourcemap{
+ \maps[datatype=bibtex]{
+ % \map{%尝试未定义数据模型的newspaper类型映射为article,newspaper完全是针对gb7714的新类型,在biblatex中完全没有定义
+ % %但从实践看,并没有什么影响,映射过来就可以了。这一段可以用下面的驱动层别名映射替代,所以这里注释掉用下面的\DeclareBibliographyAlias命令
+ % \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]
+ }
+ }
+ }
+ \DeclareBibliographyAlias{newspaper}{article}%定义驱动别名,尝试以替代驱动层映射,实践表明是可行的。
+ \end{texlist}
+
+\item 在online类型中,公告日期改为首选用date实现,然后用enddate,当没有date 和enddate时则用eventdate输出。代码详见\ref{sec:date:fmt}节。
+
+\item 为方便bib文件生成,构建可以从gb7714-2015格式的参考文献表文本转bib 文件的perl 程序,利用它可以批量解析参考文献信息并转换为bib数据源文件。详见:\href{run:./gb7714texttobib.pl}{gb7714texttobib.pl},测试文件见:\href{run:./gb7714texteg.dat}{gb7714texteg.dat}。
+
+\item 在输出标识符的usera域格式中考虑标准样式的url选项,以便实现对是否打印url和urldate的控制。这个需求是Wenbo Sheng兄提出的,这里做出修改。
+ \begin{texlist}
+ \DeclareFieldFormat{gbtypeflag}{%
+ \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
+ \iftoggle{bbx:url}{\iffieldundef{url}%当存在url时,增加一个OL标识符
+ {\nobreak\printtext{[}\nobreak N\printtext{]}\nobreak}%
+ {\nobreak\printtext{[}\nobreak N\printtext{\texttt{/}OL]}\nobreak}%
+ }{\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}}
+ \end{texlist}
+
+\item 在一些条目类型如inbook等的标识符后面(如[M]//)加入一个不可断行短空格,使紧跟其后的单词能正确断行,当然也可以增加一个可断行的短空格addthinspace,方便直接在//后面断行。
+ \begin{texlist}
+ \usebibmacro{title}%
+ %\nopunct
+ %\iffieldundef{booktitle}{\adddot\addspace}{%兼容standard时,如果standard没有booktitle的应转换为book类,因为都转成inbook 类,所以这里做如下处理
+ \printtext{\texttt{//}\addnbthinspace}%%\texttt{//}
+ \usebibmacro{bybookauthor}%
+ \end{texlist}
+
+\item 对参考文献的一些域中存在的一些特殊字符比如\&,\%,\#等进行处理,方法是利用动态数据修改。同时因为texlive2015/texlive2016中biblatex 版本的不同分别进行处理。这个需求是湘厦人提出的,这里做出修改,详见\ref{sec:dynamic:modify}节。
+
+
+\end{enumerate}
+
+%============================
+\updateinfo[2016-12-31]{update to version 1.0f}\label{up:161231}
+\begin{enumerate}
+\item 利用biblatex提供的iffieldequalstr函数替换用于判断note域值等于new 或standard 的函数,比如:
+\begin{texlist}
+%case 1:
+%\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} %可以利用这一函数代替
+
+%case 2:
+\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%
+
+%case 3:
+\iffieldequalstr{note}{news}{\usebibmacro{newsdate}}%判断是否为报纸
+ {\usebibmacro{date}}%
+% \def\comparetmp{news}\edef\comparetmpb{\thefield{note}}%
+% \ifx\comparetmp\comparetmpb%
+% \usebibmacro{newsdate}%
+% \else%
+% \usebibmacro{date}%
+% \fi
+
+%case 4:
+\renewbibmacro*{publisher+location+date}{%
+\testCJKfirst{\thefield{title}}%
+%\testifnoteeqstd%
+\iflistundef{location}{%\adddot
+\iffieldequalstr{note}{standard}{}{%从gbt7714-2015标准低19页看到,标准存在出版项时输出,没有时完全省略。
+%\iftoggle{ifnoteeqstandard}{}{%}替换为上一句,尽可能用biblatex提供的函数
+\iftoggle{ifCJKforgbt}{\printtext{[出版地不详]}\addcolon\addspace}{\printtext{[S.l.\adddot]}\addcolon\addspace}}}% \bibstring{noaddress}
+{\printlist{location}\addcolon\addspace}%
+%\addcolon\addspace%
+\iflistundef{publisher}{%
+\iffieldequalstr{note}{standard}{}{%
+%\iftoggle{ifnoteeqstandard}{}{%}替换为上一句,尽可能用biblatex提供的函数
+\iftoggle{ifCJKforgbt}{\printtext{[出版者不详]}\setunit{\adddot\addspace}\setunit*{\addcomma\addspace}}%
+{\printtext{\mkbibbrackets{s.n.}}\setunit{\adddot\addspace}\setunit*{\addcomma\addspace}}}}%
+{\printlist{publisher}\setunit*{\addcomma\addspace}}%
+%\addcomma\addspace%
+\usebibmacro{date}%
+ %\newunit %去掉这个标点
+}
+\end{texlist}
+
+\item 之前1.0e版增加gbalign选项的时候,没有测试对texlive2015的兼容性,所以导致一些错误。因为texlive2015的biblatex3.0版本的DeclareBibliographyOption 命令定义选项时不像texlive2016的biblatex3.4版的是带类型说明的。所以做出一定的处理,把该命令分两个版本进行设置。同时需要注意新定义的参考文献表环境在texlive2015中的biblatex3.0中无效且出错,所以直接去掉,因此文献表的标签的项对齐效果在texlive2015中的biblatex3.0 版中无法实现。代码详见\ref{sec:blx:compatibility}节。
+
+\item 之前1.0e版解决编组符号包围的责任者的中英文判断问题的时候,没有测试对texlive2015的兼容性,所以导致一些错误。因为使用了xstring宏包的功能,但texlive2015的biblatex3.0版本不默认加载xstring宏包,所以在修改样式文件,在其中加载一下该宏包。
+\begin{texlist}
+\RequirePackage{xstring}%为兼容texlive2015的biblatex3.0不加载xstring包的问题
+\end{texlist}
+
+\end{enumerate}
+
+%============================
+\updateinfo[2016-12-07]{update to version 1.0e}\label{up:161207}
+\begin{enumerate}
+\item 应海阔天空和xmtangjun等朋友的要求,在同一文献中可以使用上标或非上标的标注方式,修改顺序编码制的标注样式文件,去掉parencite命令的上标模式,恢复非上标方式。这样可以在同一文章中使用cite命令标注上标,而parencite命令标注非上标。而作者年制没有这一问题,不做修改。具体的效果见第\ref{sec:cite:cmd:test}节的内容。
+
+\item 给宏包增加了一个选项gbalign,用于控制顺序编码制的参考文献表的标签对齐方式,默认是right即右对齐,可以设置left即左对齐,也可以设置gb7714-2015,即以各条参考文献自身为基准对齐实现对齐。效果见第\ref{sec:align:test}节的内容。增加一个选项,真正实现起来并不复杂,但在未明白其运行机制之前尝试了好长时间,显得很麻烦,具体的机制见第\ref{sec:biblatex:mech} 节。
+ 修改代码如下:
+\begin{texlist}
+\DeclareBibliographyOption[string]{gbalign}[right]{%
+\ifstrequal{#1}{left}{\setalignleft}{}
+\ifstrequal{#1}{gb7714-2015}{\setaligngbstyle}{}
+}
+
+%修改序号标签格式为左对齐
+\def\setalignleft{\DeclareFieldFormat{labelnumberwidth}{\mkbibbrackets{##1}\hfill}}
+%修改序号标签格式为以各条参文献为基础进行对齐的方式
+\def\setaligngbstyle{%
+\def\blx@bibitem##1{%
+ \blx@ifdata{##1}
+ {\begingroup
+ \blx@getdata{##1}%
+ \blx@bibcheck
+ \iftoggle{blx@skipentry}{}{%
+ \blx@setdefaultrefcontext{##1}%
+ \global\let\blx@noitem\@empty
+ \blx@setoptions@type\abx@field@entrytype
+ \blx@setoptions@entry
+ \blx@thelabelnumber
+ \addtocounter{instcount}\@ne
+ \blx@initsep
+ \blx@namesep
+ \csuse{blx@item@\blx@theenv}\relax
+% \blx@initsep %移动到上面去,恢复bibnamesep等的作用机制
+% \blx@namesep
+ \csuse{blx@hook@bibitem}%
+ \blx@execute
+ \blx@initunit
+ \blx@anchor
+ \blx@beglangbib
+ \bibsentence
+ \blx@pagetracker
+ \blx@driver\abx@field@entrytype
+ \blx@postpunct
+ \blx@endlangbib}%
+ \par\endgroup}%这里增加了一个\par
+ {}}
+\newcommand{\itemcmd}{%
+\settowidth{\lengthid}{[\printfield{labelnumber}]}
+\addtolength{\lengthid}{\biblabelsep}
+\setlength{\lengthlw}{\textwidth}
+\addtolength{\lengthlw}{-\lengthid}
+\addvspace{\bibitemsep}%恢复\bibitemsep的作用
+%\parshape 2 0em \textwidth \lengthid \lengthlw
+\hangindent\lengthid
+[\printfield{labelnumber}]\hspace{\biblabelsep}}
+\newlength{\lengthid}
+\newlength{\lengthlw}
+\defbibenvironment{bibliography}
+{\begingroup\setlength{\parindent}{0em}}
+{\endgroup}
+{\itemcmd}}
+\end{texlist}
+
+
+\item map中当有append选项时也需要overwrite选项,这不知道是不是texlive 2016 中biber 升级后的原因。之前使用texlive2015的时候没有问题。所以修改为:
+\begin{texlist}
+%*.bbx
+ \map{%将entrykey放入keywords中用于后期的使用
+ \step[fieldsource=entrykey]
+ \step[fieldset=keywords, origfieldval]
+ }
+ \map[overwrite]{%这里还必须有overwrite,怎么之前会觉得没有问题呢,可能是之前版本拷错了,还是之前是texlive2015 变16后biber有了变化(2016-1207修改正确)
+ \step[fieldsource=note, final]%将note域信息复制给keywords,用于输出时容易区分标准和报纸
+ \step[fieldset=keywords, fieldvalue={,}, append]
+ \step[fieldset=keywords, origfieldval, append]
+ }
+\end{texlist}
+
+\item 顺序制中,出版项后没有日期的情况下,出现逗号这是有问题的,所以修改为:
+\begin{texlist}
+%gb7714-2015.bbx
+%出版社和地址的处理,当没有出版社地址时
+%直接判断title的信息是否是中文,若为中文,则写出版地不详,否则用英文的字符表示。
+%事实上title对于每个文献来说是必须的,所以用它判断是最快的,而且一般标题和出版社的语言是一样的。
+\newbibmacro*{publisher+location+date}{%
+\testCJKfirst{\thefield{title}}%
+\testifnoteeqstd%
+\iflistundef{location}{%\adddot
+\iftoggle{ifnoteeqstandard}{}{%
+\iftoggle{ifCJKforgbt}{\printtext{[出版地不详]}\addcolon\addspace}{\printtext{[S.l.\adddot]}\addcolon\addspace}}}% \bibstring{noaddress}
+{\printlist{location}\addcolon\addspace}%
+%\addcolon\addspace%
+\iflistundef{publisher}{%
+\iftoggle{ifnoteeqstandard}{}{%
+\iftoggle{ifCJKforgbt}{\printtext{[出版者不详]}\setunit{\adddot\addspace}\setunit*{\addcomma\addspace}}%
+{\printtext{\mkbibbrackets{s.n.}}\setunit{\adddot\addspace}\setunit*{\addcomma\addspace}}}}%
+{\printlist{publisher}\setunit*{\addcomma\addspace}}%在这里修改使用了setunit命令,与ay.bbx统一。
+%\addcomma\addspace%
+\usebibmacro{date}%
+ %\newunit %去掉这个标点
+}
+\end{texlist}
+
+\item 当urldate域给出的信息不全时,比如只有年和月,而没有日,那么就需要进行判断,只输出存在的信息,因此对urldate域格式做修改,代码详见\ref{sec:date:fmt}节。
+
+
+\item 当责任者等需要判断中英文的信息是用编组符号包含的时候,原来的CJK判断函数会出现问题,所以利用xstring宏包做一定的修改,修改完成后可以应对信息中存在编组的情况,详见\ref{sec:cjkjudge}节。
+\end{enumerate}
+
+%============================
+\updateinfo[2016-11-24]{update to version 1.0d}
+\begin{enumerate}
+\item 用于usera域的gbtypeflag域打印格式,明明在aritle/book类中没有问题,但在beamer中就会出现问题,多出一个点了。到现在还没有搞明白怎么会多出点来,printtext命令明明没有输出点,不像S.l.还有一个点的输出,这里只有]符号,但就是多了一个点。从最后修改成功看,这里就是多了一个点,而且是literal period,所以后面的点无法覆盖它,所以需要先用adddot命令将其转换为缩写的点,而且似乎用isdot 也不行,其原因还得再分析分析。因此做如下修改:
+
+\begin{texlist}
+%域格式修改
+\DeclareFieldFormat{title}{#1\adddot\addthinspace}%
+\DeclareFieldFormat{journaltitle}{#1\isdot}
+\DeclareFieldFormat%将期刊等文献的标题中原来带的引号去掉
+ [article,patent,thesis,unpublished]
+ {title}{#1\adddot\addthinspace}
+\DeclareFieldFormat%将期刊等文献的标题中原来带的引号去掉
+ [inbook,incollection,inproceedings]
+ {title}{#1\nopunct\unspace}
+
+%同时移动title的micro的printtext[title]的括号范围:
+%重设title的输出,将文献类型标识符输出出去,原输出来自biblatex.def文件
+\newbibmacro*{title}{%
+ \ifboolexpr{%
+ test{\iffieldundef{title}}%
+ and%
+ test{\iffieldundef{subtitle}}%
+ }%
+ {}%
+ {\printtext[title]{%
+ \printfield[titlecase]{title}%
+ \ifboolexpr{test {\iffieldundef{subtitle}}}%这里增加了对子标题的判断,解决不判断多一个点的问题
+ {}{\setunit{\subtitlepunct}%
+ \printfield[titlecase]{subtitle}}%
+ \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%
+ }%
+ \iffieldundef{booktitle}{\newunit}{}%当title是析出时,不要标点
+ %\newunit
+ }%将\printtext[title]的结束编组放到这里来。
+}%
+}
+\end{texlist}
+
+还需要注意的是如果gbtypeflag域格式中不直接输出[],而用mkbibbrackets也能解决这些个问题,但是会因为ctex对于中英文间空格的的默认处理加入空格,所以只能采用上面的方式。
+
+还有beamer类中很多不同域之间的空格似乎比其它类中更宽,不知道原因,难道是beamer重新定义了\textbackslash space命令?
+
+\item 在参考文献表中加入逐字文本(原样文本,如实文本),也就是直接插入文本信息,或者用printtext插入都会导致一些问题,上面的第1点就是典型问题之一,还比如出版项缺省等问题。在有利用printtext 插入原样文本的时候,要特别注意在driver中该命令前后几行的代码后加注释,否则容易带入空格,注释后就可以消除。
+
+\item 同样的periodical条目类型的title输出也修改了printtext[title]的结束编组位置。journaltitle域格式也加了isdot。patent 的title 也修改了printtext[title]的结束编组位置。
+
+\item 修改了location+institution+date的s.n.的处理方式与publisher+location+date的方式类似。中英文判断也往外放到一层,与publisher+location+date一致,这样就不会出现不判断的问题。
+
+\item 3.3版以后的family-given格式的given name用全大写代替首字母大写。
+\end{enumerate}
+
+
+%============================
+\updateinfo[2016-11-14]{update}\label{up:20161114}
+\begin{enumerate}
+\item 很早之前思考的利用biber的动态修改数据功能来进行佚名问题处理是合理的,因为biblatex不能在tex处理过程中添加域的信息,所以任何要进入域的信息都需要在运行biber命令之时或者之前处理。利用正则表达式可以完成一定的区分,尽管可能有一些特殊情况无法涵盖,但如下的处理可以基本正确的实现功能。
+如果不需要用佚名的方式,那么只要把这段处理注释掉就可以了。
+
+\begin{texlist}
+\map{%因为要做佚名处理,所以这里先对有些只有编者而没有作者的情况进行处理
+ step[fieldsource=editor]
+ \step[fieldset=author,origfieldval]
+ }
+\map{%默认情况下将空缺作者设置为佚名
+ \step[fieldset=author, fieldvalue={佚名}]
+ }
+\map[overwrite]{%当标题带有英文字符,且作者为佚名的情况,设置作者为noauthor,
+ %也有一些特殊情况可能处理不到,比如标题中英混合,作者又却是
+ \step[fieldsource=title,match=\regexp{[a-zA-Z]},final]
+ \step[fieldsource=author,match=\regexp{佚名}, replace={NOAUTHOR}]
+ }
+\end{texlist}
+
+\item 关于文种分集排序的问题,之前要求用户自己往userb域填信息,现在通过如下处理,可以避免,也是用的正则表达式判断,但有些特殊情况可能会有问题,出现问题的话,手动在bib源文件中添加userb域信息是可以解决的。到这里为止,在使用本样式文件时,除了必须要输入的引文的信息外,其它信息都不需要再输入了,包括原来就已经处理的usera域(用于添加文献类型标识符的),这里的userb域用于文种分集排序的,都不必输入了。
+
+\begin{texlist}
+\map{%将entrykey放入keywords中用于后期的使用
+ \step[fieldsource=entrykey]
+ \step[fieldset=keywords, origfieldval]
+ \step[fieldsource=note,final]%将note域信息复制给keywords,用于输出时容易区分标准和报纸
+ \step[fieldset=keywords, fieldvalue={,},append]
+ \step[fieldset=keywords, origfieldval,append]
+ }
+\map{%因为无法进行cjk字符判断,所以用反的思路,判断没有英文字符,没有空格,没有逗号等字符情况下
+ %认为是中文的,将文献userb设置成cn,用于排序
+ \step[fieldsource=author,match=\regexp{[^a-zA-Z\s\.\,\'\{\}]},final]
+ \step[fieldset=userb,fieldvalue={cn}]
+ }
+\map{%将没有设置的userb设置成en,即认为不是中文的就是英文的。
+ \step[fieldset=userb,fieldvalue={en}]
+ }
+\end{texlist}
+
+\item 增加了一个yearpagescite命令用于处理: 作者年制文中已有作者只需要年份和页码的情况,而顺序制的情况下该命令与pagescite命令作用相同。其使用方式如下:
+
+\begin{texlist}
+%使用方式:
+见赵耀东\yearpagescite[][205]{赵耀东1998--}和Simon\yearpagescite[][15]{Simon2001--}的文献。
+
+%增加的命令:
+%*2015ay.cbx中:
+%增加一个命令yearpagescite用于当文中作者已经存在,需要页码和年份的情况。
+%参考来源,biblatex.DEF,其中\DeclareCiteCommand*{\citeyear}命令
+\DeclareCiteCommand{\yearpagescite}
+ {\printtext{(}\usebibmacro{prenote}}
+ {\printfield{year}\printfield{extrayear}}
+ {\multicitedelim}
+ {\printtext{)}\textsuperscript{\usebibmacro{postpages}}}
+%*2015.cbx中:
+%增加一个命令yearpagescite为与ay样式兼容,命令等同于\pagescite
+\DeclareCiteCommand{\yearpagescite}[\mkbibsuperscript]%\mkbibbrackets,仍然用上标
+ {[\usebibmacro{cite:init}%
+ \usebibmacro{prenote}%
+ }
+ {\usebibmacro{citeindex}%
+ \usebibmacro{cite:comp}}
+ {}
+ {\usebibmacro{cite:dump}]%
+ \usebibmacro{postpages}}
+\end{texlist}
+
+\item 在出版者缺省的情况下,当出版者后面没有更多信息的情况下,缺省字符串后面应该有一个点,因此做出修正为:
+\begin{texlist}
+%出版社和地址的处理,当没有出版社地址时
+%直接判断title的信息是否是中文,若为中文,则写出版地不详,否则用英文的字符表示。
+%事实上title对于每个文献来说是必须的,所以用它判断是最快的,而且一般标题和出版社的语言是一样的。
+\newbibmacro*{publisher+location+date}{%
+\iffieldundef{title}{}{\testCJKfirst{\thefield{title}}}%
+\testifnoteeqstd%
+\iflistundef{location}{%\adddot
+\iftoggle{ifnoteeqstandard}{}{%
+\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}{}{%
+\iftoggle{ifCJKforgbt}{\printtext{[出版者不详]}\setunit{\adddot\addspace}\setunit*{\addcolon\addspace}}
+%\mkbibbrackets
+%{\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%
+%\usebibmacro{date}%
+%\newunit %去掉这个标点
+}
+\end{texlist}
+
+
+\item 反向链接,backref的格式并没有要求,但考虑到中文环境还是将其格式改一下,因此修改英文本地化字符串为“引用页”。
+\begin{texlist}
+\DefineBibliographyStrings{english}{
+bibliography = {参考文献},
+references = {参考文献},
+%bytranslator= {\addcomma\ 译\adddot}, %将trans. by 改成 译
+bytranslator= {\addcomma\ 译},%\addperiod
+and = {\addcomma},%将第2和3人名见的and符号改成 逗号,用\finalnamedelim命令也可以定义,参见3.9.1节
+%andothers = {et al.}, %将超过3个人名的省略,et al.改成为 等
+andotherscn = {等}, %将超过3个人名的省略,et al.改成为 等
+noaddress = {[S.l.]},
+nopublisher = {[s.n.]},
+backrefpage = {引用页:},
+backrefpages = {引用页:},
+}
+\end{texlist}
+
+\item 在处理姓名相关的问题时,利用DeclareNameFormat的方式控制需要的姓和名的前后顺序,当maxbibnames和maxcitenames不一致时,可能用到last-first/first-last(biblatex3.2以前的版本)/family-given/given-family(3.3以后版本),其中第一个姓名和后面姓名的姓和名的前后顺序时不同的。可以直接利用其中的name:first-last和name:last-first或name:family-given和name:given-family宏做修改控制具体姓名成分的格式,而避免重定义DeclareNameFormat格式,详见\ref{sec:name:fmt:out} 节。
+
+\item 作者年制区分文献表和引用中的作者名数量,引用相关的选项设置需要放到cbx 文件中,否则可能失效。同时因为一些特殊情况下,姓名数量截短为1个的引用标签,可能无法区分文献,所以默认情况下,biblatex会增加作者数量用于区分,这是因为uniquelist会自动重设maxcitenames和mincitenames,因此修改uniquelist选项为minyear,明确在年份也一样的情况下再利用增加姓名进行区分。*ay.bbx文件中的选项设置为:
+\begin{texlist}
+\ExecuteBibliographyOptions{
+ useprefix = true, %名字的信息包括前缀
+ %firstinits = true, %名字有缩写,参考3.1.2.3 Internal
+ giveninits = true,
+ date = year, %日期仅写到年
+ %maxnames = 3 , %设置名字最大数量
+ %minnames = 3, %设置缩减后的名字最小数量
+ maxbibnames=3, %将文献列表和引用中最大名字数量区分开
+ minbibnames=3,
+}
+%biblatex3.3版前(比如texlive2015中的3.0版)的使用方式
+\ExecuteBibliographyOptions{
+ useprefix = true, %名字的信息包括前缀
+ firstinits = true, %名字有缩写,参考3.1.2.3 Internal
+ date = year, %日期仅写到年
+ %maxnames = 3 , %设置名字最大数量
+ %minnames = 3, %设置缩减后的名字最小数量
+ maxbibnames=3, %将文献列表和引用中最大名字数量区分开
+ minbibnames=3,
+}
+\end{texlist}
+
+*ay.cbx文件中的选项设置为:
+\begin{texlist}
+\ExecuteBibliographyOptions{
+ %autocite = superscript ,
+ %autopunct = true ,
+ %sorting = none ,
+ maxcitenames=1,
+ mincitenames=1,
+ uniquename=init,%因为使用了名字缩写选项,所以需要设置uniquename=init 而不是full 避免冲突
+ labeldate=true,
+ uniquelist=minyear,
+}
+\end{texlist}
+\end{enumerate}
+
+%============================
+\updateinfo[2016-11-11]{update}
+\begin{enumerate}
+\item 说明文档增加了版本和修改时间信息,修正了一些错误和不妥的说法,增加了一些说明比如报纸版次,报告条目域格式等,去掉一些不必要的注释,简化各样式文件内容。
+
+\item 由Harry Chen提议,将english本地化文件中的参考文献标题信息改为中文的,因为本样式多在中文环境下使用,修改为中文后,printbibliography命令中不提供title信息的情况下,参考文献列表标题默认为参考文献。感谢Harry Chen在github上的commit!
+修改如下:
+\begin{texlist}
+\DefineBibliographyStrings{english}{
+bibliography = {参考文献},
+references = {参考文献},
+%bytranslator= {\addcomma\ 译\adddot}, %将trans. by 改成 译
+bytranslator= {\addcomma\ 译},%\addperiod
+and = {\addcomma},%将第2和3人名见的and符号改成 逗号,用\finalnamedelim命令也可以定义,参见3.9.1节
+%andothers = {et al.}, %将超过3个人名的省略,et al.改成为 等
+andotherscn = {等}, %将超过3个人名的省略,et al.改成为 等
+noaddress = {[S.l.]},
+nopublisher = {[s.n.]}
+}
+\end{texlist}
+
+
+\item 当作者名只有一个,但又有and others表示多个作者的时候,标准样式中作者名和et al.之间是空格而不是逗号链接,但gb7714-2015要求在等之前用逗号,所以做出修改如下。
+
+\begin{texlist}
+%判断作者或译者是否中文,若中文用字符等,否则用etcl。
+\newbibmacro*{name:andothers}{%
+ \ifboolexpr{%
+ test {\ifnumequal{\value{listcount}}{\value{liststop}}}
+ and
+ test \ifmorenames
+ }%
+ {%这里做一个判断是在处理author还是translator用于两者是不同语言的情况
+ \ifcurrentname{translator}{\testCJKfirst{\thefield{usere}}}{\testCJKfirst{\thefield{userf}}}%
+ %这句判断如果放到\andothersdelim后面会在等或etc.前增加一个空格,所以放前面
+ \ifnumgreater{\value{liststop}}{1}%
+ {\finalandcomma}%
+ {\finalandcomma}%biblatex作者要区别单作者加等的情况,这里为符合gbt7714-2015第7.2节的要求加上了逗号。
+\andothersdelim\iftoggle{ifCJKforgbt}{\bibstring{andotherscn}}{\bibstring{andothers}}%
+%\andothersdelim\bibstring{andotherscn}
+}%
+{}}
+\end{texlist}
+
+\item 给report和manual驱动添加了译者域,这在实际中是用的到的,同时打印version域的格式也做了处理,并且修改中文判断函数,增加了注释符以避免带入空格,这个问题在之前体现为版本域前多了一个空格。
+\begin{texlist}
+%对version的版本信息做出修改,源来自biblatex.DEF
+\DeclareFieldFormat{version}{%
+\testCJKfirst{\thefield{title}}%
+\ifinteger{#1}%
+{\iftoggle{ifCJKforgbt}{\printtext{#1版}}%
+{\mkbibordedition{#1}~\bibstring{version}}}%
+{#1\isdot}}
+\end{texlist}
+
+\item 把作者年制的参考文献列表和引用中的作者名数量做区分。列表中最大为3 个,引用中最大为1个。
+(这里还有点问题,进一步修改见2016-11-14的更新。)
+\begin{texlist}
+%%biblatex3.3版后(比如texlive2016中的3.4版)的使用方式
+%\ExecuteBibliographyOptions{
+% useprefix = true, %名字的信息包括前缀
+% %firstinits = true, %名字有缩写,参考3.1.2.3 Internal
+% giveninits = true,
+% date = year, %日期仅写到年
+% %maxnames = 3 , %设置名字最大数量
+% %minnames = 3, %设置缩减后的名字最小数量
+% maxbibnames=3, %将文献列表和引用中最大名字数量区分开
+% minbibnames=3,
+% maxcitenames=1,
+% mincitenames=1
+% %uniquename = init
+%}
+%
+%%biblatex3.3版前(比如texlive2015中的3.0版)的使用方式
+%\ExecuteBibliographyOptions{
+% useprefix = true, %名字的信息包括前缀
+% firstinits = true, %名字有缩写,参考3.1.2.3 Internal
+% date = year, %日期仅写到年
+% %maxnames = 3 , %设置名字最大数量
+% %minnames = 3, %设置缩减后的名字最小数量
+% maxbibnames=3, %将文献列表和引用中最大名字数量区分开
+% minbibnames=3,
+% maxcitenames=1,
+% mincitenames=1
+% %uniquename = init
+%}
+\end{texlist}
+\end{enumerate}
+
+%============================
+\updateinfo[2016-10-22]{update}
+\begin{enumerate}
+\item 修改版本判断机制,版本3.3以后的版本设置判断标签iftexlivesix为真,采用新的姓名处理机制。
+修改如下:
+\begin{texlist}
+\providetoggle{iftexlivesix}
+%\def\versionstr{3.4}
+%\def\versionstra{3.6}
+%\ifx\abx@version\versionstr
+%\toggletrue{iftexlivesix}
+%\else
+%\ifx\abx@version\versionstra
+%\toggletrue{iftexlivesix}
+%\else
+%\togglefalse{iftexlivesix}
+%\fi
+%\fi
+%改变版本判断机制,根据biblatex更新历史可知,版本3.3开始使用新的姓名处理机制
+%所以当版本大于3.2开始,就用设置\toggletrue{iftexlivesix}
+\def\numparserta#1.#2\relax{#1}%注意relax的重要性
+\def\numparsertb#1.#2\relax{#2}
+\def\numinteger{\expandafter\numparserta\abx@version\relax}
+\def\numdigital{\expandafter\numparsertb\abx@version\relax}
+\ifnumcomp{\numdigital}{>}{2}{\toggletrue{iftexlivesix}}{\togglefalse{iftexlivesix}}
+\end{texlist}
+\end{enumerate}
+
+%============================
+\updateinfo[2016-10-11]{update}
+\begin{enumerate}
+\item 真的是需求推动事物发展,秋平同学提出需要把顺序编码制的参考文献序号标签设为左对齐。
+于是可以做如下修改。需要用的可以把下面这段加进gb7714-2015.bbx中,不需要的就不用任何处理,
+左对齐还是右对齐其实还是看个人喜好,我其实觉得右对齐挺好的。
+\begin{texlist}
+ %修改序号标签格式为左对齐,注意各参考文献内容还是对齐的,
+ %这样就会使得序号标签与参考文献内容的间隔增大,这个问题是没有办法解决的
+ %因为采用list做具有一定宽度的序号标签,\labelwidth只能设置一个,且是最宽的标签的宽度
+ %但总的来说参考文献内容对齐是合理和漂亮的,
+ %而标签则只能对齐一个方向,要么左对齐要么右对齐,看个人选择了。
+ %\DeclareFieldFormat{shorthandwidth}{\mkbibbrackets{#1}} %源来自numeric.BBX
+ \DeclareFieldFormat{labelnumberwidth}{\mkbibbrackets{#1}\hfill}
+\end{texlist}
+
+\item 测试了老电脑装的texlive2014,没有问题通过。
+\end{enumerate}
+
+%============================
+\updateinfo[2016-10-04]{update}
+\begin{enumerate}
+\item 今天广州的秋平同学使用更新后的biblatex3.6版出错。是因为bbx文件中的版本判断只有3.4和其它,所以应急加了一段对于3.6 的判断。这个问题以后可能还会出现因为biblatex会不断的更新,所以需要设计一个更合理的判断,这个等实现以后再更新。
+
+\item 在说明文档中增加了一些说明,修改了一些错别字。
+\end{enumerate}
+
+%============================
+\updateinfo[2016-07-20]{update}
+\begin{enumerate}
+\item 去掉texlive2016和texlive2015选项,直接根据biblatex宏包的版本进行判断。
+
+\item 增加了unpublished条目类型驱动,并按报告report进行处理,但文献标识码用Z表示。
+\end{enumerate}
+
+%============================
+\updateinfo[2016-07-01]{update}
+\begin{enumerate}
+\item 增加了pagescite命令,实现GB/T7714-2015对于引用标注中输出页码的特殊格式要求。
+
+\item 测试了texlive2015,texlive2016,发现其中关于名字域格式的差异,并作出修改。增加了两个宏包选项,一个是texlive2016,另一个是texlive2015。使用texlive2016版本时,带选项texlive2016即可,其它情况带选项texlive2015
+\end{enumerate}
+
+%============================
+\updateinfo[2016-06-20]{update}
+\begin{enumerate}
+\item 利用判断CJK字符的函数,判断条目中著者,译者域是否是CJK字符,做相应的处理。
+
+\item 利用范围解析函数,可对卷期等进行解析,并按GB/T7714-2015要求输出。
+\end{enumerate}
+
+%============================
+\updateinfo[2016-05-20]{update}
+基本完成样式文件,实现的功能包括:
+\begin{enumerate}
+\item 实现GB/T7714-2015要求的参考文献著录格式。
+
+\item 利用map功能使录入参考文献数据时不需要文献类别标识符。
+
+\item 多语言文献的处理方法和条目格式。
+\end{enumerate}