
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 \DeclareFieldFormat
macro (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 message
chamada).
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 booktitle
macro 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 booktitle
comando está na parte externa \printtext
e 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.}]
}
}
}