使用 Biblatex 格式化 .bib 文件

使用 Biblatex 格式化 .bib 文件

我尝试手动将格式代码放入 .bib 文件的字段中,但最终编译步骤因行Missing \endcsname inserted上出现错误而崩溃\printbibliography。具体来说,我需要将特定名称加粗,这些名称可能位于作者列表中的任意位置。问题似乎在于\textbf{Name}破坏了最终编译。

我也尝试过{\bfseries Name},但之后所有名称都会变成粗体。

(背景,我需要对我的简历中的出版物列表进行处理,以将其置于特定的所需格式中。我宁愿使用biblatex而不是手动格式化所有内容。)

以下是我的 MNWE。我正在使用pdflatex; biber; pdflatexMikTex-64 位发行版进行编译。

\documentclass{article}

\usepackage{filecontents}
\usepackage[backend=biber]{biblatex}
% biblatex version 3.3
% biber version 2.4

\begin{filecontents}{\jobname.bib}
@misc{Article1,
author = {Last1\textsuperscript{*}, First1 and \textbf{Last2}, \textbf{First2} and Last3, First3},
year = {2016},
title = {The Title},
}
\end{filecontents}

\addbibresource{\jobname.bib}
\nocite{*}


\begin{document}

Star\textsuperscript{*} indicates student author.  \textbf{Bold} indicates corresponding author.
\subsection*{Desired output}
[1]  First1 Last1\textsuperscript{*}, \textbf{First2} \textbf{Last2},  and First3 Last3. \emph{The Title}. 2016.

\printbibliography

\end{document}

答案1

现在,biblatex 3.4/biber 2.5 中有一种更通用的方法,即通过数据注释来处理这个问题,因为这不是一种不常见的请求,我们需要一种方法来允许将语义信息临时附加到数据片段中,而不需要处理内部问题。注释biblatexml很简单,通过 XML 属性完成:

<bltx:entries xmlns:bltx="http://biblatex-biber.sourceforge.net/biblatexml">
  <bltx:entry id="Article1" entrytype="misc">
    <bltx:names type="author">
      <bltx:name>
        <bltx:namepart type="given" initial="F">First1</bltx:namepart>
        <bltx:namepart type="family" initial="L" annotation="student">Last1</bltx:namepart>
      </bltx:name>
      <bltx:name annotation="corresponding">
        <bltx:namepart type="given" initial="F">First2</bltx:namepart>
        <bltx:namepart type="family" initial="L">Last2</bltx:namepart>
      </bltx:name>
      <bltx:name>
        <bltx:namepart type="given" initial="F">First3</bltx:namepart>
        <bltx:namepart type="family" initial="L">Last3</bltx:namepart>
      </bltx:name>
    </bltx:names>
  </bltx:entry>
</bltx:entries>

有了bibtex数据源,就有点丑了,但相对简单:

@MISC{Article1,
  AUTHOR    = {Last1, First1 and Last2, First2 and Last3, First3},
  AUTHOR+an = {1:family=student;2=corresponding},
}

然后您可以通过三个新的宏在格式指令中使用这些注释:

\renewbibmacro*{name:given-family}[4]{%
  \usebibmacro{name:delim}{#2#3#1}%
  \usebibmacro{name:hook}{#2#3#1}%
  \ifdefvoid{#2}{}{\mkbibnamegiven{#2}\isdot\bibnamedelimd}%
  \ifdefvoid{#3}{}{%
    \mkbibnameprefix{#3}\isdot
    \ifprefchar
      {}
      {\ifuseprefix{\bibnamedelimc}{\bibnamedelimd}}}%
  \mkbibnamefamily{#1}%
  \ifpartannotation{family}{student}
    {\textsuperscript{*}}
    {}%
    \isdot
  \ifdefvoid{#4}{}{\bibnamedelimd\mkbibnamesuffix{#4}\isdot}}

\renewcommand*{\mkbibnamegiven}[1]{%
  \ifitemannotation{corresponding}
    {\textbf{#1}}
    {#1}}

\renewcommand*{\mkbibnamefamily}[1]{%
  \ifitemannotation{corresponding}
    {\textbf{#1}}
    {#1}}

这样,您无需在数据中添加标记,而是通过语义注释即可获得所需的输出。DEV 3.4 PDF 手册中有详细信息。它biber也需要最新的 2.5 版本。

答案2

可以将命令注入名称处理中,这些命令仅用于某些键 + 作者计数。对于 \textsuperscript 来说,这不是必需的,但我还是插入了另一个命令作为概念证明。可能可以将信息存储在 bib 文件中,并且肯定可以改进界面:

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@misc{Article1,
author = {Last1\textsuperscript{*}, First1 and Last2, First2 and Last3, First3},
year = {2016},
title = {The Title},
}
\end{filecontents}

\usepackage[backend=biber]{biblatex}
% biblatex version 3.3
% biber version 2.4

\DeclareNameFormat{given-family}{%
  \nameparts{#1}%
  \ifgiveninits
    {\usebibmacro{name:given-family}
      {\namepartfamily}
      {\namepartgiveni}
      {\namepartprefix}
      {\namepartsuffix}}
    {{\csname key-\thefield{entrykey}-\the\value{listcount}-font\endcsname
      \usebibmacro{name:given-family}
      {\namepartfamily}
      {\namepartgiven}
      {\namepartprefix}
      {\namepartsuffix}%
      \csname key-\thefield{entrykey}-\the\value{listcount}-suffix\endcsname
      }}%
  \usebibmacro{name:andothers}}
\addbibresource{\jobname.bib}


\makeatletter
\@namedef{key-Article1-2-font}{\bfseries}
\@namedef{key-Article1-1-suffix}{\textsuperscript{*}}
\makeatletter

\begin{document}
\cite{Article1}
Star\textsuperscript{*} indicates student author.  \textbf{Bold} indicates corresponding author.
\subsection*{Desired output}
[1]  First1 Last1\textsuperscript{*}, \textbf{First2} \textbf{Last2},  and First3 Last3. \emph{The Title}. 2016.

\printbibliography

\end{document}

在此处输入图片描述

相关内容