我遇到的问题是,我使用引文管理器 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
格式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
我编写了一个可以更改 urldate 格式的小 Python 脚本:将您的 .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;