修改 biblatex 中的 smartcite 以根据 prenote 改变行为

修改 biblatex 中的 smartcite 以根据 prenote 改变行为

我对 biblatex 的 smartcite 命令有疑问。

我按以下方式重新定义它:

\documentclass{article}
\usepackage[style=alphabetic, autocite=footnote]{biblatex}

\DeclareCiteCommand{\smartcite}[\iffootnote\mkbibparens\mkbibfootnote]
    {\usebibmacro{prenote}}
    {\usebibmacro{citeindex}%
               \printtext[brackets]{\usebibmacro{cite} \usebibmacro{postnote}}}
    {\multicitedelim}
    {}

\DeclareMultiCiteCommand{\smartcites}
   [\iffootnote\mkbibparens\mkbibfootnote]{\smartcite}{\multicitedelim}

\DeclareAutoCiteCommand{footnote}[f]{\smartcite}{\smartcites}

\begin{filecontents*}{bibliography.bib}
@BOOK{ABC,
  author = {Cornelisse, J. W. and Schöyer, H. Ferry R. and Wakker, Karel F.},
  title = {Rocket Propulsion and Spaceflight Dynamics},
  year = {1979},
  publisher = {Pitman},
}
\end{filecontents*}

\bibliography{bibliography.bib}

\begin{document}
   Normal text\footnote{Some text \autocite[][20]{ABC}}.}
\end{document}

这样,使用该\autocite命令时,我就可以在普通文本中获得脚注引用,并在脚注中获得括号内的引用。

问题是当我使用例如时,\footnote{Some text \autocite[][20]{ABC}}.}我得到了结果,Some text ([ABC, S. 20]).但我希望看到的是Some text [ABC, S. 20].当我没有给出预注时。但是当有预注时,\footnote{Some text \autocite[see][20]{ABC}}.}我希望得到Some text (see [ABC, S. 20]).结果。

我尝试\smartcite使用以下命令重新定义该命令:

   \DeclareCiteCommand{\smartcite}[\iffootnote{\ifthenelse{\iffieldundef{prenote}}{\textnormal}{\mkbibparens}}{\mkbibfootnote}]
    {\usebibmacro{prenote}}
    {\usebibmacro{citeindex}%
               \printtext[brackets]{\usebibmacro{cite} \usebibmacro{postnote}}}
    {\multicitedelim}
    {}

但该命令似乎\ifthenelse没有效果。

有人知道如何修复它吗?

问候

答案1

\iffieldundef{prenote}biblatex在包装器参数中似乎不可用\DeclareCiteCommand,因此我们必须推迟测试,直到可以为止。

可以按如下方式完成

\newtoggle{weareinfootnote}
\settoggle{weareinfootnote}{false}

\newbibmacro*{smartprenote}{%
  \iffieldundef{prenote}
    {}
    {\iftoggle{weareinfootnote}
       {\bibopenparen}%
       {}%
     \printfield{prenote}%
     \setunit{\prenotedelim}}}

\DeclareCiteCommand{\smartcite}[\iffootnote{\settoggle{weareinfootnote}{true}}{\settoggle{weareinfootnote}{false}\mkbibfootnote}]
    {\usebibmacro{smartprenote}}
    {\usebibmacro{citeindex}%
     \printtext[brackets]{\usebibmacro{cite}\usebibmacro{postnote}}}
    {\multicitedelim}
    {\ifboolexpr{not test {\iffieldundef{prenote}} and test {\iftoggle{weareinfootnote}}}
      {\bibcloseparen}%
      {}}

smartprenote如果预注位于 中,则在预注中额外打印一个左括号\footnote。最后在“邮政编码”部分中,如果预注位于脚注中,则关闭括号。我们不能\iffootnote在引用命令中使用标准测试,因为它总是会产生 true(如果它是在脚注中调用的,显然会这样,而如果它是在文本中调用的,我们自己开始一个脚注,结果会\iffootnote评估为 true),所以我们定义了一个切换开关weareinfootnote来检查在发出命令之前我们是否在脚注中。

请注意,如果多次引用或\smartcites代码,这可能会产生严重错误。

\documentclass{article}
\usepackage[style=alphabetic, autocite=footnote]{biblatex}

\newtoggle{weareinfootnote}
\settoggle{weareinfootnote}{false}

\newbibmacro*{smartprenote}{%
  \iffieldundef{prenote}
    {}
    {\iftoggle{weareinfootnote}
       {\bibopenparen}%
       {}%
     \printfield{prenote}%
     \setunit{\prenotedelim}}}

\DeclareCiteCommand{\smartcite}[\iffootnote{\settoggle{weareinfootnote}{true}}{\settoggle{weareinfootnote}{false}\mkbibfootnote}]
    {\usebibmacro{smartprenote}}
    {\usebibmacro{citeindex}%
     \printtext[brackets]{\usebibmacro{cite}\usebibmacro{postnote}}}
    {\multicitedelim}
    {\ifboolexpr{not test {\iffieldundef{prenote}} and test {\iftoggle{weareinfootnote}}}
      {\bibcloseparen}%
      {}}

\addbibresource{biblatex-examples.bib}

\begin{document}
   Normal in-text cite \autocite[20]{wilde} indeed\autocite[see][20]{wilde}. Normal text\footnote{Some text \autocite[][20]{wilde}} and\footnote{Some text \autocite[see][20]{wilde}}.

   Normal in-text cite \autocite{wilde,cicero} indeed \autocite[see][]{wilde,cicero}. Normal text\footnote{Some text \autocite{wilde,cicero}} and\footnote{Some text \autocite[see][]{wilde,cicero}}.
\end{document}

在此处输入图片描述

相关内容