是否有用于 biblatex 引用样式定制的宏ifciteibid
和其他测试?我在哪里可以找到它们?它们是否易于重新定义?
先感谢您。
答案1
作为艾伦·芒恩指出在评论中\ifciteibid
,手册中记录了类似的引用跟踪器。§4.6.2中记录了biblatex
类似的测试。\ifciteibid
独立测试,控制这些测试的某些行为的相应选项在§3.1.2.3 中进行了解释[序言选项 > ] 内部。
类似的测试的实现\ifciteibid
由几个部分组成,所有(或大部分)部分可以在中找到biblatex.sty
。
第一部分是测试本身的实现(biblatex.sty
v3.16中的 ll. 2924-2953)。\ifciteibid
以下定义将根据前导选项进行切换。
% {<true>}{<false>}
\def\blx@ifciteibid@global{%
\ifbool{citetracker}
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}
{\@secondoftwo}}
\def\blx@ifciteibid@context{%
\ifbool{citetracker}
{\iftoggle{blx@footnote}
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@foot}
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}}
{\@secondoftwo}}
\def\blx@ifciteibid@strict{%
\ifbool{citetracker}
{\blx@ifcitesingle
{\blx@ifciteibid@global}
{\@secondoftwo}}
{\@secondoftwo}}
\def\blx@ifciteibid@constrict{%
\ifbool{citetracker}
{\blx@ifcitesingle
{\iftoggle{blx@footnote}
{\blx@ifmpfncheck
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@foot}
{\@secondoftwo}}
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}}
{\@secondoftwo}}
{\@secondoftwo}}
实施的第二部分是引用跟踪本身(ll. 11227-11263 在biblatex.sty
v3.16 中)因为ibid
我们有
% ibidem tracker
\def\blx@ibidtracker@global{%
\ifbool{citetracker}
{\global\let\blx@lastkey@text\abx@field@entrykey}
{}}
\def\blx@ibidtracker@context{%
\ifbool{citetracker}
{\iftoggle{blx@footnote}
{\global\let\blx@lastkey@foot\abx@field@entrykey}
{\global\let\blx@lastkey@text\abx@field@entrykey}}
{}}
\def\blx@ibidtracker@strict{%
\blx@ifcitesingle
{\blx@ibidtracker@global}
{\blx@ibidreset@global}}%
\def\blx@ibidtracker@constrict{%
\blx@ifcitesingle
{\blx@mpfnsave
\blx@ibidtracker@context}
{\blx@ibidreset@context}}%
\def\blx@ibidreset@force{%
\global\undef\blx@lastkey@text
\global\undef\blx@lastkey@foot
\blx@mpfnreset}
\def\blx@ibidreset@global{%
\global\undef\blx@lastkey@text}
\def\blx@ibidreset@context{%
\iftoggle{blx@footnote}
{\blx@mpfnreset
\global\undef\blx@lastkey@foot}
{\global\undef\blx@lastkey@text}}
再次,使用哪一个定义取决于前导码设置。
具体来说,选择测试的确切行为的前导选项实现如下(biblatex.sty
v3.16中的 ll. 14844-14871)
\DeclareBiblatexOption{global,type,entry}[string]{ibidtracker}[true]{%
\ifcsdef{blx@opt@ibidtracker@#1}
{\csuse{blx@opt@ibidtracker@#1}}
{\blx@err@invopt{ibidtracker=#1}{}}}
\def\blx@opt@ibidtracker@true{%
\let\blx@imc@ifciteibid\blx@ifciteibid@global
\let\blx@ibidtracker\blx@ibidtracker@global
\let\blx@ibidreset\blx@ibidreset@global
\booltrue{citetracker}}
\def\blx@opt@ibidtracker@false{%
\let\blx@imc@ifciteibid\@secondoftwo
\let\blx@ibidtracker\relax
\let\blx@ibidreset\relax}
\def\blx@opt@ibidtracker@context{%
\let\blx@imc@ifciteibid\blx@ifciteibid@context
\let\blx@ibidtracker\blx@ibidtracker@context
\let\blx@ibidreset\blx@ibidreset@context
\booltrue{citetracker}}
\def\blx@opt@ibidtracker@strict{%
\let\blx@imc@ifciteibid\blx@ifciteibid@strict
\let\blx@ibidtracker\blx@ibidtracker@strict
\let\blx@ibidreset\blx@ibidreset@global
\booltrue{citetracker}}
\def\blx@opt@ibidtracker@constrict{%
\let\blx@imc@ifciteibid\blx@ifciteibid@constrict
\let\blx@ibidtracker\blx@ibidtracker@constrict
\let\blx@ibidreset\blx@ibidreset@context
\booltrue{citetracker}}
所有这些测试的大致思路都是相同的:命令(根据选项定义为\blx@ibidtracker
之一)将当前引用的条目键保存在辅助宏中。 ( 的内部名称)然后可以将辅助宏中的条目键与当前正在处理的条目的键进行比较。根据设置,可能会区分脚注和文内引用,并且可能会尝试抑制可能产生歧义的“ibid。”如果其中一个 cite 调用同时提到了多个来源。\blx@ibidtracker@...
\blx@imc@ifciteibid
\ifciteibid
biblatex