我可以在第一次出现后在 Tufte 文档中自动生成缩写引用吗?

我可以在第一次出现后在 Tufte 文档中自动生成缩写引用吗?

在使用 Tufte 文档类(tuft-handout 或 tuft-book)的文档中,\cite被替换为与所引用作品的完整参考书目条目相对应的脚注(显示为旁注)。对于第一次出现的情况,这很好,但(通常)对于同一作品的后续出现,我并不希望出现这种情况。

有没有办法在第一个引文之后自动生成缩写引文,使用 \cite 独自的?

例如,我想要这样的东西:

渲染的 MWE

但为了得到这个,我需要手动使用类似

\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

相关内容