Bibliografia: evidenzia automaticamente i riferimenti recenti aggiungendo un asterisco nel margine sinistro
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 .bib
file è 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 datetime2
ei comandi \DTMsavedate{lastupdatedate}{2020-01-31}
e \DTMusedate{lastupdatedate}
ottimizzare i prossimi aggiornamenti.
- Come posso fare per ottenere tutte le referenze recenti identificate da un asterisco?
- Quale documento bisogna leggere per imparare a fare questo tipo di programmazione?
Risposte
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
:
- Dichiarare un nuovo modello di dati con il
timestamp
campo. - Rimappa
timestamp
a un campo noto (ad esempio il campo scratch 'usera').
In quanto segue useremo una combinazione dei due approcci. Dichiareremo un nuovo campo datatimestampdate
e timestamp
mapperemo quel campo con una mappa sorgente Biber (per motivi tecnici tutti i campi data biblatex
devono terminare con ...date
, quindi ci è timestampdate
sembrata 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.DD
a YYYY-MM-DD
.
Sarebbe perfettamente possibile passare timestamp
così com'è e non tramite un ...date
campo, ma poi dovresti analizzare la data sul lato LaTeX (che non dovrebbe essere troppo complicato).
Con la data passata a biblatex
dobbiamo 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 timestampdate
l'anno vivrà in timestampyear
, il mese in timestampmonth
ecc. 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é timestamp
viene 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 biblatex
la 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? ).