Bibliografía: resalte las referencias recientes automáticamente agregando un asterisco en el margen izquierdo
Estoy actualizando una lista de referencias y me gustaría resaltar las referencias agregadas desde la última actualización. Por ejemplo, me gustaría agregar un asterisco (u otro símbolo) justo antes de la referencia (idealmente en el margen izquierdo o, al menos, al principio de la referencia).
Sin embargo, contrariamente a las numerosas preguntas que ya se han hecho (p. ej., se agregó un asterisco después de algunas palabras clave), me gustaría agregar el asterisco automáticamente de acuerdo con una fecha específica.
El .bib
archivo se creó con JabRef, por lo que cada referencia tiene un campo "timestamp" (formato: aaaa-mm-dd o aaaa.mm.dd). Este campo podría usarse para agregar el asterisco.
El 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}
He intentado adaptar el siguiente fragmento de código dado en esta publicación , sin éxito:
\renewbibmacro*{begentry}{%
\iftimestamp{<thechoosendate>}{%
\makebox[0pt][r]{\textasteriskcentered\addspace}%
}{}%
}
Por ejemplo, me gustaría resaltar las referencias agregadas desde el 31 de enero de 2020 (marca de tiempo>=2020-01-31).
Tal vez podamos usar el paquete y datetime2
los comandos para optimizar las próximas actualizaciones.\DTMsavedate{lastupdatedate}{2020-01-31}
\DTMusedate{lastupdatedate}
- ¿Cómo puedo hacer para obtener todas las referencias recientes identificadas con un asterisco?
- ¿Qué documento se debe leer para aprender a hacer este tipo de programación?
Respuestas
Me imagino que hay muchas maneras de lidiar con esto.
En cualquier caso, el primer paso sería asegurarse de que los datos de la marca de tiempo lleguen a Biber. En el modelo de datos estándar no existe un campo como timestamp
, por lo que el campo simplemente se ignora. Hay al menos dos formas sencillas de obtener los datos de la marca de tiempo biblatex
:
- Declare un nuevo modelo de datos con el
timestamp
campo. - Reasignar
timestamp
a un campo conocido (por ejemplo, el campo borrador 'usera').
En lo que sigue a continuación, utilizaremos una combinación de los dos enfoques. Declararemos un nuevo campo de fechatimestampdate
y timestamp
mapearemos ese campo con un mapa fuente de Biber (por razones técnicas, todos los campos de fecha biblatex
deben terminar con ...date
, por lo que timestampdate
parecía una buena opción). Elegí esta ruta más complicada, porque luego podemos hacer que Biber analice el campo como una fecha y devuelva el año, el mes y el día por separado. Además, podemos usar este paso para normalizar los formatos de fecha de YYYY.MM.DD
a YYYY-MM-DD
.
Sería perfectamente posible pasar timestamp
tal como está y no a través de un ...date
campo, pero luego tendría que analizar la fecha en el lado de LaTeX (lo que no debería ser demasiado complicado).
Con la fecha pasada hasta biblatex
, solo necesitamos verificar si no somos más antiguos que una fecha determinada. Eso se puede verificar simplemente revisando las partes de la fecha año, mes y día uno por uno. Para nuestro campo de fecha timestampdate
, vivirá el año timestampyear
, el mes, timestampmonth
etc. Podemos acceder a los campos sin formato 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}

Para ser honesto, no estoy seguro de dónde empezarías a leer sobre la programación de esto. El punto más importante aquí es llevar los datos a biblatex
, porque timestamp
se ignora de manera predeterminada ( Agregar campo "tomo" a las entradas de biblatex muestra algunos métodos para obtener un campo 'nuevo' a biblatex
). Después de eso, 'solo' necesita asegurarse de analizar la fecha y compararla. Hay varias formas de hacerlo. Simplemente elegí uno que involucra Biber y biblatex
manejo de fechas, pero esto no es un hecho. También puede analizar todo usted mismo (cf. ¿Es posible analizar una cadena de fecha en LaTeX para convertirla a un formato de fecha diferente? ).