CSL 和 bibtex/biblatex 之间的意识形态差异是什么?我知道曾经有过讨论这里介绍了如何将 CSL 与 LaTeX 结合使用,但它们的区别(以及原因)以及为什么应该存在几种引用/参考书目的样式方法,这一点并不明显。是不是因为 bib(la)tex 旨在使用 LaTeX 进行引用,而 CSL 旨在使用 MS Word/LibreOffice 等办公套件进行引用?哪个更通用(在什么意义上)?为什么 CSL 似乎在 Zotero 和 Mendeley 等软件中更受欢迎(写作风格比 biblatex 更简单吗?)?除了 CSL 和 bib(la)tex 之外,还存在其他用于格式化引用/参考文献的标准化系统吗?
我曾尝试自己解决这些问题。坦白地说,我发现CSL 规范不是很有启发性(对我来说,biblatex 是记录更严格)。事实上,CSL 甚至没有指定哪种元数据对于哪种文档类型是必需的(当然,在 biblatex 中,必需/可选的划分也变得有些不严格和依赖于样式,但它仍然存在)。更奇怪的是,CSL 中的类型定义根本没有解释!例如,article
与其他文章(article-journal
,article-magazine
和)有什么区别?或者和article-newspaper
之间的区别?我找不到答案。post
post-weblog
对我来说特别奇怪的是以下情况。biblatex 和 CSL 的最终目标都是相同的:设计引文和参考书目。然而,CSL 变量和 biblatex 数据字段的重叠度大约为 60-70%。他们怎么能用不同的数据做同样的事情呢?例如,biblatex 中没有这些 CSL 变量的类似物:,,,,,,,,...archive_location
同时,CSL中也没有这些 biblatex 字段的archive-place
类似物:,,,,,,...call-number
medium
reviewed-author
illustrator
jurisdiction
subtitle
titleaddon
eprint
reprinttitle
origlanguage
抱歉,这些问题并非严格与 TeX 相关,但我还能在哪里找到答案。
答案1
更新
对使用 CSL 和 LaTeX 感兴趣的人可能想看看https://www.ctan.org/pkg/citation-style-language.例如参见https://tex.stackexchange.com/a/618815/35864。
这可能不会是一个完整的答案,但也许它可以阐明 CSL 的整个问题biblatex
。
历史与介绍
biblatex
开发工作于 2006 年开始,2008 年取得了重大里程碑,2010 年发布了第一个正式版本 1.0。根据维基百科,CSL 的出现时间大致相同,甚至可能更早一些(有可追溯到 2004 年的页面与之相关,Zotero 在 2006 年发布时就支持 CSL)。
biblatex
基本上是对 BibTeX 创建书目方式的重新实现和重新发明,这种方式自 20 世纪 80 年代末以来就一直存在于 TeX 世界中。有了 BibTeX,.bst
自己的格式编写文件逆波兰表示法语言决定了参考书目的输出。 BibTeX 编译文件中的所有信息.bib
并.bbl
以预期格式将其输出到,然后 LaTeX 只需导入.bbl
并排版其内容即可。biblatex
另一方面,格式化是在 LaTeX 端完成的。这意味着参考书目样式和引用命令可以用 TeX 编写,使那些不想学习 BibTeX 逆波兰表示法的人更容易理解。后端(BibTeX 或 Biber,后者是享受全套功能所必需的biblatex
)被简化为从文件中提取相关条目.bib
,对它们进行排序并将它们解析为可用于 LaTeX 的数据结构。所有这些意味着它biblatex
仍然与 LaTeX 世界紧密相连,并且在它之外可能没有多大用处。biblatex
的标准数据模型是“通常的 BibTeX 数据模型”(即 BibTeX 样式支持的类型和字段)的扩展。甚至在此之前,biblatex
一些书目包中的相当多的功能是在 LaTeX 方面实现的,甚至更多的样式允许通过 LaTeX 宏进行修改(想想natbib
,,jurabib
......),但biblatex
为所有级别的样式提供了统一的 LaTeX 界面。
CSL 是一种基于 XML 的引文和参考书目样式语言。它旨在成为一种可供各种参考管理器和文字处理器使用的通用语言。据我所知,CSL 拥有大多数(如果不是全部)功能的专属版本biblatex
(我认为它具有一些没有的功能biblatex
,并且可以更好地解决某些问题,我特别考虑的是引文与参考书目排序)。CSL 的巨大优势在于biblatex
它的社区和覆盖范围:似乎很多人都在使用 CSL,并且有大量的样式可供使用。有许多样式可用biblatex
,但最终人们往往不得不自己对样式进行一些修改。我认为这种情况很少发生在 CSL 样式上。
意识形态差异
我实际上并不认为除了biblatex
基本上只支持 LaTeX 并且 CSL 应该是一个通用标准之外,存在很大的意识形态差异。
为什么应该存在不同的方法?
我认为这样的事情自然会发生。此外,我大胆猜测,这两个项目最初都不知道对方的存在。
BibTeX 在被构思出来时已经存在了一段时间biblatex
,但是即使对于有经验的 TeX 用户来说它也有点复杂,因为它使用了完全不同的语言。biblatex
仍然向后兼容 BibTeX,因此biblatex
人们可以轻松地过渡到 BibTeX。biblatex
和 BibTeX 共享.bib
已经存在多年的相同文件库,人们已经习惯了它,许多程序和网站都可以导出到.bib
...有一个.bib
生态系统——一旦掌握了它,.bib
文件就很容易使用。
在 TeX 世界中,参考书目不仅仅是biblatex
:为什么amsrefs
和biblatex
共存?为什么会有natbib
和jurabib
,...?
另一方面,CSL 从未只针对 TeX,因此它实际上并不需要 TeX 才能起步。由于 TeX 已经有了一个有效的引文和参考书目系统,因此从未真正需要 CSL 实现。我认为这两个事实导致了我们今天看到的结果:还没有人为 LaTeX 实现 CSL——而那些考虑这样做的人必须认真考虑在这样的项目上花费的工作是否值得。
为何 CSL 受到参考文献管理者的青睐?
因为它是一个完善的标准(至少在我看来是这样),基于人们熟悉并且能够真正理解的无处不在的 XML。biblatex
另一方面,它是用 LaTeX 编写并用 LaTeX 进行配置,这意味着如果软件想要使用它,它必须解析 LaTeX(以这种或那种方式,不一定是全部,但 XML 似乎更容易)。
我从未编写过 CSL 样式,但我想说编写 CSL 样式看起来比编写样式更容易biblatex
,特别是如果你不熟悉 LaTeX 的话。标准biblatex
样式和大多数贡献样式(遵循标准样式设置的示例)的结构表现出一些特性,如果一个人以类似于 CSL 的方式从头编写样式,他可能不一定会遵循这些特性biblatex
,因此这种比较可能有点不公平:apa.csl
大约有 720 行,而apa.bbx
和apa.cbx
(的主体部分biblatex-apa
)加起来大约有2800行代码。
重叠小
从纸面上看,CSL 和 CSL 之间的重叠biblatex
可能确实只有 60-70%(我的感觉是重叠更高,但我没有检查过),但差异在于很少使用且不那么常见的字段和条目类型。如果我们按使用率添加权重,我会说我们最终的重叠水平接近 90%。在大多数情况下,您的平均书目(带有 DOI 的期刊文章、一本书、一个集合中的一篇论文、一个简单的网站......)可能可以在不丢失信息的情况下从一个系统转移到另一个系统。
至于为什么名义重叠比人们预期的类似系统要小,这可能只是文化和实施者的问题。我认为可以公平地说,BibTeX 的开发biblatex
基本上是由一位开发人员完成的,并得到了 TeX 社区的投入(主要但肯定不完全来自 STEM 相关领域;biblatex
受到以法律为重点的jurabib
项目的巨大影响)。CSL 的开发似乎一开始也是由一两个人推动的,但他们的投入可能不仅来自 TeX,还来自更多样化或至少不同的人群(Open/Libre Office、Zotero)。您列出的 CSL 中缺失的许多字段看起来biblatex
像是图书管理员可能立即想到的东西。CSL 中列出的缺失但存在的字段biblatex
是一组更不均匀的字段,似乎它们解决了某些人可能认为不太重要的特定问题(subtitle
使作者标题引用更短,通常可以删除副标题,titleaddon
用于附加注释,eprint
用于 arXiv 等存储库)。
答案2
我是CSL的创建者,我最初创建它的原因非常简单:
- 虽然我使用过 LaTeX,但我的工作领域需要与 Word 兼容的文件;因此不接受 LaTeX。
- 我认为这种样式不需要与输出格式紧密耦合。所以我的原型 XSLT 实现有 LaTeX(绕过 BibTeX)、HTML 和 RTF 的输出驱动程序,如果我没记错的话。我发现它运行得很好,并且是一个概念验证(我用它来格式化我的第一本书),并且从那时起一直是我的首要任务。
这种输出灵活性的另一个优点是 CSL 样式的潜在用户群会更大,从而可以支持更多样式。
不过,我非常尊重 biblatex;如果你能专门使用 LaTeX 工作,它是一个很好的解决方案。
但是如果您需要非 LaTeX 输出目标,您可能想要使用 CSL。
答案3
这不是一个答案,更多的是对可行性的思考。
鉴于biblatex
目前的能力,CSL-Latex“风格”肯定是可能的。
此外,在当前的 中,在一个文档中使用多种引用样式也是可能的,因此对于元语言来说,biblatex
与之相当的 CSL 版本可能被称为类似的东西。CSLL
Biblatex
正在做这么多事情,“轴”的概念可能会很有用。CSL 将涉及样式轴(也许还有项目序列轴)。
以法律引用为例,法律引用基本上是一种作者-标题系统,其中作者被理解为(法院,议会,监管机构),标题是案件,法规或法规的名称。
参考文献所需的粒度级别由所有合法引用样式中的最低级别规范决定。例如,一种样式要求一个直立的 v(“versus”),后面跟着一个缩写点 (v.
例如《现代法律评论》),而另一种样式则要求使用无点斜体 v(五例如加拿大的麦吉尔大学,C,在加拿大法语中为“反对派”)。因此,粒度要求派对分隔符(如果有多个派对)本身就是一个字段。
因此,这里已经有了四个样式“原子”:(i) 案例名称中是否有党派分隔符缩写;(ii) 是否是v
或c
或其他内容;(iii) 是否是斜体;(iv) 是否带点。这些实际上都只是切换和选择。
有时同一篇文档需要多种引用样式,只需使用一个引用命令就可以处理,非常方便。
使用键值对是实现这种(多)样式的一种方法,以便特定的引用样式“仅仅”是一个设置一组(通常很多)键值对的包选项。
我
例如,可以通过包选项选择 McGill 风格:
\usepackage[...,lawcitestyle=mcgill,...]biblatex
依次设置样式参数并切换
\newcommand\lcsetstylemcgill{%
\togglefalse{partysepdotted}%
\toggletrue{partysepitalic}%
\toggletrue{partynamesitalic}%
...
}
这反过来意味着 bibmacros 和 fieldformats 只需要查看它们自己的字段,逻辑上独立于用户选择了(或切换到或从中切换)的实际样式:
\DeclareFieldFormat{partysep}{%
%#1
\iftoggle{partysepitalic}{%true
\mkbibemph{#1}{\iftoggle{partysepdotted}{\adddot}{}}%
}%end true
{%false
#1{\iftoggle{partysepdotted}{\adddot}{}}%
}%end false
}%end
(注:上述代码可以重写得更高效)
更改样式(即使是在句子中间)也变得很简单。只需切换开关即可。或者更好的是:使用开关来执行此操作。
二
但有时候,顺序需要“动态”地重新排列物品。
因此,将用户定义的项目序列存储在 bibentry 字段中(实际上,这些项目是一种非常简单的 markdown 类型):
@book{ualbertabook,
author={Kevin P McGuinness},
title={Canadian Business Corporations Law},
edition = {3},
volume = {1},
publisher={LexisNexis Canada},
location = {Toronto},
date={2017},
keywords = {lawbook},
yoptions = {name, dot, space, title, comma, space, edition, space, lparen, location, colon, space, publisher, comma, space, year, rparen, space, volume, dot},
}
citation 命令可以遍历列表,执行正则表达式替换
\regex_replace_all:nnN
{ comma }
{ \c{addcomma} }
\l_myscriptname_tl
...
以表格形式更容易看到项目序列:
这是一种“自下而上”的方法,其中风格“原子”逐渐形成结果。
三
并且,不必将样式信息存储在 bibentry 中,而是可以使用动态命令。
这是一个非常简单的例子:
具有如下预期序列/结构:
guide=aglc
citetype=case
items
item:title
itemtitlepart:partya
itemtitlepart:partya:format=italic
itemtitlepart:partya:delim=space
itemtitlepart:partysep
itemtitlepart:partysep:text:default=v
itemtitlepart:partysep:format=italic
itemtitlepart:partysep:delim=space
itemtitlepart:partyb
itemtitlepart:partyb:format=italic
itemtitlepart:partya:delim=none
item:title:format=none
item:title:delim=space
item:refmnc
item:refmnc:year
item:refmnc:year:format=brackets
item:refmnc:year:delim=space
item:refmnc:courtname
item:refmnc:courtname:format=none
item:refmnc:courtname:delim=space
item:refmnc:casenumber
item:refmnc:casenumber:format=none
item:refmnc:casenumber:delim=none
然后使用这样的高级样式指针:
\renewcommand\lguide{aglc}
以及像这样的 bientry:
@case{croome,
partya = {Croome},
partyb = {Tasmania},
caseshortname = {Croome},
%paper
reportyear={1997},
reportvolume = {191},
reportseries = {CLR},
reportpage = {119},
}
引用如下:
\yycite[\nopp 125]{croome}
它使用 cite 命令来调用(在本例中)核心宏
\DeclareCiteCommand{yycite}%
{\usebibmacro{prenote}}%
{%
\usebibmacro{yycore}% <===================
}%
{%
\multicitedelim%
}%
{\usebibmacro{postnote}}
这又调用了项目序列
\newbibmacro{yycore}{%
%\usebibmacro{set:multidelim}%
\usebibmacro{yycore:seq}% <===================
\usebibmacro{yycore:postnoteprelim}%
}
在这种情况下是静态/硬编码的,但可以是动态宏:
\newbibmacro{yycore:seq}{%
\usebibmacro{yy:case:partya}%
\usebibmacro{yy:case:partyb}%
\usebibmacro{yy:case:mnc}%
\usebibmacro{yy:case:report}%
}
依次展开或扩展为(例如,查看第一个项目)格式化的项目及其(格式化的)分隔符:
\newbibmacro{yy:case:partya}{%
\iffieldundef{partya}{}{%
\printfield[\lguide :case:item:titlepart:partya:format]{partya}%
\printfield[\lguide :case:item:titlepart:partya:delim]{partya}%
}%
}
所选样式的项目格式如下所示
\DeclareFieldFormat[case]{aglc:case:item:titlepart:partya:format}{\mkbibitalic{#1}}
分隔符如下所示
\DeclareFieldFormat[case]{aglc:case:item:titlepart:partya:delim}{\addspace}
其他领域也类似,产生:
整个aglc:case:item:titlepart:partya:delim
字符串可以通过读取输入文件定义的 -separated 宏动态构建:
(不过,有人仍然必须编写合法的 CSL 文件:))。
Biblatex
已经应用样式(通过样式文件),因此相当于 CSL。
Biblatex
还在对样式对象(“CS:O”)进行样式转换(“CST”),因此,直观地讲,在原子到原子级别将 CSL 样式映射到Biblatex
-样式应该很简单。就像一堆选项一样。
在风格层面上进行操作,其中“原子”已经形成所谓的风格“分子”,将会更加复杂(但并非不可能),大概需要解开并重新包装事物。