使 Biblatex (Bibtex) 识别相等的后续后记

使 Biblatex (Bibtex) 识别相等的后续后记

为了总结查看示例

我使用 Biblatex (biber-backend) 作为参考书目工具,但我想这个问题也可能与 Bibtex 有关。我使用的样式是:authoryear-icomp

我这样引用:

\****cite[<number>]{<bibkey>}

这样,Biblatex 就会将数字识别为页码,并且重复引用的引用方式为:

(ibid.)

现在问题
我有相同的来源,但有特殊的页码,如“20:16”(或后记,如“第 XY 章”),因此 Biblatex 无法将其识别为页码,所以我必须像这样引用它:

\****cite[p.~20:16]{<bibkey>}

这当然意味着 Biblatex 不识别重复引用并将其引用为:

(ibid., p. 20:16)

代替:

(ibid.)

例子 (应该如何)

<text1> \cite[\ibid{chapter XY}]{authorXY}. <text2> \cite[\ibid{chapter XY}]{authorXY}
becomes:
<text1> (authorXY, chapter XY). <text2> (ibid.)

<text1> \cite[\ibid{chapter XY}]{authorXY}. <text2> \cite[\ibid{chapter AB}]{authorXY}
becomes:
<text1> (authorXY, chapter XY). <text2> (ibid., chapter AB)

同上{...}- 命令只是一个占位符,因为我不知道如何实现我所描述的内容。它只是为了解释这个想法。
我希望这能澄清一些事情。

非常感谢您的帮助和想法:)
提前谢谢您!

答案1

这个解决方案非常接近您想要的,不同之处在于您提出的建议\ibid与我的完全相反\noibidonly

我们修改了biblatex的跟踪器,使得所有后记都被视为“检查前一个后记是否相同”的跟踪器,而不仅仅是正确的页码。

\def\blx@loccit@stricttracker#1{%
  \global\csundef{blx@lastnote@#1@\abx@field@entrykey}%
  \blx@imc@iffieldundef{postnote}
    {}
    {\blx@ifcitesingle
       {\global\cslet{blx@lastnote@#1@\abx@field@entrykey}\abx@field@postnote
           \xifinlistcs\abx@field@entrykey{blx@trackkeys@#1}
             {}
             {\listcsxadd{blx@trackkeys@#1}\abx@field@entrykey}}
       {}}}

\def\blx@loccit@numcheck#1{%
  \blx@imc@iffieldundef{postnote}
    {\@secondoftwo}
    {\blx@imc@iffieldequalcs{postnote}{blx@lastnote@#1@\abx@field@entrykey}}}

这只是\ifpages删除了勾号的标准定义。

然后我们定义\noibidonly允许我们重置后记跟踪器,实际上导致当前和下一个后记出现,无论它是否之前立即显示过。

\newrobustcmd*{\noibidonly}{%
  \iftoggle{blx@footnote}
    {\blx@loccit@reset{foot}}
    {\blx@loccit@reset{text}}%
}

我们希望能够在后记中使用此命令,因此我们发出

\DeclarePageCommands*{\noibidonly}

(不过,想想看,那已经不再是必要的了。)

平均能量损失

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[style=authoryear-icomp,ibidpage]{biblatex}
\addbibresource{biblatex-examples.bib}

\makeatletter
\def\blx@loccit@stricttracker#1{%
  \global\csundef{blx@lastnote@#1@\abx@field@entrykey}%
  \blx@imc@iffieldundef{postnote}
    {}
    {\blx@ifcitesingle
       {\global\cslet{blx@lastnote@#1@\abx@field@entrykey}\abx@field@postnote
           \xifinlistcs\abx@field@entrykey{blx@trackkeys@#1}
             {}
             {\listcsxadd{blx@trackkeys@#1}\abx@field@entrykey}}
       {}}}

\def\blx@loccit@numcheck#1{%
  \blx@imc@iffieldundef{postnote}
    {\@secondoftwo}
    {\blx@imc@iffieldequalcs{postnote}{blx@lastnote@#1@\abx@field@entrykey}}}

\newrobustcmd*{\noibidonly}{%
  \iftoggle{blx@footnote}
    {\blx@loccit@reset{foot}}
    {\blx@loccit@reset{text}}%
}
\makeatother
\DeclarePageCommands*{\noibidonly}

\begin{document}
\cite[20]{cicero} and \cite[20]{cicero} and \cite[20]{cicero}.

\cite[p.~20:16]{wilde} and \cite[p.~20:16]{wilde} and \cite[p.~20:16]{wilde}.

\cite[lorem]{cicero} and \cite[ipsum]{cicero} and \cite[ipsum]{cicero}.

\cite[lorem]{wilde} and \cite[lorem]{wilde} and \cite[lorem\noibidonly]{wilde} and \cite[lorem]{wilde} and \cite[lorem]{wilde}.

\printbibliography
\end{document}

得出

在此处输入图片描述

相关内容