我有一个没有日期的书目条目。我希望这个条目在引用(即在正文中)和参考文献中都打印出来,并带有“nd”,否则它应该与常规条目没有什么不同。
在下面的例子中,我希望引用
列侬 (nd);列侬 (1972)
以及参考文献
列侬,约翰(nd)。世界和平。
列侬,约翰(1972)。地球更加和平。
\documentclass{article}
\usepackage{csquotes,filecontents}
\usepackage[style=authoryear,dashed=false]{biblatex}
\begin{filecontents}{\jobname.bib}
@BOOK{lennon,
AUTHOR = "John Lennon",
TITLE = "Peace on earth"}
@BOOK{lennon1972,
AUTHOR = "John Lennon",
TITLE = "More peace on earth",
YEAR = "1972"}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\textcites{lennon}{lennon1972}.
\printbibliography
\end{document}
答案1
您可以将以下钩子添加到您的序言中:
\newcommand{\mkbibnodate}{n\adddot d\adddot}
\AtEveryCitekey{\iffieldundef{labelyear}{\restorefield{labelyear}{\mkbibnodate}}{}}
\AtEveryBibitem{\iffieldundef{labelyear}{\restorefield{year}{\mkbibnodate}}{}}
使用 biber,你可以使用源映射实现相同的结果:
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map[overwrite=false]{
\step[fieldset=date,origfieldval,final]
\step[fieldset=eventdate,origfieldval,final]
\step[fieldset=origdate,origfieldval,final]
\step[fieldset=urldate,origfieldval,final]
\step[fieldset=eventyear,origfieldval,final]
\step[fieldset=origyear,origfieldval,final]
\step[fieldset=urlyear,origfieldval,final]
\step[fieldset=year,fieldvalue={n.d.},final]
\step[fieldset=sortyear,fieldvalue={0000}]
}
}
}
这两种方法都与风格无关,因此它们适用于其authoryear
任何变体。
上面的sourcemap是基于默认的labelyear
规范:
\DeclareLabelyear{
\field{year}
\field{eventyear}
\field{origyear}
\field{urlyear}
}
目前\DeclareLabelyear
不支持文字字符串,但类似下面的内容会很有用:
\DeclareLabelyear{
\field{year}
\field{eventyear}
\field{origyear}
\field{urlyear}
\literal{n.d.}
}
我添加了一个功能要求这个可以在 biblatex github 存储库中找到。
答案2
请尝试使用 SourceForge 的 biblatex 2.6/biber 1.6 开发版本。此设置现在是默认设置,并且有一个新的本地化字符串“nodate”,目前在所有语言中默认为“nd”。\DeclareLabelyear
现在更通用:
\DeclareLabeldate{%
\field{date}
\field{event}
\field{orig}
\field{url}
\literal{nodate}
}
但除非您是使用此宏的样式作者,否则您不必担心这一点。使用这些版本,您的示例无需任何额外编码即可提供以下内容:
更改您语言的“nodate”本地化字符串将会更改参考文献和引文中的“nd”。
答案3
\renewbibmacro*{date+extrayear}{%
\iffieldundef{year}
{\printtext[parens]{n.d.}}
{\printtext[parens]{\printdateextra}}}%
\renewbibmacro*{cite:label}{%
\iffieldundef{label}
{\printtext[bibhyperref]{\printtext{n.d.}}}
{\printtext[bibhyperref]{\printfield{label}}}}