Применить замену строки к цитате, возвращаемой \cite

Применить замену строки к цитате, возвращаемой \cite

У меня есть biblatexс вариантами

\usepackage[backend=bibtex, style=authoryear]{biblatex}

Ссылки, сделанные с помощью, \citeвыглядят так: Smith, 2019или Smith and Baker, 2019и так далее. Я хотел бы определить команду, которая автоматически заменяет вхождение моего имени на мои инициалы. А именно мне нужно

\cite{SmithsPaper}  % --> Smith, 2019
\cite{MyPaper}      % --> Manny, 2019
%%%
\newcite{SmithsPaper}  % --> Smith, 2019
\newcite{MyPaper}      % --> MC, 2019

Я пытался с помощью пакета xstringсделать что-то вроде

\newcommand{\newcite}[1]{%
  \begingroup
  \edef\@temp{\cite{#1}}%
  \StrSubstitute{\@temp}{Manny}{MC}
  \endgroup
}

Проблема в том, что я не могу понять, как сказать LaTeX расширить \cite{#1}. В результате цитата выходит без замены. Если я \cite{#1}просто меняю на #1и вызываю, \newcite{bla Manny bla}то выдает bla MC blaто, что и ожидалось.

Это не должно иметь значения, но я использую это в классе документов Beamer.

решение1

КакСкиллмонговорит в комментариях: \cite...команды не расширяемы, поэтому вы не можете (легко) выполнять xstringзамены на них. Вместо этого я бы попробовал и позволил biblatexделать замену напрямую.

Один из способов сделать это — использовать подходмой ответкВыделите конкретного автора жирным шрифтом с помощью biblatex(смотрите такжеВыделите автора в библиографии с помощью biblatex, позволяя отформатировать его в стиле библиографии). Идея состоит в том, чтобы получить уникальный хеш имени, вычисленный Biber для имени, которое вы хотите заменить, а затем заменить его инициалами в \mkbibcompletename.

Обратите внимание, что для данной реализации требуется biblatexверсия не ниже 3.13 (17.08.2019).

Вы можете запросить замену имени на\replacenamewith{<name>}{<replacement>}

\replacenamewith{Emma Sigfridsson}{ES}

Замену можно стилизовать, переопределив \mkbinamereplacement.

Дополнительные пояснения можно найти по ссылкам выше.

Предупреждение, этот документ перезапишет файл <name of the main TeX file/\jobname>-replacenames.bibбез предупреждения. Имя этого перезаписанного вспомогательного файла можно изменить, переопределив \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}

ES и Райд 1998

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