
我有一個問題,我使用引文管理器 Citavi,它只能以 格式匯出urldate = {dd.mm.yyyy}
。然而 Bibtex 需要格式urldate = {yyyy-mm-dd}
。就我而言,手動更改參考書目的所有日期並不現實,因為我有很多條目,每次匯出後我都需要重做。
例如我的 bibtex 條目如下圖所示:
@Misc{FAO.2011,
Title = {{FAOSTAT: Food balance sheet}},
Author = {FAO},
Year = {2011},
Address = {Rome},
Url = {http://faostat3.fao.org/download/FB/FBS/E},
Urldate = {15.1.2014}
}
然後,當我用 BibTex 編譯它時,我收到以下警告
Package biblatex Warning: Biber reported the following issues
(biblatex) with 'FAO.2011':
(biblatex) - Datamodel: Entry 'FAO.2011' (literature.bib): Inval
id format '15.1.2014' of date field 'urldate' - ignoring.
有什麼方法可以更改 Bibtex 的格式,它讀取urldate
in 格式urldate = {dd.mm.yyyy}
,或者我可以以某種方式將其轉換為 嗎urldate = {yyyy-mm-dd}
?
我在網路上搜尋過,但沒有找到解決這個問題的方法。這似乎是 Citavi 的一個特定問題。不幸的是 Citavi 不可自訂。
我的問題與此類似:忽略參考書目欄位 [例如“urldate”] 以消除 biblatex/biber 警告。但是,本主題沒有為我的問題提供解決方案,因為在這種情況下urldate
不需要,因此被忽略。但我需要付出urldate
。
答案1
感謝 Giacomo 的回饋,我找到了另一個針對此特定問題的解決方案:
這個問題在某種程度上與 Citavi 更相關,而 Citavi 不像 LaTeX 那樣清晰或透明。供其他可能遇到類似問題的人參考:雖然 Citavi 要求提供格式的日期,但urldate={dd.mm.yyyy}
您可以將其輸入為urldate = {yyyy-mm-dd}
.出口不會有任何問題。奇怪的是,只要更改一個條目,所有其他條目都會相應匯出。我的錯沒有早點嘗試。我應該早點嘗試一下。
答案2
如果您正在使用biblatex
包,您可以使用
\DeclareSourcemap{
\maps{
\map[overwrite]{
\step[fieldsource=urldate,
match=\regexp{([0-9]{2})\.([0-9]{2})\.([0-9]{4})},
replace={$3-$2-$1},
final]
}
}
}
在序言中重新格式化urldate
輸入檔案的欄位*.bib
。
答案3
為了在 BibTeX 中強制格式化,我使用雙括號,例如:
Urldate = {{15/01/2014}}
答案4
我編寫了一個小 python 腳本來更改 urldate 的格式:將 .bib 檔案放在與該腳本相同的目錄中,並將其命名為「quellen.bib」並運行該腳本。將出現一個名為「changedFile.bib」的新格式化文件
import re
file = open("quellen.bib","r");
fileChanged = open("changedFile.bib","w");
pattern = re.compile("([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{4})");
for line in file:
if "urldate =" in line and pattern.search(line):
#save end of line to add it later to the modified date
endline = line[line.index('}')+1:len(line)];
date = line[line.index('{')+1:line.index('}')];
month = int(date[0:date.index('/')]);
date = date[date.index('/')+1:len(date)];
day = int(date[0:date.index('/')]);
date = date[date.index('/')+1:len(date)];
year = int(date);
if month > 12:
# check if month and day are reversed
temp = day;
day = month;
month = temp;
# check if every value is ledgit
if(month > 0 and month < 13 and day >0 and day < 32 and year > 1000):
if(month<10):
#add 0 if month or day is less then 10
month = "0"+str(month);
if(day<10):
day = "0"+str(day);
fileChanged.write(" urldate = {"+ str(year)+"-"+str(month)+"-"+str(day)+"}"+endline);
else:
print("something is wrong with this line: ");
print("day: ",day,"montH: ",month, "year: ",year);
print(line);
else:
fileChanged.write(line);
file.close;
fileChanged.close;