
나는 책 제목 필드의 단어를 약어(예: 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.}]
}
}
}