Библиография: выделите последние ссылки автоматически, добавив звездочку в левом поле.

Aug 19 2020

Я обновляю список ссылок, и я хотел бы выделить ссылки, добавленные с момента последнего обновления. Например, я хотел бы добавить звездочку (или другой символ) непосредственно перед ссылкой (в идеале на левом поле или, по крайней мере, в начале ссылки).

Однако, вопреки многочисленным уже заданным вопросам (например, после некоторых ключевых слов добавлена ​​звездочка), я хотел бы добавить звездочку автоматически в соответствии с определенной датой.

.bibФайл был создан с JabRef, так что каждая ссылка имеет поле «метки времени» (формат: гггг-мм-дд или yyyy.mm.dd). Это поле можно использовать для добавления звездочки.

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}

Я безуспешно пытался адаптировать следующий фрагмент кода, приведенный в этом посте :

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

Например, я хотел бы выделить ссылки, добавленные с 31 января 2020 года (временная метка> = 2020-01-31).

Возможно, мы сможем использовать пакет datetime2и команды \DTMsavedate{lastupdatedate}{2020-01-31}и \DTMusedate{lastupdatedate}оптимизировать предстоящие обновления.

  1. Как я могу получить все недавние ссылки, отмеченные звездочкой?
  2. Какой документ следует прочитать, чтобы узнать, как выполнять этот тип программирования?

Ответы

2 moewe Aug 19 2020 at 13:46

Я полагаю, что есть много способов справиться с этим.

В любом случае первым шагом будет убедиться, что данные о временной метке попадают в Biber. В стандартной модели данных нет такого поля как timestamp, поэтому поле просто игнорируется. Есть как минимум два простых способа получить данные отметки времени biblatex:

  1. Объявите новую модель данных с timestampполем.
  2. Переназначить timestampна известное поле (например, временное поле usera).

В дальнейшем мы будем использовать комбинацию этих двух подходов. Мы объявим новое поле датыtimestampdate и сопоставим timestampэто поле с исходной картой Biber (по техническим причинам все поля даты biblatexдолжны заканчиваться на ...date, что timestampdateпоказалось хорошим выбором). Я выбрал этот более сложный путь, потому что тогда мы можем заставить Biber проанализировать поле как дату и вернуть год, месяц и день отдельно. Кроме того, мы можем использовать этот шаг для нормализации форматов даты с YYYY.MM.DDпо YYYY-MM-DD.

Было бы вполне возможно передать timestampкак есть, а не через ...dateполе, но тогда вам придется анализировать дату на стороне LaTeX (что не должно быть слишком сложным).

С датой, прошедшей до, biblatexнам просто нужно проверить, не старше ли мы заданной даты. Это можно просто проверить, последовательно просматривая дату, месяц и день. Для нашего поля даты timestampdateбудет существовать год timestampyear, месяц timestampmonthи т. Д. Мы можем получить доступ к необработанным полям с помощью \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}

Честно говоря, я не уверен, с чего бы вы начали читать об этом программировании. Самым важным моментом здесь является получение данных biblatex, потому что timestampпо умолчанию игнорируется ( Добавление поля «tome» к записям biblatex показывает некоторые методы для получения «нового» поля biblatex). После этого вам «просто» нужно обязательно проанализировать дату и сравнить ее. Есть несколько способов сделать это. Я просто случайно выбрал тот, который включает в себя Biber и biblatexобработку даты, но это не данность. Вы также можете проанализировать все самостоятельно (см. Можно ли проанализировать строку даты в LaTeX, чтобы преобразовать ее в другой формат даты? ).