我的参考书目中作者或编辑的第一个名字应该写出来,但所有其他名字都应该缩写(首字母加句号 - 如果有多个名字/首字母,则加空格,见下文)。我正在使用style=authoryear
BibLaTeX(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
#3
John\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}
}
产生以下输出:
答案2
假设这种情况是已知的缩写,我会使用如下数据源映射来执行此操作(在您的序言中):
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=author,
match={John Arthur Kyle},
replace={John A. K.}]
}
}
}
这不会改变您的数据源,它会在读取数据时进行映射。最好让 Perl(biber 就是用 Perl 编写的)处理正则表达式和字符串操作 - TeX 在这方面很糟糕。