2

This is a follow-up question to biblatex - Consistent numbering in split bibliographies.

My bibliography is split into two parts via categories. The entries are numbered consecutively and I want to sort the entries within each \cite. However, inside each \cite the entries are ordered (first) by year and, thus, entries of the first and second part of the bibliography get mixed up.

MWE:

\documentclass{article}

\usepackage[
    sorting      = ynt,
    bibstyle     = numeric,
    defernumbers = true,
    sortcites    = true
]{biblatex}
\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
    @book{a,
        author = "I",
        year = "1973"
    }
    @book{a2,
        author = "I",
        year = "1923"
    }
    @book{b,
        author = "You",
        year = "1959"
    }
\end{filecontents}

\addbibresource{\jobname.bib}

\DeclareBibliographyCategory{own}

\begin{document}

\cite{a,a2,b}

\addtocategory{own}{a,a2}

\printbibliography[category=own,title={A}]
\printbibliography[notcategory=own,title={B}]

\end{document}

The cite reads [1, 3, 2] but I would like to have [1, 2, 3].

Is there a good way to achieve this?

1
  • Now you see why I said I cheated before. For proper sorting as in the former title of the other question we need a bit more work.
    – moewe
    Commented Oct 16, 2015 at 9:20

1 Answer 1

1

Since we want to sort entries with a certain property before other entries and sorting is done by Biber we will have to tell Biber in the .bib which entry has this property (there is a way to get out of this limitation, see below for more details).

So we cannot use bibcategories any more, we will use keywords instead. Just add keywords = {own} to the relevant entries

@book{a,
  author = "I",
  year = "1973",
  keywords = {own},
}

Naturally the bibliographies are filtered with keyword and notkeyword now

\printbibliography[keyword=own,title={A}]
\printbibliography[notkeyword=own,title={B}]

We then check for own and, if the keyword is present, fill the presort field with A, otherwise it gets a B.

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=keywords, match=\regexp{(^|,)own(,|$)}, final]
      \step[fieldset=presort, fieldvalue = {A}]
    }
    \map{
      \step[fieldset=presort, fieldvalue = {B}]
    }
  }
}

MWE

\documentclass{article}

\usepackage[
    sorting      = ynt,
    bibstyle     = numeric,
    defernumbers = true,
    sortcites    = true
]{biblatex}

\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@book{a,
  author = "I",
  year = "1973",
  keywords = {own},
}
@book{a2,
  author = "I",
  year = "1923",
  keywords = {own},
}
@book{b,
  author = "You",
  year = "1959",
}
@book{c,
  author = "You",
  year = "1970",
  keywords = {notmine},
}
\end{filecontents*}

\addbibresource{\jobname.bib}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=keywords, match=\regexp{(^|,)own(,|$)}, final]
      \step[fieldset=presort, fieldvalue = {A}]
    }
    \map{
      \step[fieldset=presort, fieldvalue = {B}]
    }
  }
}

\begin{document}
\cite{a,a2,b,c}

\printbibliography[keyword=own,title={A}]
\printbibliography[notkeyword=own,title={B}]
\end{document}

example output


To do everything from within your .tex file use

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=entrykey, match=\regexp{^(a|a2)$}, final]
      \step[fieldset=presort, fieldvalue = {A}]
    }
    \map[overwrite=true]{
      \step[fieldsource=entrykey, match=\regexp{^(a|a2)$}, final]
      \step[fieldset=keywords, fieldvalue = {own}, append]
    }
    \map{
      \step[fieldset=presort, fieldvalue = {B}]
    }
  }
}

Where you replace (a|a2) in the two steps above with a list of "own" entry keys separated by |.

MWE

\documentclass{article}

\usepackage[
    sorting      = ynt,
    bibstyle     = numeric,
    defernumbers = true,
    sortcites    = true
]{biblatex}

\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@book{a,
  author = "I",
  year = "1973",
}
@book{a2,
  author = "I",
  year = "1923",
}
@book{b,
  author = "You",
  year = "1959",
}
@book{c,
  author = "You",
  year = "1970",
}
\end{filecontents*}

\addbibresource{\jobname.bib}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=entrykey, match=\regexp{^(a|a2)$}, final]
      \step[fieldset=presort, fieldvalue = {A}]
    }
    \map[overwrite=true]{
      \step[fieldsource=entrykey, match=\regexp{^(a|a2)$}, final]
      \step[fieldset=keywords, fieldvalue = {own}, append]
    }
    \map{
      \step[fieldset=presort, fieldvalue = {B}]
    }
  }
}

\begin{document}
\cite{a,a2,b,c}

\printbibliography[keyword=own,title={A}]
\printbibliography[notkeyword=own,title={B}]
\end{document}
3
  • 1
    Since I use the same bib-file across multiple projects, I refrain from modifying the bib-file. Is there any possibility to fill the presort-field in the tex-file by, e.g., using the category or by a \customCommand{a2}?
    – gerw
    Commented Oct 16, 2015 at 9:31
  • @gerw Scrap my earlier comment, I found a solution, see the edit.
    – moewe
    Commented Oct 16, 2015 at 9:42
  • Thank you for your answer! I used and modified your approach to provide a \citeown-command, which adds references to the regexp in the sourcemap.
    – gerw
    Commented Oct 16, 2015 at 11:29

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .