我使用 LuaTeX、BibLaTeX 和 biber 以及 APA 书目格式。德语版本的字段有origyear
误。
原始的英文 APA 版本想要的是这样的:
作者(年)。标题。地点:发行商. (原作发表原始年份)
德文版也一样,只是把“Original work posted”换成了“Original erschienen”,这样就可以了。但是根据德国DGP的调整版本,其余部分应该是这样的:
作者(年)。标题。地点:发行商。 (原文 原始年份:原标题)
但是我们甚至不能使用该origtitle
字段,而只是移动它。因为当该字段已经用于自制的标题翻译时,该origtitle
字段是标题的字段。想象一下以下情况:title
史密斯,A.(1990 年)。爱情 [Die Liebe]。巴黎:阿方斯。 (原作发表于 1988 年:《爱》)。
因此,我们有一本原版英文书的法语译本,并且我们给出了德语译本,以便每个人都能理解。title
字段是我们的译本“Die Liebe”,origtitle
是译本“L'amour”的标题,所以我们需要另一个字段来记录原作“Love”的标题。这不能附加,origyear
因为我们origyear
在引用时需要单独添加,如下所示:Smith (1988/1990)。
我们需要一个origwork
附加到的字段,origyear
并且非常灵活,因为如果原始作品的作者略有不同(这到底是什么情况??),DGP 会将其变成:
Zimbardo, PG & Gerrig, RJ (2004)。 ...(原作于 2002 年由 Gerrig, RJ 和 Zimbardo, PG, 《心理学与生活》出版)
而DGP也有点不一致。可以发现:
(原版于 1988 年出版:《爱》)
和
(原作于 1988 年,《爱》)
无论如何,有人知道如何在 german-apa.lbx 中实现这一点吗?我甚至不知道从哪里开始...
编辑:
非常感谢 Guido,这几乎就是我需要的。
不过这有点混乱。这会把所有东西都弄乱。没有必要这样做。title
,subtitle
应该origtitle
保留原位。我们只需要一个额外的字段。我们不能使用titleaddon
它,因为它放在方括号中(我们也不能使用标题/副标题,因为它是斜体,但如果用作原创作品的标题,就不应该这样)。我们只需要另一个字段origwork
。
以下是我目前得到的信息:
\documentclass{scrbook}
\usepackage[american,english,ngerman]{babel}
\usepackage[style=apa,backend=biber,bibencoding=utf8,babel=other]{biblatex}
\usepackage[autopunct=true,autostyle=true,german=guillemets,english=american]{csquotes}
\bibliography{test.bib}
\DeclareLanguageMapping{american}{american-apa}
\DeclareLanguageMapping{ngerman}{ngerman-apa}
\begin{filecontents}{biblatex-dm.cfg}
\DeclareDatamodelFields[type=list, datatype=name,skipout=false]{origauthor}
\DeclareDatamodelEntryfields{origauthor}
\DeclareDatamodelFields[type=field, datatype=literal,skipout=false]{origwork}
\DeclareDatamodelEntryfields{origwork}
\end{filecontents}
\DeclareFieldFormat{origyear}{%
\mkbibparens{\bibcpstring{origyear}~\thefield{origyear}%
\ifnameundef{origauthor}
{}
{\addspace als \printnames[author]{origauthor}}%
\iffieldundef{origwork}
{}%
{\ifnameundef{origauthor}
{\setunit{\addcolon\addspace}}
{\setunit{\addcomma\addspace}}%
\printfield{origwork}}}%
}
\renewbibmacro*{origyear}{%
\ifthenelse{
\NOT\iffieldsequal{labelyear}{origdateyear}
\OR
\NOT\iffieldsequal{title}{origwork}
\OR
\NOT\ifnamesequal{author}{origauthor}
}
{\printfield{origyear}}
{}%
}
\begin{document}
\textcite{testentry}
\printbibliography
\end{document}
测试.bib:
@BOOK{testentry,
author = {Adam Smith},
title = {Die Liebe},
origtitle = {L'amour},
location = {Paris},
publisher = {Alfons},
date = {1994},
origdate = {1988},
origauthor = {Adam Smith-Degen},
origwork = {Love},
hyphenation = {ngerman},
}
编辑2:
我现在明白了,你把一切都颠倒过来了,这样它就符合语义目的了。而且 biblatex-apa 有点不一致,使用title
表示标题,但使用origtitle
表示标题,如果有自制的翻译,则填写为title
。无论如何,这是现在每个人都在使用的。我们可以使用未使用的字段添加缺失的部分。这是我的尝试reprinttitle
:
\documentclass{scrbook}
\usepackage[american,english,ngerman]{babel}
\usepackage[style=apa,backend=biber,bibencoding=utf8,babel=other]{biblatex}
\usepackage[autopunct=true,autostyle=true,german=guillemets,english=american]{csquotes}
\bibliography{test.bib}
\DeclareLanguageMapping{american}{american-apa}
\DeclareLanguageMapping{ngerman}{ngerman-apa}
\DeclareFieldFormat{origyear}{%
\mkbibparens{\bibcpstring{origyear}~\thefield{origyear}%
\ifnameundef{origauthor}
{}
{\addspace als \printnames[author]{origauthor}}%
\iffieldundef{reprinttitle}
{}%
{\ifnameundef{origauthor}
{\setunit{\addcolon\addspace}}
{\setunit{\addcomma\addspace}}%
\printfield{reprinttitle}}}%
}
\renewbibmacro*{origyear}{%
\ifthenelse{
\NOT\iffieldsequal{labelyear}{origdateyear}
\OR
\NOT\iffieldsequal{title}{reprinttitle}
\OR
\NOT\ifnamesequal{author}{origauthor}
}
{\printfield{origyear}}
{}%
}
\begin{document}
\textcite{testentry}
\printbibliography
\end{document}
测试.bib:
@BOOK{testentry,
author = {Adam Smith},
title = {Die Liebe},
subtitle = {in all ihren Formen},
origtitle = {L'amour},
location = {Paris},
publisher = {Alfons},
date = {1994},
origdate = {1988},
origauthor = {Adam Smith},
titleaddon = {Special issue},
reprinttitle = {Love},
hyphenation = {ngerman},
}
现在看起来像:
史密斯,A.(1994 年)。爱情[爱情:以你所有的形式] [特刊]。巴黎:阿方斯。 (原作于 1988 年,作者为 Smith, A., Love)。
要做的事情:“als” 也需要作为关键字,在德语书目中为“als”,在英语书目中为“as”。作者的名字是 Surname, F.,但应该是 F. Surname。如果您能详细说明这一点,我将非常高兴。
答案1
对于原问题,需要的修改是:
\renewbibmacro*{title}{%
\ifthenelse{\iffieldundef{title}\AND\iffieldundef{subtitle}}
{}
{\printtext[title]{%
\printfield[apacase]{title}%
\setunit{\subtitlepunct}%
\printfield[apacase]{subtitle}}%
\setunit{\addspace}%
\printfield{titleaddon}%
\iffieldequalstr{entrytype}{book}%
{\setunit{\addspace}\usebibmacro{bookaddinfo}}%
{}%
\ifthenelse{%
\ifnameundef{author}\AND%
\(\ifnameundef{editor}\AND\NOT\boolean{bbx:editorinauthpos}\)\AND%
\ifnameundef{producer}\AND%
\ifnameundef{director}\AND%
\ifnameundef{writer}}
{\newunit\newblock
\usebibmacro{labelyear+extrayear}}
{}}}
\DeclareFieldFormat{origyear}{%
\mkbibparenss{\bibcpstring{origyear}~\thefield{origyear}%
\iffieldundef{origtitle}
{}%
{\addcolon\addspace\printfield{origtitle}}}%
}
\newbibmacro*{origyear}{%
\ifthenelse{
\NOT\iffieldundef{labelyear}
\AND\NOT\iffieldsequal{labelyear}{origyear}
\OR
\NOT\iffieldsequal{title}{origtitle}}
{\printfield{origyear}}
{}%
}
\DefineBibliographyStrings{german}{%
origyear = {Original erschienen}
}
这可以插入到文档的序言中。
对于扩展版本,要么引入新的字段(可以通过修改数据模型或使用 BibLaTeX 工具来实现related
)。
编辑 1 和编辑 2 为了适应原始出版物作者不同的情况,第一步是修改数据模型,可以这样做:
\begin{filecontents}{biblatex-dm.cfg}
\DeclareDatamodelFields[type=list, datatype=name,skipout=false]{origauthor}
\DeclareDatamodelEntryfields{origauthor}
\end{filecontents}
这会biblatex-dm.cfg
在当前目录中生成一个名为的文件,其中包含有关如何扩展 BibLaTeX 数据模型的说明。
请注意,BibLaTeX 提供了一个titleaddon
字段,它可以用于标题的额外信息(OP 中的“Die Liebe”)。
最后,可以添加一个titletranslation
用于自制翻译的字段,即可以在数据模型文件中包含以下两行。
\DeclareDatamodelField[type=field, datatype=literal,skipout=false]{titletranslation}
\DeclareDatamodelEntryfields{titletranslation}
另一种可能性是使用“未使用”字段,例如reprinttitle
。接下来我将使用此选项。
下一步是修改适当的bibmacro
s。在本例中,title
以及origyear
标题的格式(以及有关原始出版物的相关信息)
\renewbibmacro*{title}{%
\ifthenelse{\iffieldundef{title}\AND\iffieldundef{subtitle}}
{}
{\printtext[title]{%
\printfield[apacase]{title}%
\setunit{\subtitlepunct}%
\printfield[apacase]{subtitle}}%
\setunit{\addspace}%
\printfield{titleaddon}%
\setunit{\addspace}%
\printfield{reprinttitle}%
\iffieldequalstr{entrytype}{book}%
{\setunit{\addspace}\usebibmacro{bookaddinfo}}%
{}%
\ifthenelse{%
\ifnameundef{author}\AND%
\(\ifnameundef{editor}\AND\NOT\boolean{bbx:editorinauthpos}\)\AND%
\ifnameundef{producer}\AND%
\ifnameundef{director}\AND%
\ifnameundef{writer}}
{\newunit\newblock
\usebibmacro{labelyear+extrayear}}
{}}}
首先originyear
要做的是定义格式。为此,我们检查是否originauthor
已定义,并相应地设置标点符号:
\DeclareFieldFormat{origyear}{%
\mkbibparens{\bibcpstring{origyear}~\thefield{origyear}%
\ifnameundef{origauthor}
{}
{\addspace\bibstring{as}\addspace\printnames[FirstLast]{origauthor}}%
\iffieldundef{origtitle}
{}%
{\ifnameundef{origauthor}
{\setunit{\addcolon\addspace}}
{\setunit{\addcomma\addspace}}%
\printfield{origtitle}}}%
}
然后,我们必须考虑必须输出有关原始出版物的信息的情况(这里的条件是年份、标题或作者不同)。
\renewbibmacro*{origyear}{%
\ifthenelse{
\NOT\iffieldsequal{labelyear}{origdateyear}
\OR
\NOT\iffieldsequal{title}{origtitle}
\OR
\NOT\ifnamesequal{author}{origauthor}
}
{\printfield{origyear}}
{}%
}
警告上述解决方案的一个问题是,并非所有书目条目类型都包含使用上述方法格式化原始出版物信息的说明。更强大的技术是使用 BibLaTeX 提供的功能来处理相关出版物。
最后一步是使用适当的本地化字符串origyear
和值as
。
\NewBibliographyString{origyear,as}
\DefineBibliographyStrings{ngerman}{%
origyear = {Original erschienen},
as = {als}
}
\DefineBibliographyStrings{american}{%
as = {as}
}
最后,为了改变名称的呈现方式,我们必须修改apaauthor
\DeclareNameFormat{FirstLast}{%
\ifthenelse{\value{listcount}=\maxprtauth\AND\value{listcount}<\value{listtotal}}
{\addcomma\addspace\ldots}
{\ifthenelse{\value{listcount}>\maxprtauth\AND\value{listcount}<\value{listtotal}}
{}
{\iffirstinits
{\usebibmacro{name:first-last}{#1}{#4}{#5}{#7}}
{\usebibmacro{name:first-last}{#1}{#3}{#5}{#7}}}}
\ifmorenames{\andothersdelim\bibstring{andothers}}{}}