abreviar o título do periódico no comando \fullcite

abreviar o título do periódico no comando \fullcite

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 \fullcitecomando: 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}

insira a descrição da imagem aqui

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 journalbibmacro (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 shortjournale origjournalbibmacros (onde origsignifica que estou apenas reciclando o journalbibmacro 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 \makeatlettere \makeatother: eles são necessários se isso for diretamente em um .texarquivo.)

\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}

shortjournal.png

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}

insira a descrição da imagem aqui

PS = Funciona apenas com versões recentes de biblatex/ biberpacotes, 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 .bibarquivo) na bibliografia final.

Observe que se algum tipo de citação diferente fullcitefor usado, o comando relativo deverá ser renovado de forma análoga.

informação relacionada