Сократите отображаемых авторов + год в библиографии, чтобы они не превышали 1 строку

Сократите отображаемых авторов + год в библиографии, чтобы они не превышали 1 строку

Я настраиваю свой biblatexдля своей диссертации и знаю, что просто ограничиваю отображаемых авторов определенным значением в библиографии (например, \maxbibnames=5& \minbibnames=5). Однако я хочу добиться того, чтобы строка авторов, включая (год), была ограничена числом = X (скажем, 5 отображаемых авторов), НО также не превышала первую строку. Так что если "авторы вкл. (год)" потребуют более 1 строки в документе, biblatex просто отрезает больше bibnames, чем изначально определено с помощью \maxbibnames/ \minbibnames(но, конечно, только для этой записи).

Пример сейчас:

Эйнштейн, А., Тесла, Н., Джонс, И., Джефферсон, Т. и Худ, Р.

и др. (1980).Действительно хорошая статья.Природа 1: 100-150.

Пример сокращенного нового:

Эйнштейн, А., Тесла, Н., Джонс, И. и Джефферсон, Т. и др. (1980).

Действительно хорошая статья.Природа 1: 100-150.

решение1

Следующий код просто подсчитывает количество имен и проверяет, помещаются ли они в одну строку.

Исходные определения макросов взяты из authoryear.bbx, мы только добавляем тонкую оболочку, которая ведет обратный отсчет и измеряет длину выходных данных.

\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{csquotes}
\usepackage[backend=biber, style=authoryear, maxbibnames=999, dashed=false]{biblatex}
\usepackage{hyperref}

\addbibresource{biblatex-examples.bib}

\makeatletter
\newcounter{namecountdown}
\newlength{\bbx@namelength}
\newbibmacro*{bbx:measure:outer}[2]{%
  \settowidth{\bbx@namelength}{\usebibmacro*{#1}{#2}}%
  \ifboolexpr{test {\ifdimgreater{\bbx@namelength}{\linewidth}}
              and test {\ifnumgreater{\value{namecountdown}}{1}}}
    {\advance\c@namecountdown\m@ne
     \usebibmacro{bbx:measure:outer}{#1}{#2}}
    {\usebibmacro*{#1}{#2}}}

\renewbibmacro{author}{%
  \ifnumless{\value{maxnames}}{\value{author}}
    {\c@namecountdown\c@maxnames}
    {\c@namecountdown\c@author}%
  \usebibmacro{bbx:measure:outer}{bbx:measure:author:inner}{}}
\newbibmacro*{bbx:measure:author:inner}{%
  \ifboolexpr{
    test \ifuseauthor
    and
    not test {\ifnameundef{author}}
  }
    {\usebibmacro{bbx:dashcheck}
       {\bibnamedash}
       {\usebibmacro{bbx:savehash}%
        \printnames[][1-\the\value{namecountdown}]{author}%
        \iffieldundef{authortype}
          {\setunit{\printdelim{nameyeardelim}}}
          {\setunit{\printdelim{authortypedelim}}}}%
     \iffieldundef{authortype}
       {}
       {\usebibmacro{authorstrg}%
        \setunit{\printdelim{nameyeardelim}}}}%
    {\global\undef\bbx@lasthash
     \usebibmacro{labeltitle}%
     \setunit*{\printdelim{nonameyeardelim}}}%
  \usebibmacro{date+extradate}}


\renewbibmacro*{bbx:editor}[1]{%
  \ifnumless{\value{maxnames}}{\value{editor}}
    {\c@namecountdown\c@maxnames}
    {\c@namecountdown\c@editor}%
  \usebibmacro{bbx:measure:outer}{bbx:measure:editor:inner}{#1}}
\newbibmacro*{bbx:measure:editor:inner}[1]{%
  \ifboolexpr{
    test \ifuseeditor
    and
    not test {\ifnameundef{editor}}
  }
    {\usebibmacro{bbx:dashcheck}
       {\bibnamedash}
       {\printnames[][1-\the\value{namecountdown}]{editor}%
        \setunit{\printdelim{editortypedelim}}%
        \usebibmacro{bbx:savehash}}%
     \usebibmacro{#1}%
     \clearname{editor}%
     \setunit{\printdelim{nameyeardelim}}}%
    {\global\undef\bbx@lasthash
     \usebibmacro{labeltitle}%
     \setunit*{\printdelim{nonameyeardelim}}}%
  \usebibmacro{date+extradate}}

\renewbibmacro*{bbx:translator}[1]{%
  \ifnumless{\value{maxnames}}{\value{translator}}
    {\c@namecountdown\c@maxnames}
    {\c@namecountdown\c@translator}%
  \usebibmacro{bbx:measure:outer}{bbx:measure:translator:inner}{#1}}
\newbibmacro*{bbx:measure:translator:inner}[1]{%
  \ifboolexpr{
    test \ifusetranslator
    and
    not test {\ifnameundef{translator}}
  }
    {\usebibmacro{bbx:dashcheck}
       {\bibnamedash}
       {\printnames[][1-\the\value{namecountdown}]{translator}%
        \setunit{\printdelim{translatortypedelim}}%
        \usebibmacro{bbx:savehash}}%
     \usebibmacro{#1}%
     \clearname{translator}%
     \setunit{\printdelim{nameyeardelim}}}%
    {\global\undef\bbx@lasthash
     \usebibmacro{labeltitle}%
     \setunit*{\printdelim{nonameyeardelim}}}%
  \usebibmacro{date+extradate}}
\makeatother

\begin{document}
  \cite{companion,aksin,herrmann,sigfridsson,jaffe}
  \printbibliography
\end{document}

введите описание изображения здесь

Связанный контент