
Estoy intentando utilizar biblatex para reemplazar automáticamente palabras en el campo título del libro con sus abreviaturas (por ejemplo, Actas del Proc., Simposio del Simposio, etc.). Mi enfoque ha sido utilizar la \DeclareFieldFormat
macro (con una macro de sustitución cortesía deReemplazo de subcadenas múltiples):
\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}}
El problema es que cuando DeclareFieldFormat
se ejecuta, el argumento aún no se ha expandido al valor de datos real, por lo que el argumento pasado shorten
es en realidad: \printfield [titlecase]{booktitle}\setunit {\addperiod }\printfield [titlecase]{booksubtitle}
(impreso por la message
llamada).
¿Alguna idea sobre cómo obtener el título del libro real de biblatex para poder ejecutar mi macro en él?
Respuesta1
Debe aplicar el formato directamente. La booktitle
macro tiene el siguiente aspecto
\newbibmacro*{booktitle}{%
\ifboolexpr{
test {\iffieldundef{booktitle}}
and
test {\iffieldundef{booksubtitle}}
}
{}
{\printtext[booktitle]{%
\printfield[titlecase]{booktitle}%
\setunit{\subtitlepunct}%
\printfield[titlecase]{booksubtitle}}%
\newunit}%
\printfield{booktitleaddon}}
Entonces, el booktitle
comando está en realidad en el exterior \printtext
y no directamente en el archivo \printfield
.
Defina un nuevo formato y utilícelo
\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}}
También puedes usar Biber para hacer el reemplazo y no tener que preocuparte por nada más.
\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.}]
}
}
}