
Я пытаюсь использовать 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.}]
}
}
}