我有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(2019-08-17)。
您可以申请更换姓名\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}