引文风格语言 (CSL)

引文风格语言 (CSL)

我如何使用引用样式语言(CSL)在 LaTeX 书目中?这看起来很棒,目前有 2,803 种引用样式Zotero 样式库

引文样式语言 (CSL) 是一种 XML 格式,用于描述文内引文、注释和参考书目的格式。CSL 提供:

  • 任何应用程序都可以使用的开放格式
  • 能够编写紧凑而强大的样式
  • 广泛支持风格要求
  • 自动风格定位
  • 轻松分发和更新样式
  • 快速增长的库,拥有数千种免费样式

答案1

事实上,有一个在编译 LaTeX 文档时使用 CSL 的工具。潘多克接受一个--csl=<csl file>参数,它将使用提供的 CSL 样式来格式化您的参考书目。

例如:

pandoc --bibliography=refs.bib --csl=mystyle.csl -o out.pdf doc.tex

将很乐意out.pdf使用 bibtex 文件refs.bib和 CSL 文件mystyle.csl从源代码通过 LaTeX 生成文件,该文件可能在某处doc.tex有一个或一些引用。\thebibliography

答案2

一句话概括:不。

CSL 的原创者 Bruce D'Arcus 曾多次表示,他希望看到 CSL 为 LaTeX 实现(更准确地说:他经常谈论 LuaLaTeX),而且从理论上讲,实现这一点并不难(参见以及以下帖子),但到目前为止,还没有人对此感兴趣(我链接到的帖子可以追溯到 2008 年!)。

我认为,CSL for LaTeX 非常有用。CSL 越来越受到关注(目前大约有 6 种实现),尽管它不如那么强大biblatex(但什么才是呢?),但它非常灵活,而且最重要的是,真正与系统无关。

它将是第一个提供适用于 LaTeX 和各种文字处理器的参考书目样式的解决方案,并且真正能够处理复杂的样式。

答案3

编辑:

西替普罗现在包含自己的 LaTeX 包,它添加了对 BibTeX 文件的支持,并使用了正常的 LaTeX 引用命令。它可在加拿大运输安全局,因此您可以使用 安装它tlmgr

另请参阅关于如何运行示例的说明

\documentclass{article}

\usepackage{citation-style-language}
\cslsetup{style = apa}
\addbibresource{example.bib}

\begin{document}

Foo \cite{ITEM-1} bar \cite{ITEM-1, ITEM-2} baz.

\printbibliography

\end{document}

结果:

在此处输入图片描述


原始答案:

现在有一个完整的Lua 版本的 Citeproc。它还不包含 TeX 接口,但是使用它的 LuaLaTeX 简单包可能如下所示citeproc.sty

\ProvidesPackage{citeproc}
\RequirePackage{luacode}

% Basic initialization of Citeproc.lua

\begin{luacode*}
require("lualibs")

-- global object for functions defined in this 
CSL = {}

local dom = require("luaxml-domobject")
local formats = require("citeproc.citeproc-formats")

local CiteProc = require("citeproc")


local function read_file(path)
    local file = io.open(path, "r")
    if not file then return nil end
    local content = file:read("*a")
    file:close()
    return content
end


function CSL.load_style(filename)
  CSL.style = read_file(filename)
end

function CSL.load_json(filename)
  CSL.bib = CSL.bib or {}
  local items = utilities.json.tolua(read_file(filename)) 
  if not items then
    return nil, "JSON file cannot be loaded: " .. filename
  end
  for _, item in ipairs(items) do
    CSL.bib[item["id"]] = item
  end
end

function CSL.load_lang(lang)
  CSL.lang= lang
end

function CSL.load_style(style)
  CSL.style = read_file(style)
end

function make_citeproc_sys(bib)
  local bib = bib
  local citeproc_sys = {
    retrieveLocale = function (self, lang)
      local locale_name_format = CSL.locale_name_format or "locales-%s.xml"
      local filename = string.format(locale_name_format, lang)
      local content = read_file(filename)
      if content then
        return dom.parse(content)
      else
        return nil
      end
    end,
    retrieveItem = function (self, id)
      return bib[id]
    end
  }
  return citeproc_sys
end

function CSL.init()
  CSL.bib = CSL.bib or {}
  local citeproc_sys = make_citeproc_sys(CSL.bib)
  CSL.citeproc = CiteProc:new(citeproc_sys, CSL.style)
  CSL.citeproc.formatter = formats.latex
end

function CSL.cite(citation)
  local cite_items = {}
  for item in string.gmatch(citation, "([^,]+)") do 
    cite_items[#cite_items+1] = {id = item}
  end
  local result = CSL.citeproc:makeCitationCluster(cite_items)
  tex.print(result)
end

function CSL.bibliography()
    local params, result = CSL.citeproc:makeBibliography()
    tex.print("\\begin{thebibliography}{}")
    for _,bibitem in pairs(result) do
      bibitem = bibitem:gsub("bibitem%[.-%]","bibitem")
      tex.print(bibitem)
    end
    tex.print("\\end{thebibliography}")
end


\end{luacode*}

\newcommand\cslstyle[1]{%
  \luaexec{CSL.load_style("#1")}
}

\newcommand\csljson[1]{%
  \luaexec{CSL.load_json("#1")}
}

\newcommand\cslinit{%
\luaexec{CSL.init()}
}

\newcommand\cslcite[1]{%
  \luaexec{CSL.cite("\luaescapestring{#1}")}
}

\newcommand\cslbibliography{\luaexec{CSL.bibliography()}}

% initialize citeproc
\AtBeginDocument{%
  \cslinit%
}


\endinput

它不支持 BibTeX 文件,目前需要 JSON。要运行以下示例,bib.json请从simple.csllocales-en-US.xmlCiteproc-lua 示例目录

文件sample.tex

\documentclass{article}
\usepackage{citeproc}
\cslstyle{simple.csl}
\csljson{bib.json}
\begin{document}
hello world \cslcite{ITEM-1,ITEM-2}

\cslbibliography
\end{document}

你可以使用 LuaLaTeX 来编译它。结果如下:

在此处输入图片描述

答案4

如果您通过 RMarkdown 编写 LaTeX 文档,则可以在文件头(即 YAML 头)中设置 csl 参数。这非常方便直接,以下是 RMarkdown 的一个示例 YAML 头:

---
output: 
  pdf_document
title: 'Title of document'
author:
  name: "My Name"
bibliography: references.bib
csl: biblio_style.csl

---

Text [@reference].
# References

相关内容