我尝试手动将格式代码放入 .bib 文件的字段中,但最终编译步骤因行Missing \endcsname inserted
上出现错误而崩溃\printbibliography
。具体来说,我需要将特定名称加粗,这些名称可能位于作者列表中的任意位置。问题似乎在于\textbf{Name}
破坏了最终编译。
我也尝试过{\bfseries Name}
,但之后所有名称都会变成粗体。
(背景,我需要对我的简历中的出版物列表进行处理,以将其置于特定的所需格式中。我宁愿使用biblatex
而不是手动格式化所有内容。)
以下是我的 MNWE。我正在使用pdflatex; biber; pdflatex
MikTex-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}