使用 BibLaTeX 的参考书目:不要缩写第一个名字,并缩写所有其他名字

使用 BibLaTeX 的参考书目:不要缩写第一个名字,并缩写所有其他名字

我的参考书目中作者或编辑的第一个名字应该写出来,但所有其他名字都应该缩写(首字母加句号 - 如果有多个名字/首字母,则加空格,见下文)。我正在使用style=authoryearBibLaTeX(v. 2.7)和 Biber(v. 1.7)。

我的书目如下:

Doe,John Arthur Kyle(2013)。《John Doe 的秘密生活》。

它看起来应该是这样的:

Doe, John AK (2013)。 John Doe 的秘密生活。

最小示例:

例子.tex

\documentclass{scrartcl}

\usepackage[ngerman]{babel}
\usepackage[babel,german=quotes]{csquotes}
\usepackage[backend=biber,style=authoryear]{biblatex}
\bibliography{bibliography}

\begin{document}

\cite[123]{Doe}
\printbibliography

\end{document}

参考书目

@book{Doe,
    title = {The secret life of John Doe},
    author = {Doe, John Arthur Kyle},
    year = {2013}
}

(与上述版本的 BibLaTeX 和 Biber、Texmaker(v. 4.0.3)和 MiKTeX(v. 2.9.4813)一起使用。)

我无法找到解决方案biblatex 文件firstinits=true缩写所有名字,包括第一个名字。

答案1

由于biblatex没有区分多个名字,我们需要自己拆分此列表:

\makeatletter
\def\@empty{}
\def\first#1{\expandafter\@first#1 \@nil}
\def\@first#1 #2\@nil{#1\addspace%
  \if\relax\detokenize{#2}\relax\else\@initials#2\@nil\fi}
\def\initials#1{\expandafter\@initials#1 \@nil}
\def\@initials#1 #2\@nil{%
  \initial{#1}%
  \def\NextName{#2}%
  \ifx\@empty\NextName\relax%
  \else\@initials#2\@nil\fi}
\def\initial#1{\expandafter\@initial#1\@nil}
\def\@initial#1#2\@nil{#1.\addspace}
\makeatother

现在呼叫\first{John Arthur Kyle}会产生“John AK”。

所用的技巧是,宏\first将其参数传递给 ,\@first然后 用空格分隔其参数,即#1是“John” 和#2是“Arthur Kyle”。这被发送给\@initials,遍历名称列表(如果多于或少于两个)并调用\initial每个名称。\initial反过来调用\@initial,丢弃除第一个字母以外的所有字母并添加一个点和一个空格。

现在我们可以在以下地方使用它\DeclareNameFormat

\def\bibnamedelima{ }%
\def\bibnamedelimb{ }%
\DeclareNameFormat{author}{%
  \ifblank{#5}{}{#5\addspace}% prefix if applicable
  #1% last name
  \edef\firstname{#3}%
  \ifblank{#3}{}{\addcomma\addspace\expandafter\first{\firstname}}%
  \ifthenelse{\value{listcount}<\value{liststop}}%
   {\addslash}{}%
}

请注意,文件author = {Doe, John Arthur Kyle}中的实际上由 组成,所以我们需要消除这些 才能使宏正常工作。bib#3John\bibnamedelimb Arthur\bibnamedelima Kyle\first

编辑:“适当的”NameFormat应该包括多个名称的分隔符,因此我们检查我们是否位于名称列表的中间,如果是,则打印斜线。

此外,该authoryear样式用于labelname在引用中显示作者姓名,因此应更改格式以使引用的格式与参考书目条目的格式保持一致:

\DeclareNameFormat{labelname}{%
  \ifblank{#5}{}{#5\addspace}% prefix if applicable
  #1% last name
  \edef\firstname{#3}%
  \ifblank{#3}{}{\addcomma\addspace\expandafter\first{\firstname}}%
  \ifthenelse{\value{listcount}<\value{liststop}}%
   {\addslash}{}%
}

总结一下:此代码

\documentclass{scrartcl}

\usepackage[backend=biber,style=authoryear]{biblatex}
\bibliography{bibliography}

\usepackage[T1]{fontenc}

\def\bibnamedelima{ }%
\def\bibnamedelimb{ }%
\DeclareNameFormat{author}{%
  \ifblank{#5}{}{#5\addspace}% prefix if applicable
  #1% last name
  \edef\firstname{#3}%
  \ifblank{#3}{}{\addcomma\addspace\expandafter\first{\firstname}}%
  \ifthenelse{\value{listcount}<\value{liststop}}%
   {\addslash}{}%
}

\DeclareNameFormat{labelname}{%
  \ifblank{#5}{}{#5\addspace}% prefix if applicable
  #1% last name
  \edef\firstname{#3}%
  \ifblank{#3}{}{\addcomma\addspace\expandafter\first{\firstname}}%
  \ifthenelse{\value{listcount}<\value{liststop}}%
   {\addslash}{}%
}

\makeatletter
\def\@empty{}
\def\first#1{\expandafter\@first#1 \@nil}
\def\@first#1 #2\@nil{#1\addspace%
  \if\relax\detokenize{#2}\relax\else\@initials#2\@nil\fi}
\def\initials#1{\expandafter\@initials#1 \@nil}
\def\@initials#1 #2\@nil{%
  \initial{#1}%
  \def\NextName{#2}%
  \ifx\@empty\NextName\relax%
  \else\@initials#2\@nil\fi}
\def\initial#1{\expandafter\@initial#1\@nil}
\def\@initial#1#2\@nil{#1.\addspace}
\makeatother

\begin{document}

\cite[123]{Doe}\par
\cite[124]{Doe2}\par
\cite[125]{vD}
\printbibliography

\end{document}

与此bib文件一起:

@book{Doe,
    title = {The secret life of John Doe},
    author = {Doe, John Arthur Kyle and Jane Emma Dane and Someone Else},
    year = {2013}
}

@book{Doe2,
    title = {The secret life of John Doe 2},
    author = {Doe, John},
    year = {2013}
}

@book{vD,
    title = {The secret life of John von Doe},
    author = {John Arthur Kyle von Doe},
    year = {2013}
}

产生以下输出:

裁剪的 pdf 输出

编辑:有关拆分字符串的更多详细信息,请参见以下答案这个问题;有关使用“奇怪”参数分隔符的宏的信息,请参见此主题

答案2

假设这种情况是已知的缩写,我会使用如下数据源映射来执行此操作(在您的序言中):

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=author,
            match={John Arthur Kyle},
            replace={John A. K.}]
    }
  }
}

这不会改变您的数据源,它会在读取数据时进行映射。最好让 Perl(biber 就是用 Perl 编写的)处理正则表达式和字符串操作 - TeX 在这方面很糟糕。

相关内容