2

Working a lot with @set containters recently I stumbled across this question: why do entrytypes like @mvbook not accept entryset = {...} like @set? For me that would make sense - one bibliogrphy entry working as a container with one volume after another like @set, something like the examples in additional fields for biblatex/biber “set” but with the option to provide extended data...

AndiW
  • 786

1 Answers1

5

Answering the why conclusively is probably not possible without asking Philipp Lehman, but here are some thoughts.

For the standard styles @mvbook/@mvcollection is essentially the same as @book/@collection. The idea behind @mvbook/@mvcollection would be that it can be used as an 'umbrella entry' for multi-volume works if it makes sense to mention the entire work in the bibliography and not each constituent separately. If one refers to multi-volume reference works like the Encyclopedia Britannica regularly it might be useful to just cite the entire work once and not have to add each volume to the bibliography separately. Once can then use the \volcite command to cite a specific volume of the @mvbook/@mvcollection. Note that usually the data of the @mv... entry itself does not refer to its constituent 'child' volumes. These entry types were introduced in biblatex v1.2 together with an enhanced data inheritance scheme.

@set entries are a concept of some numeric citation styles (I believe mainly from chemistry and physics) that allows to combine several references into one parent reference, since it is assumed that those references are either always cited together or are related in such a way that it makes sense to keep them together in not only the citation, but also a bibliography entry. The @set concept does not assume additional relations between the data of the set entries and has no way to deal with special relationship between child entry data (for example with cases where all entries have the same set of authors). biblatex just incorporated functionalities of the mcite package here. The specific behaviour of @set and its entryset field is hard-coded in Biber and can not be changed with datamodel macros from biblatex.

At the moment types other than @set are not set up to consume an entryset field and work analogous to @set – I assume mainly because no one asked for that to happen until now. The entire framework is not set up to deal with entryset for arbitrary entry types: Presumably those children could not be just processed with the full bibliography driver for each entry, instead a very intricate handling of certain parent-child relations would have to be implemented. There is something that almost does this, but not quite.

In version 2.0 biblatex added the related functionality that can be used to describe certain types of relations between bibliography entries. Usually these relations are implemented in such a way that one 'parent' entry has related entries, that are then shown together with the parent entry. Usually related entries do not appear in the bibliography in their own right, they can't be cited (if they can be cited, they appear in the bibliography separately from their parent). With very little work related does almost everything you want, except for the set citations. Since the related children can't be cited themselves, you have to use \volcite.

Your additional fields for biblatex/biber "set" from could then look like

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[babel,german=quotes]{csquotes}
\usepackage[doi=false,backend=biber,subentry,sorting=nyt,style=numeric-comp]{biblatex}


\renewbibmacro*{related:multivolume}[1]{%
  \entrydata*{#1}{%
    \printtext{%
      \printfield{volume}%
      \printfield{part}}%
    \setunit*{\addcolon\space}%
    \usebibmacro{title}%
    \ifboolexpr{
      test {\ifnamesequal{author}{savedauthor}}
      or
      test {\ifnameundef{author}}
    }
      {}
      {\usebibmacro{bytypestrg}{author}{author}%
       \setunit{\addspace}%
       \printnames[byauthor]{author}
       \newunit\newblock}%
    \ifboolexpr{
      test {\ifnamesequal{editor}{savededitor}}
      or
      test {\ifnameundef{editor}}
    }
      {}
      {\usebibmacro{byeditor+others}%
       \newunit\newblock}%
    \ifboolexpr{
      test {\iflistsequal{location}{savedlocation}}
      or
      test {\iflistundef{location}}
    }
      {}
      {\printlist{location}}%<- typo
    \ifboolexpr{
      test {\iflistsequal{publisher}{savedpublisher}}
      or
      test {\iflistundef{publisher}}
    }
      {\setunit*{\addcomma\space}}
      {\setunit*{\addcolon\space}%
       \printlist{publisher}%
       \setunit*{\addcomma\space}}%
  \printdate%
  \newunit\newblock
  \ifboolexpr{
    test {\iffieldsequal{isbn}{savedisbn}}
    or
    not togl {bbx:isbn}
  }
    {}
    {\printfield{isbn}}}}


