参考文献:左マージンにアスタリスクを追加して、最近の参照を自動的に強調表示します

Aug 19 2020

参考文献のリストを更新していますが、前回の更新以降に追加された参考文献を強調したいと思います。たとえば、参照の直前(理想的には左マージン、または少なくとも参照の先頭)にアスタリスク(または別の記号)を追加したいと思います。

ただし、すでに尋ねられている多くの質問(たとえば、いくつかのキーワードの後に​​アスタリスクが追加されている)とは異なり、特定の日付に従ってアスタリスクを自動的に追加したいと思います。

.bib各参照フィールド「タイムスタンプ」(:YYYY-MM-DDまたはYYYY.MM.DDフォーマット)を有するように、ファイルは、JabRefので作成されました。このフィールドは、アスタリスクを追加するために使用できます。

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}%
    }{}%
}

たとえば、2020年1月31日以降に追加された参照を強調表示したいと思います(タイムスタンプ> = 2020-01-31)。

たぶん、パッケージdatetime2とコマンド\DTMsavedate{lastupdatedate}{2020-01-31}を使用して\DTMusedate{lastupdatedate}、今後の更新を最適化することができます。

  1. アスタリスクで識別される最近のすべての参照を取得するにはどうすればよいですか?
  2. このタイプのプログラミングを行う方法を学ぶには、どのドキュメントを読む必要がありますか?

回答

2 moewe Aug 19 2020 at 13:46

これに対処する方法はたくさんあると思います。

いずれの場合も、最初のステップは、タイムスタンプデータがBiberに確実に届くようにすることです。標準データモデルには、のようなフィールドがないtimestampため、フィールドは単に無視されます。タイムスタンプデータを取得するには、少なくとも2つの簡単な方法がありますbiblatex

  1. timestampフィールドを使用して新しいデータモデルを宣言します。
  2. timestamp既知のフィールド(たとえば、スクラッチフィールド「usera」)に再マップします。

以下では、2つのアプローチを組み合わせて使用​​します。新しい日付フィールドを宣言し、そのフィールドをBiberソースtimestampdateマップでマップtimestampします(技術的な理由から、のすべての日付フィールドはでbiblatex終わる必要が...dateあるためtimestampdate、良い選択のように思われました)。このより複雑なルートを選択したのは、Biberにフィールドを日付として解析させ、年、月、日を別々に返すことができるためです。さらに、この手順を使用して、日付形式をからYYYY.MM.DDに正規化できますYYYY-MM-DD

フィールドtimestampを経由せずにそのまま通過することは完全に可能...dateですが、LaTeX側で日付を解析する必要があります(これはそれほど難しいことではありません)。

日付が渡されbiblatexたら、指定された日付より古くないかどうかを確認する必要があります。それは、日付部分の年、月、日を1つずつ確認するだけで簡単に確認できます。日付フィールドの場合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で日付文字列を解析して別の日付形式に変換することは可能ですか?)。