Kaynakça: sol kenar boşluğuna bir yıldız işareti ekleyerek son referansları otomatik olarak vurgulayın
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 datetime2
ve komutları kullanabilir \DTMsavedate{lastupdatedate}{2020-01-31}
ve \DTMusedate{lastupdatedate}
gelecek güncellemeleri optimize edebiliriz.
- Yıldız işaretiyle tanımlanan tüm son referansları nasıl elde edebilirim?
- Bu tür bir programlamanın nasıl yapılacağını öğrenmek için hangi belge okunmalıdır?
Yanıtlar
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
:
timestamp
Alanla yeni bir veri modeli bildirin .- 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 timestampdate
ve timestamp
bu alanı bir Biber kaynak haritası ile eşleyeceğiz (teknik nedenlerden dolayı, içindeki tüm tarih alanları ile biblatex
bitmelidir ...date
, bu yüzden timestampdate
iyi 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.DD
kullanabiliriz YYYY-MM-DD
.
Olduğu timestamp
gibi ve bir ...date
alan ü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, biblatex
sadece 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 timestampdate
için yılın yaşayacağı timestampyear
ay, ay timestampmonth
vb. İ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ü timestamp
varsayı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 biblatex
tarih 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ü? ).