
У меня есть 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}