问题
我希望能够引用正在准备但尚未完成的作品,使用“准备中”而不是日期。(这主要是为了在求职申请、简历等中引用我自己正在进行的作品。)原因是(至少在我的领域)“Bar (2016)”意味着该作品至少在某种程度上是完整的,并且以某种形式可用(已发布或发布在档案或作者的网站上),而“Bar (in prep.)”不暗示任何一种。
具体来说,我希望能够使用 Biblatex 执行以下操作:
\cite{bar} -> Bar [in prep.]
\textcite{bar} -> Bar (in prep.)
\parencite{bar} -> (Bar [in prep.])
\printbibliography -> Bar, Foo (in prep.). Title. ...
我不认为方括号是常规的,但它们对我来说是有意义的,因为“Bar in prep.”和“(Bar in prep.)”看起来很奇怪,尤其是有多个作者时,例如“Bar and Baz in prep.”,而“Bar (in prep.)”已经被使用并且具有不同的语义。
Biblatex 有一个名为的字段,pubstate
它接受可能的值inpreparation
,该值会扩展为(本地化)字符串“in Preparation”。但是,默认情况下,如果我还指定了日期,则会打印日期而不是“In Preparation”。
@unpublished{bar,
author = {Foo Bar},
date = {2016},
pubstate = {inpreparation},
title = {Title},
}
\cite{bar} -> Bar 2016
\textcite{bar} -> Bar (2016)
\parencite{bar} -> (Bar 2016)
\printbibliography -> Bar, Foo (2016). Title. ... In preparation.
梅威瑟:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@unpublished{bar,
author = {Foo Bar},
date = {2016},
pubstate = {inpreparation},
title = {Title},
}
\end{filecontents}
\usepackage[backend=biber,style=authoryear-comp]{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
In \cite{bar}, \textcite{bar} argues \ldots \parencite{bar}.
\printbibliography
\end{document}
以下是我所知道的两种解决方案。
解决方案 #1
替换date = {2016}
为year = {in prep.}
。(注意:使用date = {in prep.}
会引发错误。)这种方法可行,但并非我所寻找的(没有方括号)。此外,这是对字段的滥用year
,我更希望在 Biblatex 的精神下找到语义上更好的解决方案。
@unpublished{bar,
author = {Foo Bar},
year = {in prep.},
title = {Title},
}
\cite{bar} -> Bar in prep.
\textcite{bar} -> Bar (in prep.)
\parencite{bar} -> (Bar in prep.)
\printbibliography -> Bar, Foo (in prep.). Title. ...
梅威瑟:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@unpublished{bar,
author = {Foo Bar},
year = {in prep.},
title = {Title},
}
\end{filecontents}
\usepackage[backend=biber,style=authoryear-comp]{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
In \cite{bar}, \textcite{bar} argues \ldots \parencite{bar}.
\printbibliography
\end{document}
解决方案 #2
删除该date
字段,保留pubstate = {inpreparation}
并添加
\DeclareLabeldate{%
\field{date}
\field{pubstate}
}
其基本含义是“date
如果有值,则使用;否则,pubstate
如果有值,则使用”。
@unpublished{bar,
author = {Foo Bar},
pubstate = {inpreparation},
title = {Title},
}
\cite{bar} -> Bar in preparation
\textcite{bar} -> Bar (in preparation)
\parencite{bar} -> (Bar in preparation)
\printbibliography -> Bar, Foo. Title. ... In preparation.
梅威瑟:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@unpublished{bar,
author = {Foo Bar},
pubstate = {inpreparation},
title = {Title},
}
\end{filecontents}
\usepackage[backend=biber,style=authoryear-comp]{biblatex}
\addbibresource{\jobname.bib}
\DeclareLabeldate{%
\field{date}
\field{pubstate}
}
\begin{document}
In \cite{bar}, \textcite{bar} argues \ldots \parencite{bar}.
\printbibliography
\end{document}
这个解决方案更符合 Biblatex 原则,但仍然有点偏差:
- “准备中”,而不是更短(且更常规)的“准备中”。
\cite
和\parencite
情况下没有方括号- 参考文献中的作者后面不能紧跟“(准备中)”
我的问题
是否有任何简单的方法来调整解决方案#2(或类似的),以便inpreparation
扩展为“准备中”,添加方括号但仅限于\cite
和\parencite
,并在参考列表中的作者姓名后添加“(准备中)”(或“准备中”或其他,按照指定bibstyle
)?
或者有没有更好的方法来解决我忽略的这些问题?谢谢。
答案1
我对这个问题有一个合理但有些有限的解决方案。
为了使用缩写形式“in prep.”而不是完整形式,您可以:
\DefineBibliographyStrings{english}{%
inpreparation = {in prep\adddot},
}
正如您所建议的,添加pubstate
到labeldate
:
\DeclareLabeldate{%
\field{date}
\field{year}
\field{eventdate}
\field{origdate}
\field{urldate}
\field{pubstate} % <-- NEW
\literal{nodate}
}
要添加方括号\cite
,\parencite
我相信最简单的方法是调整相应的 cite 命令:
\DeclareCiteCommand{\parencite}[\mkbibparens]
{\iffieldequalstr{pubstate}{inpreparation}{\DeclareFieldFormat{labelyear}{\mkbibbrackets{\bibstring{\thefield{labelyear}}}}}{}% <-- NEW
\usebibmacro{cite:init}%
\usebibmacro{prenote}}
{\usebibmacro{citeindex}%
\usebibmacro{cite}}
{}
{\usebibmacro{postnote}}
\DeclareCiteCommand{\cite}
{\iffieldequalstr{pubstate}{inpreparation}{\DeclareFieldFormat{labelyear}{\mkbibbrackets{\bibstring{\thefield{labelyear}}}}}{}% <-- NEW
\usebibmacro{prenote}}
{\usebibmacro{citeindex}%
\usebibmacro{cite}}
{\multicitedelim}
{\usebibmacro{postnote}}
(@CarLaTeX,我不明白为什么这不适用于“in press”)。
在参考书目中的年份位置使用“(准备中)”:
\renewbibmacro*{date+extrayear}{%
\iffieldundef{\thefield{datelabelsource}year}
{\iffieldequalstr{pubstate}{inpreparation}{\printtext[parens]{\bibstring{\thefield{pubstate}}}}{}} % <-- NEW
{\printtext[parens]{%
\iffieldsequal{year}{\thefield{datelabelsource}year}
{\printdateextralabel}%
{\printfield{labelyear}%
\printfield{extrayear}}}}}%
鉴于此,如果您希望省略参考书目中参考文献末尾多余的“准备中”:
\renewbibmacro*{addendum+pubstate}{%
\printfield{addendum}%
\newunit\newblock
\iffieldequalstr{pubstate}{inpreparation}{}{\printfield{pubstate}}} % <-- NEW
将所有内容整合到 MWE 中:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@unpublished{bar,
author = {Foo Bar},
pubstate = {inpreparation},
title = {Title},
}
\end{filecontents}
\usepackage[backend=biber,style=authoryear-comp]{biblatex}
\DefineBibliographyStrings{english}{%
inpreparation = {in prep\adddot},
}
\DeclareLabeldate{%
\field{date}
\field{year}
\field{eventdate}
\field{origdate}
\field{urldate}
\field{pubstate} % <-- NEW
\literal{nodate}
}
\DeclareCiteCommand{\parencite}[\mkbibparens]
{\iffieldequalstr{pubstate}{inpreparation}{\DeclareFieldFormat{labelyear}{\mkbibbrackets{\bibstring{\thefield{labelyear}}}}}{}% <-- NEW
\usebibmacro{cite:init}%
\usebibmacro{prenote}}
{\usebibmacro{citeindex}%
\usebibmacro{cite}}
{}
{\usebibmacro{postnote}}
\DeclareCiteCommand{\cite}
{\iffieldequalstr{pubstate}{inpreparation}{\DeclareFieldFormat{labelyear}{\mkbibbrackets{\bibstring{\thefield{labelyear}}}}}{}% <-- NEW
\usebibmacro{prenote}}
{\usebibmacro{citeindex}%
\usebibmacro{cite}}
{\multicitedelim}
{\usebibmacro{postnote}}
\renewbibmacro*{addendum+pubstate}{%
\printfield{addendum}%
\newunit\newblock
\iffieldequalstr{pubstate}{inpreparation}{}{\printfield{pubstate}}} % <-- NEW
\renewbibmacro*{date+extrayear}{%
\iffieldundef{\thefield{datelabelsource}year}
{\iffieldequalstr{pubstate}{inpreparation}{\printtext[parens]{\bibstring{\thefield{pubstate}}}}{}} % <-- NEW
{\printtext[parens]{%
\iffieldsequal{year}{\thefield{datelabelsource}year}
{\printdateextralabel}%
{\printfield{labelyear}%
\printfield{extrayear}}}}}%
\addbibresource{\jobname.bib}
\begin{document}
In \cite{bar}, \textcite{bar} argues \ldots\ \parencite{bar}.
\printbibliography
\end{document}
其渲染效果为:
但遗憾的是,限制非常严格。如果你有两个或多个来自同一作者的“准备中”,那么在处理该extrayear
部分时你会得到奇怪的结果。但 OP 的 2 个解决方案中也会出现这种情况(最不糟糕的是解决方案 #1)。