diff options
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.tex | 1055 |
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} |