Bibliografia: destaque referências recentes automaticamente adicionando um asterisco na margem esquerda

Aug 19 2020

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 .bibarquivo 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 datetime2e os comandos \DTMsavedate{lastupdatedate}{2020-01-31}e \DTMusedate{lastupdatedate}otimizar as próximas atualizações.

  1. Como posso fazer para obter todas as referências recentes identificadas por um asterisco?
  2. Qual documento deve ser lido para aprender a fazer esse tipo de programação?

Respostas

2 moewe Aug 19 2020 at 13:46

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:

  1. Declare um novo modelo de dados com o timestampcampo.
  2. Remapear timestamppara 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 timestampesse campo com um mapa de origem do Biber (por razões técnicas, todos os campos de data biblatexdevem terminar com ...date, então timestampdateparece 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.DDpara YYYY-MM-DD.

Seria perfeitamente possível passar timestampcomo está e não por meio de um ...datecampo, mas você teria que analisar a data no lado do LaTeX (o que não deve ser muito complicado).

Com a data passada para biblatexnó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, timestampdateo ano viverá em timestampyear, o mês em timestampmonthetc. 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 biblatexmanuseio 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? ).