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