BibLaTeX \DeclareCiteCommand:如何检查速记和引用并选择因此?

BibLaTeX \DeclareCiteCommand:如何检查速记和引用并选择因此?

这个问题与Biblatex:依赖于速记的 Autocite但由于该问题询问autocite,我决定提出一个新问题。

我正在尝试声明一个引用命令\mycite,它的行为类似于\footcite没有shorthand没有字段的对于带有shorthand字段的 bib-entries,当它们第一次被引用时。如果带有shorthand字段的 bib-entries 第二次被引用,\mycite则应该表现得像\parencite

以下是 MWE:

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
    @book{Book1, author={Author 1}, title={Title 1}, shorthand={Shorthand1}}
    @book{Book2, author={Author 2}, title={Title 2}}
\end{filecontents}

\usepackage[style=verbose,backend=biber]{biblatex}
\addbibresource{\jobname.bib}

\DeclareCiteCommand{\mycite}[\mkbibfootnote]
  {\usebibmacro{prenote}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}}
  {\multicitedelim}
  {\usebibmacro{cite:postnote}}

\begin{document}
Citing an entry with defined shorthand field for the first time \mycite{Book1}.

Citing an entry with undefined shorthand field \mycite{Book2}.

Citing an entry with defined shorthand field for the second time \mycite{Book1}.
\end{document}

输出结果如下:

在此处输入图片描述 在此处输入图片描述

我想\mycite输出:

在此处输入图片描述 在此处输入图片描述

遗憾的是,以下声明\mycite不起作用:

\DeclareCiteCommand{\mycite}[\iffieldundef{shorthand}\mkbibfootnote\mkbibparens]
  {\usebibmacro{prenote}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}}
  {\multicitedelim}
  {\usebibmacro{cite:postnote}}

因此,我尝试通过复制粘贴和其他的定义来重新利用<precode>和字段,这似乎适用于简单的任务,例如根据简写字段使用方括号或圆括号:<postcode>\mkbibparens

\makeatletter
\DeclareCiteCommand{\mycite}[]
  {\iffieldundef{shorthand}{%
    \begingroup
    \blx@blxinit
    \blx@setsfcodes
    \bibopenparen
    \usebibmacro{prenote}}{%
    \begingroup
    \blx@blxinit
    \blx@setsfcodes
    \bibopenbracket
    \usebibmacro{prenote}}%
   }
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}}
  {\multicitedelim}
  {\iffieldundef{shorthand}{%
    \usebibmacro{cite:postnote}%
    \bibcloseparen%
    \endgroup}{%
    \usebibmacro{cite:postnote}%
    \bibclosebracket%
    \endgroup}
  }
\makeatother

这很可能是一种非常糟糕且丑陋的黑客行为。我不知道如何使用\mkbibfootnote包装器来实现这一点,这比\mkbibparens或的包装器更复杂\mkbibbrackets

我想指出的是,对我来说这里最重要的是有一个 cite 命令,它的行为类似于\footcite没有字段的条目shorthand,并且它的行为类似于有字段\parencite的条目shorthand

答案1

如果您每次只引用一个作品,以下解决方案将顺利运行\mycite。这是因为我们必须将所有代码移到引用命令的循环代码中,该命令针对每个引用的键执行。由于我们需要访问有关条目的信息(即它是否有字段shorthand?),而这些信息仅在循环代码中可用(并且在一定程度上在前缀和后缀中可用?),因此有必要进行此调整。

\DeclareCiteCommand{\mycite}[\unspace]
  {}
  {\usebibmacro{citeindex}%
   \ifboolexpr{not test {\iffieldundef{shorthand}} and test {\ifciteseen}}%
     {\space\mkbibparens{\usebibmacro{prenote}\printfield{shorthand}\usebibmacro{cite:postnote}}}
     {\mkbibfootnote{\usebibmacro{prenote}\usebibmacro{cite}\usebibmacro{cite:postnote}}}}
  {\multicitedelim}
  {}

这个想法很简单,我们检查是否有一个shorthand已经被引用的条目,如果是,我们默认使用\parencite简写;否则我们在脚注中进行正常引用。

平均能量损失

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
    @book{Book1, author={Author 1}, title={Title 1}, shorthand={Shorthand1}}
    @book{Book2, author={Author 2}, title={Title 2}}
\end{filecontents*}

\usepackage[style=verbose,backend=biber]{biblatex}
\addbibresource{\jobname.bib}

\DeclareCiteCommand{\mycite}[\unspace]
  {}
  {\usebibmacro{citeindex}%
   \ifboolexpr{not test {\iffieldundef{shorthand}} and test {\ifciteseen}}%
     {\space\mkbibparens{\usebibmacro{prenote}\printfield{shorthand}\usebibmacro{cite:postnote}}}
     {\mkbibfootnote{\usebibmacro{prenote}\usebibmacro{cite}\usebibmacro{cite:postnote}}}}
  {\multicitedelim}
  {}

\begin{document}
Citing an entry with defined shorthand field for the first time\mycite[Cf.][1]{Book1}.

Citing an entry with undefined shorthand field \mycite[2]{Book2}.

Citing an entry with defined shorthand field for the second time\mycite[4]{Book1}.
\end{document}

在此处输入图片描述

相关内容