
Tengo una bibliografía con muchos artículos de revistas de un pequeño número de revistas. Quiero abreviar el título de la revista, pero sólo cuando aparece en un \fullcite
comando: quiero el título completo de la revista en la lista de Referencias. ¿Cómo puedo hacer eso? Una solución que cite todas las entradas del archivo bib no funcionará, ya que contiene muchas entradas que no quiero mostrar. El siguiente código abrevia el título de la revista en ambas situaciones.
\documentclass{article}
\usepackage{csquotes}
\usepackage[american]{babel}
\usepackage[style=apa,
backend=biber]{biblatex}
\DeclareLanguageMapping{american}{american-apa}
\begin{filecontents}{\jobname.bib}
@article{art,
Author = {Author, A},
Year = 2006,
Journal = {A Journal With a Long Title},
Number = 1,
Pages = {1-10},
Title = {An Article}
}
\end{filecontents}
\addbibresource{\jobname.bib}
\DeclareSourcemap{
\maps[datatype=bibtex,overwrite=true]{
\map{
\step[fieldsource=journal,
match=\regexp{A\sJournal\sWith\sa\sLong\sTitle},
replace={Journ}]
}
}
}
\begin{document}
\fullcite{art}
\printbibliography
\end{document}
Respuesta1
Podrías hacerlo de esta manera: Primero, modifica ligeramente tu Sourcemapping:
\DeclareSourcemap{
\maps[datatype=bibtex,overwrite=true]{
\map{
\step[fieldsource=journal,
match=\regexp{A\sJournal\sWith\sa\sLong\sTitle},
fieldset=shortjournal, fieldvalue={Journ}
% replace={Journ}
]
}
}
}
A continuación, cree un modificador booleano:
\providebool{use:shortjournal}
Luego, redefinir el journal
bibmacro (tomado de biblatex.def
) para incorporar el booleano. Sin embargo, debido a que esto crea cierto grado de anidamiento y repetición, es mejor redefinir la macro original en términos de algunas bibmacros nuevas. Es decir, tome la definición original:
% Original definition (from biblatex.def)
% \newbibmacro*{journal}{%
% \iffieldundef{journaltitle}
% {}
% {\printtext[journaltitle]{%
% \printfield[titlecase]{journaltitle}%
% \setunit{\subtitlepunct}%
% \printfield[titlecase]{journalsubtitle}}}}
Y reformúlelo para que quede así:
\renewbibmacro*{journal}{%
\ifbool{use:shortjournal}%
{\iffieldundef{shortjournal}%
{\usebibmacro{origjournal}}%
{\usebibmacro{shortjournal}}%
}%
{\usebibmacro{origjournal}}%
}
Esto se basa en shortjournal
y origjournal
bibmacros (donde orig
significa que solo estoy reciclando el journal
bibmacro original):
\newbibmacro*{shortjournal}{%
\printtext[journaltitle]{%
\printfield[titlecase]{shortjournal}%
\setunit{\subtitlepunct}%
\printfield[titlecase]{journalsubtitle}}%
}
\newbibmacro*{origjournal}{%
\iffieldundef{journaltitle}
{}
{\printtext[journaltitle]{%
\printfield[titlecase]{journaltitle}%
\setunit{\subtitlepunct}%
\printfield[titlecase]{journalsubtitle}}}%
}
Luego, finalmente, agregue el modificador booleano para \fullcite
. (Tenga en cuenta los \makeatletter
y \makeatother
: son necesarios si esto va directamente a un .tex
archivo).
\makeatletter
\DeclareCiteCommand{\fullcite}
{\renewcommand{\finalnamedelim}{\ifnum\value{liststop}>2 \finalandcomma\fi\addspace\&\space}%
\usebibmacro{prenote}}
{\usedriver
{\DeclareNameAlias{sortname}{default}%
\booltrue{use:shortjournal}%
\global\boolfalse{bbx:parens}%
\global\boolfalse{bbx:volseen}%
\global\boolfalse{bbx:titleinauthpos}%
\global\boolfalse{bbx:editorinauthpos}%
\global\boolfalse{bbx:in}%
\global\let\blx@related@loop\@empty}
{\thefield{entrytype}}}
{\multicitedelim}
{\boolfalse{use:shortjournal}%
\usebibmacro{postnote}%
\usebibmacro{cite:post}}
\makeatother
Poniendolo todo junto:
\documentclass{article}
\usepackage{csquotes}
\usepackage[american]{babel}
\usepackage[style=apa,
backend=biber]{biblatex}
\DeclareLanguageMapping{american}{american-apa}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@article{art,
Author = {Author, A},
Year = 2006,
Journal = {A Journal With a Long Title},
Number = 1,
Pages = {1-10},
Title = {An Article}
}
@article{art2,
Author = {Author, A},
Year = 2006,
Journal = {A Journal With a Non-Matching Long Title},
Number = 1,
Pages = {1-10},
Title = {An Article}
}
\end{filecontents*}
\addbibresource{\jobname.bib}
% Step 1.
\DeclareSourcemap{
\maps[datatype=bibtex,overwrite=true]{
\map{
\step[fieldsource=journal,
match=\regexp{A\sJournal\sWith\sa\sLong\sTitle},
fieldset=shortjournal, fieldvalue={Journ}
% replace={Journ}
]
}
}
}
% Step 2.
\providebool{use:shortjournal}
% Step 3.
% Original definition (from biblatex.def)
% \newbibmacro*{journal}{%
% \iffieldundef{journaltitle}
% {}
% {\printtext[journaltitle]{%
% \printfield[titlecase]{journaltitle}%
% \setunit{\subtitlepunct}%
% \printfield[titlecase]{journalsubtitle}}}}
\newbibmacro*{shortjournal}{%
\printtext[journaltitle]{%
\printfield[titlecase]{shortjournal}%
\setunit{\subtitlepunct}%
\printfield[titlecase]{journalsubtitle}}%
}
\newbibmacro*{origjournal}{%
\iffieldundef{journaltitle}
{}
{\printtext[journaltitle]{%
\printfield[titlecase]{journaltitle}%
\setunit{\subtitlepunct}%
\printfield[titlecase]{journalsubtitle}}}%
}
\renewbibmacro*{journal}{%
\ifbool{use:shortjournal}%
{\iffieldundef{shortjournal}%
{\usebibmacro{origjournal}}%
{\usebibmacro{shortjournal}}%
}%
{\usebibmacro{origjournal}}%
}
% Step 4.
\makeatletter
\DeclareCiteCommand{\fullcite}
{\renewcommand{\finalnamedelim}{\ifnum\value{liststop}>2 \finalandcomma\fi\addspace\&\space}%
\usebibmacro{prenote}}
{\usedriver
{\DeclareNameAlias{sortname}{default}%
\booltrue{use:shortjournal}% <-- the added line
\global\boolfalse{bbx:parens}%
\global\boolfalse{bbx:volseen}%
\global\boolfalse{bbx:titleinauthpos}%
\global\boolfalse{bbx:editorinauthpos}%
\global\boolfalse{bbx:in}%
\global\let\blx@related@loop\@empty}
{\thefield{entrytype}}}
{\multicitedelim}
{\usebibmacro{postnote}%
\usebibmacro{cite:post}}
\makeatother
\begin{document}
\parindent0pt
\fullcite{art}\par
\fullcite{art2}\par
\printbibliography
\end{document}
Respuesta2
No sé si este truco te sirve, pero coloca todo el documento bajo una sección de referencia falsa y agrega [refsection=1]
opciones map
:
\documentclass{article}
\usepackage{csquotes}
\usepackage[american]{babel}
\usepackage[style=apa,
backend=biber]{biblatex}
\DeclareLanguageMapping{american}{american-apa}
% Declare an ad hoc category
\DeclareBibliographyCategory{quack}
% Renew fullcite command
\let\oldfullcite\fullcite % this in necessary to renew the command with the same name
\renewcommand*{\fullcite}[2][]{\addtocategory{quack}{#2}\oldfullcite[#1]{#2}}
\begin{filecontents}{\jobname.bib}
@article{art,
Author = {Author, A},
Year = 2006,
Journal = {A Journal With a Long Title},
Number = 1,
Pages = {1-10},
Title = {An Article}
}
@article{noinbib,
Author = {Buthor, A},
Year = 2006,
Journal = {A Journal With a Long Title},
Number = 1,
Pages = {1-10},
Title = {An Article that should not be listed in bibliography}
}
\end{filecontents}
\DeclareSourcemap{
\maps[datatype=bibtex,overwrite=true]{
\map[refsection=1]{% with refsection=<n> the map is valid only for the refsection with <n> number
\step[fieldsource=journal,
match=\regexp{A\sJournal\sWith\sa\sLong\sTitle},
replace={Journ}]
}
}
}
\addbibresource{\jobname.bib}
\begin{document}
\begin{refsection}% fake refsection
%\therefsection % use this to discover the number of the refsection
\section{Title 1}
A citation: \fullcite{art}
some text
\section{Title 2}
Some other text and
another citation: \fullcite{art}
\end{refsection}
\nocite{*}
\printbibliography[category=quack]
\end{document}
PD = Funciona solo con versiones recientes de biblatex
/ biber
paquetes, veraquí.
EDITAR: He actualizado la respuesta de acuerdo con lo que solicitaste en tu comentario.
He creado unad hoccategoría para enumerar solo las referencias citadas (no todas las referencias en el .bib
archivo) en la bibliografía final.
Tenga en cuenta que si se utiliza algún tipo de cita diferente a fullcite
, el mandato relativo debe renovarse de manera análoga.