在我的文档的一个参考部分中,参考文献按其关键字分组。现在我想根据引用的类别打印每个部分的参考书目,例如,一个带有关键字的文章参考书目in
和一个带有关键字的参考书目out
。为了美观,我希望参考书目连续编号,就像在这个文本模型中一样
**In**
[1-1] a. “a”. In: a (a).
[1-2] c. “c”. In: c (c).
[1-3] e. “e”. In: e (e).
**Out**
[1-4] b. “b”. In: b (b).
[1-5] d. “d”. In: d (d).
因此,我使用来连续编号defernumbers
条目biblatex
。问题是,这会导致每个 都再次从 1 开始编号\printbibliography
。
我想启用defernumbers
每个\printbibliography
。\refsection
平均能量损失
\documentclass{article}
\pagestyle{empty}
\usepackage{filecontents}
\begin{filecontents*}{test.bib}
@article{a,
title = {a},
author = {a},
journal = {a},
year = {a},
keywords = {in}
}
@article{b,
title = {b},
author = {b},
journal = {b},
year = {b},
keywords = {out}
}
@article{c,
title = {c},
author = {c},
journal = {c},
year = {c},
keywords = {in}
}
@article{d,
title = {d},
author = {d},
journal = {d},
year = {d},
keywords = {out}
}
@article{e,
title = {e},
author = {e},
journal = {e},
year = {e},
keywords = {in}
}
\end{filecontents*}
\usepackage[
defernumbers=true,
citestyle=numeric,
]{biblatex}
\defbibheading{subbibliography}[\bibname]{%
\subsubsection*{#1}
}
\addbibresource{test.bib}
\begin{document}
\section{Testing biblatex}
\refsection
\cite{a,b,c,d,e}
\printbibliography[
title={In},
prefixnumbers={\thesection-},
heading=subbibliography,
keyword=in
]
\printbibliography[
title={Out},
prefixnumbers={\thesection-},
heading=subbibliography,
keyword=out
]
\endrefsection
\section{Testing biblatex}
\refsection
\cite{a,b,c,d,e}
\printbibliography[
title={In},
prefixnumbers={\thesection-},
heading=subbibliography,
keyword=in
]
\printbibliography[
title={Out},
prefixnumbers={\thesection-},
heading=subbibliography,
keyword=out
]
\endrefsection
\end{document}
输出
当然,会提供赏金!
答案1
这个问题源于 的固有功能biblatex
。从其他问题,biblatex
具有一个隐式函数resetnumbers=true
,当您使用prefixnumbers
它向标签添加前缀时,该函数会被应用。这可以通过不同的方式解决,但只能通过一些小技巧来解决,这些技巧实际上要么稍微改变问题,要么改变前缀的处理/应用方式。
由于这个问题的目的是按部分(或章节等)细分每个参考书目,因此可以以prefixnumber
不同的方式全局应用设置,从而消除resetnumbers=true
每个应用的隐式设置\printbibliography
。为此,我们重新定义了标签的打印方式,并将其纳入\thesection
格式:
\DeclareFieldFormat{labelnumber}{\mkbibsecnum{#1}}
\newrobustcmd{\mkbibsecnum}[1]{\thesection-#1\relax}
每个标签都存储为 1、2、3......,但其格式为打印时出现的部分编号。(注意*:因为我们以这种方式添加前缀,所以命令\printbibliography
必须出现在与引文相同的section
/refsection
中。特别是,这意味着您不能使用此方法在末尾打印累积参考书目,其中多个refsection
s 用 细分出来\printbibliography[section=1...]
)。
此时,剩下要做的就是使用 在适当的点(每个的第一个参考书目refsection
)重新设置编号\printbibliography[...resetnumbers=true]
。
结果
结果显示如下:
平均能量损失
我做了一些改变,使得解决方案比原始 MWE 更高效。
refsection=section
(也可以是...=part
、...=chapter
等)全局传递给biblatex
仅收集每个部分中的参考文献。这可以根据需要替换为\newrefsection
/\endrefsection
以手动划分参考书目项目。
defernumbers=true
被保留以便按顺序对每个子书目进行排序。
我还注释掉了一些引用以强调编号和refsection
s 的效果。
修改后的 MWE 演示了此解决方案:
\documentclass{article}
\pagestyle{empty}
\usepackage{filecontents}
\begin{filecontents*}{test.bib}
@article{a,
title = {a},
author = {a},
journal = {a},
year = {a},
keywords = {in}
}
@article{b,
title = {b},
author = {b},
journal = {b},
year = {b},
keywords = {out}
}
@article{c,
title = {c},
author = {c},
journal = {c},
year = {c},
keywords = {in}
}
@article{d,
title = {d},
author = {d},
journal = {d},
year = {d},
keywords = {out}
}
@article{e,
title = {e},
author = {e},
journal = {e},
year = {e},
keywords = {in}
}
\end{filecontents*}
\usepackage[
defernumbers=true,
citestyle=numeric,
refsection=section % Each \section{...} starts a new refsection environment
]{biblatex}
% Format the labelnumber with \thesection prefix
\DeclareFieldFormat{labelnumber}{\mkbibsecnum{#1}}
\newrobustcmd{\mkbibsecnum}[1]{\thesection-#1\relax}
\defbibheading{subbibliography}[\bibname]{%
\subsubsection*{#1}
}
\addbibresource{test.bib}
\begin{document}
\section{Testing biblatex} % New refsection, too!
Cite a \cite{a};
Cite b \cite{b};
Cite c \cite{c};
\printbibliography[
title={In},
heading=subbibliography,
keyword=in,
resetnumbers=true % The first bibliography in each refsection needs its numbers manually reset
]
\printbibliography[
title={Out},
heading=subbibliography,
keyword=out
]
\section{Testing biblatex} % New refsection, too!
Cite b \cite{b};
Cite d \cite{d};
Cite e \cite{e}.
\printbibliography[
title={In},
heading=subbibliography,
keyword=in,
resetnumbers=true % The first bibliography in each refsection needs its numbers manually reset
]
\printbibliography[
title={Out},
heading=subbibliography,
keyword=out
]
\end{document}
*@Guido 的解决方案重新定义整个书目环境并使用枚举系列计数器继续计数某些标签,但不计数其他标签。这可能可以解决这个问题(并解决累积书目问题),但我无法让代码按照 OP 要求的方式编译章节编号。