按 langid 对已排序的参考书目进行分组

按 langid 对已排序的参考书目进行分组

我知道我可以按关键字对参考书目进行分组。但这不是这种情况,因为如果我不使用字母排序和数字样式,我可以通过关键字拆分参考书目。但如果我想要排序的参考书目和数字编号并尝试拆分它,我会破坏编号。我需要的是将某种语言的 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}

输出为:

英语第一,俄语第二


笔记

  1. 无需将datatype=bibtex选项传递给\maps(如 moewe 的回答中所做的那样),因为bibtex是选项的默认值datatype。请参阅手册第 199 页biblatex,版本 3.18b,2022 年 7 月 12 日。

  2. 没有必要将正则表达式包装起来\regexp(就像 moewe 的答案中所做的那样),除非它们包含的字符序列也是有效的 TEX 命令。请参阅手册第 204 页。

  3. 特殊字段值的数据类型presort被解释为biblatex字符串,而不是数字。(请参阅手册第 31 页。)因此,适用于其值的顺序是字典顺序而不是数字顺序。因此,在我看来,最好避免为该字段分配数字(如 moewe 的回答中所做的那样),以避免不直观的后果。例如,如果在我的“英语第一,俄语第二”示例中,我为英语条目分配了值presort2为俄语条目分配presort了值10,那么俄语条目最终会在参考书目中出现在英语条目之前。

  4. 除非明确指定,否则书目条目的字段presort将自动设置为mm。 (请参阅手册第 83 页第 3.6 节“排序选项”的第二段。)因此,如果langid您希望按 进行排序,则恰好有三个不同的值,则无需明确指定presort所有三个的值(如 moewe 的回答中所做的那样)。 只需指定其中两个的明确值presort,并确保两者按字典顺序小于 即可mm

    如果您希望某些条目出现在参考书目的顶部,但不必关心指定其余条目的相对顺序,这也是一个有用的信息,正如我在“英语第一,其他按照默认顺序排列”示例中所做的那样。

    请注意,源映射发生在任何排序模板(包括手册附录 C1-C3 中描述的默认内置模板)应用之前。(请参阅手册第 199 页第 4.5.3 节“动态修改数据”的第二段。)因此,如果您使用任何默认排序模板,请说明nty如果您未明确指定任何排序模板,则使用的默认排序模板是什么(请参阅手册第 48 页第 3.1.2.1 节“包选项/前言选项/常规”),每个组内的条目顺序presort将按预期进行,即按模板规定的顺序进行。

  5. step如果安排得当, s 和s的数量map可以大大减少,s 的数量final可以减少甚至消除。将 moewe 的回答与我的“英语第一,俄语第二”示例进行比较。

  6. final关于consult的语义moewe 的这个回答,因为手册对此说明不明确,甚至具有误导性。

相关内容