Смит (2010a, 2010b) вместо Смит (2010a, b) во время внутристрочного цитирования

Смит (2010a, 2010b) вместо Смит (2010a, b) во время внутристрочного цитирования

Для написания текстов я использую пакет natbib.

Например, у Смита есть 2 статьи, обе опубликованы в 2010 году. Я обозначил их как Sm1 и sm2 в моем файле .bib. Теперь, когда я цитирую статьи с помощью \citet{Sm1,Sm2}, получается Smith (2010a, b). Но я хочу, чтобы было Smith (2010a, 2010b). Может ли кто-нибудь мне помочь?

решение1

Я бы пропатчил \NAT@citex, чтобы избежать проверки года, так что вам не нужно знать год заранее. Это просто сработает в каждом случае.

\begin{filecontents*}{\jobname.bib}
@article{sma,
 author={Smith, J.},
 title={A},
 journal={B},
 year={2014},
}
@article{smb,
 author={Smith, J.},
 title={C},
 journal={D},
 year={2014},
}
\end{filecontents*}
\documentclass{article}
\usepackage[authoryear,round]{natbib}
\usepackage{xpatch}

% patch \NAT@citex to always use the year
\makeatletter
\xpatchcmd{\NAT@citex}
  {\ifx\NAT@last@yr\NAT@year}
  {\iffalse}
  {}{}
\xpatchcmd{\NAT@citex}
  {\ifx\NAT@last@yr\NAT@year}
  {\iffalse}
  {}{}
\makeatother

\begin{document}
\citep{sma,smb}

\citet{sma,smb}

\bibliographystyle{plainnat}
\bibliography{\jobname}
\end{document}

Как обычно, filecontents*окружение нужно лишь для того, чтобы сделать пример самодостаточным.

введите описание изображения здесь

Объяснение. \NAT@citexКоманда — это основная часть процесса; в двух местах она

\ifx\NAT@last@yr\NAT@year
  <something if the current citation has the same year as the preceding one>
\else
  <otherwise>
\fi

С помощью патча мы меняем условный оператор (первая строка) на \iffalse, поэтому «истинная» ветвь никогда не будет выполнена.

решение2

Предполагая, что ключами двух записей являются sm1и sm2, вы можете достичь своей цели, записав

\citeauthor{sm1} (\citeyear{sm1}, \citeyear{sm2})

Примечание: natbibПакет содержит параметры sort, compressи sort&compress, но они, похоже, в основном предназначены для числовых ссылок на цитаты. Для ссылок на цитаты в стиле authoryear пакет, похоже, не предоставляет такие параметры, как nosortили nocompress-- отсюда и необходимость в громоздком на вид коде, представленном выше.

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