
tengo biblatex
con opciones
\usepackage[backend=bibtex, style=authoryear]{biblatex}
Las citas hechas con \cite
se ven así: Smith, 2019
o Smith and Baker, 2019
y así sucesivamente. Me gustaría definir un comando que reemplace automáticamente la aparición de mi nombre con mis iniciales. Es decir, necesito
\cite{SmithsPaper} % --> Smith, 2019
\cite{MyPaper} % --> Manny, 2019
%%%
\newcite{SmithsPaper} % --> Smith, 2019
\newcite{MyPaper} % --> MC, 2019
He intentado con el paquete xstring
hacer algo como
\newcommand{\newcite}[1]{%
\begingroup
\edef\@temp{\cite{#1}}%
\StrSubstitute{\@temp}{Manny}{MC}
\endgroup
}
El problema es que no sé cómo decirle a LaTeX que se expanda \cite{#1}
. Como resultado, la cita sale sin el reemplazo. Si cambio \cite{#1}
simplemente #1
y lo llamo \newcite{bla Manny bla}
da bla MC bla
como se esperaba.
No debería ser relevante, pero lo estoy usando dentro de la clase de documento del proyector.
Respuesta1
ComoSkillmondice en los comentarios: \cite...
los comandos no se pueden expandir, por lo que no puede (fácilmente) realizar xstring
reemplazos en ellos. En lugar de eso, intentaría dejar que biblatex
se hiciera el reemplazo directamente.
Una forma de hacerlo es utilizando el enfoque demi respuestaaPoner en negrita un autor específico usando biblatex(ver tambiénResalte un autor en la bibliografía usando biblatex permitiendo que el estilo de la bibliografía le dé formato). La idea es obtener el hash de nombre único calculado por Biber para el nombre que desea reemplazar y luego reemplazarlo con las iniciales en \mkbibcompletename
.
Tenga en cuenta que esta implementación en particular requiere al menos biblatex
la versión 3.13 (2019-08-17).
Puede solicitar el reemplazo de un nombre con\replacenamewith{<name>}{<replacement>}
\replacenamewith{Emma Sigfridsson}{ES}
El reemplazo se puede diseñar redefiniendo \mkbinamereplacement
.
Se pueden encontrar algunas explicaciones más en los enlaces anteriores.
Advertencia, este documento sobrescribirá el archivo <name of the main TeX file/\jobname>-replacenames.bib
sin previo aviso. El nombre de este archivo auxiliar sobrescrito se puede cambiar redefiniendo \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}