我想按年份对文内引用进行排序,但按名称对参考书目进行排序。听起来就像这个问题。
但是,建议的解决方案(使用\usepackage[sorting=ynt]{biblatex}
和\printbibliography[sorting=nty]
)对我来说不起作用(参见下面的 MWEB)。事实上,参考文献列表仍然按年份排序,而不是按名称排序。
问题:如何强行sorting=nty
插入\printbibliography
?
\documentclass{article}
\usepackage[%
backend=biber,%
style=authoryear-comp,%
natbib=true,%
sorting=ynt%
]{biblatex}
\addbibresource{\jobname.bib}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{key2000,
author = {Author, A.},
year = {2000},
title = {Alphabetical fist \& Year last},
publisher = {Publisher},
}
@book{key1900,
author = {Boathor, B.},
year = {1900},
title = {Alphabetical last \& Year first},
publisher = {Publisher},
}
\end{filecontents}
\begin{document}
Citation should be year-sorted, even if \verb+\citep+ is random \citep{key2000, key1900}.% citation NOT year-sorted
\printbibliography[sorting=nyt]
\end{document}
附言:相反,使用
\begingroup
\newrefcontext[sorting=nyt]
\printbibliography
\endgroup
覆盖\usepackage[sorting=ynt]{biblatex}
选项(即 LoR 是按名称排序的,但也是按行内引用排序的)。
答案1
更新
在biblatex
v3.18 及更高版本中,您可以使用\localrefcontext
和\GenRefcontextData
切换到不同的参考上下文(例如排序)。
使用
\AtBeginRefsection{\GenRefcontextData{sorting=ynt}}
确保我们所使用的每个文档也能生成与排序refcontext
类似的内容。refcontext
ynt
然后
\AtEveryCite{\localrefcontext[sorting=ynt]}
将我们的引用切换到ynt
排序refcontext
。\localrefcontext
只在本地起作用,不需要“关闭”或重置,因为它发生在组内部。
\documentclass{article}
\usepackage[backend=biber,
style=authoryear-comp,
% sortcites=true, % not needed here because it is implied by style=authoryear-comp,
]{biblatex}
\AtBeginRefsection{\GenRefcontextData{sorting=ynt}}
\AtEveryCite{\localrefcontext[sorting=ynt]}
\begin{filecontents}{\jobname.bib}
@book{key2000,
author = {Author, A.},
year = {2000},
title = {Alphabetical fist \& Year last},
publisher = {Publisher},
}
@book{key1900,
author = {Boathor, B.},
year = {1900},
title = {Alphabetical last \& Year first},
publisher = {Publisher},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
Lorem \autocite{key2000, key1900}
ipsum \autocite{key1900, key2000}
\printbibliography
\end{document}
也可以看看在自定义 biblatex 样式中按年份 (ynt) 对引文进行排序,按名称 (nyt) 对参考文献进行排序。
针对旧版本的解决方案biblatex
\begin{refcontext}[sorting=<sorting>]...\end{refcontext}
在加载时提供所需的引用排序顺序。然后在新的 refcontext( )中为 提供所需的参考书目顺序\printbibliography
。
\documentclass{article}
\usepackage[backend=biber,
style=authoryear-comp, sorting=ynt,
% sortcites=true, % not needed here because it is implied by style=authoryear-comp,
]{biblatex}
\begin{filecontents}{\jobname.bib}
@book{key2000,
author = {Author, A.},
year = {2000},
title = {Alphabetical fist \& Year last},
publisher = {Publisher},
}
@book{key1900,
author = {Boathor, B.},
year = {1900},
title = {Alphabetical last \& Year first},
publisher = {Publisher},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
Lorem \autocite{key2000, key1900}
ipsum \autocite{key1900, key2000}
\begin{refcontext}[sorting=nyt]
\printbibliography
\end{refcontext}
\end{document}
我用了
\begin{refcontext}[sorting=nyt]
\printbibliography
\end{refcontext}
而不是稍微短一点
\newrefcontext[sorting=nyt]
如果有引文,则要谨慎后參考文獻。
提示和注意事项
由于这种情况出现得更频繁,因此需要更多的解释。
biblatex
不再允许sorting
使用该选项\printbibliography
。它被删除是因为它可能导致奇怪的排序结果。
相反,现在您使用“refcontexts”来控制排序。refcontext 控制sorting
、labelprefix
和sortingnamekeytemplate
以及一些其他内容(将来可能会有更多)。
一个条目可以出现在不同的引用上下文中,并且任何额外的标签数据(extradate
,extraalpha
)将根据每个引用上下文的具体细节(例如排序)重新计算。
这可能会在非常牵强的例子中导致稍微违反直觉的结果,因为排序顺序可能是由引用本身中不可见的数据决定的,并且这些数据会在不同的方案中导致不同的排序结果。
这是一个非常人为的例子,它展示了您的设置中的这种行为。使用其他排序方案组合可以更容易地实现这种效果。这里的技巧是nyt
考虑volume
排序而不考虑排序ynt
。
\documentclass{article}
\usepackage[backend=biber, style=authoryear, sorting=ynt, sortcites]{biblatex}
\usepackage{hyperref}
\begin{filecontents}{\jobname.bib}
@book{one,
author = {Elk, Anne},
title = {Title},
volume = {1},
note = {sorts first in ynt},
}
@book{two,
author = {Elk, Anne},
title = {Title},
note = {sorts first in nyt},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\autocite{one,two} \autocite{two,one}
\begin{refcontext}[sorting=nyt]
\printbibliography[title={\refname{} (sorting \texttt{nyt})}]
\end{refcontext}
\end{document}
答案2
“快速而肮脏”的解决方案(不如moewe 的一个) 是使用biblatex
的sortcites=false
选项,启用内联引用的手动排序。
\documentclass{article}
\usepackage[%
backend=biber,%
style=authoryear-comp,%
natbib=true,%
sorting=nyt,%
sortcites=false,
]{biblatex}
\addbibresource{\jobname.bib}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{A2000,
author = {Author, A.},
year = {2000},
title = {Alphabetical fist \& Year last},
publisher = {Publisher},
}
@book{B1900,
author = {Boathor, B.},
year = {1900},
title = {Alphabetical last \& Year first},
publisher = {Publisher},
}
@book{C1950,
author = {Coathor, C.},
year = {1950},
title = {Alphabetical last \& Year first},
publisher = {Publisher},
}
}
\end{filecontents}
\begin{document}
In-line citations should be manually sorted in the desired order, and the References list will be alphabetically sorted.
Example:
\begin{itemize}
\item This citation is manually year-sorted \citep{B1900, C1950, A2000},
\item this one is manually shuffled \citep{C1950, B1900, A2000}.
\end{itemize}
\printbibliography[]
\end{document}