我猜这个问题已经有人发过并回答过了,但我搞不清楚这个问题的相关主题。抱歉,可能有重复。
我biblatex
和 Biber 一起使用。
当使用多个引文时,即通过使用\parencites
,引文在 pdf 中的显示顺序与我输入的顺序相同。Biber 不能自动按字母顺序对它们进行排序吗(如果对同一作者有多个引用,则按时间倒序排序)?
moewe 提出了这个解决方案:Biblatex:对合格引文列表 \parencites 中的引文进行排序但我觉得有点复杂。它能解决问题吗?有没有更简单的解决方法?
移动网络:
\documentclass{report}
\usepackage[a4paper,bindingoffset=0.5cm, left=2.6cm,right=2.6cm,top=2.6cm,bottom=3cm, footskip=.67cm]{geometry}
\usepackage{gensymb}
\usepackage[backend=biber,maxbibnames=99,date=year,sortlocale=danish,firstinits=true,style=authoryear-icomp,dashed=false,doi=false,isbn=false,url=true,]{biblatex}
\addbibresource{ex.bib}
\begin{document}
The references are not ordered alphabetically \parencites{stigler1999}{bahn2017c}{bahn2017a}.
References the same article are not sorted by the order of page numbers \parencites[31]{bahn2017a}[1]{bahn2017a}
\end{document}
围兜:
@book{stigler1999,
location = {{New York}},
title = {The {{Teaching Gap}}: {{Best Ideas}} from the {{World}}'s {{Teachers}} for {{Improving Education}} in the {{Classroom}}.},
publisher = {{The Free Press}},
date = {1999},
author = {Stigler, James W. and Hiebert, James}
}
@article{bahn2017a,
title = {An Experiment with {{Open}}-Ended {{Approach}} in Grade Four Probability Teaching},
journaltitle = {Recherches en Didactique des Mathématiques},
date = {2017-06},
author = {Bahn, Jacob},
file = {/home/jb/.mozilla/firefox/mwad0hks.default/zotero/storage/LN55IYG2/Bahn - 2017 - An experiment with Open-ended Approach in grade fo.pdf},
pubstate = {revision}
}
@article{bahn2017c,
title = {Evolution of Teachers' Anticipation of Didactical Situations in the Course of Three Lesson Studies},
journaltitle = {Annales de Didactique et de Sciences Cognitives},
date = {2017-10},
author = {Bahn, Jacob},
file = {/home/jb/.mozilla/firefox/mwad0hks.default/zotero/storage/Y3G88PIA/Bahn - 2017 - Evolution of teachers' anticipation of didactical .pdf},
pubstate = {review}
}
答案1
这里有几个问题。其中最重要的、更大的问题是对跨不同参数的多重引用命令进行排序。
排序多点
困难
由于多引用命令的实施方式,biblatex
无法对这些命令创建的引用列表进行排序。
一个巧妙的技巧可以对单个引用命令进行非常简单的排序,但这在这里并不容易。这个技巧的工作原理如下:biblatex
有一个按排序顺序排列的所有条目键的列表,还有一个此引用中请求的条目列表。biblatex
遍历所有条目的排序列表,并将这些条目添加到引用条目列表中的新列表(这一点被简化了)。这样就留下了此引用的排序条目列表。
如果你使用一种样式(例如style=authoryear-icomp
)对引用进行排序,并且使用前后注进行引用
\cite[cf.][67]{worman,sigfridsson}
你会看到警告
Package biblatex Warning: Package option 'sortcites' enabled. (biblatex) Verify postnote placement on input line 14.
这表明了这种简单排序方法的缺点:前后注仍然粘在引文的前面和后面。它们没有与特定的条目绑定。
这对于多引用命令来说有所不同
\cite[cf.][67]{worman}[but][380]{sigfridsson}
这里的前后注都与其具体的条目相关。
multicite 命令的实现方式是,每个“块”的可选和强制参数[<pre>][<post>]{<key>}
本质上都是单独解析的。然后,这些块被粘合在一起形成一个长表达式,而不知道这些块的实际内容。
有人可能会天真地尝试对块进行排序,然后再将它们粘合到最终的表达式中。这可以有效,但存在两个潜在障碍
- 前后注释要么与特定区块相关联,要么与特定条目相关联,并且必须与其一起排序。这意味着它们很可能需要暂时保存。
具有多个输入键的块的排序不清楚。虽然确定所需的排序输出很简单
\parencites[6]{sortorder3}[5]{sortorder1}[9]{sortorder2}
即
\parencites[5]{sortorder1}[9]{sortorder2}[6]{sortorder3}
这并不容易
\parencites[8]{sortorder4,sortorder2}[3]{sortorder3}[1]{sortorder1}
是预期输出
\parencites[1]{sortorder1}[8]{sortorder2,sortorder4}[3]{sortorder3}
或者
\parencites[1]{sortorder1}[8]{sortorder2}[3]{sortorder3}{sortorder4}
你期望什么
\parencites[1]{sortorder1,sortorder2}[3]{sortorder1,sortorder3}
也就是说,一旦其中一个
{<key>}
参数本身包含多个输入键,预期的输出就不会立即明确。
虽然第 2 项中的情况似乎有些牵强和不寻常,因为多引用命令的全部意义在于修复每个条目的前后注释,但每个强制参数带有多个键的语法是有效的,必须继续工作。
奥黛丽的回答
Audrey 提供了一个答案,它确实对多重引用进行了排序使用 biblatex 中的 \cites 命令对引用进行排序\cites
(除了is at之外的 cite 命令的直接扩展Biblatex:对合格引文列表 \parencites 中的引文进行排序)。她的解决方案使用两遍方案对条目进行排序。这使我们能够收集引用键的列表,保存相应的前后注释,然后对键进行排序。\textcite
一些标准引用样式中实现了相关的两遍方案。
两遍引用命令有一些结构上的复杂性,可以解决(至少据我所知,\textcite
标准样式的命令都可以正常工作,即使其中一些命令使用这种复杂的结构)。但更重要的是,它们需要参考书目/引用样式的支持。这意味着,以一种所有样式都可以从排序中受益而无需为此做任何事情的方式实现这一点将非常困难,几乎不可能,同时还要确保不会出现任何严重问题。另请参阅https://github.com/plk/biblatex/issues/214。
Audrey 的答案已经找到了一种适当的方法来解决问题 1 和 2:每个条目的前后注释都会保存,因为它们会在排序后出现在输出中
\cites[cf.][45]{sigfridsson,worman}
将指定“cf.”作为前注sigfridsson
和45
后注worman
(假设worman
排序在后sigfridsson
!)。排序时不保留任何结构,排序前所有块都分解为单个条目。
目前提出的解决方案存在一些缺点。特别是,引文跟踪器会被引文命令的两遍结构所混淆。这应该可以通过类似于标准样式命令的方式修复\textcite
,但我还没有查看它是否容易修复。更重要的是,虽然一个条目每次只能被引用一次\cites
,所以你的\parencites[31]{bahn2017a}[1]{bahn2017a}
例子会失败。这是解决上述问题 1 所选择的策略所固有的。它可能可以通过更复杂的结构来修复,但这需要更多的变量和更多的变量存储以及适当的清理。
事实上,我相信修改内部结构以自动对多引用命令进行排序并非完全不可能。但是,当遇到上述两个问题之一时,我考虑过的每个简单解决方案都失败了。特别是,侧面进行的排序biblatex
必须简单,并且不应涉及实施经典排序算法。
按附注排序
您似乎还对不仅按输入键对多引用命令进行排序感兴趣,而且还对按后记参数对多引用命令进行排序以打破平局感兴趣。
这也带来了新的困难。biblatex
依赖于后端(Biber 或传统后端 BibTeX)进行排序。特别是,排序是针对整个文档确定的并且是固定的。postnote
但是,参数是文档本地的,后端不知道,因此不能轻易用于排序。此外,biblatex
只知道排序条目的概念,而不是条目+额外数据。因此,很有可能必须在 LaTeX 中实现额外的排序。传统上,排序被外部程序(BibTeX、Biber、、、...)接管而不是在 LaTeX 本身中实现,这是有充分理由的makeindex
。Unicodexindy
的出现并没有降低排序的复杂性,虽然 LaTeX3 中有一些有希望的事情,但我不确定他们目前是否进行 Unicode 排序和整理。当然,对纯数字进行排序比对任意字符串进行排序要容易得多。
参考书目和引文的不同排序
一个小问题是,据我所知,您希望以不同于参考书目的方式对引文进行排序(引文降序,参考书目升序)。这是可能的,请参阅Biblatex:当参考文献按名称排序(sorting=nyt)时,如何自动按年份对引用进行排序(sortcites=ynt),但也存在一些微妙之处。
对于您的明确问题
回答你的明确问题。据我所知,奥黛丽的回答使用 biblatex 中的 \cites 命令对引用进行排序以及我的简单扩展Biblatex:对合格引文列表 \parencites 中的引文进行排序目前确实最接近排序多点列表。该解决方案并不完美,您可能会遇到一些棘手的问题,如果您在此站点提问,其中一些问题可能很容易解决 - 其他问题可能更为根本,更难解决。
答案没有很好的解决方案来对引用进行不同于参考书目的排序,但这是一个如上所述的普遍问题。它也无法同时处理对同一条目的多个引用,即您的第二个示例\parencites[31]{bahn2017a}[1]{bahn2017a}
。