我偶然发现了 Biblatex 中的一个奇怪的效果,也许有人可以帮助我解决它。我有以下目标:
- 重要事物的全球出版物清单(按类别)
- 其余的全球名单
- 本地事物列表(按类别?)
在本地范围内,例如某个部分,本地引用会获得本地(前缀)编号,如果我引用全局事物(即不是来自本地类别),则使用全局标签。以下示例没有仅本地引用,但它们应该不是问题(因为例如,本地 1 可以从全局中排除)。
\documentclass{scrartcl}
\usepackage{filecontents}
\usepackage[backend=biber,style=numeric,defernumbers=true]{biblatex}
\begin{filecontents}{library.bib}
@article{a,
author={A},
title={A1},
journal={A2},
year={2019},
}
@article{b,
author={B},
title={B1},
journal={B2},
year={2019},
}
@article{c,
author={C},
title={C1},
journal={C2},
year={2019},
}
@article{d,
author={D},
title={D1},
journal={D2},
year={2019},
}
\end{filecontents}
\addbibresource{library.bib}
\DeclareBibliographyCategory{important}
\DeclareBibliographyCategory{local1}
\begin{document}
I am citing in general a\cite{a} (should be I-1),\\
as well as (b,c,d)\cite{b,c,d} (should be I-2,1,2).
\addtocategory{important}{a}
\addtocategory{important}{b}
\paragraph{Important Publications,}
\begin{refcontext}[labelprefix=I-]
\printbibliography[heading=none,category=important]
\end{refcontext}
\paragraph{Other Publications,}
\printbibliography[heading=none,notcategory=important, resetnumbers]
\section{My own next local Project}
Here I would like to also cite two types:
\begin{itemize}
\item things that get reassigned locally,\\
for example (a,c)\cite{a,c} (should be L-1,L-2)
\item things that stay from the global scope,\\
as (b,d)\cite{b,d} (should be I-2,2)
\end{itemize}
\addtocategory{local1}{a}
\addtocategory{local1}{c}
\paragraph{Locally important Publications}
\begin{refcontext}[labelprefix=L-]
\printbibliography[heading=none,category=local1]
\end{refcontext}
\end{document}
我已经标明了我希望的引用。特别注意引用 a。全局来说应该是,I-1
因为它属于重要类别,本地应该L-1
如以下屏幕截图所示:
但是:这实际上是错误的:全局获取的是本地编号,本地获取的是全局编号。至少其中一个混淆让我很困惑。此外,对于像c
引用这样的普通文章,似乎用错了。
- 为什么会发生这种情况?
- 我如何才能获得“正确的”(即我在括号中写的)参考标签?
- 附录:我真的只能在本地执行此操作吗,即在本地部分之后
L-1
再次I-1
(一次又一次L-2
)执行此操作?1
答案1
记录的行为是所有引用都从它们出现的最后一份参考书目中获取其参考上下文。
无论您是从绝对意义还是相对意义来理解“最后”,那都是一个解释的问题。
天真地,我会把它读成绝对的,所以会期望它a
应该c
出现在“L-1”和“L-2”中全部引用。
但目前,这个“最后”是相对的。另见https://github.com/plk/biblatex/issues/904。这意味着引用从它们出现的前一个参考书目中获取其参考上下文,如果没有这样的参考书目,则从它们出现的(绝对)参考书目中获取其参考上下文。
这解释了为什么我们会得到我们看到的输出。当a
和c
在文档开头被引用时,它们会获得包含它们的绝对最后一个参考书目的引用上下文(labelprefix=L-
),但是当它们第二次被引用时,它们会出现在参考书目之后labelprefix=I-
,因此会出现在该引用上下文中。
以下 MWE 显示了如何获得所需的输出。
首先我们定义一个本地版本,\assignrefcontextcats
它允许我们本地根据类别分配 refcontext(可以对关键字或键列表执行相同操作,但您只使用类别)。我们将使用该命令在本地切换到上下文labelprefix=L-
(\assignrefcontextcatslocal[labelprefix=L-]{local1}
)。
然后我们只需要正确获取文档其余部分的上下文。我们需要停止“最后参考书目”获胜规则,local1
因为
\assignrefcontextcats[]{local1}
但我们还需要确保important
条目获得正确的上下文
\assignrefcontextcats[labelprefix=I-]{important}
总共
\documentclass{scrartcl}
\usepackage{filecontents}
\usepackage[backend=biber,style=numeric,defernumbers=true]{biblatex}
\DeclareBibliographyCategory{important}
\DeclareBibliographyCategory{local1}
\makeatletter
\newcommand*{\assignrefcontextcatslocal}{%
\@ifstar
{\blx@assignrefcontextcatslocal[*]}
{\blx@assignrefcontextcatslocal[]}}
\def\blx@assignrefcontextcatslocal[#1][#2]#3{%
\edef\blx@tempa{\blx@sorting}%
\def\blx@tempb{global}%
\let\blx@tempc\@empty%
\def\blx@tempd{global}%
\def\blx@tempe{global}%
\setkeys{blx@assignrefcontext}{#2}%
\def\do##1{%
\listeadd\blx@assignedrefcontextcatlist{##1}%
\csedef{blx@assignedrefcontextcats#1@\the\c@refsection @##1}%
{\blx@tempa/\blx@tempb/\blx@tempc/\blx@tempd/\blx@tempe}}%
\docsvlist{#3}}
\makeatother
\assignrefcontextcats[]{local1}
\assignrefcontextcats[labelprefix=I-]{important}
\begin{filecontents}{\jobname.bib}
@article{a,
author = {A},
title = {A1},
journal = {A2},
year = {2019},
}
@article{b,
author = {B},
title = {B1},
journal = {B2},
year = {2019},
}
@article{c,
author = {C},
title = {C1},
journal = {C2},
year = {2019},
}
@article{d,
author = {D},
title = {D1},
journal = {D2},
year = {2019},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
I am citing in general a\cite{a} (should be I-1),
as well as (b,c,d)\cite{b,c,d} (should be I-2,1,2).
\addtocategory{important}{a}
\addtocategory{important}{b}
\paragraph{Important Publications,}
\begin{refcontext}[labelprefix=I-]
\printbibliography[heading=none,category=important]
\end{refcontext}
\paragraph{Other Publications,}
\printbibliography[heading=none,notcategory=important, resetnumbers]
\begingroup
\section{My own next local Project}
\addtocategory{local1}{a}
\addtocategory{local1}{c}
\assignrefcontextcatslocal[labelprefix=L-]{local1}
Here I would like to also cite two types:
\begin{itemize}
\item things that get reassigned locally,
for example (a,c)\cite{a,c} (should be L-1,L-2)
\item things that stay from the global scope,
as (b,d)\cite{b,d} (should be I-2,2)
\end{itemize}
\paragraph{Locally important Publications}
\begin{refcontext}[labelprefix=L-]
\printbibliography[heading=none,category=local1]
\end{refcontext}
\endgroup
\end{document}
用 分隔“我的下一个本地项目”部分可能有意义refsection
,但这样您就无法local1
像平常一样引用不属于的条目。您还需要为这些条目提供单独的参考书目。