[Tex/LaTex] With biblatex, is it possible to replace one author of an author list by a bibnamedash or idem string

biblatex

With biblatex, the author can be replaced by a dash (or “idem”) in the bibliography. Is it possible to have this replacement also if there are multiple authors, and the first of these multiple authors is the same as the author of the book listed before? (It is somewhat difficult to describe, see the attached example instead, where “Buchautor, Hans-Wilhelm” should be replaced in book3 as well.)

I assume that it should be possible by customising \DeclareNameFormat, but I don’t know how.

Minimal example:

\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[english]{babel}
\usepackage{csquotes}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@BOOK{book1,
  author = {Buchautor, Hans-Wilhelm},
  title = {Irgendein Buch},
  location = {Buch am Wald},
  date = {2000}
}
@BOOK{book2,
  author = {Buchautor, Hans-Wilhelm},
  title = {Ein anderes Buch},
  location = {Berlin},
  date = {2001}
}
@BOOK{book3,
  author = {Buchautor, Hans-Wilhelm and Zweitautor, Zoran},
  title = {Noch ein Buch},
  location = {London and New York},
  date = {2010}
}
\end{filecontents}

\usepackage[
style=authortitle,
backend=bibtex8
]{biblatex}
\bibliography{\jobname}

\renewcommand*{\bibnamedash}{%
  \bibstring[\mkbibbold]{idem\thefield{gender}}}

\begin{document}
\nocite{*}

\printbibliography
\end{document}

Edit 15/02/2011 17:14

I should have added that there was a feature request for biber which pointed back to biblatex. See this feature request.

Edit 21/06/2011 9:26

Is this somehow possible now with biblatex 1.4/1.5? I played a bit with uniquename/uniquelist, but I could not get it to work.

Best Answer

The leading names in the current author/editor could be compared with the previous bibliography entry's author/editor using internal lists from etoolbox. These lists can be built up with \indexnames.

Some counters and tracking of the last entry's gender field help ensure that the names are properly delimited and use of the appropriate idem bibliography string.

For simplicity I've assumed no truncation of author/editor. It is possible to permit truncation. However the resulting style would be rather ambiguous; recurrent andothers read identically, but could refer to different authors/editors.

The solution could definitely be made more efficient, probably with the use of a routine that drops a specified number of elements from the end of a given list. It could also make smarter use of information available in the gender field, either from entries before just the last one or from the current entry.

\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[american]{babel}
\usepackage{csquotes}
\usepackage[style=authortitle,% Based on this style
            maxbibnames=99,% Solution assumes no truncation
            backend=biber,% Needed if using hash field
            sorting=nyt,
            abbreviate=false]{biblatex}

\newcounter{bbx:idemcount}
\newcounter{bbx:namecount}

