我正在尝试从 Natbib 切换到 BibLaTeX。在 Natbib(通过 hyperref)中,我对反向引用进行了以下自定义:
\renewcommand*{\backref}[1]{}
\renewcommand*{\backrefalt}[4]{%
\ifcase #1 %
(Not cited.)%
\or
Cited on page~#2.%
\else
Cited on pages~#2.%
\fi}
\renewcommand*{\backrefsep}{, }
\renewcommand*{\backreftwosep}{ and~}
\renewcommand*{\backreflastsep}{, and~}
我想在 BibLatex 中进行相同的自定义。以下内容将始终有效:
\usepackage[backref=true]{biblatex}
\DefineBibliographyStrings{english}{%
backrefpage = {Cited on page},
backrefpages = {Cited on pages},
}
我需要的帮助是:
- 将(未引用)添加到通过 \nocite{} 添加的所有条目。
- 正确格式化页面列表,例如“在第 1、2、3、4 和 5 页引用”。 --- 现在它输出“在第 1、2、3、4、5 页引用”。
编辑:
解决方案(根据@Guido 的回复创建):
\documentclass{article}
\usepackage{hyperref}
\hypersetup{colorlinks=false, pdfborder={0 0 0}}
\usepackage[backend=bibtex,backref=true]{biblatex}
\DefineBibliographyStrings{english}{%
backrefpage = {Cited on page},
backrefpages = {Cited on pages},
}
\renewbibmacro{pageref}{%
\iflistundef{pageref}
{\printtext[parens]{Not Cited}}
{%
\printtext[parens]{\ifnumgreater{\value{pageref}}{1}
{\bibstring{backrefpages}\ppspace}
{\bibstring{backrefpage}\ppspace}
\printlist [pageref][-\value{listtotal}]{pageref}}}}
\DeclareListFormat{pageref}{%
% == 2 references
\ifthenelse{\value{liststop} < 3}{\ifthenelse{\value{listcount}<\value{liststop}}{\hyperpage{#1} and }{\hyperpage{#1}}} %
{ % > 2 references
\ifthenelse{\value{listcount}<\value{liststop}}
{\hyperpage{#1}\addcomma\addspace}
{\ifnumequal{\value{listcount}}{\value{liststop}}
{and \hyperpage{#1}}
{}%
}%
}%
}
\begin{filecontents}{mybib.bib}
@article{zero,title= {Tile 0}}
@article{one,title= {Tile 1}}
@article{two,title= {Tile 2}}
@article{three,title= {Tile 3}},
}
\end{filecontents}
\bibliography{mybib}
\begin{document}
\nocite{zero}
\cite{one}
\cite{two}
\cite{three}
\newpage
\cite{two}
\cite{three}
\newpage
\cite{three}
\printbibliography
\end{document}
生成:
[1] “Tile 0”。出处:()。(未引用)。
[2] “Tile 1”。出处:()(引自第 1 页)。
[3] “Tile 2”。出处:()(引用自第 1 页和第 2 页)。
[4] “Tile 3”。出处:()(引用自第 1、2 和 3 页)。
答案1
反向引用存储在pageref
列表中。因此,您可以\DeclareListFormat
控制反向引用的格式。
这是一个可以实现您想要的定义:
\DeclareListFormat{pageref}{%
\ifthenelse{\value{listcount}<\value{liststop}}
{#1\addcomma\addspace}
{\ifnumequal{\value{listcount}}{\value{liststop}}
{and #1}
{}%
}%
}
为了解决未引用条目的情况,必须修改pageref
bibmacro
\renewbibmacro{pageref}{%
\iflistundef{pageref}
{\printtext[parens]{Not Cited}}
{%
\printtext[parens]{\ifnumgreater{\value{pageref}}{1}
{\bibstring{backrefpages}\ppspace}
{\bibstring{backrefpage}\ppspace}
\printlist [pageref][-\value{listtotal}]{pageref}}}}
利用提供的 MWE 它生成:
答案2
如果不想使用 BibLaTeX 在最后一个元素前添加逗号,则应修改 Guido 和 OP 提出的定义:
\DeclareListFormat{pageref}{%
\ifthenelse{\value{listcount}=1}%
{\hyperpage{#1}}%
{\ifthenelse{\value{listcount}<\value{liststop}}%
{\addcomma\addspace\hyperpage{#1}}%
{\ifnumequal{\value{listcount}}{\value{liststop}}%
{\addspace{}and\addspace\hyperpage{#1}}{}%
}%
}%
}%
示例输出为:
(引自第 1 页和第 2 页)
(引自第 1、2 和 3 页)
顺便说一句,向 TeX.stackexchange 社区问好!