Autoren eines Bibliographieeintrags zählen

Autoren eines Bibliographieeintrags zählen

Ich hätte gern einen Befehl, der mir die Anzahl der Autoren eines bestimmten Bib-Eintrags angibt. Bisher habe ich erfolglos versucht, einen Schlüssel-Wert-Speicher (Prop) zu erstellen, den BBL-Importmechanismus anzuhängen und die Anzahl der Autoren zu speichern, die im Autorenzähler vorhanden sein soll.

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
    @book{key,
        author = {John Doe and Mike Smith},
        year = {2001},
        title = {Title},
        publisher = {Publisher},
    }
    @book{key2,
        author = {John Doe},
        year = {2002},
        title = {Title2},
        publisher = {Publisher2},
    }
\end{filecontents}

\usepackage{biblatex}
\addbibresource{\jobname.bib}

\usepackage{expl3}
\ExplSyntaxOn
\prop_new:N \g_my_author_count
\cs_new_protected:Npn \storecount#1#2{%
    \prop_gput:Nnn \g_my_author_count{#1}{#2}%
}
\cs_new:Npn \getcount#1{%
    \prop_item:Nn \g_my_author_count{#1}%
}
\ExplSyntaxOff

\newcounter{authorcount}
\setcounter{authorcount}{0}

\AtDataInput{%
    \storecount{\strfield{entrykey}}{\value{author}}%
    % debug stuff begin
        \storecount{fakekey}{123}%
        \addtocounter{authorcount}{\value{author}}%
        \global\edef\entrykey{\strfield{entrykey}}%
    % debug stuff end
}

% make sure it's defined
\makeatletter
\@ifundefined{entrykey}{\edef\entrykey{\empty}}{}
\makeatother

\begin{document}
    % debug stuff begin
        % expect 3
        \arabic{authorcount} % got 3 => hook & counter work

        % expect key or key2
        \entrykey % got key => \strfield{entrykey} works

        % expect [?] - 123
        [?] - \getcount{fakekey}    % got [?] - 123
                                    % => storage works
    % debug stuff end

    % expect [2] - 2
    \cite{key} - \getcount{key} % got [2] - 

    % expect [1] - 1
    \cite{key2} - \getcount{key2} % got [1] -   

    \printbibliography

\end{document}

Bildbeschreibung hier eingeben

Was vermisse ich?

Antwort1

Da die Information bei der Verarbeitung eines Eintrags bereits im Zähler vorliegt author, kann die Nummer direkt mit einem -ähnlichen Befehl abgefragt werden \cite.... Es ist kein Umweg über \AtDataInputnotwendig.

Da die biblatexBefehle von \citerobust sind, erhält man hierdurch nicht die Anzahl der Autoren in erweiterbarer Form zurück. Sollte das nötig sein, ist es vielleicht tatsächlich einfacher, den entsprechenden Zähler in einem Hilfsmakro \AtDataInputdurch einen like-Befehl speichern zu lassen \cite. Was sinnvoller ist, hängt vom Anwendungsfall ab.

\documentclass{article}

\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}

\DeclareCiteCommand{\citeauthorcount}
  {\boolfalse{citetracker}%
   \boolfalse{pagetracker}%
   \usebibmacro{prenote}}
  {\printtext{The entry}%
   \setunit{\addspace}%
   \printfield{entrykey}%
   \setunit{\addspace}%
   \printtext{has \arabic{author} author(s)}}
  {\multicitedelim}
  {\usebibmacro{postnote}}

\begin{document}
\citeauthorcount{sigfridsson,worman}
\printbibliography
\end{document}

Der Eintrag sigfridsson hat 2 Autor(en), Der Eintrag worman hat 1 Autor(en)


Wenn ich das richtig verstehe, war das Hauptproblem Ihrer expl3Lösung die Erweiterung und ein fehlendes \the. Das MWE verwendete nArgumente vom Typ - und speicherte daher nicht die Werte des Zählers, sondern seine interne Darstellung und das Gleiche galt für \strfield{entrykey}: Die nVersion würde nur speichern \strfield{entrykey}, aber die xVersion erweitert dies und schreibt daher sigfridssonund worman. Die folgende Implementierung sollte funktionieren.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{biblatex}

\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn

\prop_new:N \g_vh_author_count

\cs_new_protected:Npn \vh_store_author_count:nn #1#2
{
  \prop_gput:Nnn \g_vh_author_count {#1} {#2}
}
\cs_generate_variant:Nn \vh_store_author_count:nn {xx}

\cs_new:Npn \vh_get_author_count:n #1
{
  \prop_item:Nn \g_vh_author_count {#1}
}

\NewExpandableDocumentCommand \getauthorcount {m} {
  \vh_get_author_count:n { #1 }
}

\AtDataInput{%
  \vh_store_author_count:xx {\strfield{entrykey}}{\the\value{author}}%
}
\ExplSyntaxOff

\addbibresource{biblatex-examples.bib}

\begin{document}
  \cite{sigfridsson} - \getauthorcount{sigfridsson}

  \cite{worman} - \getauthorcount{worman}

  \edef\foo{\getauthorcount{worman}} \meaning\foo

  \edef\foo{\getauthorcount{sigfridsson}} \meaning\foo

  \printbibliography
\end{document}

[1] - 2

[2] - 1

Makro:->1

Makro:->2

verwandte Informationen