Bibliografia: destaque referências recentes automaticamente adicionando um asterisco na margem esquerda
Estou atualizando uma lista de referências e gostaria de destacar referências adicionadas desde a última atualização. Por exemplo, gostaria de adicionar um asterisco (ou outro símbolo) logo antes da referência (idealmente na margem esquerda ou, pelo menos, no início da referência).
No entanto, ao contrário de inúmeras perguntas já feitas (por exemplo, asterisco adicionado após algumas palavras-chave), gostaria de adicionar o asterisco automaticamente de acordo com uma data específica.
O .bib
arquivo foi criado com JabRef, então cada referência tem um campo "timestamp" (formato: aaaa-mm-dd ou aaaa.mm.dd). Este campo pode ser usado para adicionar o asterisco.
O 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}
Tentei adaptar o seguinte trecho de código dado neste post , sem sucesso:
\renewbibmacro*{begentry}{%
\iftimestamp{<thechoosendate>}{%
\makebox[0pt][r]{\textasteriskcentered\addspace}%
}{}%
}
Por exemplo, gostaria de destacar as referências adicionadas desde 31 de janeiro de 2020 (timestamp>=2020-01-31).
Talvez possamos usar o pacote datetime2
e os comandos \DTMsavedate{lastupdatedate}{2020-01-31}
e \DTMusedate{lastupdatedate}
otimizar as próximas atualizações.
- Como posso fazer para obter todas as referências recentes identificadas por um asterisco?
- Qual documento deve ser lido para aprender a fazer esse tipo de programação?
Respostas
Imagino que haja muitas maneiras de lidar com isso.
A primeira etapa, em qualquer caso, seria garantir que os dados do registro de data e hora cheguem ao Biber. No modelo de dados padrão não existe um campo como timestamp
, então o campo é simplesmente ignorado. Existem pelo menos duas maneiras diretas de obter os dados do carimbo de data/hora para biblatex
:
- Declare um novo modelo de dados com o
timestamp
campo. - Remapear
timestamp
para um campo conhecido (por exemplo, o campo temporário 'usera').
No que segue abaixo, usaremos uma combinação das duas abordagens. Vamos declarar um novo campo de datatimestampdate
e mapear timestamp
esse campo com um mapa de origem do Biber (por razões técnicas, todos os campos de data biblatex
devem terminar com ...date
, então timestampdate
parece uma boa escolha). Escolhi essa rota mais complicada, porque podemos fazer com que o Biber analise o campo como uma data e retorne ano, mês e dia separadamente. Além disso, podemos usar esta etapa para normalizar os formatos de data de YYYY.MM.DD
para YYYY-MM-DD
.
Seria perfeitamente possível passar timestamp
como está e não por meio de um ...date
campo, mas você teria que analisar a data no lado do LaTeX (o que não deve ser muito complicado).
Com a data passada para biblatex
nós só precisamos verificar se não somos mais velhos do que uma determinada data. Isso pode ser verificado simplesmente passando pelas partes da data, ano, mês e dia, um por um. Para o nosso campo de data, timestampdate
o ano viverá em timestampyear
, o mês em timestampmonth
etc. Podemos acessar os campos brutos com \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, não tenho certeza de onde você começaria a ler sobre como programar isso. O ponto mais importante aqui é obter os dados para biblatex
, porque timestamp
é ignorado por padrão ( Adicionar campo "tomo" às entradas do biblatex mostra alguns métodos para obter um 'novo' campo para biblatex
). Depois disso, você 'só' precisa certificar-se de analisar a data e compará-la. Existem várias maneiras de fazer isso. Por acaso, escolhi um que envolve Biber e biblatex
manuseio de datas, mas isso não é um dado adquirido. Você também pode analisar tudo sozinho (cf. É possível analisar uma string de data no LaTeX para convertê-la em um formato de data diferente? ).