Bibliografi: sorot referensi terbaru secara otomatis dengan menambahkan tanda bintang di margin kiri

Aug 19 2020

Saya memperbarui daftar referensi dan saya ingin menyoroti referensi yang ditambahkan sejak pembaruan terakhir. Misalnya, saya ingin menambahkan tanda bintang (atau simbol lain) tepat sebelum referensi (idealnya di margin kiri atau, setidaknya di awal referensi).

Namun, bertentangan dengan banyak pertanyaan yang telah diajukan (misalnya tanda bintang ditambahkan setelah beberapa kata kunci), saya ingin menambahkan tanda bintang secara otomatis sesuai dengan tanggal tertentu.

The .bibFile diciptakan dengan JabRef, sehingga setiap referensi memiliki lapangan "timestamp" (format: yyyy-mm-dd atau yyyy.MM.dd). Bidang ini dapat digunakan untuk menambahkan tanda bintang.

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}

Saya telah mencoba menyesuaikan potongan kode berikut yang diberikan dalam posting ini , tetapi tidak berhasil:

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

Misalnya, saya ingin referensi sorotan ditambahkan sejak 31 Januari 2020 (stempel waktu> = 2020-01-31).

Mungkin kita dapat menggunakan paket datetime2dan perintah \DTMsavedate{lastupdatedate}{2020-01-31}dan \DTMusedate{lastupdatedate}mengoptimalkan pembaruan yang akan datang.

  1. Bagaimana saya bisa mendapatkan semua referensi terbaru yang ditandai dengan asterisk?
  2. Dokumen apa yang harus dibaca untuk mempelajari cara membuat program jenis ini?

Jawaban

2 moewe Aug 19 2020 at 13:46

Saya membayangkan ada banyak cara untuk mengatasinya.

Langkah pertama dalam hal apa pun adalah memastikan data cap waktu sampai ke Biber. Dalam model data standar tidak ada timestampkolom seperti itu , jadi kolom tersebut diabaikan begitu saja. Setidaknya ada dua cara langsung untuk mendapatkan data stempel waktu ke biblatex:

  1. Deklarasikan model data baru dengan timestamplapangan.
  2. Peta ulang timestampke bidang yang diketahui (misalnya bidang awal 'usera').

Berikut di bawah ini kita akan menggunakan kombinasi dari dua pendekatan. Kami akan mendeklarasikan bidang tanggal baru timestampdatedan akan memetakan timestampbidang tersebut dengan peta sumber Biber (karena alasan teknis semua bidang tanggal biblatexharus diakhiri dengan ...date, jadi timestampdatesepertinya pilihan yang baik). Saya memilih rute yang lebih rumit ini, karena kita dapat meminta Biber mengurai bidang sebagai tanggal dan kembali tahun, bulan, dan hari secara terpisah. Selanjutnya, kita dapat menggunakan langkah ini untuk menormalkan format tanggal dari YYYY.MM.DDmenjadi YYYY-MM-DD.

Sangat mungkin untuk melewati timestampapa adanya dan tidak melalui ...datebidang, tetapi kemudian Anda harus mengurai tanggal di sisi LaTeX (yang seharusnya tidak terlalu rumit).

Dengan tanggal yang dilalui, biblatexkami hanya perlu memeriksa apakah kami tidak lebih tua dari tanggal yang ditentukan. Itu dapat dengan mudah diperiksa dengan melihat bagian tanggal tahun, bulan dan hari satu per satu. Untuk bidang tanggal kami timestampdatetahun akan tinggal timestampyear, bulan timestampmonthdll. Kami dapat mengakses bidang mentah dengan \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}

Sejujurnya, saya tidak yakin dari mana Anda akan mulai membaca tentang pemrograman ini. Poin terpenting di sini adalah mendapatkan data ke biblatex, karena timestampdiabaikan secara default ( Tambahkan kolom "tome" ke entri biblatex menunjukkan beberapa metode untuk mendapatkan kolom 'baru' biblatex). Setelah itu Anda 'hanya' perlu memastikan untuk mengurai tanggal dan membandingkannya. Ada banyak cara untuk melakukannya. Saya kebetulan memilih salah satu yang melibatkan Biber dan biblatexpenanganan tanggal, tetapi ini tidak diberikan. Anda juga dapat mem-parsing semuanya sendiri (lih. Apakah mungkin untuk mengurai string tanggal di LaTeX untuk mengubahnya ke format tanggal yang berbeda? ).