\newbibmacro*{bbx:printlist}[1]{%
  \global\csundef{bbx:namelist}%
  \global\csundef{bbx:checklist}%
  \setcounter{bbx:namecount}{0}%
  \indexnames[bbx:checklist]{#1}%
  \ifcsequal{bbx:checklist}{bbx:idemlist}
    {\ifnumequal{\value{bbx:namecount}-\value{bbx:idemcount}}{1}
       {\let\finalandcomma=\empty}
       {}%
     \printnames[idem:first-last]{#1}}
    {\printnames{#1}}}

\DeclareIndexNameFormat{bbx:checklist}{%
  \addtocounter{bbx:namecount}{1}%
  \listcsxadd{bbx:namelist}{\thefield{hash}}% Or #4 #5 #1 might be sufficient
  \ifnumgreater{\value{listcount}}{\value{bbx:idemcount}}
    {}
    {\listcsxadd{bbx:checklist}{\thefield{hash}}}}

% authortitle uses sortname format - i.e. last-first/first-last
% Use \biblstring \bibxlstring for long idem, irrespective of
% the abbreviate option setting
\DeclareNameFormat{idem:first-last}{%
  \ifnumequal{\value{listcount}}{1}
    {\ifboolexpr{ test {\ifbibxstring{idem\csuse{bbx:idemgender}}}
                  and test {\ifcsdef{bbx:idemgender}} }
       {\bibstring[\mkbibbold]{idem\csuse{bbx:idemgender}}}
       {\ifnumgreater{\value{bbx:idemcount}}{1}
          {\bibstring[\mkbibbold]{idempn}}
          {\bibstring[\mkbibbold]{idemsn}}}}
    {\ifnumgreater{\value{listcount}}{\value{bbx:idemcount}}
       {\iffirstinits
          {\usebibmacro{name:first-last}{#1}{#4}{#5}{#7}}
          {\usebibmacro{name:first-last}{#1}{#3}{#5}{#7}}}
       {}}}

\newbibmacro*{bbx:savelist}{%
  \savefieldcs{gender}{bbx:idemgender}%
  \setcounter{bbx:idemcount}{\value{bbx:namecount}}%
  \csxdef{bbx:idemlist}{\csuse{bbx:namelist}}}

\renewbibmacro*{author}{%
  \ifboolexpr{ test {\ifuseauthor}
               and not test {\ifnameundef{author}} }
    {\usebibmacro{bbx:printlist}{author}%
     \setunit{\addcomma\space}%
     \usebibmacro{bbx:savelist}%
     \usebibmacro{authorstrg}}
    {\global\csundef{bbx:idemlist}%
     \setcounter{bbx:idemcount}{0}}}

\renewbibmacro*{bbx:editor}[1]{%
  \ifboolexpr{ test {\ifuseeditor}
               and not test {\ifnameundef{editor}} }
    {\usebibmacro{bbx:printlist}{editor}%
     \setunit{\addcomma\space}%
     \usebibmacro{bbx:savelist}%
     \usebibmacro{#1}%
     \clearname{editor}}
    {\global\csundef{bbx:idemlist}%
     \setcounter{bbx:idemcount}{0}}}

\renewbibmacro*{bbx:translator}[1]{%
  \ifboolexpr{ test {\ifusetranslator}
               and not test {\ifnameundef{translator}} }
    {\usebibmacro{bbx:printlist}{translator}%
     \setunit{\addcomma\space}%
     \usebibmacro{bbx:savelist}%
     \usebibmacro{#1}%
     \clearname{translator}}
    {\global\csundef{bbx:idemlist}%
     \setcounter{bbx:idemcount}{0}}}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@BOOK{book1,
  author = {Buchautor, Emma-Louise},
  gender = {sf},
  title = {First Title},
  date = {2001}}
@BOOK{book2,
  author = {Buchautor, Emma-Louise},
  title = {Same female author},
  date = {2002}}
@BOOK{book3,
  author = {Buchautor, Emma-Louise and van Helsing, Sarah},
  gender = {pf},
  title = {Same first author whose gender is unspecified},
  date = {2003}}
@BOOK{book4,
  author = {Buchautor, Emma-Louise and van Helsing, Sarah and Knuth, Donald E.},
  gender = {pp},
  title = {Same first and second female authors},
  date = {2004}}
@BOOK{book5,
  editor = {Buchautor, Emma-Louise and van Helsing, Sarah and Knuth, Donald E. and Cicero, Marcus Tullius},
  gender = {pp},
  title = {Same leading names of mixed genders},
  date = {2005}}
@BOOK{book6,
  editor = {van Helsing, Abraham},
  title = {Different name},
  date = {2006}}
@BOOK{book7,
  author = {van Helsing, Abraham},
  gender = {sm},
  translator = {van Helsing, Abraham},
  title = {Same male name},
  date = {2007}}
@BOOK{book8,
  editor = {van Helsing, Abraham and Jackson, Tom},
  gender = {pm},
  translator = {Cicero, Marcus Tullius},
  title = {Same first male author},
  date = {2008}}
@BOOK{book9,
  author = {van Helsing, Abraham and Jackson, Tom},
  title = {Same male names},
  date = {2009}}
@BOOK{book10,
  author = {van Helsing, Abraham and Jackson, Tom},
  gender = {pm},
  title = {Same authors of unspecified gender},
  date = {2010}}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
\nocite{*}
\printbibliography
\end{document}

enter image description here

For comparison here is the same bibliography generated with no changes to the authortitle bibliography macros:

enter image description here