I'm late for the party, but I think now biblatex
allows you to do that.
Consider the example:
\documentclass{article}
\usepackage{geometry}
\usepackage[citestyle=authoryear-comp]{biblatex}
\addbibresource{biblatex-examples.bib}
\begin{document}
\cites{glashow,herrmann}
\cites{glashow,herrmann,kastenholz}
\cites[1-3]{glashow}{herrmann}[\ppno~4 and~12--14]{kastenholz}
\end{document}
which prints:

If we redefine \multicitedelim
we can make it print different delimiters, depending on the number of citations (stored in the citetotal
counter) and the number of the current citation (stored in the citecount
counter):
\renewcommand*{\multicitedelim}{%
\iflastcitekey
{%
\ifboolexpr{
test {\ifnumgreater{\value{citetotal}+\value{multicitetotal}-1}{2}}
or test {\ifnumgreater{\value{lastcitetotal}+\value{citetotal}}{2}}
}
{\finalandcomma}
{}%
\addspace\bibstring{and}\space
}
{\addcomma\space}%
\ifnumequal{\value{citetotal}}{\value{citecount}}
{\setcounter{lastcitetotal}{\value{citetotal}}}
{}%
}
The above definition checks if the current citation key is the last one in the comma separated list using \iflastcitekey
. If it's not the last citation, just print \addcomma\space
(i.e., ,␣
). Otherwise, if it's the last key, we check if the expression \value{citetotal}+\value{multicitetotal}-1
or \value{lastcitetotal}+\value{citetotal}
are greater than two, and if they are, print a \finalandcomma
and then \addspace\bibstring{and}\space
in all cases (,␣and␣
).
The first expression is less or equal the total number of citations in the multi-cite command, so if there are multiple citations it will ensure the \finalandcomma
. This expression will only fail in the case \cites{one,two}{three}
, where multicitetotal
is two and citetotal
is 1 when three
is being processed. In this case the expression evaluates to 2 and the \finalandcomma
is not printed, whereas it should.
To work around that exception I added a bodge temporary counter which stores the previous citetotal
. In the case of the exception, lastcitetotal
will be 2 and citetotal
, 1, and their sum will be larger than 2 so the \finalandcomma
will be printed.
Adding that definition to our example:
\documentclass{article}
\usepackage{geometry}
\usepackage[citestyle=authoryear-comp]{biblatex}
\addbibresource{biblatex-examples.bib}
\newcounter{lastcitetotal}
\renewcommand*{\multicitedelim}{%
\iflastcitekey
{%
\ifboolexpr{
test {\ifnumgreater{\value{citetotal}+\value{multicitetotal}-1}{2}}
or test {\ifnumgreater{\value{lastcitetotal}+\value{citetotal}}{2}}
}
{\finalandcomma}
{}%
\addspace\bibstring{and}\space
}
{\addcomma\space}%
\ifnumequal{\value{citetotal}}{\value{citecount}}
{\setcounter{lastcitetotal}{\value{citetotal}}}
{}%
}
\begin{document}
\pagestyle{empty}
\cites{glashow,herrmann}
\cites{glashow,herrmann,kastenholz}
\cites[1-3]{glashow}{herrmann}[\ppno~4 and~12--14]{kastenholz}
\end{document}
we get:
