Expanda argumentos para DeclareFieldFormat para substituir palavras no campo biblatex

Expanda argumentos para DeclareFieldFormat para substituir palavras no campo biblatex

Estou tentando usar o biblatex para substituir automaticamente palavras no campo do título do livro por suas abreviações (por exemplo, Proceedings to Proc., Symposium to Symp. etc.). Minha abordagem tem sido usar a \DeclareFieldFormatmacro (com uma macro de substituição, cortesia deSubstituição de múltiplas substrings):

\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}}

O problema é que quando o DeclareFieldFormaté executado, o argumento ainda não foi expandido para o valor real dos dados, então o argumento passado para shortené na verdade: \printfield [titlecase]{booktitle}\setunit {\addperiod }\printfield [titlecase]{booksubtitle}(impresso pela messagechamada).

Alguma idéia de como obter o título do livro do biblatex para que eu possa executar minha macro nele?

Responder1

Você precisa aplicar o formato diretamente. A booktitlemacro fica assim

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

Portanto, o booktitlecomando está na parte externa \printtexte não diretamente no arquivo \printfield.

Defina um novo formato e use-o

\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}}

Você também pode usar o Biber para fazer a substituição e não precisa se preocupar com mais nada.

\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.}]
    }
  }
}

informação relacionada