参考书目:通过在左边距添加星号自动突出显示最近的参考文献

参考书目:通过在左边距添加星号自动突出显示最近的参考文献

我正在更新参考文献列表,我想突出显示自上次更新以来添加的参考文献。例如,我想在参考文献前面添加一个星号(或其他符号)(最好在左边距,或者至少在参考文献的开头)。

但是,与已经提出的许多问题相反(例如,在某些关键字后添加星号),我想根据特定日期自动添加星号。

.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. 我怎样才能获得所有以星号标识的最新参考文献?
  2. 要学习如何进行这种类型的编程,应该阅读什么文档?

答案1

我想有很多方法可以解决这个问题。

无论如何,第一步是确保时间戳数据到达 Biber。在标准数据模型中没有这样的字段timestamp,因此该字段被忽略。至少有两种直接的方法可以将时间戳数据发送到biblatex

  1. 使用该字段声明一个新的数据模型timestamp
  2. 重新映射timestamp到已知字段(例如临时字段“usera”)。

在下面的内容中,我们将结合使用这两种方法。我们将声明一个新的日期字段timestampdate,并将timestamp该字段与 Biber 源映射进行映射(由于技术原因,所有日期字段都biblatex必须以 结尾...date,因此这timestampdate似乎是个不错的选择)。我选择了这条更复杂的路线,因为我们可以让 Biber 将该字段解析为日期并分别返回年、月和日。此外,我们可以使用此步骤将日期格式从 到 进行YYYY.MM.DD规范化YYYY-MM-DD

完全可以按timestamp原样传递而不是通过字段...date,但您必须在 LaTeX 端解析日期(这应该不会太棘手)。

将日期传递给后,biblatex我们只需检查是否不早于给定日期。只需逐一检查日期部分年、月、日即可。对于我们的日期字段,年份timestampdatetimestampyear,月份为,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 中的日期字符串并将其转换为不同的日期格式?)。

相关内容