我试图找出目前是否可以在 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
使用biblatex
v1.3 后,这一点变得非常容易:此版本引入了citecounter
计数器,“表示当前正在处理的条目在当前参考部分被引用的次数”(手册,第 4.6.2 节)。在下面的 MWE 中,我使用了由 加载的包\ifnumgreater
中的测试。etoolbox
biblatex
编辑:需要注意的是,该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}