在多引用中有一个默认的预值

在多引用中有一个默认的预值

我正在使用该biblatex包并尝试修改该\cites命令。

\cites命令定义为

\cites(<pre>)(<post>)[<pre>][<post>]{<key>}...[<pre>][<post>]{<key>}

我将添加一些索引来阐明我正在尝试做的事情。

\cites(<pre_0>)(<post_0>)[<pre_1>][<post_1>]{<key_1>}...[<pre_n>][<post_n>]{<key_n>}

pre_0将显示在多引文之前,post_0并将显示在最后。

我正在尝试编写一个新命令,其行为与 完全相同\cites,不同之处在于pre_1填充pre_n了默认值。

到目前为止我所取得的成就是使用默认值来pre_0使用

\newcommand{\compares}{\cites[Cf. ]}

但我不需要使用pre_0。如果它是我的新命令的可选参数,那就太好了,但这不是必须的。

我可以对\cite以下命令执行此操作(Cf.这是默认设置):

\newcommand{\compare}[2][]{\cite[Cf.][#1]{#2}}

现在我想让命令具有相同的行为\cites。我该如何实现?

答案1

我才刚刚开始学习如何在 上敲击biblatex。一般来说,您正在尝试声明一个新的 multicite 命令。对于 样式,numeric\cites定义为

\DeclareMultiCiteCommand{\cites}[\mkbibbrackets]{\cite}{\multicitedelim}

所以我们想要

\DeclareMultiCiteCommand{\mycites}[\mkbibbrackets]{\mycite}{\multicitedelim}

现在我们需要定义\mycite我们想要做什么。再次从原始numeric样式开始

\DeclareCiteCommand{\cite}[\mkbibbrackets]
  {\usebibmacro{prenote}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}}
  {\multicitedelim}
  {\usebibmacro{postnote}}

我们可以去

\DeclareCiteCommand{\mycite}[\mkbibbrackets]
  {\usebibmacro{myprenote}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}}
  {\multicitedelim}
  {\usebibmacro{mypostnote}}

让我们定义\myprenote\mypostnote。原文定义biblatex.def

\newbibmacro*{prenote}{%
  \iffieldundef{prenote}
    {}
    {\printfield{prenote}%
     \setunit{\prenotedelim}}}

\newbibmacro*{postnote}{%
  \iffieldundef{postnote}
    {}
    {\setunit{\postnotedelim}%
     \printfield{postnote}}}

这是我不确定什么是最好的。一个解决方案是

\newbibmacro*{myprenote}{x\space}
\newbibmacro*{mypostnote}{, y}

在哪里,你想让它们在哪里x就让y它们在哪里。我不认为这是真正的方法bibltex,我认为更好的方法是

\newbibmacro*{myprenote}{\printtext{x}\setunit{\prenotedelim}}
\newbibmacro*{mypostnote}{\printtext{\addcomma\space y}\setunit{\postnotedelim}}

但我真的不明白这是做什么的,我认为我们应该使用字段格式。把它们放在一起

\documentclass{article}
\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}
\newbibmacro*{myprenote}{\printtext[prenote]{x}\setunit{\prenotedelim}}
\newbibmacro*{mypostnote}{\printtext[postnote]{\addcomma\space y}\setunit{\postnotedelim}}
\DeclareCiteCommand{\mycite}[\mkbibbrackets]
  {\usebibmacro{myprenote}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}}
  {\multicitedelim}
  {\usebibmacro{mypostnote}}
\DeclareMultiCiteCommand{\mycites}[\mkbibbrackets]{\mycite}{\multicitedelim}

\begin{document}
\cites(a)(b)[x][y]{angenendt}[x][y]{bertram}

\mycites(a)(b){angenendt}{bertram}
\end{document}

答案2

\AtNextCite钩子允许您轻松定义现有引用命令的变体。

\newrobustcmd*{\mycite}{\AtNextCite{<code>}\cite}

在 中,<code>您可以修改 biblatex 计数器、通用命令、参考书目宏或格式指令。这些更改仅适用于以下内容\cite。引文参数解析可以留给 biblatex。\mycite可以类似地定义 的多引文变体:

\newrobustcmd*{\mycites}{\AtNextCite{<code>}\cites}

以下是一个解答您问题的示例。在新的引用命令中,您可以\bibstring{confer}通过提供非空的预注释参数来覆盖默认的预注释。

\documentclass{article}
\usepackage[style=verbose,maxnames=1]{biblatex}

\newrobustcmd*{\cfautocite}{\cfcitehook\autocite}
\newrobustcmd*{\Cftextcite}{\cfcitehook\Textcite}
\newrobustcmd*{\cfautocites}{\cfcitehook\autocites}
\newrobustcmd*{\Cftextcites}{\cfcitehook\Textcites}

\newrobustcmd*{\cfcitehook}{%
  \AtNextCite{\renewbibmacro*{prenote}{\usebibmacro{prenote:confer}}}}

\newbibmacro*{prenote:confer}{%
  \iffieldundef{prenote}
    {\bibstring{confer}}
    {\printfield{prenote}}%
  \setunit{\prenotedelim}}

\newcommand{\cmd}[1]{\texttt{\textbackslash #1}}
\addbibresource{biblatex-examples.bib}

\begin{document}
\null\vfill\noindent
\cmd{Textcite}: \Textcite[e.g.][10]{companion} showed that... \\
\cmd{autocite}: Filler text \autocite[10]{companion,knuth:ct:a}. \\
\cmd{Textcites}: \Textcites[10]{companion}[e.g.][]{knuth:ct:a}{glashow} showed that... \\
\cmd{autocites}: Filler text \autocites[10]{companion}[e.g.][]{knuth:ct:a}{glashow}. \\\\
\cmd{Cfextcite}: \Cftextcite[e.g.][10]{companion} showed that... \\
\cmd{cfautocite}: Filler text \cfautocite[10]{companion,knuth:ct:a}. \\
\cmd{Cftextcites}: \Cftextcites[10]{companion}[e.g.][]{knuth:ct:a}{glashow} showed that...\\
\cmd{cfautocites}: Filler text \cfautocites[10]{companion}[e.g.][]{knuth:ct:a}{glashow}.
\end{document}

相同的方法适用于multiprenote- 无法通过\DeclareCiteCommand或访问的字段\DeclareMultiCiteCommand

\newrobustcmd*{\cfmulticitehook}{%
  \AtNextCite{\renewbibmacro*{multiprenote}{\usebibmacro{multiprenote:confer}}}}

\renewbibmacro*{multiprenote:confer}{%
  \iffieldundef{multiprenote}
    {\bibstring{confer}}
    {\printfield{multiprenote}}%
  \setunit{\prenotedelim}}

相关内容