完全指南:從 Zotero Extra 到 Bib(La)TeX/CSL 輸出)
科研【免費(fèi)下載鏈接】zotero-better-bibtexMake Zotero effective for us LaTeX holdouts項(xiàng)目地址https://gitcode.com/gh_mirrors/zo/zotero-better-bibtex點(diǎn)擊查看免費(fèi)下載導(dǎo)讀Zotero 的標(biāo)準(zhǔn)字段有時(shí)無法容納你希望出現(xiàn)在導(dǎo)出條目中的全部信息例如法律法規(guī)的court、專利申請的assignee、或任意自定義 LaTeX 字段。本文基于 Better BibTeX 官方文檔 site/content/exporting/extra-fields.md系統(tǒng)講解如何利用 Zotero 的 cheater syntax在extra字段中以獨(dú)立行寫入Label: value向?qū)С鼋Y(jié)果注入任意字段并深入剖析 BBT 特有的tex./bibtex./biblatex.前綴語法、三種字段類型text/date/name的處理規(guī)則、原始 LaTeX 直通機(jī)制以及 postscript 中通過extra.kv.變量名訪問這些字段的完整方式。讀完后你將能精準(zhǔn)控制 BibTeX/BibLaTeX 與 CSL JSON/YAML 的導(dǎo)出內(nèi)容不再受 Zotero 內(nèi)置字段限制。Cheater syntax在 Extra 字段中聲明任意數(shù)據(jù)所有 Zotero 條目都自帶一個(gè)extra字段它最初用于存放非結(jié)構(gòu)化的補(bǔ)充信息。Zotero 的引文處理器支持在其中識別所謂的 cheater syntax——把每個(gè)字段寫成獨(dú)立的一行格式為Label: value例如Original Date: 1856 Court: Supreme Court of the United StatesBBT 同樣理解這套語法并且額外添加了一種屬于自己的cheater 語法下文 BBT 專屬前綴 一節(jié)詳述。此外BBT 還兼容一種更古老的寫法官方文檔明確標(biāo)注該格式仍被支持但已廢棄{:csl-variable: value}例如{:original-date: 1856}。兩種寫法效果等價(jià)但建議新數(shù)據(jù)一律使用Label: value形式。解析器的正則實(shí)現(xiàn)BBT 對這兩種格式的解析可以在 content/extra.ts 中看到。解析器維護(hù)三套正則const re { old: /^{:(?key[^:])(?assign:)\s*(?value[^}])}$/i, // 廢棄的 {:csl-var: value} 形式 new: /^(?:(?tex(bib(la)?)?tex\.)|(?cslcsl\.))?(?key[^:])\s*(?assign[:])\s*(?value[\S\s]*)/i, // Label: value quoted: /^(?:(?tex(bib(la)?)?tex\.)|(?cslcsl\.))?(?key[^])\s*(?assign[:])\s*(?value[\S\s]*)/i, // 帶引號的 Label }注意new正則已經(jīng)內(nèi)建了對可選前綴tex.、biblatex.、bibtex.、csl.的識別并用:或兩種賦值符區(qū)分不同的處理模式quoted變體則允許把帶空格的標(biāo)簽用引號包裹Label: value且解析順序上先匹配 quoted 再匹配 new避免引號內(nèi)的冒號干擾。三種字段類型BBT 把 cheater 字段分為三類類型說明示例text普通文本原樣處理Archive: BNF archivesdate日期值Original Date: 1856-03-04name人名/機(jī)構(gòu)名Interviewer: Emily WatsonDate日期BBT 會盡最大努力解析各種瘋狂的日期寫法這也是 content/dateparser.ts 存在的意義但如果希望結(jié)果穩(wěn)定一致官方文檔強(qiáng)烈建議統(tǒng)一使用YYYY-MM-DD格式。Name人名可以只寫一段文本——等價(jià)于 Zotero 中的單段式名稱機(jī)構(gòu)名也可以使用||分隔符顯式給出姓與名Interviewer: Watson || Emily在 content/extra.ts 中可以看到name 類型值會按/\s*\|\|\s*/切分為兩部分cslCreator將其映射為 CSL 的{ family, given }結(jié)構(gòu)單段則作為literal即機(jī)構(gòu)名zoteroCreator則映射為 Zotero 的{ lastName, firstName }結(jié)構(gòu)。因此在 CSL 與 Zotero 兩條導(dǎo)出鏈路中name 字段都會被正確處理。字段如何映射到導(dǎo)出變量重要但略有繞寫入extra的標(biāo)簽會被映射到兩種不同的變量體系Zotero 字段如accessDate、archiveLocation、DOI、pagesCSL 變量如accessed、original-date、DOI、page。映射到哪個(gè)體系取決于你導(dǎo)出到哪種格式官方文檔自己也承認(rèn)這一點(diǎn) depends (sorry)導(dǎo)出到 CSLBetter CSL JSON / Better CSL YAML時(shí)優(yōu)先嘗試映射到對應(yīng)的 CSL 字段如果找不到對應(yīng)的 CSL 字段則以Zotero 字段名暴露。導(dǎo)出到 Better BibTeX / Better BibLaTeX 時(shí)優(yōu)先嘗試映射到對應(yīng)的 Zotero 字段如果找不到對應(yīng)的 Zotero 字段則以CSL 變量名暴露。這一邏輯在 content/extra.ts 中有精確實(shí)現(xiàn)if (options.kv) { const [ primary, secondary ] mode csl ? [csl, zotero] : [zotero, csl] if (key _eprint) { extraFields.kv![key] value; return false } if ((ef Schema.labeled[primary][key]) addMappedField(ef, value)) return false // Secondary fallback only when the key is not known in the primary mode. // Unprefixed type does not fall back to CSL in Zotero mode. if ((mode csl || key ! type) !Schema.labeled[primary][key] (ef Schema.labeled[secondary][key]) addMappedField(ef, value)) return false }其中mode在 bibtex 導(dǎo)出器調(diào)用Extra.get(item.extra, zotero)見 translators/bibtex/exporter.ts時(shí)為zotero在 CSL 鏈路則傳csl。Schema.labeled是 BBT 在 content/item-schema.ts 中構(gòu)建的標(biāo)簽 → 字段雙向索引zotero與csl兩張查找表它由 Zotero 與 CSL 的 JSON schema 驅(qū)動生成。在 postscript 中訪問這些字段這些 extra 字段在 postscript腳本化導(dǎo)出 中統(tǒng)一以extra.kv.變量名暴露。具體是哪個(gè)變量名遵循上面的映射規(guī)則CSL 導(dǎo)出用 CSL 名失敗則 Zotero 名Bib(La)TeX 導(dǎo)出用 Zotero 名失敗則 CSL 名。extra.kv只是解析結(jié)果Fields結(jié)構(gòu)的一部分完整結(jié)構(gòu)見 content/extra.tsexport type Fields { raw: Recordstring, string // 未歸一化的原始鍵值 kv?: Recordstring, string // 按模式映射后的 text/date 字段 csl?: Recordstring, string // 顯式 csl.* 前綴字段 creator: Recordstring, string[] // name 類型字段按 creator 角色分組 creators: Creator[] // name 類型字段的完整列表 tex?: Recordstring, TeXString // tex./bibtex./biblatex. 前綴字段 aliases?: string[] // 引文鍵別名 }在導(dǎo)出端BibTeX/BibLaTeX 導(dǎo)出器確實(shí)大量消費(fèi)這個(gè)結(jié)構(gòu)例如 translators/bibtex/bibtex.ts 中item.DOI || item.extraFields.kv!.DOI與item.url || item.extraFields.kv!.url以及 translators/bibtex/biblatex.ts 中的 URL/DOI 回退邏輯——這意味著即使條目沒有填寫標(biāo)準(zhǔn)url/DOI字段你也可以通過 cheater 語法補(bǔ)上。CSL 側(cè)同樣如此見 translators/csl/csl.tsextraFields.kv!.originalDate參與日期回退。BBT 專屬前綴tex. / bibtex. / biblatex.除了標(biāo)準(zhǔn)的 cheater 語法BBT 還提供一套專屬的 extra 字段格式tex.field: value這些字段不會被映射到任何 Zotero/CSL 變量而是被 BBT原樣復(fù)制到輸出中。例如在extra中寫tex.bestfield: philosophy導(dǎo)出的 Bib(La)TeX 中就會出現(xiàn)bestfield {philosophy}即tex.前綴之后的bestfield直接成為 bib(la)tex 字段名。限定導(dǎo)出目標(biāo)bibtex. 與 biblatex.你可以通過更換前綴讓字段只在某一類導(dǎo)出中出現(xiàn)tex.bestfield:—— 無論 BibTeX 還是 BibLaTeX 導(dǎo)出都會輸出bibtex.bestfield:—— 僅在BibTeX導(dǎo)出時(shí)輸出biblatex.bestfield:—— 僅在BibLaTeX導(dǎo)出時(shí)輸出。這個(gè)前綴過濾邏輯在 translators/bibtex/exporter.ts 中實(shí)現(xiàn)導(dǎo)出器先按當(dāng)前翻譯器this.translation.BetterBibLaTeX ? biblatex. : bibtex.選出目標(biāo)前綴再與通用前綴tex.一起把匹配的字段剝掉前綴后進(jìn)入輸出不匹配的字段被刪除if (item.extraFields.tex) { // strip extra.tex fields that are not for me const prefix this.translation.BetterBibLaTeX ? biblatex. : bibtex. for (const [ name, field ] of Object.entries(item.extraFields.tex).sort((a, b) strcmp.variant(b[0], a[0]))) { for (const type of [ prefix, tex. ]) { if (name.startsWith(type)) { item.extraFields.tex[name.substr(type.length)] field break } } delete item.extraFields.tex[name] } }排序時(shí)tex.在biblatex./bibtex.之前因此同一標(biāo)簽同時(shí)出現(xiàn)tex.與bibtex.變體時(shí)后者優(yōu)先。:與文本轉(zhuǎn)義 vs 原始 LaTeX 直通前綴字段的分隔符同樣有兩種語義截然不同:冒號冒號之后的內(nèi)容被視為普通文本。BBT 會對其進(jìn)行 LaTeX 轉(zhuǎn)義例如會被轉(zhuǎn)義并應(yīng)用大小寫保護(hù)規(guī)則。等號等號之后的內(nèi)容被視為raw LaTeX——BBT不做任何轉(zhuǎn)義原樣照抄進(jìn)輸出文件。因此官方文檔給出了一對正反示例。想要文本轉(zhuǎn)義與大小寫保護(hù)時(shí)用冒號tex.corp: Black Decker tex.formula $\sum\limits_{i1}^{n} -p(m_{i})\log_{2}(p(m_{i}))$而下面這種寫法是有問題的——公式用了冒號會被轉(zhuǎn)義破壞用了等號則變成未轉(zhuǎn)義的裸 LaTeXtex.corp Black Decker tex.formula: $\sum\limits_{i1}^{n} -p(m_{i})\log_{2}(p(m_{i}))$注意同一行里與$...$混用時(shí)必須各自選對分隔符這正是上面第一個(gè)示例的用意。該模式assign 時(shí)mode raw同樣定義在 content/extra.tsconst texmode (assign ) ? raw : (tex (tex.includes(T) || tex.match(/^[A-Z]/)) ? cased : undefined)TeXString類型content/extra.ts就是{ value, mode?: raw | cased, line }三要素raw對應(yīng)cased對應(yīng)大小寫保護(hù)見下一節(jié)line記錄其在 extra 中的原始行號以便報(bào)錯(cuò)定位。大小寫保護(hù)在前綴中加入大寫B(tài)BT 會對非 raw即冒號形式的字段應(yīng)用大小寫保護(hù)規(guī)則——你只需把前綴里的字母大寫即可。例如TeX.corp: Black Decker就會以大小寫保護(hù)的方式輸出corp字段從而在標(biāo)題化title-casing時(shí)保護(hù)詞首大寫。實(shí)現(xiàn)上texmode判定中的tex.includes(T) || tex.match(/^[A-Z]/)正是檢測前綴是否含大寫字母content/extra.ts隨后字段鍵會被tex tex tex.toLowerCase()歸一化而mode: cased保留在TeXString中供編碼器使用。兩個(gè)需要注意的限制這些 BBT 專屬字段只被 BBT 認(rèn)識。官方文檔明確提醒其他導(dǎo)出器不認(rèn)識tex./bibtex./biblatex.前綴某些第三方導(dǎo)出器甚至可能把它們當(dāng)作 notes 輸出——這是無法干預(yù)的。它們同樣會被 Zotero 的引文處理器忽略不像無前綴的 CSL 變量那樣參與 Zotero 內(nèi)部引文處理。完整標(biāo)簽 / 變量對照表官方文檔在 site/layouts/shortcodes/extra-fields.md 中維護(hù)了一份完整的標(biāo)簽對照表通過 Hugo shortcode{{% extra-fields %}}注入文檔。表格列出的是Zotero 字段而不是 bibtex 字段——Zotero 字段到 bibtex 字段的翻譯非常復(fù)雜官方暫未提供簡明的對應(yīng)描述。下表精選了最常用的標(biāo)簽完整列表約 150 項(xiàng)請直接查看上述 shortcode 文件標(biāo)簽Label類型Zotero 字段CSL 變量Original DatedateoriginalDateoriginal-dateAuthornameauthor / creatorauthorContainer Titletextcode / publicationTitle / reportercontainer-titleDatedatedateissuedDOItextDOIDOIEvent PlacetexteventPlaceevent-placeFiling DatedatefilingDatesubmittedGenretextgenre / programmingLanguage / typegenreIssuetextissue / priorityNumbersissueIssueddatedateissuedNumbertextnumbernumberPagestextpagespagePublication TitletextpublicationTitlecontainer-titlePublishertextpublisherpublisherReferencestexthistory / referencesreferencesRightstextrightslicenseSeriestextseriescollection-titleSourcetextlibraryCatalogsourceTitletexttitletitleURLtexturlURLVolumetextcodeNumber / volumevolumeYear Suffixtext—year-suffix表注① 標(biāo)記為 Juris-M only 的字段如attorneyAgent、assignee、court、wordsBy等法律領(lǐng)域字段僅在 Juris-M 中受支持標(biāo)準(zhǔn) Zotero 中部分標(biāo)簽如applicationNumber、archiveID / number、issueDate等會通過斜杠/給出的多個(gè) Zotero 字段做回退映射。幾個(gè)值得特別說明的映射細(xì)節(jié)同一 Zotero 字段可能由多個(gè)標(biāo)簽共享如publicationTitle同時(shí)由Blog Title、Book Title、Container Title、Dictionary Title、Proceedings Title、Publication Title、Session Title、Website Title等標(biāo)簽映射同一標(biāo)簽也可能映射到多個(gè) Zotero 字段斜杠分隔取第一個(gè)命中的custom標(biāo)簽沒有對應(yīng)的 Zotero/CSL 字段表格中留空用于攜帶純自定義信息多個(gè) CSL 變量如title-short、archive_location、first-reference-note-number在 Zotero 側(cè)沒有對應(yīng)字段它們正是導(dǎo)出到 Bib(La)TeX 時(shí)以 CSL 變量名暴露的典型場景反之a(chǎn)rchiveID、codePages、reporterVolume、seriesText等只有 Zotero 字段沒有 CSL 變量屬于導(dǎo)出到 CSL 時(shí)以 Zotero 字段名暴露的情況。實(shí)戰(zhàn)建議與注意事項(xiàng)日期用 ISO 格式BBT 雖然會盡力解析各種人類花式日期March 4, 1856、1856/03等但為了跨導(dǎo)出器與跨版本的一致結(jié)果請一律使用YYYY-MM-DD。人名用 || 分隔需要結(jié)構(gòu)化人名時(shí)使用family || given姓在前、名在后符合 CSL/Zotero 的慣用順序單個(gè)字符串則按機(jī)構(gòu)/單段名處理。raw LaTeX 的邊界只有當(dāng)你確定內(nèi)容已是合法 LaTeX 時(shí)才用包含、%、_、$等特殊字符的普通文本務(wù)必用:讓 BBT 完成轉(zhuǎn)義。postscript 聯(lián)動所有 cheater 字段都可以在 postscript 中通過extra.kv.變量名讀取配合tex.add({ name, value, enc })API 可以做非常精細(xì)的二次加工而tex.前綴字段則可以直接驅(qū)動tex.entrytype這類特殊字段——在 translators/bibtex/entry.ts 中可以看到tex.entrytype的值會被用作導(dǎo)出條目的類型例如強(qiáng)制輸出customa{...}之類條目tex.referencetype作為其過渡期別名同樣被支持。免去為每個(gè)條目手工輸入的自動化把反復(fù)使用的 cheater 行寫入 string 偏好preferences 或利用自動導(dǎo)出 模板可以避免在每條記錄里重復(fù)手工輸入相同字段這也是官方推薦的工作流方向詳見 自動導(dǎo)出??偨Y(jié)Zotero 的extra字段 cheater syntax 提供了一條不修改任何源碼即可注入任意導(dǎo)出字段的通道而 BBT 在此基礎(chǔ)上追加了tex./bibtex./biblatex.前綴、raw LaTeX 直通和大小寫保護(hù)讓 Bib(La)TeX 用戶得以完全掌控最終 .bib 文件的內(nèi)容。核心實(shí)現(xiàn)集中在 content/extra.ts解析與映射、content/item-schema.ts標(biāo)簽索引與 translators/bibtex/exporter.ts前綴過濾三處配合文末的完整標(biāo)簽對照表你可以隨時(shí)查表定位任意標(biāo)簽在 Zotero 與 CSL 兩側(cè)的落點(diǎn)。贊分享科研【免費(fèi)下載鏈接】zotero-better-bibtexMake Zotero effective for us LaTeX holdouts項(xiàng)目地址https://gitcode.com/gh_mirrors/zo/zotero-better-bibtex點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Zotero Better BibTeX 終極指南CSL JSON與CSL YAML導(dǎo)出格式詳解Zotero Better BibTeX 終極指南CSL JSON與CSL YAML導(dǎo)出格式詳解 想要讓Zotero引用管理更加高效專業(yè)嗎 作為LaTe科研pandoc 將 BibTeX 轉(zhuǎn)換為 CSL JSONurl 與 doi 字段的逐字輸出行為詳解pandoc 將 BibTeX 轉(zhuǎn)換為 CSL JSONurl 與 doi 字段的逐字輸出行為詳解 導(dǎo)讀 本文圍繞 pandoc 的命令行用法 pandoc文檔開發(fā)工具CLI上一篇openpilot部署實(shí)戰(zhàn)5個(gè)高效技巧解決駕駛輔助系統(tǒng)核心問題下一篇洛雪音樂音源終極指南5分鐘打造你的免費(fèi)高品質(zhì)音樂庫創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考