Biblatex 필드의 단어를 바꾸려면 인수를 DeclareFieldFormat으로 확장하세요.

Biblatex 필드의 단어를 바꾸려면 인수를 DeclareFieldFormat으로 확장하세요.

나는 책 제목 필드의 단어를 약어(예: Proceedings to Proc., Symposium to Symp. 등)로 자동 대체하기 위해 biblatex를 사용하려고 합니다. 내 접근 방식은 매크로를 사용하는 것이었습니다 \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.}]
    }
  }
}

관련 정보