BibLaTeX Citetracker 混淆

BibLaTeX Citetracker 混淆

我有以下要求:对于第一的每次提到作者时,必须有一个“满的”引文,匹配参考书目条目之后,使用已能正常工作的简写形式。

现在我发现BibLaTeX 文档我设置为 true 的选项citetracker。我还找到了宏\ifciteseen\ifentryseen。但是,我不知道如何在我的.cbx文件中使用它们来解决问题。我必须重写宏吗?如何在文件的帮助下生成参考书目字符串.bbx

如果您需要更多信息或找到类似的帖子(尽管我搜索过),请随时发表评论。

最小示例:

\documentclass{article}
\usepackage{lipsum}
\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
  @book{Knu86,
    author = {Knuth, Donald E.},
    year = {1986},
    title = {The \TeX book},
  }
\end{filecontents}

\begin{filecontents}{cs.cbx}
\RequireCitationStyle{authoryear}
\DeclareFieldFormat{citetitle}{#1\isdot}
\DeclareFieldFormat[article]{citetitle}{#1}
\DeclareNameFormat{labelname}{%
    \ifcase\value{uniquename}%
    \usebibmacro{name:last}{#1}{#3}{#5}{#7}%
    \or
    \ifuseprefix
        {\usebibmacro{name:last}{#1}{#3}{#5}{#8}}
        {\usebibmacro{name:last}{#1}{#4}{#6}{#8}}%
    \or
    \usebibmacro{name:last}{#1}{#3}{#5}{#7}%
    \fi
    \usebibmacro{name:andothers}
}
\end{filecontents}

\usepackage[citestyle = cs, bibstyle = standard, backend=bibtex8, citetracker=true]{biblatex}
\bibliography{\jobname}
 
\begin{document}
\lipsum[1]\footcite[S.85]{Knu86}
\lipsum[1]\footcite[S.96]{Knu86}
\printbibliography
\end{document}

我想提供一段伪代码,希望它能清楚地表达我的意思。

如果当前 bib 条目(例如 Knu86)已被引用

(true:) 使用 cite style 中定义的引用方式

(false:)从参考书目中打印字符串

答案1

这种类型的引用标签已在verbose样式及其变体中实现,但使用简短的作者标题标签代替作者年份标签。在 中verbose.cbx,测试的使用\ifciteseen在参考书目宏中得到演示cite,其定义如下:

\newbibmacro*{cite}{%
  \usebibmacro{cite:citepages}%
  \ifciteseen
    {\iffieldundef{shorthand}
       {\usebibmacro{cite:short}}
       {\usebibmacro{cite:shorthand}}}
    {\usebibmacro{cite:full}}}

为了获得所需的输出,我们可以编辑cite:short宏以打印labelyear代替labeltitle。宏通过以下方式生成完整引文cite:full

\usedriver{\DeclareNameAlias{sortname}{default}}{\thefield{entrytype}}

它的输出与条目的参考书目项几乎相同,只是条目开头的名称列表以默认first-last格式打印,而不是last-first/first-last。使用以下命令可以获得相同的输出

\usedriver{}{\thefield{entrytype}}

尽管该pages字段可能会与附注中的页码引用产生一些混淆。为了解决这个问题,该verbose样式及其变体提供了一个名为的附加选项citepages

\documentclass{article}
\usepackage[german]{babel}
\usepackage{csquotes}
\usepackage[style=verbose,labelyear]{biblatex}

% experiment with these settings
\ExecuteBibliographyOptions{citepages=omit,citetracker=true}

% replace labeltitle with labelyear
\renewbibmacro*{cite:short}{%
  \printnames{labelname}%
  \setunit{\nameyeardelim}%
  \usebibmacro{cite:labelyear+extrayear}}

% full citations same as bibliography
\renewbibmacro*{cite:full}{%
  \usebibmacro{cite:full:citepages}%
  \printtext[bibhypertarget]{%
    \usedriver{}{\thefield{entrytype}}}%
  \usebibmacro{shorthandintro}}

% from authoryear.cbx
\newbibmacro*{cite:labelyear+extrayear}{%
  \iffieldundef{labelyear}{}{%
    \printtext[bibhyperref]{\printfield{labelyear}\printfield{extrayear}}}}

\bibliography{biblatex-examples}

\begin{document}
\null\vfill\noindent
Filler text \autocite{baez/article,baez/online}.
Filler text \autocite[85]{bertram}.
Filler text \autocite[96]{bertram}.
Filler text \parencite{baez/article,baez/online}.
\printbibliography
\end{document}

在此处输入图片描述

请注意,extrayear附加的labelyear用于消除歧义的字段未包含在作者-标题书目中。可以添加此字段,但作者-年份书目样式会更方便读者阅读。您可以通过替换来实现这一点

\usepackage[style=verbose,labelyear]{biblatex}

\usepackage[citestyle=verbose,bibstyle=authoryear]{biblatex}

相关内容