检查某个条目是否被多次引用

检查某个条目是否被多次引用

我试图找出目前是否可以在 Biblatex 中进行一项测试,在第一次引用某个条目时测试该条目是否会在当前参考部分(即整篇论文或书籍的章节)中被引用多次。

现实世界的使用场景是法律引用,即《加拿大统一法律引用指南》,其中虽然略显含糊,但指出“如果后续段落中未提及案例,则无需为案例建立简短形式”(实际上,我看到的大多数论文只会在随后引用案例时提供简短形式,这是有道理的,因为否则,考虑到通常论文中只引用一次的大量案例,任何使脚注更短的方法都是受欢迎的)。

假设我引用长老牧业有限公司新西兰银行第一个脚注会写“长老牧业有限公司新西兰银行[1989] 2 NZLR 180(加州)[长老]”,所有后续脚注都会写“长老同上n.1”。然而,我需要打印速记字段作为条件,以便条目被引用多次。

我有一个模糊的想法,通过采取以下措施可能会实现。

这是我当前用来为案例做脚注的宏:

\newbibmacro*{footcite:jurisdiction}{%
  \global\boolfalse{cbx:loccit}%
  \ifciteseen
    {\ifthenelse{\ifciteibid\AND\NOT\iffirstonpage}
      {\usebibmacro{footcite:ibid}}
      {\usebibmacro{footcite:jurisdiction:note}}}
    {\usebibmacro{footcite:full:jurisdiction}%

以下是 footcite:full:jurisdiction 宏

\newbibmacro*{footcite:full:jurisdiction}{%
   \printtext{%
   \bibhypertarget{\thefield{entrykey}:\the\value{instcount}}{%
      \usedriver
        {\DeclareNameAlias{sortname}{default}}
        {jurisdiction}}}%
   \usebibmacro{shorthandintro:jurisdiction}}
   \usebibmacro{footcite:save}}}

因此,在 footcite:full:jurisdiction 中,我会使\usebibmacro{shorthandintro:jurisdiction}测试依赖于变量,而在 footcite:jurisdiction 中,我会在结果为真时设置变量\ifciteseen。这在运行两次 LaTeX 后就会起作用。

但是,我的问题是使用什么类型的变量以及如何设置它,以避免错误(例如,我认为使用布尔值并进行测试\ifbooltrue会导致第一次运行时出现“布尔变量 cbx:???? 未设置”之类的错误)。

欢迎任何想法。

答案1

根据@Seamus的建议,我编辑了我的原始答案,而不是添加新的答案;我最初的答案并不完全正确,如果有人遇到同样的问题,我的经验可能会有所帮助。虽然我最初的解决方案可以工作,但它也会给我最初没有注意到的错误,因为TextMate似乎抑制了它们。只有当我在终端中编译时我才会看到它们。所以这里是我改变和简化它的方法。

首先,我从宏开始footcite:jurisdiction

\newbibmacro*{footcite:jurisdiction}{%
  \global\boolfalse{cbx:loccit}%
  \ifciteseen%
    {\ifthenelse{\ifciteibid\AND\NOT\iffirstonpage}%
          {\usebibmacro{footcite:ibid}}%
          {\usebibmacro{footcite:jurisdiction:note}}}%
    {\usebibmacro{footcite:full:jurisdiction}%
     \usebibmacro{footcite:save}}}

这里没有什么特别的,它只是常规的 的一个变体footcite macro。请注意,footcite:jurisdiction:note当案例至少被引用一次(不是第一次,也不是与 ibid 一起引用)时,它会调用宏(这正是我希望在第一次引用中打印速记的情况)。宏footcite:jurisdiction:note如下:

\newbibmacro*{footcite:jurisdiction:note}{%
 \usebibmacro{jurisdiction:multipletimes}%
 \ifbool{bbx:jurisdiction:germany}%
   {\usebibmacro{court+location:germany}% Case id for German cases
    \setunit{\addspace}%
    \iffieldundef{origtitle}%
      {\printfield{title}}%
      {\printfield{origtitle}}}
   {\iffieldundef{shorthand}% Case id for English-style cases
      {\usebibmacro{casename}}
      {\printfield{shorthand}}}%
 \usebibmacro{seenote}%
 \iffieldundef{postnote}%
  {}%
  {\setunit*{\addcomma\space}}%
}

jurisdiction:multipletimes宏设置了一个变量,将检查该变量以确定是否需要打印简写。由于该宏最早仅在第二次引用时调用,但需要在第一次引用时打印简写,因此它会写入辅助文件。宏如下所示:

