Bibliographie : surlignez automatiquement les références récentes en ajoutant un astérisque dans la marge de gauche

Aug 19 2020

Je mets à jour une liste de références et j'aimerais souligner les références ajoutées depuis la dernière mise à jour. Par exemple, je voudrais ajouter un astérisque (ou un autre symbole) juste avant la référence (idéalement dans la marge de gauche ou, au moins au début de la référence).

Cependant, contrairement à de nombreuses questions déjà posées (ex. astérisque ajouté à la suite de certains mots-clés), je souhaite ajouter l'astérisque automatiquement selon une date précise.

Le .bibfichier a été créé avec JabRef, donc chaque référence possède un champ "horodatage" (format : aaaa-mm-jj ou aaaa.mm.jj). Ce champ pourrait être utilisé pour ajouter l'astérisque.

Le MWE :

\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}

J'ai essayé d'adapter le morceau de code suivant donné dans ce post , sans succès:

\renewbibmacro*{begentry}{%
    \iftimestamp{<thechoosendate>}{%
        \makebox[0pt][r]{\textasteriskcentered\addspace}%
    }{}%
}

Par exemple, je voudrais mettre en évidence les références ajoutées depuis le 31 janvier 2020 (timestamp>=2020-01-31).

Peut-être pouvons-nous utiliser le package datetime2et les commandes \DTMsavedate{lastupdatedate}{2020-01-31}et \DTMusedate{lastupdatedate}optimiser les mises à jour à venir.

  1. Comment puis-je faire pour obtenir toutes les références récentes identifiées par un astérisque ?
  2. Quel document faut-il lire pour apprendre à faire ce type de programmation ?

Réponses

2 moewe Aug 19 2020 at 13:46

J'imagine qu'il existe de nombreuses façons de gérer cela.

Dans tous les cas, la première étape serait de s'assurer que les données d'horodatage parviennent à Biber. Dans le modèle de données standard, il n'y a pas de champ tel que timestamp, donc le champ est simplement ignoré. Il existe au moins deux manières simples d'obtenir les données d'horodatagebiblatex :

  1. Déclarez un nouveau modèle de données avec le timestampchamp.
  2. Remapper timestampsur un champ connu (par exemple le champ scratch 'usera').

Dans ce qui suit, nous utiliserons une combinaison des deux approches. Nous allons déclarer un nouveau champ de datetimestampdate et mapper timestampce champ avec un sourcemap Biber (pour des raisons techniques, tous les champs de date biblatexdoivent se terminer par ...date, cela timestampdatesemblait donc être un bon choix). J'ai choisi cette voie plus compliquée, car nous pouvons alors demander à Biber d'analyser le champ en tant que date et de renvoyer l'année, le mois et le jour séparément. De plus, nous pouvons utiliser cette étape pour normaliser les formats de date de YYYY.MM.DDà YYYY-MM-DD.

Il serait parfaitement possible de passer timestamptel quel et non via un ...datechamp, mais il faudrait alors analyser la date côté LaTeX (ce qui ne devrait pas être trop compliqué).

Avec la date passée à biblatexnous avons juste besoin de vérifier si nous ne sommes pas plus âgés qu'une date donnée. Cela peut simplement être vérifié en parcourant les parties de date année, mois et jour un par un. Pour notre champ de date, timestampdatel'année vivra dans timestampyear, le mois dans timestampmonthetc. Nous pouvons accéder aux champs bruts avec \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}

Pour être honnête, je ne sais pas par où commencer pour lire sur la programmation. Le point le plus important ici est d'obtenir les données vers biblatex, car elles timestampsont ignorées par défaut ( Ajouter un champ "tome" aux entrées biblatex montre quelques méthodes pour obtenir un "nouveau" champ vers biblatex). Après cela, vous devez "juste" vous assurer d'analyser la date et de la comparer. Il existe plusieurs façons de le faire. Il m'est arrivé d'en choisir un qui implique Biber et biblatexla gestion des dates, mais ce n'est pas acquis. Vous pouvez également tout parser vous-même (cf. Est-il possible de parser une chaîne de date dans LaTeX pour la convertir dans un format de date différent ? ).