
Ich habe eine Bibliographie mit vielen Zeitschriftenartikeln aus einer kleinen Anzahl von Zeitschriften. Ich möchte den Zeitschriftentitel abkürzen, aber nur, wenn er in einem \fullcite
Befehl vorkommt: Ich möchte den vollständigen Zeitschriftentitel in der Referenzliste. Wie kann ich das tun? Eine Lösung, die alle Einträge in der Bib-Datei zitiert, funktioniert nicht, da sie viele Einträge enthält, die ich nicht anzeigen möchte. Der folgende Code kürzt den Zeitschriftentitel in beiden Situationen ab.
\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}
Antwort1
Sie können es folgendermaßen machen: Ändern Sie zunächst Ihr Sourcemapping leicht:
\DeclareSourcemap{
\maps[datatype=bibtex,overwrite=true]{
\map{
\step[fieldsource=journal,
match=\regexp{A\sJournal\sWith\sa\sLong\sTitle},
fieldset=shortjournal, fieldvalue={Journ}
% replace={Journ}
]
}
}
}
Erstellen Sie als Nächstes einen Booleschen Schalter:
\providebool{use:shortjournal}
Definieren Sie dann das journal
Bibmakro (aus biblatex.def
) neu, um den Booleschen Wert einzubinden. Da dies jedoch zu einer gewissen Verschachtelung und Wiederholung führt, ist es besser, das ursprüngliche Makro in Form einiger neuer Bibmakros neu zu definieren. Das heißt, nehmen Sie die ursprüngliche Definition:
% Original definition (from biblatex.def)
% \newbibmacro*{journal}{%
% \iffieldundef{journaltitle}
% {}
% {\printtext[journaltitle]{%
% \printfield[titlecase]{journaltitle}%
% \setunit{\subtitlepunct}%
% \printfield[titlecase]{journalsubtitle}}}}
Und formulieren Sie es neu, sodass es folgendermaßen aussieht:
\renewbibmacro*{journal}{%
\ifbool{use:shortjournal}%
{\iffieldundef{shortjournal}%
{\usebibmacro{origjournal}}%
{\usebibmacro{shortjournal}}%
}%
{\usebibmacro{origjournal}}%
}
Dies basiert auf den Bibmacros shortjournal
und origjournal
(wobei orig
bedeutet, dass ich nur das ursprüngliche journal
Bibmacro wiederverwende):
\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}}}%
}
Fügen Sie dann abschließend den Booleschen Schalter für hinzu \fullcite
. (Beachten Sie die \makeatletter
und \makeatother
: diese werden benötigt, wenn dies direkt in eine Datei geht .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
Alles zusammen:
\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}
Antwort2
Ich weiß nicht, ob dieser Trick für Sie in Ordnung ist, aber legen Sie das gesamte Dokument unter einen falschen Referenzabschnitt und fügen Sie Optionen [refsection=1]
hinzu :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 = Es funktioniert nur mit aktuellen Versionen von biblatex
/ biber
Paketen, sieheHier.
BEARBEITEN: Ich habe die Antwort entsprechend Ihren Anforderungen in Ihrem Kommentar aktualisiert.
Ich habe einad hocKategorie, um .bib
in der endgültigen Bibliografie nur die zitierten Referenzen (nicht alle Referenzen in der Datei) aufzulisten.
Beachten Sie, dass bei Verwendung einer anderen Zitierart als der oben genannten fullcite
der entsprechende Befehl sinngemäß erneuert werden muss.