BibLaTeX (autorano) coloca parênteses vazios quando a data está vazia

BibLaTeX (autorano) coloca parênteses vazios quando a data está vazia

Quero usar pubstateo campo BibLaTeX para publicações "em preparação" que ainda não possuem data de publicação (campo de data vazio), como este no estilo autorano:

@Article{Test,
author       = {Author, A.},
journaltitle = {A Journal},
title        = {A Title},
pubstate     = {inpreparation},
}

No entanto, isso deixa um parêntese vazio após o nome do diário:

\documentclass{article}
\usepackage[backend=biber, style=authoryear]{biblatex}
\addbibresource{Bib2.bib}

\begin{document}
Test \parencite{Test}.

\printbibliography
\end{document}

insira a descrição da imagem aqui

Como posso remover isso?

Responder1

A questão subjacente aqui é que, ao contrário dos seus colegas, \print(field|list|names|date)o comando \printtextnão sabe de antemão se irá imprimir algo. Portanto, ele sempre aplicará o argumento de formatação, mesmo que mais tarde se descubra que nada deve ser impresso. Aqui isso significa que terminamos com um par de parênteses vazio.

Uma maneira de contornar isso é verificar se queremos imprimir algo antes de ligar \printtext.

Embora alguns biblatexcódigos usem \ifthenelsea maioria dos códigos mais recentes, use etoolbox's \ifboolexpr. Observe que internamente para biblatexnão há campo date, se você quiser testar a existência de um dateé melhor testaryear

\renewbibmacro*{issue+date}{%
  \ifboolexpr{test {\iffieldundef{issue}} and test {\iffieldundef{year}}}
    {}
    {\printtext[parens]{%
       \printfield{issue}%
       \setunit*{\addspace}%
       \usebibmacro{date}}%
     \newunit}}

Veja tambémhttps://github.com/plk/biblatex/issues/793.

Pode ser do interesse de algumas pessoas que biblatex-apaimplementaram recentemente uma versão \printtextque verifica automaticamente se imprime algo e suprime a formatação caso não imprima. Verhttps://github.com/plk/biblatex-apa/pull/99. Se descobrirmos que este comando não tem nenhum efeito colateral negativo, podemos querer pensar em movê-lo para o biblatexnúcleo, mas ele precisa de mais testes (e a implementação parece muito com trapaça).

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}

\renewbibmacro*{issue+date}{%
  \printtexte[parens]{%
    \printfield{issue}%
    \setunit*{\addspace}%
    \usebibmacro{date}}%
  \newunit}

% implement \printtexte
\makeatletter
% Optional parens/brackets
% Thanks to egreg from https://tex.stackexchange.com/questions/53068/how-to-check-if-a-macro-value-is-empty-or-will-not-create-text-with-plain-tex-co
% for this test for expanded emptiness so that we can easily opt to not print parens around nothing
% Without this, it is very messy - you have to test all potential fields for defness first and this
% is messy because the fields in the additional info vary betwee entrytypes
\def\foreverunspace{%
  \ifnum\lastnodetype=11
    \unskip\foreverunspace
  \else
    \ifnum\lastnodetype=12
      \unkern\foreverunspace
    \else
      \ifnum\lastnodetype=13
        \unpenalty\foreverunspace
      \fi
    \fi
  \fi
}

% we need a way to save the state of the punctuation buffer
% cf. \blx@initunit in biblatex.sty for what we need to copy

% this uses the internal implementation of etoolbox toggles
% fingers crossed no one messes with it
\newrobustcmd*{\apablx@savetoggle}[1]{%
  \csletcs{apablx@savedtoggle@#1}{etb@tgl@#1}}

\newrobustcmd*{\apablx@restoretoggle}[1]{%
  \csletcs{etb@tgl@#1}{apablx@savedtoggle@#1}}

\newrobustcmd*{\apablx@savepunctstate}{%
  \apablx@savetoggle{blx@block}%
  \apablx@savetoggle{blx@unit}%
  \apablx@savetoggle{blx@insert}%
  \apablx@savetoggle{blx@lastins}%
  \apablx@savetoggle{blx@keepunit}%
  \let\apablx@savd@unitpunct\blx@unitpunct
  \let\apablx@savd@puncthook\abx@puncthook}

\newrobustcmd*{\apablx@restorepunctstate}{%
  \global\apablx@restoretoggle{blx@block}%
  \global\apablx@restoretoggle{blx@unit}%
  \global\apablx@restoretoggle{blx@insert}%
  \global\apablx@restoretoggle{blx@lastins}%
  \global\apablx@restoretoggle{blx@keepunit}%
  \global\let\blx@unitpunct\apablx@savd@unitpunct
  \global\let\abx@puncthook\apablx@savd@puncthook}

% printtext that checks if it would print anything
\newrobustcmd{\printtexte}[2][]{%
  \apablx@savepunctstate
  \setbox0=\hbox{#2\foreverunspace}%
  \apablx@restorepunctstate
  \ifdim\wd0=0pt
  \else
    \ifblank{#1}
      {\printtext{#2}}
      {\printtext[#1]{#2}}%
  \fi}
\makeatother


\begin{filecontents}{\jobname.bib}
@article{test,
  author       = {Author, A.},
  journaltitle = {A Journal},
  title        = {A Title},
  pubstate     = {inpreparation},
}
\end{filecontents}
\addbibresource{\jobname.bib}


\begin{document}
\autocite{test}
\printbibliography
\end{document}

Autor, A. (sd). 'Um título'. In: Um Diário. Em preparação.

Responder2

Encontrei a solução:

\renewbibmacro*{issue+date}{%
\ifthenelse{\ifentrytype{article}\AND\iffieldundef{date}\AND\iffieldundef{issue}}
    {}
    {\ifthenelse{\iffieldundef{issue}}
        {}
        {\printtext[parens]{%
        \printfield{issue}%
        \setunit*{\addspace}%
        \usebibmacro{date}}}}%
\newunit}

informação relacionada