我正在使用该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}}