Expanda los argumentos a DeclareFieldFormat para reemplazar palabras en el campo biblatex

Expanda los argumentos a DeclareFieldFormat para reemplazar palabras en el campo biblatex

Estoy intentando utilizar biblatex para reemplazar automáticamente palabras en el campo título del libro con sus abreviaturas (por ejemplo, Actas del Proc., Simposio del Simposio, etc.). Mi enfoque ha sido utilizar la \DeclareFieldFormatmacro (con una macro de sustitución cortesía deReemplazo de subcadenas múltiples):

\newcommand{\shorten}[1]{%
    \saveexpandmode\noexpandarg
    \def\x{#1}%
    \xStrSubstitute{\x}{Proceedings}{Proc.}[\x]%
    \x%
    \message{\x}
    \restoreexpandmode
}
\newcommand*{\xStrSubstitute}{%
    \expandafter\StrSubstitute\expandafter
}

\DeclareFieldFormat[inproceedings]{booktitle}{\shorten{#1}}

El problema es que cuando DeclareFieldFormatse ejecuta, el argumento aún no se ha expandido al valor de datos real, por lo que el argumento pasado shortenes en realidad: \printfield [titlecase]{booktitle}\setunit {\addperiod }\printfield [titlecase]{booksubtitle}(impreso por la messagellamada).

¿Alguna idea sobre cómo obtener el título del libro real de biblatex para poder ejecutar mi macro en él?

Respuesta1

Debe aplicar el formato directamente. La booktitlemacro tiene el siguiente aspecto

\newbibmacro*{booktitle}{%
  \ifboolexpr{
    test {\iffieldundef{booktitle}}
    and
    test {\iffieldundef{booksubtitle}}
  }
    {}
    {\printtext[booktitle]{%
       \printfield[titlecase]{booktitle}%
       \setunit{\subtitlepunct}%
       \printfield[titlecase]{booksubtitle}}%
     \newunit}%
  \printfield{booktitleaddon}}

Entonces, el booktitlecomando está en realidad en el exterior \printtexty no directamente en el archivo \printfield.

Defina un nuevo formato y utilícelo

\DeclareFieldFormat{shortenbooktitle}{#1}
\DeclareFieldFormat[inproceedings]{shortenbooktitle}{\shorten{#1}}

\renewbibmacro*{booktitle}{%
  \ifboolexpr{
    test {\iffieldundef{booktitle}}
    and
    test {\iffieldundef{booksubtitle}}
  }
    {}
    {\printtext[booktitle]{%
       \printfield[shortenbooktitle]{booktitle}%
       \setunit{\subtitlepunct}%
       \printfield[shortenbooktitle]{booksubtitle}}%
     \newunit}%
  \printfield{booktitleaddon}}

También puedes usar Biber para hacer el reemplazo y no tener que preocuparte por nada más.

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \pertype{inproceedings}
      \step[fieldsource=booktitle,
              match=\regexp{Proceedings},
              replace=\regexp{Proc.}]
      \step[fieldsource=booktitle,
              match=\regexp{Symposium},
              replace=\regexp{Symp.}]
    }
  }
}

información relacionada