我正在使用tufte-book
文档类和biblatex
包,并希望在“第一次”引用时添加边注,以表明几乎完整的引用。具体来说,我希望文内引用本身充当一种注释调用。我能实现的最接近的事情是:
注意两个不该注意的地方。首先,第二个边注不应该存在。其次,边注的引用信息应该与正文中的引用信息完全相同。也就是说,名字中不能有首字母。
我写第一次引号之间,因为我想重置以下行为:i) 每一页、ii) 除章节第一页之外的每对奇偶页(应包括行为)以及 iii) 每一章。当然,对于任何完整文档,只应有一个案例。
我尝试改编代码,但没有成功这里,这里, 和这里我怀疑问题有两个根源:
1)citetracker
在所有浮动中被禁用(biblatex 手册第 59 页 - 版本 3.11)。我认为该marginfix
包使用浮动来排列边注,因此我尝试了\citetrackertrue
几种设置方法,但都失败了。
2) 该\newbibmacro*
部分语法不正确。更准确地说,是该\ifciteseen
部分内部的语法不正确。
我尝试的另一种策略是在第一次使用键时\AtEveryCitekey
添加额外的代码( ),但这并没有带来预期的结果。\marginnote{}
最后,请注意,我无法脱离这个fixmargin
包,我需要维护 APA 风格,并且我正在使用 overleaf.com 进行编译。
我的最小工作示例是:
\RequirePackage{filecontents}
\begin{filecontents}{mybib.bib}
@article{acemoglu2001colonial,
title={The colonial origins of comparative development: An empirical investigation},
author={Acemoglu, Daron and Johnson, Simon and Robinson, James A},
journal={American Economic Review},
volume={91},
number={5},
pages={1369--1401},
year={2001}
}
\end{filecontents}
% ---------------------------------------
\documentclass[nobib]{tufte-book}
\usepackage[T1]{fontenc}
\usepackage[
style=apa,
citestyle=apa,
backend=biber
]{biblatex}
\addbibresource{mybib.bib}
\ExecuteBibliographyOptions{citetracker,sorting=none}
\DeclareCiteCommand{\fullcite}
{\usebibmacro{prenote}}
{\usedriver
{\DeclareNameAlias{sortname}{default}}
{\thefield{entrytype}}}
{\multicitedelim}
{\usebibmacro{postnote}}
\newbibmacro*{fullcite}{%
\ifciteseen
{}
{\fullcite{\thefield{entrykey}}\addperiod}
}
\usepackage{xargs}
\newcommandx{\mytextcite}[3][1={0pt},2={}]{
\textcite{#3}\marginnote[#1]{\fullcite[#2]{#3}.}
}
\AtEveryCitekey{\clearfield{pages}}
\AtEveryCitekey{\clearfield{volume}}
\AtEveryCitekey{\clearfield{number}}
% For Apa to work
\DeclareLanguageMapping{english}{english-apa}
\usepackage{marginfix}
\begin{document}
\mytextcite{acemoglu2001colonial} argue that the evidence is not robust.
This new paragraph repeats a citation. We now want to check how repeated in-text citations are treated in the margin. \mytextcite{acemoglu2001colonial} are the only authors that \ldots
\printbibliography
\end{document}
答案1
据我所知,1 和 2 实际上都不是问题。
biblatex
的跟踪器未被禁用,\marginnote
并且的语法\newbibmacro*{fullcite}
实际上是正确的,但没有调用 bibmacro fullcite
,而且它从未被调用,所以该定义不执行任何操作。
但是,所提出的方法存在一个问题。\mytextcite
被拆分为两个不同的、独立的 cite 命令(\textcite
和\fullcite
)。当然,这两个命令的 值不同\ifciteseen
。如果之前没有见过引用,\textcite
则切换\ifciteseen
为 false,但对于所有后续引用, 则将其切换为 true。这意味着无论如何,\ifciteseen
对于后续的 都将为 true \fullcite
。
解决这个问题的最好方法是只定义一个引用命令,用\DeclareCiteCommand
它决定是否直接发出边注。这样,\ifciteseen
就有了正确的值。
我应用的第二个更改是个人喜好问题。\AtEveryCitekey
我发现定义一个宏来打印所需的信息比使用 fullcite 和删除“多余”信息更优雅。nearfullcite
显示标签名称(作者、编辑等)、年份、标题和附件作品的标题(journaltitle
或booktitle
)(如果适用)。
因为您想使用biblatex-apa
代码,所以需要进行一些肮脏的黑客攻击。bibaltex-apa
必须非常努力才能正确获取一些 APA 要求,并且干扰这一点可能会很痛苦。
\RequirePackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{acemoglu2001colonial,
title = {The colonial origins of comparative development: An empirical investigation},
author = {Acemoglu, Daron and Johnson, Simon and Robinson, James A},
journal = {American Economic Review},
volume = {91},
number = {5},
pages = {1369--1401},
year = {2001}
}
\end{filecontents}
\documentclass[nobib]{tufte-book}
\usepackage[T1]{fontenc}
\usepackage[
style=apa,
citetracker=true,
backend=biber,
]{biblatex}
\newcommand*{\bibmarginnote}[2][0pt]{%
\marginnote[#1]{\protecting{\blxmkbibnote{foot}{#2}}}}
\DeclareCiteCommand{\margtextcite}
{\usebibmacro{cite:init}%
\usebibmacro{prenote}}
{\usebibmacro{citeindex}%
\usebibmacro{textcite}%
\ifciteseen
{}
{\bibmarginnote{\usebibmacro{nearfullcite}}}}
{}
{\usebibmacro{textcite:postnote}%
\usebibmacro{cite:post}}
\newrobustcmd*{\Margtextcite}{\bibsentence\margtextcite}
\makeatletter
% this macro is specific to biblatex-apa
\newbibmacro*{nearfullcite}{%
\begingroup
\let\ifciteseen\@secondoftwo% <- bad hack for biblatex-apa
\printnames[labelname][-\value{listtotal}]{labelname}%
\setunit{\addspace}%
\usebibmacro{cite:paren:labeldate+extradate}%
\newunit
\ifbooklikeentrytype
{\usebibmacro{maintitle+title}}
{\usebibmacro{title}}%
\newunit
\ifentrytype{article}
{\usebibmacro{journal}}
{}%
\newunit
\ifinbooklikeentrytype
{\usebibmacro{maintitle+booktitle}}
{}%
\endgroup
}
\makeatother
\providebibmacro*{cite:paren:labeldate+extradate}{%
\iffieldundef{labelyear}
{}
{\printtext[parens]{\printlabeldateextra}}}
\newcommand*{\ifbooklikeentrytype}{%
\ifboolexpr{ test {\ifentrytype{book}}
or test {\ifentrytype{collection}}
or test {\ifentrytype{proceedings}}}}
\newcommand*{\ifinbooklikeentrytype}{%
\ifboolexpr{ test {\ifentrytype{inbook}}
or test {\ifentrytype{incollection}}
or test {\ifentrytype{inproceedings}}}}
\newcommand*{\ifmisclikeentrytype}{%
\ifboolexpr{ test {\ifentrytype{booklet}}
or test {\ifentrytype{manual}}
or test {\ifentrytype{misc}}
or test {\ifentrytype{online}}
or test {\ifentrytype{report}}
or test {\ifentrytype{thesis}}
or test {\ifentrytype{unpublished}}}}
\usepackage{marginfix}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\begin{document}
\Margtextcite{acemoglu2001colonial,sigfridsson,nussbaum} argue that the evidence is not robust.
This new paragraph repeats a citation. We now want to check how repeated in-text citations are treated in the margin. It has been shown by \margtextcite{acemoglu2001colonial,geer,sigfridsson} that \ldots
\printbibliography
\end{document}
可以使用选项等按章节(如果可用)、按节、按小节重置引用跟踪器citereset=chapter
。
对于每页重置,没有citereset
你只需要\iflastciteonsamepage
使用https://tex.stackexchange.com/a/275524/35864代替\ifciteseen
。