我正在尝试创建一个 DeclareSourcemap 来将字符串(“现代出版日期”)和源字段值(来自 的值date
)附加到目标字段( )。在我的 biblatex 源中,我有一些不存在的addendum
条目;而有些条目确实存在,其中包含我不想覆盖的现有文本。addendum
addendum
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}
这导致...
...柏拉图的条目在“现代出版日期...”之前有两个空格(此处需要一个空格),休谟的条目在“现代出版日期...”之前有一个空格(如预期的那样)。使用 使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
\map
s 进一步条件化,以更安全。关键是您可以强制\map
s 仅适用于某些带有 的条目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}
}