
Ich habe biblatex
mit Optionen
\usepackage[backend=bibtex, style=authoryear]{biblatex}
Die mit gemachten Zitate \cite
sehen so aus: Smith, 2019
oder Smith and Baker, 2019
und so weiter. Ich möchte einen Befehl definieren, der das Vorkommen meines Namens automatisch durch meine Initialen ersetzt. Und zwar brauche ich
\cite{SmithsPaper} % --> Smith, 2019
\cite{MyPaper} % --> Manny, 2019
%%%
\newcite{SmithsPaper} % --> Smith, 2019
\newcite{MyPaper} % --> MC, 2019
Ich habe versucht, mit dem Paket xstring
so etwas zu tun wie
\newcommand{\newcite}[1]{%
\begingroup
\edef\@temp{\cite{#1}}%
\StrSubstitute{\@temp}{Manny}{MC}
\endgroup
}
Das Problem ist, dass ich nicht herausfinden kann, wie ich LaTeX anweisen kann, zu expandieren \cite{#1}
. Als Ergebnis wird das Zitat ohne Ersetzung ausgegeben. Wenn ich es \cite{#1}
einfach durch ändere #1
und aufrufe, \newcite{bla Manny bla}
wird es bla MC bla
wie erwartet ausgegeben.
Es sollte nicht relevant sein, aber ich verwende dies innerhalb der Beamer-Dokumentklasse.
Antwort1
AlsSkillmonsagt in den Kommentaren: \cite...
Befehle sind nicht erweiterbar, daher kann man xstring
sie nicht (einfach) ersetzen. Stattdessen würde ich versuchen, biblatex
die Ersetzung direkt durchführen zu lassen.
Eine Möglichkeit hierzu ist der Ansatz vonmeine AntwortZuBestimmten Autor mit Biblatex fett markieren(siehe auchMarkieren Sie einen Autor in der Bibliografie mit Biblatex und lassen Sie den Bibliografiestil zur Formatierung zu.). Die Idee besteht darin, den von Biber berechneten eindeutigen Namens-Hash für den Namen zu erhalten, den Sie ersetzen möchten, und ihn dann durch die Initialen in zu ersetzen \mkbibcompletename
.
Beachten Sie, dass diese spezielle Implementierung mindestens biblatex
Version 3.13 (17.08.2019) erfordert.
Sie können die Ersetzung eines Namens beantragen durch\replacenamewith{<name>}{<replacement>}
\replacenamewith{Emma Sigfridsson}{ES}
Der Ersatz kann durch Neudefinition gestaltet werden \mkbinamereplacement
.
Einige weitere Erklärungen finden Sie in den oben stehenden Links.
Warnung, dieses Dokument überschreibt die Datei <name of the main TeX file/\jobname>-replacenames.bib
ohne Warnung. Der Name dieser überschriebenen Hilfsdatei kann durch Neudefinition geändert werden \hlblx@bibfile@name
.
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[backend=biber, style=authoryear]{biblatex}
\addbibresource{biblatex-examples.bib}
\makeatletter
\def\hlblx@bibfile@name{\jobname -replacenames.bib}
\newwrite\hlblx@bibfile
\immediate\openout\hlblx@bibfile=\hlblx@bibfile@name
\newcounter{hlblx@name}
\setcounter{hlblx@name}{0}
\newcommand*{\hlblx@writenametobib}[2]{%
\stepcounter{hlblx@name}%
\edef\hlblx@tmp@nocite{%
\noexpand\AfterPreamble{%
\noexpand\setbox0\noexpand\vbox{%
\noexpand\hlblx@getmethehash{hlblx@name@\the\value{hlblx@name}}}}%
}%
\hlblx@tmp@nocite
\immediate\write\hlblx@bibfile{%
@misc{hlblx@name@\the\value{hlblx@name},
author = {\unexpanded{#1}}, %
note = {\unexpanded{#2}}, %
options = {dataonly=true},}%
}%
}
\AtEndDocument{%
\closeout\hlblx@bibfile}
\addbibresource{\hlblx@bibfile@name}
\newcommand*{\hlblx@hashextract@i}[1]{%
\csgdef{replacename@\thefield{fullhash}}{#1}}
\DeclareNameFormat{hlblx@hashextract}{%
\usefield{\hlblx@hashextract@i}{note}}
\DeclareCiteCommand{\hlblx@getmethehash}
{}
{\printnames[hlblx@hashextract][1-999]{author}}
{}
{}
\renewcommand*{\mkbibcompletename}[1]{%
\ifcsundef{replacename@\thefield{hash}}
{#1}
{\mkbinamereplacement{\csuse{replacename@\thefield{hash}}}}}
% {<name>}{<replacement>}
\newcommand*{\replacenamewith}{\hlblx@writenametobib}
\makeatother
% formatting for the replacement
\newcommand*{\mkbinamereplacement}[1]{\textbf{#1}}
% declare a replacement for a name
% this command can be used several times
\replacenamewith{Emma Sigfridsson}{ES}
\begin{document}
\cite{sigfridsson}
\printbibliography
\end{document}