这个问题与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}