Bibliografia: evidenzia automaticamente i riferimenti recenti aggiungendo un asterisco nel margine sinistro

Aug 19 2020

Sto aggiornando un elenco di riferimenti e vorrei evidenziare i riferimenti aggiunti dall'ultimo aggiornamento. Ad esempio, vorrei aggiungere un asterisco (o un altro simbolo) appena prima del riferimento (idealmente nel margine sinistro o, almeno all'inizio del riferimento).

Tuttavia, contrariamente a numerose domande già poste (ad es. asterisco aggiunto a seguito di alcune parole chiave), vorrei aggiungere l'asterisco automaticamente in base a una data specifica.

Il .bibfile è stato creato con JabRef, quindi ogni riferimento ha un campo "timestamp" (formato: aaaa-mm-gg o aaaa.mm.gg). Questo campo può essere utilizzato per aggiungere l'asterisco.

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

Ho provato ad adattare il seguente pezzo di codice fornito in questo post , senza successo:

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

Ad esempio, vorrei evidenziare i riferimenti aggiunti dal 31 gennaio 2020 (timestamp>=2020-01-31).

Forse possiamo usare il pacchetto datetime2ei comandi \DTMsavedate{lastupdatedate}{2020-01-31}e \DTMusedate{lastupdatedate}ottimizzare i prossimi aggiornamenti.

  1. Come posso fare per ottenere tutte le referenze recenti identificate da un asterisco?
  2. Quale documento bisogna leggere per imparare a fare questo tipo di programmazione?

Risposte

2 moewe Aug 19 2020 at 13:46

Immagino che ci siano molti modi per affrontare questo problema.

Il primo passo in ogni caso sarebbe assicurarsi che i dati del timestamp arrivino a Biber. Nel modello di dati standard non esiste un campo come timestamp, quindi il campo viene semplicemente ignorato. Esistono almeno due modi semplici per ottenere i dati di timestamp su biblatex:

  1. Dichiarare un nuovo modello di dati con il timestampcampo.
  2. Rimappa timestampa un campo noto (ad esempio il campo scratch 'usera').

In quanto segue useremo una combinazione dei due approcci. Dichiareremo un nuovo campo datatimestampdate e timestampmapperemo quel campo con una mappa sorgente Biber (per motivi tecnici tutti i campi data biblatexdevono terminare con ...date, quindi ci è timestampdatesembrata una buona scelta). Ho scelto questo percorso più complicato, perché possiamo quindi fare in modo che Biber analizzi il campo come data e restituisca anno, mese e giorno separatamente. Inoltre, possiamo utilizzare questo passaggio per normalizzare i formati di data da YYYY.MM.DDa YYYY-MM-DD.

Sarebbe perfettamente possibile passare timestampcosì com'è e non tramite un ...datecampo, ma poi dovresti analizzare la data sul lato LaTeX (che non dovrebbe essere troppo complicato).

Con la data passata a biblatexdobbiamo solo verificare se non siamo più vecchi di una data data. Ciò può essere verificato semplicemente esaminando le parti della data anno, mese e giorno una per una. Per il nostro campo data timestampdatel'anno vivrà in timestampyear, il mese in timestampmonthecc. Possiamo accedere ai campi grezzi con \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}

Ad essere onesti, non sono sicuro da dove inizieresti a leggere sulla programmazione di questo. Il punto più importante qui è ottenere i dati in biblatex, perché timestampviene ignorato per impostazione predefinita ( Aggiungi campo "tomo" alle voci biblatex mostra alcuni metodi per ottenere un 'nuovo' campo in biblatex). Dopodiché devi "solo" assicurarti di analizzare la data e confrontarla. Ci sono diversi modi per farlo. Mi è capitato di sceglierne uno che coinvolge Biber e biblatexla gestione della data, ma questo non è scontato. Puoi anche analizzare tutto da solo (cfr. È possibile analizzare una stringa di data in LaTeX per convertirla in un formato di data diverso? ).