
Tenho uma bibliografia com muitos artigos de periódicos de um pequeno número de periódicos. Quero abreviar o título do periódico, mas somente quando isso ocorrer em um \fullcite
comando: Quero o título completo do periódico na lista de Referências. Como eu posso fazer isso? Uma solução que cite todas as entradas do arquivo bib não funcionará, pois contém muitas entradas que não quero mostrar. O código a seguir abrevia o título do diário em ambas as situações.
\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}
Responder1
Você poderia fazer desta forma: Primeiro, modifique ligeiramente seu mapeamento de origem:
\DeclareSourcemap{
\maps[datatype=bibtex,overwrite=true]{
\map{
\step[fieldsource=journal,
match=\regexp{A\sJournal\sWith\sa\sLong\sTitle},
fieldset=shortjournal, fieldvalue={Journ}
% replace={Journ}
]
}
}
}
Em seguida, crie uma opção booleana:
\providebool{use:shortjournal}
Em seguida, redefina o journal
bibmacro (retirado de biblatex.def
) para incorporar o booleano. Entretanto, como isso cria um certo grau de aninhamento e repetição, é melhor redefinir a macro original em termos de algumas novas bibmacros. Ou seja, pegue a definição original:
% Original definition (from biblatex.def)
% \newbibmacro*{journal}{%
% \iffieldundef{journaltitle}
% {}
% {\printtext[journaltitle]{%
% \printfield[titlecase]{journaltitle}%
% \setunit{\subtitlepunct}%
% \printfield[titlecase]{journalsubtitle}}}}
E reformule para ficar assim:
\renewbibmacro*{journal}{%
\ifbool{use:shortjournal}%
{\iffieldundef{shortjournal}%
{\usebibmacro{origjournal}}%
{\usebibmacro{shortjournal}}%
}%
{\usebibmacro{origjournal}}%
}
Isso depende de shortjournal
e origjournal
bibmacros (onde orig
significa que estou apenas reciclando o 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}}}%
}
Então, finalmente, adicione a opção booleana para \fullcite
. (Observe os \makeatletter
e \makeatother
: eles são necessários se isso for diretamente em um .tex
arquivo.)
\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
Juntando tudo:
\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}
Responder2
Não sei se esse truque é adequado para você, mas coloque todo o documento sob uma referência falsa e adicione [refsection=1]
opções 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}
PS = Funciona apenas com versões recentes de biblatex
/ biber
pacotes, vejaaqui.
EDITAR: atualizei a resposta de acordo com o que você solicitou em seu comentário.
Eu criei umAd hoccategoria para listar apenas as referências citadas (não todas as referências no .bib
arquivo) na bibliografia final.
Observe que se algum tipo de citação diferente fullcite
for usado, o comando relativo deverá ser renovado de forma análoga.