\newbibmacro{jurisdiction:multipletimes}{%
  \iffieldundef{shorthand}%
     {}%
     {\if@filesw
       \protected@write\@mainaux{}%
         {\string\csxdef{cbx@\thefield{entrykey}:short:%
          \csuse{cbx@first@\thefield{entrykey}}}{multi}}%
      \fi
      }%
}%

据我理解,\if@filesw检查 aux 文件是否可写,这似乎是个好主意。 写入\protected@write\@mainaux{}主 aux 文件。 \string逐字写入以下命令,而不是在写入 aux 文件之前将其扩展。\csxdef设置变量,该变量稍后用于检查条目是否被引用多次。下一个cbx@\thefield{entrykey}前面没有 ,\string因为我们希望它在写入 aux 文件之前扩展,以便为每个条目生成唯一的变量名。变量的名称还包含 部分,\csuse{cbx@first@\thefield{entrykey}}因为该部分(由于前面没有 而扩展\string)对于参考部分(如章节)中的引用是唯一的。这样,测试将基于每个参考部分而不是全局执行。

不再footcite:full:jurisdiction包含对用于测试的变量的任何引用。它如下所示:

\newbibmacro*{footcite:full:jurisdiction}{%
  \printtext{%
    \bibhypertarget{\thefield{entrykey}:\the\value{instcount}}{%
      \usedriver%
        {\DeclareNameAlias{sortname}{default}}%
        {jurisdiction}}}%
  \iffieldundef{postnote}%
    {}%
    {\setunit{\addspace}}}%

jurisdiction:shortform:intro与我最初的问题不同,现在由驾驶员调用以进行管辖,因此隐式地由 调用。它footcite:full:jurisdiction如下所示:

\newbibmacro{jurisdiction:shortform:intro}{%
  \ifcsstring{cbx@\thefield{entrykey}:short:%
              \the\value{instcount}}{multi}%
    {\addspace\printtext[brackets]%
      {\printfield{shorthand}%
       \ifcsstring{cbx@\thefield{entrykey}:orig}{orig}%
         {\addcomma\addspace%
          \bibstring{citedto}\addspace\printfield{origtitle}}%
         {}}%
    }%
    {\ifcsstring{cbx@\thefield{entrykey}:orig}{orig}%
      {\addspace\printtext[brackets]%
        {\bibstring{citedto}\addspace\printfield{origtitle}}}%
      {}%
    }%
}%

只要我们在同一个参考部分,cbx@\thefield{entrykey}:short:\the\value{instcount}就会与 相同cbx@\thefield{entrykey}:short:\csuse{cbx@first@\thefield{entrykey}},因为通用footcite:save宏在当前参考部分中的第一次完整引用时设置cbx@first@\thefield{entrykey}为。\the\value{instcount}

请注意,这里还包含一个测试,即是否需要打印原始标题,这不是我最初问题的一部分,但这样做的机制是相似的。(对于任何感兴趣的人,原始标题测试测试案件的任何引文是否包含精确点,在这种情况下,origtitle 字段提供的引用记者在案件的第一个引文中给出)。

答案2

使用biblatexv1.3 后,这一点变得非常容易:此版本引入了citecounter计数器,“表示当前正在处理的条目在当前参考部分被引用的次数”(手册,第 4.6.2 节)。在下面的 MWE 中,我使用了由 加载的包\ifnumgreater中的测试。etoolboxbiblatex

编辑:需要注意的是,该citecounter功能的引入是因为功能要求SourceForge.net 上的 OP jjbornheim:biblatex。

\documentclass{article}

\usepackage[style=verbose,citecounter=true]{biblatex}

\renewbibmacro*{cite:full}{%
  \usebibmacro{cite:full:citepages}%
  \printtext[bibhypertarget]{%
    \usedriver
      {\DeclareNameAlias{sortname}{default}}
      {\thefield{entrytype}}}%
%   \usebibmacro{shorthandintro}}% DELETED
  \ifnumgreater{\value{citecounter}}{1}{% NEW
    \usebibmacro{shorthandintro}% NEW
  }{% NEW
  }% NEW
}% NEW

\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@misc{A01,
  author = {Author, A.},
  year = {2001},
  title = {Alpha},
  shorthand = {AL},
}
@misc{B02,
  author = {Buthor, B.},
  year = {2002},
  title = {Bravo},
  shorthand = {BR},
}
\end{filecontents}

\addbibresource{\jobname.bib}

\begin{document}

Some text \autocite{A01}.

Some text \autocite{B02}.

Some text \autocite{A01}.

\printbibliography

\end{document}

相关内容