Сократить название журнала в команде \fullcite

Сократить название журнала в команде \fullcite

У меня есть библиография с большим количеством статей из небольшого числа журналов. Я хочу сократить название журнала, но только когда оно встречается в команде \fullcite: Я хочу полное название журнала в списке литературы. Как это сделать? Решение, которое цитирует все записи в файле bib, не сработает, так как содержит много записей, которые я не хочу показывать. Следующий код сокращает название журнала в обеих ситуациях.

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

введите описание изображения здесь

решение1

Это можно сделать следующим образом: во-первых, немного измените 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}
      ]
    }
  }
}

Далее создадим логический переключатель:

\providebool{use:shortjournal}

Затем переопределите journalbibmacro (взятый из biblatex.def), чтобы включить булеву переменную. Однако, поскольку это создает некоторую степень вложенности и повторения, лучше переопределить исходный макрос в терминах некоторых новых bibmacro. То есть, возьмите исходное определение:

% Original definition (from biblatex.def)
% \newbibmacro*{journal}{%
%   \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}}%
}

Это основано на shortjournalи origjournalbibmacros (где origозначает, что я просто перерабатываю оригинальный journalbibmacro):

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

Затем, наконец, добавьте логический переключатель для \fullcite. (Обратите внимание на \makeatletterи \makeatother: они необходимы, если это будет идти непосредственно в .texфайле.)

\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

Собираем все вместе:

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

короткийжурнал.png

решение2

Не знаю, подойдет ли вам этот трюк, но поместите весь документ под фальшивую ссылку и добавьте [refsection=1]параметры 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 = Работает только с последними версиями biblatex/ biberпакетов, см.здесь.

EDIT: Я обновил ответ в соответствии с тем, что вы указали в своем комментарии.

Я создалдля этого случаякатегория, чтобы .bibв окончательной библиографии перечислить только цитируемые ссылки (а не все ссылки в файле).

Обратите внимание, что если используется какой-либо иной вид цитирования fullcite, соответствующая команда должна быть аналогично обновлена.

Связанный контент