TransWikia.com

For child entries with crossrefs, how can I instruct biblatex to output only a reference to the parent entry in the bibliography?

TeX - LaTeX Asked by ilpssun on June 15, 2021

When producing a bibliography using biblatex and the alphabetic style, I would like to produce actual cross-references between two crossref-entries. For example, if I have several @inproceedings entries that define crossref={proc} and I have a matching @proceedings entry, I would like to generate something along the lines of:

[Aut13a] Test Author. “Testing the second Title”. In: [EE13], pp. 10–20.

[Aut13b] Test Author. “Testing the Title”. In: [EE13], pp. 1–10.

[EE13] Senor Editor and Senora Editora, eds. My Proceedings. Any Publisher, 2013.

But the only result I am achieving so far is:

[Aut13a] Test Author. “Testing the second Title”. In: My Proceedings.
Ed. by Senor Editor and Senora Editora. Any Publisher, 2013,
pp. 10–20.

[Aut13b] Test Author. “Testing the Title”. In: My Proceedings. Ed. by
Senor Editor and Senora Editora. Any Publisher, 2013, pp. 1–10.

[EE13] Senor Editor and Senora Editora, eds. My Proceedings. Any
Publisher, 2013.

This is actually the same question as How can I print only Author-Date of the parent crossref in the bibliography entry of the child of the crossref? but the proposed answer there is just a work-around which would be very tedious for my rather large bibliography file.

The behavior described above is standard BibTeX behavior for the alpha style, AFAIK. So I suspect this is just one of the approximately 10,000 configuration options of biblatex and I’m simply not aware of how to do it 😉
To get you guys going, here is an MWE:

documentclass[]{article}

usepackage[backend=biber,style=alphabetic]{biblatex}
usepackage{filecontents}

begin{filecontents}{my.bib}
@inproceedings{inproc1,
    Author = {Test Author},
    Crossref = {proc},
    Pages = {1--10},
    Title = {Testing the Title}}

@inproceedings{inproc2,
    Author = {Test Author},
    Crossref = {proc},
    Pages = {10--20},
    Title = {Testing the second Title}}

@proceedings{proc,
    Editor = {Senor Editor and Senora Editora},
    Publisher = {Any Publisher},
    Title = {My Proceedings},
    Year = {2013}}
end{filecontents}

addbibresource{my.bib}

begin{document}
Test cite{inproc1} and cite{inproc2}
printbibliography
end{document}

2 Answers

Substantially Revised

In the light of the discussion in the comments, I've substantially revised this.

documentclass[]{article}

usepackage[backend=biber,style=alphabetic]{biblatex}
usepackage{filecontents}

begin{filecontents}{my.bib}
@inproceedings{inproc1,
    Author = {Test Author},
    Crossref = {proc},
    Pages = {1--10},
    Title = {Testing the Title}}

@inproceedings{inproc2,
    Author = {Test Author},
    Crossref = {proc},
    Pages = {10--20},
    Title = {Testing the second Title}}

@proceedings{proc,
    Editor = {Senor Editor and Senora Editora},
    Publisher = {Any Publisher},
    Title = {My Proceedings},
    Year = {2013}}

@inproceedings{inproc3,
    Author  = {Nother Author},
    Publisher = {Nother Publisher},
    Title   = {In Some Other Proceedings},
    Maintitle = {Main Title of Other Proceedings},
    Year     = {2001},
}
end{filecontents}

DeclareBibliographyDriver{inproceedings}{%
  usebibmacro{bibindex}%
  usebibmacro{begentry}%
  usebibmacro{author/translator+others}%
  setunit{labelnamepunct}newblock
  usebibmacro{title}%
  newunit
  printlist{language}%
  newunitnewblock
  usebibmacro{byauthor}%
  newunitnewblock
  usebibmacro{in:}%
  iffieldundef{crossref}
    {usebibmacro{crossref:full}}
    {usebibmacro{crossref:label}}
  newunitnewblock
  usebibmacro{chapter+pages}%
  iffieldundef{crossref}
    {usebibmacro{crossref:extrainfo}}
    {}
  setunit{bibpagerefpunct}newblock
  usebibmacro{pageref}%
  usebibmacro{finentry}}

newbibmacro{crossref:full}{%
    usebibmacro{maintitle+booktitle}%
  newunitnewblock
  usebibmacro{event+venue+date}%
  newunitnewblock
  usebibmacro{byeditor+others}%
  newunitnewblock
  iffieldundef{maintitle}
    {printfield{volume}%
     printfield{part}}
    {}%
  newunit
  printfield{volumes}%
  newunitnewblock
  usebibmacro{series+number}%
  newunitnewblock
  printfield{note}%
  newunitnewblock
  printlist{organization}%
  newunit
  usebibmacro{publisher+location+date}}

newbibmacro{crossref:label}{%
  entrydata{strfield{crossref}}
     {printtext{mkbibbrackets
        {printfield{labelalpha}printfield{extraalpha}}}}}

newbibmacro{crossref:extrainfo}{%
  newunitnewblock
  iftoggle{bbx:isbn}
    {printfield{isbn}}
    {}%
  newunitnewblock
  usebibmacro{doi+eprint+url}%
  newunitnewblock
  usebibmacro{addendum+pubstate}}%

addbibresource{my.bib}

begin{document}

Test cite{inproc1} and cite{inproc2} and cite{inproc3}
printbibliography
end{document}

This redefinition of the driver for inproceedings checks to see if there is a cross reference field defined. If there is, then it prints the label for the cross-referenced work. If there is not (ie if the inproceedings entry is self-contained) it prints full information.

I've only done this for inproceedings: it might be necessary to use a similar redefinition for inbook and incollection if you use these in a similar way.

(Note: this replaces my original answer, which involved a (bad) hackish redefinition of the maintitle+booktitle macro, and which would have had unfortunate effects if crossreferences were not defined. This should be safe if a crossreference is defined, so long as it is valid and refers to a work that is cited. It also carries the health warning that I haven't tested it extensively with a large number of examples, and it's always the corner cases that catch you when you try to write bibliography drivers.)

Correct answer by Paul Stanley on June 15, 2021

The styles of my biblatex-ext bundle have an option called citexref to do this.

So you can just replace style=alphabetic, with style=ext-alphabetic, and add citexref=true, to the biblatex options and are good to go.

documentclass[]{article}

usepackage[backend=biber, style=ext-alphabetic, citexref=true]{biblatex}

begin{filecontents}{jobname.bib}
@inproceedings{inproc1,
  author   = {Test Author},
  crossref = {proc},
  pages    = {1--10},
  title    = {Testing the Title},
}
@inproceedings{inproc2,
  author   = {Test Author},
  crossref = {proc},
  pages    = {10--20},
  title    = {Testing the second Title},
}
@proceedings{proc,
  editor    = {Senor Editor and Senora Editora},
  publisher = {Any Publisher},
  title     = {My Proceedings},
  year      = {2013},
}
@inproceedings{inproc3,
  author    = {Nother Author},
  publisher = {Nother Publisher},
  title     = {In Some Other Proceedings},
  maintitle = {Main Title of Other Proceedings},
  year      = {2001},
}
end{filecontents}
addbibresource{jobname.bib}

begin{document}
Test cite{inproc1} and cite{inproc2} and cite{inproc3}
printbibliography
end{document}

Test Author. “Testing the second Title”. In: [EE13], pp. 10–20.

The implementation of that option is fairly similar to what Paul Stanley's wonderful answer does.

Answered by moewe on June 15, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP