![修改 biblatex 中的 smartcite 以根据 prenote 改变行为](https://linux22.com/image/287305/%E4%BF%AE%E6%94%B9%20biblatex%20%E4%B8%AD%E7%9A%84%20smartcite%20%E4%BB%A5%E6%A0%B9%E6%8D%AE%20prenote%20%E6%94%B9%E5%8F%98%E8%A1%8C%E4%B8%BA.png)
我对 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}