5

In my bibliography, I want to print only the editor's name and the title of the parent work in the child entry if the parent has at least two children, while what I now get is the full parent entry within each single child entry. The parent entry should then be printed in full under the editor's name. So instead of

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

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

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

what I would like to get is:

Test Author: “Testing the second Title”. In: Senor Editor and Senora Editora, eds., *My Proceedings*, pp. 10–20.

[Test Author. “Testing the Title”. In: Senor Editor and Senora Editora, eds., *My Proceedings*, pp. 1–10.

Senor Editor and Senora Editora, eds. *My Proceedings*. Any Publisher, 2013.

I am aware that a similar question has been answered here, but I just can't figure out how I can manipulate the code suggested there so that it prints editor and title. I managed to replace the alphabetic label by the title of the collection (or proceedings or book) by using

\printfield{labeltitle}

instead of

\printfield{labelalpha}

but neither

\printfield{labelname}

nor

\printlist{labelname}

seems to work to get the editor's name. Any idea what's going wrong here? I add a MWE:

\documentclass[]{scrartcl}

\usepackage[backend=biber,style=authortitle-icomp]{biblatex}
\usepackage{filecontents}

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

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

@collection{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{incollection}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author/translator+others}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{title}%
  \newunit
  \printlist{language}%
  \newunit\newblock
  \usebibmacro{byauthor}%
  \newunit\newblock
  \usebibmacro{in:}%
  \iffieldundef{crossref}
    {\usebibmacro{crossref:full}}
    {\usebibmacro{crossref:label}}
  \newunit\newblock
  \usebibmacro{chapter+pages}%
  \iffieldundef{crossref}
    {\usebibmacro{crossref:extrainfo}}
    {}
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}

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

\newbibmacro{crossref:label}{%
  \entrydata{\strfield{crossref}}
     {\printtext{
        {\printfield{labeltitle}\printfield{extratitle}}}}}

\addbibresource{my.bib}

\begin{document}

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

And, one more little thing (too connected and minor a point for an extra question), how can I make the title of the collection appear in italics in the child entry?

Thanks for your help - as it is my first post on TeX Stack Exchange, please don't hesitate to correct me in case I didn't make myself clear, or violated any convention!

0
4

To print the names you need \printnames{labelname}.

If you want labelname to print full names, then you need \DeclareNameAlias{labelname}{given-family}.

To get (ed./eds.) after labelname, add \setunit*{\addspace}\printtext[parens]{editorstrg}.

To get (ed./eds.) after the main editor in entry proc, you need to patch the bbx:editor macro using xpatch, like this:

