Biblatex:当参考文献按名称排序(sorting=nyt)时,如何自动按年份对引用进行排序(sortcites=ynt)

Biblatex:当参考文献按名称排序(sorting=nyt)时,如何自动按年份对引用进行排序(sortcites=ynt)

我想按年份对文内引用进行排序,但按名称对参考书目进行排序。听起来就像这个问题

但是,建议的解决方案(使用\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

更新

biblatexv3.18 及更高版本中,您可以使用\localrefcontext\GenRefcontextData切换到不同的参考上下文(例如排序)。

使用

\AtBeginRefsection{\GenRefcontextData{sorting=ynt}}

确保我们所使用的每个文档也能生成与排序refcontext类似的内容。refcontextynt

然后

\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}

Lorem (Boathor 1900;作者 2000) ipsum (Boathor 1900;作者 2000) 参考文献 作者,A. (2000)。字母顺序在前,年份在后。出版商。 Boathor,B. (1900)。字母顺序在后,年份在前。出版商。

也可以看看在自定义 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}

Lorem(Boathor 1900;作者 2000)//ipsum(Boathor 1900;作者 2000)

我用了

\begin{refcontext}[sorting=nyt]
\printbibliography
\end{refcontext}

而不是稍微短一点

\newrefcontext[sorting=nyt]

如果有引文,则要谨慎參考文獻。


提示和注意事项

由于这种情况出现得更频繁,因此需要更多的解释。

biblatex不再允许sorting使用该选项\printbibliography。它被删除是因为它可能导致奇怪的排序结果。

相反,现在您使用“refcontexts”来控制排序。refcontext 控制sortinglabelprefixsortingnamekeytemplate以及一些其他内容(将来可能会有更多)。

一个条目可以出现在不同的引用上下文中,并且任何额外的标签数据(extradateextraalpha)将根据每个引用上下文的具体细节(例如排序)重新计算。

这可能会在非常牵强的例子中导致稍微违反直觉的结果,因为排序顺序可能是由引用本身中不可见的数据决定的,并且这些数据会在不同的方案中导致不同的排序结果。

这是一个非常人为的例子,它展示了您的设置中的这种行为。使用其他排序方案组合可以更容易地实现这种效果。这里的技巧是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}

(麋鹿 nd[b];麋鹿 nd[a])(麋鹿 nd[b];麋鹿 nd[a])

答案2

“快速而肮脏”的解决方案(不如moewe 的一个) 是使用biblatexsortcites=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}

相关内容