Biblatex DeclareSourcemap:在附加字段时,我们如何有条件地在前缀中添加空格?

Biblatex DeclareSourcemap:在附加字段时,我们如何有条件地在前缀中添加空格?

我正在尝试创建一个 DeclareSourcemap 来将字符串(“现代出版日期”)和源字段值(来自 的值date)附加到目标字段( )。在我的 biblatex 源中,我有一些不存在的addendum条目;而有些条目确实存在,其中包含我不想覆盖的现有文本。addendumaddendum

addendum如果结果中已经包含文本,我想在结果前面加上一个空格addendum。例如,最终结果如下:

addendum={Existing addendum text. Modern publication date 2015-02-23}

但是,如果不存在,我不想在附加到“附录”的结果前面加上空格addendum。例如,最终得到如下结果:

addendum={Modern publication date 1975-06-15}

我可以成功地在要附加的字符串前面添加一个空格。但我搞不清楚如何根据附录是否存在(或是否具有非零长度的字符串值)有条件地执行此操作。

只是为了分享更深层次的动机:我正在尝试设置源映射,以便我可以轻松地在不支持的样式origdate(例如 biblatex 原生样式authoryear)和支持的样式(例如 biblatex-chicago)之间切换,而无需更改我的 biblatex 源文件(书目条目)。此外,对于我的文内引用和书目条目,我希望突出原始日期而不是现代日期。下面的我的最小工作示例 (MWE) 完成了所有这些工作(数据源映射与 biblatex 的原生样式一起使用authoryear),除了将空格条件添加到附加文本之外...

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
  % Entry doesn't have an addendum
  @book{plato_2004_republic,
    author = {{Plato}},
    date = {2004-09-15},
    origdate = {-0379~},
    title = {Republic},
    translator = {Reeve, C. D. C.},
    publisher = {{Hackett Publishing Company, Inc.}},
  }

  % Entry has an addendum with existing text.
  @incollection{hume_1975_enquiry,
    author = {Hume, David},
    date = {1975-06-12},
    origdate = {1751},
    title = {An {{Enquiry Concerning}} the {{Principles}} of
       {{Morals}}},
    addendum = {Previously existing addendum text.},
    editor = {Selby-Bigge, L. A. and Nidditch, P. H.},
    publisher = {{Oxford University Press}},
    booktitle = {Enquiries {{Concerning Human Understanding}}
       and {{Concerning}} the {{Principles}} of {{Morals}}},
  }
\end{filecontents}

\usepackage[
%  style=debug,
  style=authoryear,
  alldates=ymd,
  dateera=secular,
  datecirca=true,
  datezeros=true,
  dateuncertain=true,
  backend=biber,
  backref=true,
  sorting=none
]{biblatex}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map[overwrite]{
      %%% addendum to "Modern publication date [datevalue]"
      %%% e.g. addendum={
      %%% [Optional existing text.] Modern publication date 
      %%%  2004-09-15
      %%% }
      % Append some text to the addendum field:
      % - With a leading space of there is text already in 
      %the addendum field (currently works); but
      % - Without a leading space if the addendum field 
      % doesn't exist (currently doesn't work).
      % XXXXXXXXXXXXX Problem line next XXXXXXXXXXXXX
      \step[fieldset=addendum, fieldvalue={\ Modern 
      publication 
      date{ }}, append]
      % The addendum field must exist with at least "Modern 
      % publication date ".
      % Append the date.
      \step[fieldsource=date]
      \step[fieldset=addendum, origfieldval, append]
      %%% origdate: origdatevalue to date: origdatevalue 
      %%% e.g. origdate = {1751} to date = {1751}
      \step[fieldsource=origdate]
      \step[fieldset=date, origfieldval]
    }
  }
}

\addbibresource{\jobname.bib}

\begin{document}
  %\autocite{plato_2004_republic}\\
  %\autocite{hume_1975_enquiry}\\
  \nocite{*}
  \printbibliography
\end{document}

这导致...

BiblatexDeclareSourcemapConditionalSpacePrefixProblem01

...柏拉图的条目在“现代出版日期...”之前有两个空格(此处需要一个空格),休谟的条目在“现代出版日期...”之前有一个空格(如预期的那样)。使用 使style=debug这一点更加明显。

我不确定解决方案是否需要以下一项或多项:

  • 更好地理解乳胶空间处理;或
  • 一些正则表达式(DeclareSourcemap 支持);
  • 更好地理解 DeclareSourcemap 处理;
  • 更改 biblatex 源代码、数据源映射,以提供更强大的附加功能。

一个选择是忽略双倍空格。它几乎不引人注意。但是,当然,我们程序员希望能够完全按照我们想要的方式进行操作。

我正在使用开发版本比伯(sourceforge 链接)和比布拉特克斯(3.7,sourceforge 链接)。生产版本对我来说已经无法与上述 MWE 相抗衡。我正在使用 Xelatex。

编辑:注释掉 MWE 文内引用,因此结果将与图像中发布的完全一样(没有反向引用)。

编辑:修正了标题大写。将“How”改为“how”。

答案1

您不必将所有东西都放在一个地方\map- 这会让某些事情变得不可能。试试这个:

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map[overwrite]{
      \step[fieldsource=addendum, final]
      \step[fieldset=addendum, fieldvalue={~}, append]
    }
    \map[overwrite]{
      % Only suffix "Modern publication date ..." where there is an origdate
      \step[fieldsource=origdate, final] 
      \step[fieldset=addendum, fieldvalue={Modern publication  date{ }}, append]
      \step[fieldsource=date]
      \step[fieldset=addendum, origfieldval, append]
      \step[fieldsource=origdate]
      \step[fieldset=date, origfieldval]
    }
  }
}

如果存在,则首先在末尾添加一个空格addendum,然后进行实际的字段修改。这可以用final \maps 进一步条件化,以更安全。关键是您可以强制\maps 仅适用于某些带有 的条目final。这通常是如何条件化地图的。

约翰·本特利 (John Bentley) 编辑:

对于上述解决方案,为了使其更加安全(正如 PLK 建议的那样),我添加了

  % Only suffix "Modern publication date ..." where there is an origdate
  \step[fieldsource=origdate, final] 

... 也可以通过添加 MWE 来测试这一点...

  @article{chalmers_1995_facinga,
    author = {Chalmers, David J.},
    date = {1995},
    title = {Facing up to the Problem of Consciousness},
    pages = {200--19},
    journaltitle = {Journal of Consciousness Studies},
    number = {3},
    timestamp = {2016-06-05T20:09:34Z},
    url = {http://consc.net/papers/facing.html},
    volume = {2},
    addendum={This entry only has a date, not origdate, so no ``Modern publication date" should be output}
  }

相关内容