\xpatchbibmacro{bbx:editor}
  {\usebibmacro{#1}}
  {\setunit{\addspace}\printtext[parens]{\usebibmacro{#1}}}
  {}{}

To get the the labeltitle in italics you can use \printfield[title]{labeltitle} since the default format for title is italics.

So your crossref:label macro becomes:

\newbibmacro{crossref:label}{%
  \entrydata{\strfield{crossref}}
     {\DeclareNameAlias{labelname}{given-family}%
      \printnames{labelname}%
      \setunit*{\addspace}%
      \printtext[parens]{\usebibmacro{editorstrg}}%
      \setunit*{\addcomma\space}%
      \printfield[title]{labeltitle}}}

Note: This is very specific to your question. More customisation is needed to handle cases when labelname does not refer to an editor (e.g., translator).

Here's the full MWE and output:

\documentclass[]{scrartcl}

\usepackage{xpatch}
\usepackage[backend=biber,style=authortitle-icomp]{biblatex}
\usepackage{filecontents}

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

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

@collection{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}

\xpatchbibmacro{bbx:editor}
  {\usebibmacro{#1}}
  {\setunit{\addspace}\printtext[parens]{\usebibmacro{#1}}}
  {}{}

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

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

\newbibmacro{crossref:label}{%
  \entrydata{\strfield{crossref}}
     {\DeclareNameAlias{labelname}{given-family}%
      \printnames{labelname}%
      \setunit*{\addspace}%
      \printtext[parens]{\usebibmacro{editorstrg}}%
      \setunit*{\addcomma\space}%
      \printfield[title]{labeltitle}}}

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

\addbibresource{my.bib}
\pagestyle{empty}
\begin{document}

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

enter image description here

9
  • Try reducing the citations line to Test \cite{inproc1} %and \cite{inproc2} and \cite{inproc3}. I get a compilation error with your code.
    – cfr
    Jul 4 '17 at 2:37
  • My code isn't quite right either, although it does not give an error. (It just gives what I consider sub-optimal output.) The default is to put the title in italics, so there shouldn't be a need to change this, by the way.
    – cfr
    Jul 4 '17 at 2:44
  • @cfr, good point. But this is because the original MWE contains this macro and never defines it. Presumably the OP defines this macro elsewhere in his code. The output looks OK. I just don't know what is meant to be printed by that macro. Jul 4 '17 at 2:49
  • You can get the definition from the answer linked in the question. The OP hasn't copied all of the required code.
    – cfr
    Jul 4 '17 at 3:02
  • @David Purton: Thanks for your solution, which worked perfect with me (\printnames{labelname} was what I was looking for). One additional question: Do you know a way to include "eds." (or even better, "(eds.)") after the names of the editors in the child entries, as indicated in my first example? Thank you so much!
    – faxminell
    Jul 5 '17 at 23:15
1

This is the feature of BibTeX which I miss the most.

With BibTeX, this just works: it is easy, foolproof and robust.

In Biblatex, additional code is required for each entry type and that code must be adapted for the bibliography and citation style used: it is hard, error-prone, a nightmare to maintain and, hence, extremely fragile.

Biblatex is obviously far more powerful and sophisticated than BibTeX. It is unfortunate that bloated bibliographies are among the few real regressions in comparison with its predecessor.


I think, though I'm not certain, that you want something like this:

less bloated bibliography

The following is an adaption of code I use, which is itself adapted from various answers to various questions on TeX SE and from parts of Biblatex's standard code. These are indicated in comments in the code.

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

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

@collection{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}
\begin{filecontents}{biblatex.cfg}
\ProvidesFile{biblatex.cfg}
% solution adapted from moewe's answer at http://tex.stackexchange.com/a/267321/, standard.bbx based on answer by Denis at http://tex.stackexchange.com/a/118850/, manual
\newif\iffaxminell@biblatex@compcoll
\faxminell@biblatex@compcollfalse
\DeclareBibliographyOption[boolean]{comp-coll}[true]{%
  \edef\tempa{#1}%
  \edef\tempb{true}%
  \edef\tempc{false}%
  \ifx\tempa\tempb
    \faxminell@biblatex@compcolltrue
  \else
    \ifx\tempa\tempc
      \faxminell@biblatex@compcollfalse
    \fi
  \fi
}
\AtEndPreamble{%
  \iffaxminell@biblatex@compcoll
    \newbibmacro*{faxminell:incollection:coll}{% addaswyd o standard.bbx 2017-04-16
      \usebibmacro{maintitle+booktitle}%
      \newunit\newblock
      \usebibmacro{byeditor+others}%
      \newunit\newblock
      \printfield{edition}%
      \newunit
      \iffieldundef{maintitle}
        {\printfield{volume}%
          \printfield{part}}
        {}%
      \newunit
      \printfield{volumes}%
      \newunit\newblock
      \usebibmacro{series+number}%
      \newunit\newblock
      \printfield{note}%
      \newunit\newblock
      \usebibmacro{publisher+location+date}%
      \newunit\newblock
      \usebibmacro{chapter+pages}%
      \newunit\newblock
      \iftoggle{bbx:isbn}
        {\printfield{isbn}}
        {}%
      \newunit\newblock
      \usebibmacro{doi+eprint+url}%
      \newunit\newblock
      \usebibmacro{addendum+pubstate}%
    }%
    \newbibmacro*{faxminell:incollection:crossref}{%
      \ifentryinbib{\thefield{crossref}}{%
        \cite{\thefield{crossref}}%
        \newunit\newblock
        \usebibmacro{chapter+pages}%
      }{%
        \iffieldundef{xref}{%
          \usebibmacro{faxminell:incollection:coll}%
        }{%
          \usebibmacro{faxminell:incollection:xref}%
        }%
      }%
    }%
    \newbibmacro*{faxminell:incollection:xref}{%
      \ifentryinbib{\thefield{xref}}{%
        \cite{\thefield{xref}}%
        \newunit\newblock
        \usebibmacro{chapter+pages}%
      }{%
        \usebibmacro{faxminell:incollection:coll}%
      }%
    }%
    \DeclareBibliographyDriver{incollection}{% adapted from standard.bbx based on answer by Denis at http://tex.stackexchange.com/a/118850/
      \citereset%
      \usebibmacro{bibindex}%
      \usebibmacro{begentry}%
      \usebibmacro{author/translator+others}%
      \setunit{\printdelim{nametitledelim}}\newblock
      \usebibmacro{title}%
      \newunit
      \printlist{language}%
      \newunit\newblock
      \usebibmacro{byauthor}%
      \newunit\newblock
      \usebibmacro{bytranslator+others}%
      \newunit\newblock
      \usebibmacro{in:}%
      \iffieldundef{crossref}{%
        \iffieldundef{xref}{%
          \usebibmacro{faxminell:incollection:coll}%
        }{%
          \usebibmacro{faxminell:incollection:xref}%
        }%
      }{%
        \usebibmacro{faxminell:incollection:crossref}%
      }%
      \setunit{\bibpagerefpunct}\newblock
      \usebibmacro{pageref}%
      \newunit\newblock
      \iftoggle{bbx:related}
        {\usebibmacro{related:init}%
         \usebibmacro{related}}
        {}%
      \usebibmacro{finentry}%
    }%
  \fi
}
% END redefine handling of @incollection etc.
\endinput
\end{filecontents}

\documentclass{article}
\usepackage[backend=biber,style=authortitle-icomp,comp-coll]{biblatex}
\addbibresource{\jobname.bib}

\begin{document}

Test \cite{inproc1} and \cite{inproc2} and \cite{inproc3}
\printbibliography

\end{document}

If you already have a biblatex.cfg, you can obviously add the code to your existing customisations. Alternatively, you can include the code in your preamble in the usual way i.e. by sandwiching it between \makeatletter and \makeatother.

If you need this for entry types such as @inproceedings etc., then you should be able to modify those in similar fashion. (It wasn't clear to me whether you needed this or not, so I just did the @incollection case, which is the only one I've found I needed so far.)

1
  • Add \RequirePackage{filecontents} to generate biblatex.cfg from the above code. I removed this lest my code overwrite an existing configuration file. Or change the name filecontents writes to e.g. biblatex-new.cfg and then rename to biblatex.cfg.
    – cfr
    Jul 4 '17 at 1:55
0

The styles of the biblatex-ext bundle have an option called citexref that allows for slightly shorter bibliography entries.

Just replace style=authortitle-icomp, with style=ext-authortitle-icomp, and add citexref=true to the options.

\documentclass[]{scrartcl}
\usepackage[backend=biber,style=ext-authortitle-icomp, citexref=true]{biblatex}

\begin{filecontents}{\jobname.bib}
@incollection{inproc1,
  author   = {Test Author},
  crossref = {proc},
  pages    = {1--10},
  title    = {Testing the Title},
}
@incollection{inproc2,
  author   = {Test Author},
  crossref = {proc},
  pages    = {10--20},
  title    = {Testing the second Title},
}
@collection{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 \autocite{inproc1} and \autocite{inproc2}
and \autocite{inproc3}
\printbibliography
\end{document}

Author, Test. “Testing the second Title”. In: Editor and Editora, My Proceedings, pp. 10–20.

This doesn't give the "eds." in the short citations since it just mirrors normal citations. "Eds." can be added by slightly modifying the cite bibmacro.

\documentclass[]{scrartcl}
\usepackage[backend=biber,style=ext-authortitle-icomp, citexref=true]{biblatex}

\newbibmacro{cite:labelname}{%
  \printnames{labelname}%
  \iffieldequalstr{labelnamesource}{author}
    {\setunit{\printdelim{authortypedelim}}%
     \usebibmacro{authorstrg}}
    {\iffieldequalstr{labelnamesource}{editor}
       {\setunit{\printdelim{editortypedelim}}%
        \usebibmacro{editor+othersstrg}}
       {\iffieldequalstr{labelnamesource}{translator}
         {\setunit{\printdelim{editortypedelim}}%
          \usebibmacro{translator+othersstrg}}
         {}}}}

\makeatletter
\renewbibmacro*{bbx:inxrefcite}{%
  \iffieldundef{shorthand}
    {\ifthenelse{\ifciteibid\AND\NOT\iffirstonpage}
       {\usebibmacro{cite:ibid}}
       {\iffieldequals{namehash}{\cbx@lasthash}
          {\setunit{\compcitedelim}}
          {\usebibmacro{cite:labelname}%
           \setunit*{\printdelim{nametitledelim}}%
           \savefield{namehash}{\cbx@lasthash}}%
        \usebibmacro{cite:title}}}%
    {\usebibmacro{cite:shorthand}%
     \usebibmacro{cite:reinit}}%
  \setunit{\multicitedelim}}
\makeatother

\begin{filecontents}{\jobname.bib}
@incollection{inproc1,
  author   = {Test Author},
  crossref = {proc},
  pages    = {1--10},
  title    = {Testing the Title},
}
@incollection{inproc2,
  author   = {Test Author},
  crossref = {proc},
  pages    = {10--20},
  title    = {Testing the second Title},
}
@collection{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 \autocite{inproc1} and \autocite{inproc2}
and \autocite{inproc3}
\printbibliography
\end{document}

Author, Test. “Testing the second Title”. In: Editor and Editora, eds., My Proceedings, pp. 10–20.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.