我正在更新参考文献列表,我想突出显示自上次更新以来添加的参考文献。例如,我想在参考文献前面添加一个星号(或其他符号)(最好在左边距,或者至少在参考文献的开头)。
但是,与已经提出的许多问题相反(例如,在某些关键字后添加星号),我想根据特定日期自动添加星号。
该.bib
文件是用 JabRef 创建的,因此每个引用都有一个字段“时间戳”(格式:yyyy-mm-dd 或 yyyy.mm.dd)。此字段可用于添加星号。
妇女权利委员会:
\documentclass{article}
\usepackage[style=authoryear,backend=biber]{biblatex}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{Rabelais1532,
author = {Rabelais, Fran\c{c}ois},
date = {1532},
title = {Pantagruel},
timestamp = {2018-07-01},
}
@book{Hugo1862,
author = {Hugo, Victor},
date = {1862},
title = {Les Mis\'{e}rables},
timestamp = {2019-07-01},
}
@book{Hugo1831,
author = {Hugo, Victor},
date = {1831},
title = {Notre-Dame de Paris},
timestamp = {2020.01.31},
}
@book{Zola1885,
author = {Zola, \'{E}mile},
date = {1885},
title = {Germinal},
timestamp = {2020-02-01},
}
@book{Balzac1831,
author = {de Balzac, Honor\'{e}},
date = {1831},
title = {The Skin of Sorrow},
timestamp = {2020-06-15},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
我试图调整下面给出的代码这个帖子, 没有成功:
\renewbibmacro*{begentry}{%
\iftimestamp{<thechoosendate>}{%
\makebox[0pt][r]{\textasteriskcentered\addspace}%
}{}%
}
例如,我想突出显示自 2020 年 1 月 31 日(时间戳>=2020-01-31)以来添加的参考资料。
也许我们可以使用该包datetime2
和命令\DTMsavedate{lastupdatedate}{2020-01-31}
来\DTMusedate{lastupdatedate}
优化即将到来的更新。
- 我怎样才能获得所有以星号标识的最新参考文献?
- 要学习如何进行这种类型的编程,应该阅读什么文档?
答案1
我想有很多方法可以解决这个问题。
无论如何,第一步是确保时间戳数据到达 Biber。在标准数据模型中没有这样的字段timestamp
,因此该字段被忽略。至少有两种直接的方法可以将时间戳数据发送到biblatex
:
- 使用该字段声明一个新的数据模型
timestamp
。 - 重新映射
timestamp
到已知字段(例如临时字段“usera”)。
在下面的内容中,我们将结合使用这两种方法。我们将声明一个新的日期字段timestampdate
,并将timestamp
该字段与 Biber 源映射进行映射(由于技术原因,所有日期字段都biblatex
必须以 结尾...date
,因此这timestampdate
似乎是个不错的选择)。我选择了这条更复杂的路线,因为我们可以让 Biber 将该字段解析为日期并分别返回年、月和日。此外,我们可以使用此步骤将日期格式从 到 进行YYYY.MM.DD
规范化YYYY-MM-DD
。
完全可以按timestamp
原样传递而不是通过字段...date
,但您必须在 LaTeX 端解析日期(这应该不会太棘手)。
将日期传递给后,biblatex
我们只需检查是否不早于给定日期。只需逐一检查日期部分年、月、日即可。对于我们的日期字段,年份timestampdate
为timestampyear
,月份为,timestampmonth
等等。我们可以使用访问原始字段\thefield
。
\documentclass{article}
\begin{filecontents}{timestampdate.dbx}
\ProvidesFile{timestampdate.dbx}[2020/08/19 timestampdate for biblatex]
\DeclareDatamodelFields[type=field, datatype=date, skipout]{
timestampdate,
}
\DeclareDatamodelEntryfields{
timestampday,
timestampendday,
timestampendhour,
timestampendminute,
timestampendmonth,
timestampendsecond,
timestampendtimezone,
timestampendyear,
timestamphour,
timestampminute,
timestampmonth,
timestampsecond,
timestamptimezone,
timestampyear,
}
\end{filecontents}
\usepackage[style=authoryear, backend=biber, datamodel=timestampdate]{biblatex}
\DeclareSourcemap{
\maps{
\map{
% map timestamp to date field timestampdate
\step[fieldsource=timestamp, fieldtarget=timestampdate]
% now convert '.' to '-'
\step[fieldsource=timestampdate, match=\regexp{\.}, replace=\regexp{-}]
% we should now have YYYY-MM-DD format
}
}
}
\makeatletter
% {<datetype prefix>}{<year>}{<month>}{<day>}
% checks if the date stored in the field <datetype>
% is at least <year>-<month>-<day>
% ---
% to understand the code below just 'map'
% \@firstoftwo -> true
% \@secondoftwo -> false
\newcommand*{\ifdateatleast}[4]{%
\ifnumgreater{\thefield{#1year}}{#2}
{\@firstoftwo}
{\ifnumequal{\thefield{#1year}}{#2}
{\ifnumgreater{\thefield{#1month}}{#3}
{\@firstoftwo}
{\ifnumequal{\thefield{#1month}}{#3}
{\ifnumless{\thefield{#1day}}{#4}
{\@secondoftwo}
{\@firstoftwo}}
{\@secondoftwo}}}
{\@secondoftwo}}%
}
\makeatother
\renewbibmacro*{begentry}{%
\ifdateatleast{timestamp}{2020}{1}{1}
{\makebox[0pt][r]{\textasteriskcentered\addspace}}
{}%
}
\begin{filecontents}{\jobname.bib}
@book{Rabelais1532,
author = {Rabelais, Fran\c{c}ois},
date = {1532},
title = {Pantagruel},
timestamp = {2018-07-01},
}
@book{Hugo1862,
author = {Hugo, Victor},
date = {1862},
title = {Les Mis\'{e}rables},
timestamp = {2019-07-01},
}
@book{Hugo1831,
author = {Hugo, Victor},
date = {1831},
title = {Notre-Dame de Paris},
timestamp = {2020.01.31},
}
@book{Zola1885,
author = {Zola, \'{E}mile},
date = {1885},
title = {Germinal},
timestamp = {2020-02-01},
}
@book{Balzac1831,
author = {de Balzac, Honor\'{e}},
date = {1831},
title = {The Skin of Sorrow},
timestamp = {2020-06-15},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
说实话,我不知道你会从哪里开始阅读有关编程的内容。这里最重要的一点是将数据传送到biblatex
,因为timestamp
默认情况下会被忽略(将字段“tome”添加到 biblatex 条目展示了一些获取“新”字段的方法biblatex
)。之后,您“只需”确保解析日期并进行比较。有多种方法可以做到这一点。我只是碰巧选择了一个涉及 Biber 和biblatex
日期处理的方法,但这不是必然的。您也可以自己解析所有内容(参见是否可以解析 LaTeX 中的日期字符串并将其转换为不同的日期格式?)。