Kaynakça: sol kenar boşluğuna bir yıldız işareti ekleyerek son referansları otomatik olarak vurgulayın

Aug 19 2020

Bir referans listesini güncelliyorum ve son güncellemeden bu yana eklenen referansları vurgulamak istiyorum. Örneğin, referanstan hemen önce bir yıldız işareti (veya başka bir sembol) eklemek istiyorum (ideal olarak sol kenar boşluğunda veya en azından referansın başında).

Bununla birlikte, zaten sorulan çok sayıda sorunun aksine (örneğin, bazı anahtar kelimelerin ardından yıldız işareti eklenmiştir), yıldız işaretini belirli bir tarihe göre otomatik olarak eklemek istiyorum.

.bib(: Yyyy-aa-tt veya yyyy.mm.dd biçimi), her bir referans, bir alan "zaman damgası" zorunda dosyası JabRef ile oluşturuldu. Bu alan yıldız eklemek için kullanılabilir.

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}

Bu yazıda verilen aşağıdaki kod parçasını başarılı bir şekilde uyarlamaya çalıştım :

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

Örneğin, 31 Ocak 2020'den beri eklenen vurgu referanslarını istiyorum (zaman damgası> = 2020-01-31).

Belki paketi datetime2ve komutları kullanabilir \DTMsavedate{lastupdatedate}{2020-01-31}ve \DTMusedate{lastupdatedate}gelecek güncellemeleri optimize edebiliriz.

  1. Yıldız işaretiyle tanımlanan tüm son referansları nasıl elde edebilirim?
  2. Bu tür bir programlamanın nasıl yapılacağını öğrenmek için hangi belge okunmalıdır?

Yanıtlar

2 moewe Aug 19 2020 at 13:46

Bununla başa çıkmanın birçok yolu olduğunu hayal ediyorum.

Her durumda ilk adım, zaman damgası verilerinin Biber'e ulaştığından emin olmak olacaktır. Standart veri modelinde böyle bir alan yoktur timestamp, bu nedenle alan basitçe yok sayılır. Zaman damgası verilerini almanın en az iki basit yolu vardır biblatex:

  1. timestampAlanla yeni bir veri modeli bildirin .
  2. Yeniden Eşleme timestamp(örneğin sıfırdan alanı 'UserA') bilinen bir alana.

Aşağıda, iki yaklaşımın bir kombinasyonunu kullanacağız. Yeni bir tarih alanı ilan edeceğiz timestampdateve timestampbu alanı bir Biber kaynak haritası ile eşleyeceğiz (teknik nedenlerden dolayı, içindeki tüm tarih alanları ile biblatexbitmelidir ...date, bu yüzden timestampdateiyi bir seçim gibi görünüyordu). Bu daha karmaşık yolu seçtim, çünkü Biber'in alanı tarih olarak ayrıştırmasını ve yıl, ay ve günü ayrı ayrı döndürmesini sağlayabiliriz. Ayrıca, bu adımı ile tarih biçimlerini normalleştirmek için YYYY.MM.DDkullanabiliriz YYYY-MM-DD.

Olduğu timestampgibi ve bir ...datealan üzerinden geçmek mükemmel bir şekilde mümkündür , ancak daha sonra LaTeX tarafındaki tarihi ayrıştırmanız gerekir (ki bu çok zor olmamalıdır).

Tarih geçtikten sonra, biblatexsadece belirli bir tarihten daha yaşlı olmadığımızı kontrol etmemiz gerekiyor. Bu, tarih bölümlerini yıl, ay ve gün tek tek geçerek kolayca kontrol edilebilir. Tarih alanımız timestampdateiçin yılın yaşayacağı timestampyearay, ay timestampmonthvb. İle ham alanlara ulaşabiliriz \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}

Dürüst olmak gerekirse, bunu programlamaya nereden başlayacağınızdan emin değilim. Buradaki en önemli nokta, veriyi almaktırbiblatex , çünkü timestampvarsayılan olarak yok sayılır ( biblatex girişlerine "tome" alanını eklemek , 'yeni' alan almak için bazı yöntemleri gösterir biblatex). Bundan sonra 'sadece' tarihi ayrıştırıp karşılaştırdığınızdan emin olmanız gerekir. Bunu yapmanın birden fazla yolu var. Biber ve biblatextarih işlemeyi içeren bir tane seçtim , ama bu kesin değil. Her şeyi kendiniz de ayrıştırabilirsiniz (bkz . LaTeX'te bir tarih dizesini farklı bir tarih biçimine dönüştürmek için ayrıştırmak mümkün mü? ).