在使用 Tufte 文档类(tuft-handout 或 tuft-book)的文档中,\cite
被替换为与所引用作品的完整参考书目条目相对应的脚注(显示为旁注)。对于第一次出现的情况,这很好,但(通常)对于同一作品的后续出现,我并不希望出现这种情况。
有没有办法在第一个引文之后自动生成缩写引文,使用 \cite
独自的?
例如,我想要这样的东西:
但为了得到这个,我需要手动使用类似
\footnote{\citealp{...}}
对于第一个之后的引用:
\documentclass[]{tufte-handout}
\begin{document}
This is the first occurrence of a citation,\cite{Deutsch:2002} which works as expected. I would also ideally like to be able to cite the same paper again, and have it appear automatically in some abbreviated form but instead I have to do this manually with a footnote and ERT\footnote{\citealp{Deutsch:2002}}. Is there a way to ensure that citations automatically appear in this "abbreviated" form after the first occurrence in Tufte documents?
\bibliographystyle{unsrtnat}
\bibliography{References}
\end{document}
这不仅在文档中很脆弱(如果第一个引用被移动到这些手工编码的引用之后),而且破坏了跨类的可移植性(因为后续引用都明确地实现为脚注)。
参考文献.bib:
@article{Deutsch:2002,
author = {Deutsch, D},
title = {{The structure of the multiverse}},
journal = {Proceedings: Mathematical, Physical and Engineering Sciences},
year = {2002},
volume = {458},
number = {2028},
pages = {2911--2923},
}
答案1
将以下代码添加到文档的序言中:
\usepackage{etoolbox}% provides some support for comma-separated lists
\makeatletter
% We'll keep track of the old/seen bibkeys here.
\def\@tufte@old@bibkeys{}
% This macro prints the full citation if it's the first time it's been used
% and a shorter citation if it's been used before.
\newcommand{\@tufte@print@margin@citation}[1]{%
% print full citation if bibkey is not in the old bibkeys list
\ifinlist{#1}{\@tufte@old@bibkeys}{%
\citealp{#1}% print short entry
}{%
\bibentry{#1}% print full entry
}%
% add bibkey to the old bibkeys list
\listgadd{\@tufte@old@bibkeys}{#1}%
}
% We've modified this Tufte-LaTeX macro to call \@tufte@print@margin@citation
% instead of \bibentry.
\renewcommand{\@tufte@normal@cite}[2][0pt]{%
% Snag the last bibentry in the list for later comparison
\let\@temp@last@bibkey\@empty%
\@for\@temp@bibkey:=#2\do{\let\@temp@last@bibkey\@temp@bibkey}%
\sidenote[][#1]{%
% Loop through all the bibentries, separating them with semicolons and spaces
\normalsize\normalfont\@tufte@citation@font%
\setcounter{@tufte@num@bibkeys}{0}%
\@for\@temp@bibkeyx:=#2\do{%
\ifthenelse{\equal{\@temp@last@bibkey}{\@temp@bibkeyx}}{%
\ifthenelse{\equal{\value{@tufte@num@bibkeys}}{0}}{}{and\ }%
\@tufte@trim@spaces\@temp@bibkeyx% trim spaces around bibkey
\@tufte@print@margin@citation{\@temp@bibkeyx}%
}{%
\@tufte@trim@spaces\@temp@bibkeyx% trim spaces around bibkey
\@tufte@print@margin@citation{\@temp@bibkeyx};\space
}%
\stepcounter{@tufte@num@bibkeys}%
}%
}%
}
% Calling this macro will reset the list of remembered citations. This is
% useful if you want to revert to full citations at the beginning of each
% chapter.
\newcommand{\resetcitations}{%
\gdef\@tufte@old@bibkeys{}%
}
\makeatother
它保存着已知/旧/见过的 bibkeys 列表。每次调用 时\cite{key}
,它都会将这些 bibkeys 添加到列表中。当它在页边打印引用时,它会检查已知密钥列表。如果我们之前见过该密钥,我们将调用\citealp{key}
。如果我们之前没有见过该密钥,我们将调用通常的\bibentry{key}
。
我添加了一个\resetcitations
宏(免费!),它会让 LaTeX 忘记之前见过的所有 bibkey。例如,可以在每章开头使用这个宏,这样你就会看到每章第一次引用的完整参考资料。
请注意,此宏不是特别高效。它不对已知 bibkey 列表进行排序,并且检查列表是一个线性时间过程,因此\cite
您拥有的 s 越多,它花费的时间就越长。
答案2
tufte-handout
加载natbib
包。你可以利用它,甚至可以使用(页面)规范引用(在人文学科中很有用):
我\citealias
在本例中定义了一个,其他选择在參考表。第一次出现可以这样引用:
\citepalias[S.148]{Camus10}\cite{Camus10}
下一次出现的情况被包装成\footnote{}
:
\footnote{\citepalias[S.147]{Camus10}}
它提供了一个足够优雅的解决方案,可以满足我的目的。我希望看到 Godbyk 的解决方案能够使用 cite-specifications。在那之前,我宁愿拥有一份脆弱的文档。
示例图片:
答案3
接受的答案实际上对我不起作用。我不得不稍微修改第一个命令,\@tufte@print@margin@citation
如下所示(请注意,我使用 BibLaTeX,因此您的引用命令也可能不同。
\newcommand{\@tufte@print@margin@citation}[1]{%
% print full citation if bibkey is not in the old bibkeys list
\xifinlist{#1}{\@tufte@old@bibkeys}{% CHANGED
\cite{#1}% print short entry
}{%
\fullcite{#1}% print full entry
% add bibkey to the old bibkeys list
\listxadd{\@tufte@old@bibkeys}{#1}% CHANGED, and moved to avoid duplicates
}%
%\show\@tufte@old@bibkeys%
}
原因实际上是,添加到列表的是字符串“\@temp@bibkeyx”,而不是 bib 键\@tufte@old@bibkeys
。使用命令可以解决这个问题\listxadd
,根据文档,该命令会在将元素添加到列表之前展开元素。如果您想知道的话,etoolbox
我是通过明智地使用命令发现这一点的。\show