问题

问题

问题

我希望能够引用正在准备但尚未完成的作品,使用“准备中”而不是日期。(这主要是为了在求职申请、简历等中引用我自己正在进行的作品。)原因是(至少在我的领域)“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},
}

正如您所建议的,添加pubstatelabeldate

\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)。

相关内容