我知道我可以按关键字对参考书目进行分组。但这不是这种情况,因为如果我不使用字母排序和数字样式,我可以通过关键字拆分参考书目。但如果我想要排序的参考书目和数字编号并尝试拆分它,我会破坏编号。我需要的是将某种语言的 bib 项目放在另一种语言项目之前。示例:
\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage[english,greek,russian]{babel} % English please
\setmainfont[
BoldFont={DeJavu Serif Bold},
ItalicFont={DeJavu Serif Italic},
BoldItalicFont={DeJavu Serif BoldItalic}
]{DeJavu Serif}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@Book{AlKarapan,
author = {Καραπαναγοπούλου, Αλέξανδρος Κ.},
title = {Η Μεγάλη Σύνοδος της Ορθοδόξου Ανατολικής Εκκλησίας},
publisher = {auto-édition},
date = {1990/1998},
volumes = {6},
address = {Αθήνα},
langid={greek},
}
@Inbook{CypinIstorijaRPC,
author = {Владислав Цыпин},
title = {История Русской Церкви 1917--1997},
chapter = {VIII},
publisher = {Издательство Спасо-Преображенского Валаамского монастыря},
address = {Москва},
date = {1997},
urldate = {2010-10-25},
url = {http://old.pravoslavie.by/podpod.asp?id=135&Session=10},
langid={russian},
}
@Inbook{authorrus,
author = {Другой Автор},
title = {Название},
chapter = {VIII},
publisher = {Издательство},
address = {Москва},
date = {1997},
urldate = {2010-10-25},
langid={russian},
}
@article{baez/article,
author = {Baez, John C. and Lauda, Aaron D.},
title = {Higher-Dimensional Algebra {V}: 2-Groups},
journaltitle = {Theory and Applications of Categories},
date = 2004,
volume = 12,
pages = {423-491},
version = 3,
eprint = {math/0307200v3},
eprinttype = {arxiv},
langid = {english},
langidopts = {variant=american},
annotation = {An \texttt{article} with \texttt{eprint} and
\texttt{eprinttype} fields. Note that the arXiv reference is
transformed into a clickable link if \texttt{hyperref} support
has been enabled. Compare \texttt{baez\slash online}, which
is the same item given as an \texttt{online} entry},
hyphenation={english},
}
@article{another,
author = {Another,Author and One more, Author},
title = {Title},
journaltitle = {Journal},
date = 2004,
volume = 12,
pages = {423-491},
version = 3,
eprint = {math/0307200v3},
eprinttype = {arxiv},
langid = {english},
langidopts = {variant=american},
hyphenation={english},
}
\end{filecontents*}
\usepackage[russian,greek,english]{babel}
\usepackage[natbib=true,
style=numeric,
isbn=true,
url=true,
defernumbers=false,
sorting=nyt,
firstinits=true,
backend=biber,
language=auto,
autolang=other]{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
\cite{AlKarapan,CypinIstorijaRPC,baez/article}
\nocite{*}
\printbibliography
\end{document}
输出将是:英文条目,希腊文条目和俄文条目。如果我编辑 bbl 文件,只需将俄文条目移到开头,然后是希腊文条目,最后是英文条目,然后不要运行 biber只需引用条目并运行 lualatex 或 xelatex 一切都会好起来。
Biblatex/Biber 对参考书目进行排序,我手动移动 bbl 文件中给定语言的条目。我获得了按给定语言排序的条目,并按照我想要的语言顺序排序。
问题:我可以不编辑 bbl 文件的情况下进行这种排序吗?
我不能使用多个围兜,因为我需要连续编号
答案1
当然,你也可以直接将其放入\sort{\field{langid}}
排序过程中,但是这样会按字典顺序对语言进行排序,因此英语会首先出现,然后是希腊语,然后是俄语,这并不是你想要的。
但顺便说一下,如果我们排序降序按字典顺序,我们在 MWE 中得到您想要的顺序。
\DeclareSortingScheme{lnyt}{
\sort{
\field{presort}
}
\sort[final]{
\field{sortkey}
}
\sort[direction=descending]{\field{langid}}
\sort{
\field{sortname}
\field{author}
\field{editor}
\field{translator}
\field{sorttitle}
\field{title}
}
\sort{
\field{sortyear}
\field{year}
}
\sort{
\field{sorttitle}
\field{title}
}
\sort{
\field[padside=left,padwidth=4,padchar=0]{volume}
\literal{0000}
}
}
当然,这只是因为您想要的排序顺序与语言名称的反向字典顺序一致。
现在使用sorting=lnyt
。
一个更加可定制但稍微复杂一些的解决方案使用了presort
字段和 Biber 的源映射功能。
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=langid, match=\regexp{\Arussian\Z}, final]
\step[fieldset=presort, fieldvalue=1]
}
\map{
\step[fieldsource=langid, match=\regexp{\Agreek\Z}, final]
\step[fieldset=presort, fieldvalue=2]
}
\map{
\step[fieldsource=langid, match=\regexp{\Aenglish\Z}, final]
\step[fieldset=presort, fieldvalue=3]
}
}
}
每种语言都简单地映射到写入presort
字段的一个数字。该presort
字段优先于其他排序字段。
这允许不遵循任何字典顺序的排序顺序。
平均能量损失
\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage[english,greek,russian]{babel} % English please
\setmainfont[
BoldFont={DeJavu Serif Bold},
ItalicFont={DeJavu Serif Italic},
BoldItalicFont={DeJavu Serif BoldItalic}
]{DeJavu Serif}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@Book{AlKarapan,
author = {Καραπαναγοπούλου, Αλέξανδρος Κ.},
title = {Η Μεγάλη Σύνοδος της Ορθοδόξου Ανατολικής Εκκλησίας},
publisher = {auto-édition},
date = {1990/1998},
volumes = {6},
address = {Αθήνα},
langid={greek},
}
@Inbook{CypinIstorijaRPC,
author = {Владислав Цыпин},
title = {История Русской Церкви 1917--1997},
chapter = {VIII},
publisher = {Издательство Спасо-Преображенского Валаамского монастыря},
address = {Москва},
date = {1997},
urldate = {2010-10-25},
url = {http://old.pravoslavie.by/podpod.asp?id=135&Session=10},
langid={russian},
}
@Inbook{authorrus,
author = {Другой Автор},
title = {Название},
chapter = {VIII},
publisher = {Издательство},
address = {Москва},
date = {1997},
urldate = {2010-10-25},
langid={russian},
}
@article{baez/article,
author = {Baez, John C. and Lauda, Aaron D.},
title = {Higher-Dimensional Algebra {V}: 2-Groups},
journaltitle = {Theory and Applications of Categories},
date = 2004,
volume = 12,
pages = {423-491},
version = 3,
eprint = {math/0307200v3},
eprinttype = {arxiv},
langid = {english},
langidopts = {variant=american},
annotation = {An \texttt{article} with \texttt{eprint} and
\texttt{eprinttype} fields. Note that the arXiv reference is
transformed into a clickable link if \texttt{hyperref} support
has been enabled. Compare \texttt{baez\slash online}, which
is the same item given as an \texttt{online} entry},
hyphenation={english},
}
@article{another,
author = {Another,Author and One more, Author},
title = {Title},
journaltitle = {Journal},
date = 2004,
volume = 12,
pages = {423-491},
version = 3,
eprint = {math/0307200v3},
eprinttype = {arxiv},
langid = {english},
langidopts = {variant=american},
hyphenation={english},
}
\end{filecontents*}
\usepackage[russian,greek,english]{babel}
\usepackage[natbib=true,
style=numeric,
isbn=true,
url=true,
defernumbers=false,
sorting=nyt,
firstinits=true,
backend=biber,
language=auto,
autolang=other]{biblatex}
\addbibresource{\jobname.bib}
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=langid, match=\regexp{\Arussian\Z}, final]
\step[fieldset=presort, fieldvalue=1]
}
\map{
\step[fieldsource=langid, match=\regexp{\Agreek\Z}, final]
\step[fieldset=presort, fieldvalue=2]
}
\map{
\step[fieldsource=langid, match=\regexp{\Aenglish\Z}, final]
\step[fieldset=presort, fieldvalue=3]
}
}
}
\begin{document}
\cite{AlKarapan,CypinIstorijaRPC,baez/article}
\nocite{*}
\printbibliography
\end{document}
答案2
以下是moewe回答的简化版本。
BibTeX 源文件
以下 BibTeX 文件保存在 中~/TestBib.bib
。
@book{shakespeare,
author = {William Shakespeare},
title = {Hamlet},
year = {1600},
langid = {english}
}
@book{homer,
author = {Homer},
title = {Illiad \& Oddysey},
year = {8th century BC},
langid = {greek}
}
@book{tolstoy,
author = {Leo Tolstoy},
title = {War and Peace},
year = {1869},
langid = {russian}
}
带有参考书目的简单 LaTeX 文档
\documentclass{article}
\usepackage{biblatex}
\addbibresource{TestBib.bib}
\begin{document}
\cite{shakespeare}\cite{homer}\cite{tolstoy}
\printbibliography
\end{document}
运行结果
> cd ~
> lualatex 测试
> biber 测试
> lualatex 测试
是
英文优先,其他按默认顺序
\documentclass{article}
\usepackage{biblatex}
\DeclareSourcemap {
\maps {
\map {
\step [
fieldsource=langid,
match=english,
fieldset=presort,
fieldvalue=a
]
}
}
}
\addbibresource{TestBib.bib}
\begin{document}
\cite{shakespeare}\cite{homer}\cite{tolstoy}
\printbibliography
\end{document}
英语第一,俄语第二
我们现在要添加一个源映射,对书目条目进行排序,以便英文条目在第一个,俄文条目在第二个。
\documentclass{article}
\usepackage{biblatex}
\DeclareSourcemap {
\maps {
\map {
\step [
fieldsource=langid,
match=english,
fieldset=presort,
fieldvalue=a
]
\step [
fieldsource=langid,
match=russian,
fieldset=presort,
fieldvalue=b
]
}
}
}
\addbibresource{TestBib.bib}
\begin{document}
\cite{shakespeare}\cite{homer}\cite{tolstoy}
\printbibliography
\end{document}
输出为:
笔记
无需将
datatype=bibtex
选项传递给\maps
(如 moewe 的回答中所做的那样),因为bibtex
是选项的默认值datatype
。请参阅手册第 199 页biblatex
,版本 3.18b,2022 年 7 月 12 日。没有必要将正则表达式包装起来
\regexp
(就像 moewe 的答案中所做的那样),除非它们包含的字符序列也是有效的 TEX 命令。请参阅手册第 204 页。特殊字段值的数据类型
presort
被解释为biblatex
字符串,而不是数字。(请参阅手册第 31 页。)因此,适用于其值的顺序是字典顺序而不是数字顺序。因此,在我看来,最好避免为该字段分配数字(如 moewe 的回答中所做的那样),以避免不直观的后果。例如,如果在我的“英语第一,俄语第二”示例中,我为英语条目分配了值presort
,2
为俄语条目分配presort
了值10
,那么俄语条目最终会在参考书目中出现在英语条目之前。除非明确指定,否则书目条目的字段
presort
将自动设置为mm
。 (请参阅手册第 83 页第 3.6 节“排序选项”的第二段。)因此,如果langid
您希望按 进行排序,则恰好有三个不同的值,则无需明确指定presort
所有三个的值(如 moewe 的回答中所做的那样)。 只需指定其中两个的明确值presort
,并确保两者按字典顺序小于 即可mm
。如果您希望某些条目出现在参考书目的顶部,但不必关心指定其余条目的相对顺序,这也是一个有用的信息,正如我在“英语第一,其他按照默认顺序排列”示例中所做的那样。
请注意,源映射发生在任何排序模板(包括手册附录 C1-C3 中描述的默认内置模板)应用之前。(请参阅手册第 199 页第 4.5.3 节“动态修改数据”的第二段。)因此,如果您使用任何默认排序模板,请说明
nty
如果您未明确指定任何排序模板,则使用的默认排序模板是什么(请参阅手册第 48 页第 3.1.2.1 节“包选项/前言选项/常规”),每个组内的条目顺序presort
将按预期进行,即按模板规定的顺序进行。step
如果安排得当, s 和s的数量map
可以大大减少,s 的数量final
可以减少甚至消除。将 moewe 的回答与我的“英语第一,俄语第二”示例进行比较。final
关于consult的语义moewe 的这个回答,因为手册对此说明不明确,甚至具有误导性。