\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@mvbook{A,
  author      = {René Goscinny and Albert Uderzo},
  sorttitle   = {Asterix und Obelix 00},
  sortyear    = {1959},
  maintitle   = {Asterix und Obelix},
  location    = {Paris},
  related     = {A:V1,A:V2,A:V3,A:V4,A:V5},
  relatedtype = {multivolume},
}
@Book{A:V1,
  crossref    = {A},
  volume      = {1},
  title       = {Asterix der Gallier},
  sorttitle   = {Asterix und Obelix 01},
  year        = {1959},
  publisher   = {Dargaud},
  options     = {dataonly},
}
@Book{A:V2,
  crossref    = {A},
  title       = {Asterix und Kleopatra},
  volume      = {2},
  sorttitle   = {Asterix und Obelix 02},
  year        = {1968},
  publisher   = {Dargaud},
  options     = {dataonly},
}
@Book{A:V3,
  crossref    = {A},
  title       = {Asterix als Gladiator},
  volume      = {3},
  sorttitle   = {Asterix und Obelix 03},
  year        = {1969},
  publisher   = {Dargaud},
  options     = {dataonly},
}
@Book{A:V4,
  crossref    = {A},
  title       = {Der Kampf der Häuptlinge},
  volume      = {4},
  msorttitle  = {Asterix und Obelix 04},
  year        = {1969},
  publisher   = {Dargaud},
  options     = {dataonly},
}
@Book{A:V5,
  crossref    = {A},
  title       = {Die goldene Sichel},
  volume      = {5},
  sorttitle   = {Asterix und Obelix 05},
  year        = {1970},
  publisher   = {Ehapa-Verlag},
  options     = {dataonly},
}
@Book{A:VX,
  crossref    = {A},
  title       = {Tour de France},
  volume      = {6},
  sorttitle   = {Asterix und Obelix 06},
  year        = {1970},
  publisher   = {Ehapa-Verlag},
  location    = {Berlin},
}
\end{filecontents}

\addbibresource{\jobname.bib}

\begin{document}
\volcite{1}{A}

\cite{A,A:VX}
\printbibliography
\end{document}

Citations only show as "1", "2" or "1, vol. 1". The bibliography looks almost as desired.

AndiW
  • 786
moewe
  • 175,683
  • +1 for Astérix et Obélix – DG' Dec 02 '18 at 14:28
  • @DG' Not my idea, unfortunately. All credits for that go to the OP's MWE from https://tex.stackexchange.com/q/459759/35864 (edited the answer to clarify). – moewe Dec 02 '18 at 14:33
  • I see. So it's just a good answer... – DG' Dec 02 '18 at 14:37
  • @DG' Sorry to disappoint you ;-) – moewe Dec 02 '18 at 14:39
  • I will, eventually, get over it. Or, at least, hope, to do so ;) – DG' Dec 02 '18 at 14:42
  • I assume you decided to give Sigfridsson a good Sunday rest today. ;-) – gusbrs Dec 02 '18 at 14:47
  • @moewe Arrrg! The Romans are crazy!!! I spent days and have about 500 lines of code for half the job and you handle it with - what? 67? 67??? 67!!!!! Arrrg! I have to go over that one but that looks as promising as christmas and easter on the same day... – AndiW Dec 02 '18 at 21:34
  • @AndiW Well, this does not do everything exactly the way @set does it (and you might have had in mind), but it might just be enough for your actual purposes. I have added an extended, but naturally much more complicated idea in https://tex.stackexchange.com/a/462860/35864. There are probably a few downsides to this, but maybe that can be worked around. – moewe Dec 02 '18 at 22:02
  • @moewe give me some days to understand your genious, master... :) I'll answer... – AndiW Dec 02 '18 at 22:21