Расширьте аргументы DeclareFieldFormat для замены слов в поле biblatex

Расширьте аргументы DeclareFieldFormat для замены слов в поле biblatex

Я пытаюсь использовать biblatex для автоматической замены слов в поле названия книги на их сокращения (например, Proceedings to Proc., Symposium to Symp. и т. д.). Мой подход заключается в использовании макроса \DeclareFieldFormat(с макросом замены, любезно предоставленнымЗамена нескольких подстрок):

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

Проблема в том, что при DeclareFieldFormatзапуске аргумент еще не расширен до фактического значения данных, поэтому переданный аргумент shortenна самом деле: \printfield [titlecase]{booktitle}\setunit {\addperiod }\printfield [titlecase]{booksubtitle}(выводится вызовом message).

Есть идеи, как получить фактическое название книги из biblatex, чтобы я мог запустить на нем свой макрос?

решение1

Вам нужно применить формат напрямую. Макрос booktitleвыглядит следующим образом

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

Таким образом, booktitleкоманда фактически находится во внешнем файле \printtext, а не непосредственно в \printfield.

Определите новый формат и используйте его

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

Вы также можете воспользоваться услугами Biber для замены и не беспокоиться ни о чем другом.

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

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