BibLaTeX (año del autor) pone paréntesis vacíos cuando la fecha está vacía

BibLaTeX (año del autor) pone paréntesis vacíos cuando la fecha está vacía

Quiero usar pubstateel campo BibLaTeX para publicaciones "en preparación" que aún no tienen fecha de publicación (campo de fecha vacío), como esta en estilo autoraño:

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

Sin embargo, esto deja un paréntesis vacío después del nombre de la revista:

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

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

\printbibliography
\end{document}

ingrese la descripción de la imagen aquí

¿Cómo puedo eliminar esto?

Respuesta1

El problema subyacente aquí es que, a diferencia de sus colegas, \print(field|list|names|date)el comando \printtextno sabe de antemano si imprimirá algo. Por lo tanto, siempre aplicará el argumento de formato incluso si luego resulta que no se debe imprimir nada. Aquí eso significa que terminamos con un par de paréntesis vacíos.

Una forma de evitarlo es comprobar si queremos imprimir algo antes de llamar \printtext.

Si bien algunos biblatexcódigos utilizan \ifthenelsela mayoría de los códigos más nuevos, se utiliza etoolbox's' \ifboolexpr. Tenga en cuenta que internamente biblatexno hay ningún campo date; si desea probar la existencia de un, datees mejor probarlo.year

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

Ver tambiénhttps://github.com/plk/biblatex/issues/793.

Puede interesar a algunas personas que biblatex-aparecientemente implementaron una versión \printtextque verifica automáticamente si imprime algo y suprime el formato si no es así. Verhttps://github.com/plk/biblatex-apa/pull/99. Si resulta que este comando no tiene ningún efecto secundario negativo, tal vez queramos pensar en trasladarlo al biblatexnúcleo, pero necesita más pruebas (y la implementación se parece mucho a una trampa).

\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. (sin fecha). 'Un título'. En: Un diario. En la preparación de.

Respuesta2

Encontré la solución:

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

información relacionada