是否有可能在 Tufte-BibLaTeX 组合中微调引用位置?

是否有可能在 Tufte-BibLaTeX 组合中微调引用位置?

我将 tufte-latex 与 BibLaTeX 结合使用,如 我可以将 biblatex 与 Tufte 课程一起使用吗?我已经尝试了问题和答案中建议的变体。使用基于 biblatex 选项的变体autocite=footnote,我得到了更好的结果,当引用多次使用时,引用的版本更短,但我无法像重新定义命令那样微调附注与引用的位置cite。另一方面,重新定义的cite命令总是为我提供完整版本的引用,并且页边空白处很快就会被引用淹没。

平均能量损失

\documentclass[nobib]{tufte-handout}

\usepackage{hyphenat}

\usepackage[backend=biber,
autocite=footnote,
citecounter=true, 
style=verbose,
citetracker=true
]{biblatex}

%redefinition of cite command
\renewcommand{\cite}[2][0pt]{\sidenote[][#1]{\fullcite{#2}}}


\addbibresource{biblatex-examples.bib}

\begin{document}

This,\autocite{springer} should be a side note and this\autocite{springer} should too.

This,\cite{springer} should be a side note and this\cite[2cm]{springer} should be a shifted down side note.

\printbibliography 

\end{document}

输出: MWE 输出

所以我的问题是:是否有可能以某种方式获取使用该autocite命令生成的侧注的可控制位置?

答案1

一种(至少我认为)优雅并且相当实用的方法是使用一个新命令,比如说\sidecite

它将使用与所有命令相同的语法,但在开头\cite带有一个可选的偏移参数。<>

我们将使用xparse来实现它。

\footcite首先,我们从相关.cbx样式文件(在您的情况下)复制的定义verbose.cbx,将其重命名为\sidecitehelper并替换\mkbibfootnote\bibfootnotewrapper(因此我们实际上并没有得到脚注,而是一致的输出)。

\DeclareCiteCommand{\sidecitehelper}[\bibfootnotewrapper]
  {\usebibmacro{prenote}%
   \toggletrue{blx@footnote}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}}
  {\multicitedelim}
  {\usebibmacro{cite:postnote}}

然后我们定义\sidecite

\ExplSyntaxOn
\NewDocumentCommand\sidecite{D<>{}O{}om}{%
  \iftoggle{blx@footnote}
    {\cs_set_protected_nopar:Npn \__sct_wrapper:nn ##1 ##2 {\mkbibparens{##2}}}
    {\cs_set_protected_nopar:Npn \__sct_wrapper:nn ##1 ##2 {\sidenote[][##1]{##2}}}
    {\IfNoValueTF{#3}
      {\__sct_wrapper:nn{#1}{\sidecitehelper[#2]{#4}}}
      {\__sct_wrapper:nn{#1}{\sidecitehelper[#2][#3]{#4}}}}
}
\ExplSyntaxOff

使用此更新的定义,\sidecite我们现在可以检查是否处于边注(脚注)中,如果是,则只需将引文括在括号中,而不是创建嵌套的脚注/边注。我们有一个虚拟命令\__sct_wrapper:nn,在脚注中,它只将内容括在括号中,而在脚注之外则创建边注。在biblatex命令中\mkbibfootnote处理这个问题,如果我们不想\sidenote采用其可选参数,使用包装器命令镜像的方法\mkbibfootnote会更容易;但由于我们需要可选参数,所有这些处理都已移至\sidecite

还有一个问题:默认情况下tufte-latex,命令\footnote不能被修补biblatex,所以我们需要自己修补。我们使用xpatch为了那个原因

\makeatletter
\xpatchcmd{\@footnotetext}%
      {\color@begingroup}
      {\color@begingroup\toggletrue{blx@footnote}}
      {}
      {}
\makeatother

平均能量损失

\documentclass[nobib]{tufte-handout}
\usepackage{xparse}
\usepackage{xpatch}
\usepackage[
  style=verbose,
  autocite=footnote,
  backend=biber
]{biblatex}
\addbibresource{biblatex-examples.bib}

\makeatletter
\xpatchcmd{\@footnotetext}%
      {\color@begingroup}
      {\color@begingroup\toggletrue{blx@footnote}}
      {}
      {}
\makeatother

\DeclareCiteCommand{\sidecitehelper}[\bibfootnotewrapper]
  {\usebibmacro{prenote}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}}
  {\multicitedelim}
  {\usebibmacro{cite:postnote}}

\ExplSyntaxOn
\NewDocumentCommand\sidecite{D<>{}O{}om}{%
  \iftoggle{blx@footnote}
    {\cs_set_protected_nopar:Npn \__sct_wrapper:nn ##1 ##2 {\mkbibparens{##2}}}
    {\cs_set_protected_nopar:Npn \__sct_wrapper:nn ##1 ##2 {\sidenote[][##1]{##2}}}
    {\IfNoValueTF{#3}
      {\__sct_wrapper:nn{#1}{\sidecitehelper[#2]{#4}}}
      {\__sct_wrapper:nn{#1}{\sidecitehelper[#2][#3]{#4}}}}
}
\ExplSyntaxOff

\begin{document}

This,\sidecite[8]{springer} should\autocite{springer} be a side note and this\sidecite[see][8]{springer} should too.

Lorem ipsum\sidecite<2cm>[9]{geer} dolor\sidecite[cf.][]{springer}.

Sit\sidenote{amet \sidecite{geer}}.

\printbibliography 

\end{document}

在此处输入图片描述

请注意脚注 3 ( ) 的 2cm 偏移\sidecite<2cm>[9]{geer},以及biblatex脚注 1 ( \sidecite[8]{springer}) 中标准引用命令的自然“如果只有一个可选参数,则为后注”行为。\sidecite脚注 6 ( \sidenote{amet \sidecite{geer}}) 中的引用变为括号中的引用,以避免嵌套脚注。

相关内容