bibtex - 改變 urldate 的格式

bibtex - 改變 urldate 的格式

我有一個問題,我使用引文管理器 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 的格式,它讀取urldatein 格式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;

    

相關內容