biblatex 是否以 IEEE(bib)样式输出与 bibtex 相同的序数版本?

biblatex 是否以 IEEE(bib)样式输出与 bibtex 相同的序数版本?

考虑一下这个MWE:

\documentclass{article}
\usepackage{filecontents} % tlmgr install filecontents
\begin{filecontents*}{btest.bib}
@BOOK{Mittelbach2005,
  author = {Frank Mittelbach},
  edition = {2. ed.},
  publisher = {Addison-Wesley},
  title = {The LATEX companion},
  year = 2005
}
\end{filecontents*}

\ifx\ubl\undefined %
  \def\tubl{bibtex}
\else %
  \usepackage[%
    style=ieee,
    isbn=true,
    doi=false,
    url=true,
    backend=biber
  ]{biblatex}
  \bibliography{btest}
  \def\tubl{bibLAtex}
\fi

\begin{document}

Citing... HERE: \cite{Mittelbach2005} (\tubl)

\ifx\ubl\undefined %
  \bibliographystyle{IEEEtranS} %
  \bibliography{btest} %
\else %
  \printbibliography[resetnumbers] %
\fi

\end{document}

您可以使用以下bash一行程序快速编译它:

for ib in {b,bl}; do \
  if [ "$ib" = "b" ]; then \
    TCMD='-jobname=testA "\input{test.tex}"'; \
    pdflatex $TCMD; bibtex testA; pdflatex $TCMD; pdflatex $TCMD; \
  else \
    TCMD='-jobname=testB "\def\ubl{1}\input{test.tex}"'; \
    pdflatex $TCMD; biber testB; pdflatex $TCMD; \
  fi; \
done

TestB.pdf 使用biblatex+biber如下所示:

测试B.png

... 使用的 TestA.pdfbibtex如下所示:

测试A.png

请注意,一个bibtex显示“第 2 版”,而biblatex+biber一个显示“第 2. 版”。Biblatex 定制 - LaTeX 中的论文 [khirevich.com],有人可能会认为这可以用作biblatex序数后缀:

\DeclareFieldFormat{edition}%
                   {\ifinteger{#1}%
                    {\mkbibordedition{#1}\addthinspace{}ed.}%
                    {#1\isdot}}

...然而,那是仅有的对于纯数值字段 - 请注意,这里的字段是:

  edition = {2. ed.},

...也就是说 - 它是字母数字;并且bibtex似乎被解析成它,并用“2nd”替换“2。”并附加其余部分!

那么,如何才能biblatex说服自己从同一领域产生与bibtex“第二版”相同的输出呢?

(顺便说一下,附带一个问题:您还可以注意到间距不同;我怎样才能获得与 相同的间距biblatexbibtex

答案1

在我们开始之前,我想引用一下biblatex文献中关于该edition领域的描述

edition字段(整数或文字)印刷出版物的版本。这必须是整数,而不是序数。不要说 edition={First}edition={1st}但是edition={1}。书目样式会将其转换为语言相关的序数。也可以将版本作为文字字符串给出,例如“第三版,修订版和扩充版”。

因此,您能做的最好的事情就是确保您的.bib文件遵循此做法,并且写入edition = {2}而不是edition = {2. ed.}

但是,我们可以让 Biber 完成部分工作。在本例中,我们使用形式为 的 RegEx ^(\d+)\.\s+(ed.|edition)$,它将匹配数字后跟一个句号、一个空格和单词“ed.”或“edition”。更自由的 RegEX 可能是 ^(\d+).*匹配所有数字,无论它们后面跟的是什么。无论如何,我们将第一组复制到字段中edition

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=edition,
            match=\regexp{^(\d+)\.\s+(ed.|edition)$},
            replace=\regexp{$1}]
    }
  }
}

平均能量损失

\documentclass{article}
\usepackage{filecontents} % tlmgr install filecontents
\begin{filecontents*}{\jobname.bib}
@BOOK{Mittelbach2005,
  author = {Frank Mittelbach},
  edition = {2. ed.},
  publisher = {Addison-Wesley},
  title = {The LATEX companion},
  year = 2005
}
\end{filecontents*}
  \usepackage[%
    style=ieee,
    isbn=true,
    doi=false,
    url=true,
    backend=biber
  ]{biblatex}
  \addbibresource{\jobname.bib}

\DeclareFieldFormat{edition}{%
  \ifinteger{#1}
    {\mkbibordedition{#1}\addnbthinspace\bibstring{edition}}
    {#1\isdot}}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=edition,
            match=\regexp{^(\d+)\.\s+(ed.|edition)$},
            replace=\regexp{$1}]
    }
  }
}

\begin{document}
Citing... HERE: \cite{Mittelbach2005}

\printbibliography[resetnumbers] %
\end{document}

在此处输入图片描述

相关内容