Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I defined the following command in my manuscript:

\newcommand{\citesep}[2]{\citeauthor{#1}#2~\cite{#1}}

which allows me to print, for instance, "Knuth and Tarjan's algorithm [16]" using \citesep{knuth-681}{'s algorithm}.

However, this causes an unwanted behaviour with papers with the same authors; for example, \citesep{knuth-681,knuth-702}{'s work} produces "Knuth and Tarjan, Knuth and Tarjan's work [16,17]" whereas I'd like it to print "Knuth and Tarjan's work [16,17]".

Any idea how to fix that?

share|improve this question
    
You could always just write out the names once and then \cite the papers normally after that. Otherwise, biblatex might have the resources to deal with this problem. [Are you sure the authors' names are exactly the same in the two fields? If one is "D. Knuth" and the other is "Donald Knuth", that will cause them to be treated as different... –  Seamus Oct 5 '10 at 11:41
    
Yes, author names are exactly the same. \citet does compress them appropriately, I guess a solution could therefore be obtained by modifying it so as to remove reference numbers, but I've had a look at natbib.sty and I don't really see how to do that. –  Anthony Labarre Oct 5 '10 at 13:44
    
Can you try IEEE bibtex styles? I'm pretty sure they do that. –  Dima Oct 13 '10 at 6:10
    
Oddly enough, neither ieeetr.bst nor ieeepes.bst prints any names using my \citesep command. –  Anthony Labarre Oct 13 '10 at 7:14
add comment

2 Answers 2

up vote 5 down vote accepted

I finally came up with what seems like a solution. I did the following:

  • Dig into natbib.sty in search for the macro segment that is responsible for typesetting the author's name(s). Trial and error revealed that \NAT@nm does the "raw" typesetting and in turn is formatted by \NAT@nmfmt.

  • Redefine \NAT@nmfmt so that it will additionally typeset the expansion of the new \nameadjunct command (which does nothing by default).

  • Define the new commands \citeposs and \citesep which are wrappers for \citet but will locally redefine \nameadjunct to "'s" respectively \citesep's second mandatory argument.


\documentclass{article}

\usepackage{natbib}

\newcommand*{\nameadjunct}{\relax}
\makeatletter
\renewcommand*{\NAT@nmfmt}[1]{\NAT@up #1\nameadjunct}
\makeatother

\newcommand*{\citeposs}[2][]{%
  \begingroup
  \renewcommand*{\nameadjunct}{'s}%
  \citet[#1]{#2}%
  \endgroup
}

\newcommand*{\citesep}[3][]{%
  \begingroup
  \renewcommand*{\nameadjunct}{#3}%
  \citet[#1]{#2}%
  \endgroup
}

\begin{filecontents}{\jobname.bib}
@misc{Knu01,
  author = {Knuth, Donald E. and Tarjan, Robert E.},
  year = {2001},
  title = {A new algorithm},
}
@misc{Knu02,
  author = {Knuth, Donald E. and Tarjan, Robert E.},
  year = {2002},
  title = {More about our algorithm},
}\end{filecontents}

\begin{document}

\citet{Knu01,Knu02}

\citeposs{Knu01,Knu02}

\citesep{Knu01,Knu02}{'s algorithm}

\bibliographystyle{plainnat}
\bibliography{\jobname}

\end{document}
share|improve this answer
add comment

I don't comprehend natbib's intricacies, but here's a solution using biblatex. (Note: My \citesep command works well for simultaneously citing several papers with the same author(s), but will yield strange results for different authors.)

\documentclass{article}

\usepackage{biblatex}

\makeatletter

% COPIED FROM \newbibmacro*{textcite}
\newbibmacro*{textadjunctcite}{%
  \iffieldequals{namehash}{\cbx@lasthash}
    {\multicitedelim}
    {\cbx@tempa
     \ifnameundef{labelname}
       {\printfield[citetitle]{labeltitle}}
%       {\printnames{labelname}}% DELETED
       {\printnames{labelname}% NEW
       \printfield{adjunct}}% NEW
     \addspace\bibopenbracket}%
  \ifnumequal{\value{citecount}}{1}
    {\usebibmacro{prenote}}
    {}%
  \usebibmacro{cite}%
  \savefield{namehash}{\cbx@lasthash}%
  \gdef\cbx@tempa{\bibclosebracket\multicitedelim}}

% COPIED FROM \DeclareCiteCommand{\textcite}
\DeclareCiteCommand{\textadjunctcite}
  {\let\cbx@tempa=\empty
   \undef\cbx@lasthash}
  {\usebibmacro{citeindex}%
%   \usebibmacro{textcite}}% DELETED
   \usebibmacro{textadjunctcite}}% NEW
  {}
  {\usebibmacro{postnote}%
   \bibclosebracket}

\newcommand*{\citeposs}[2][]{%
  \def\abx@field@adjunct{'s}%
  \textadjunctcite[#1]{#2}%
}

\newcommand*{\citesep}[3][]{%
  \def\abx@field@adjunct{#3}%
  \textadjunctcite[#1]{#2}%
}

\makeatother

\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@misc{Knu01,
  author = {Knuth, Donald E. and Tarjan, Robert E.},
  year = {2001},
  title = {A new algorithm},
}

@misc{Knu02,
  author = {Knuth, Donald E. and Tarjan, Robert E.},
  year = {2002},
  title = {More about our algorithm},
}
\end{filecontents}

\bibliography{\jobname}

\begin{document}

This was \citeposs{Knu01,Knu02} work~\dots

As shown in \citesep{Knu01,Knu02}{'s algorithm}~\dots

\printbibliography

\end{document}

EDIT: Extended MWE to include a \citeposs command.

share|improve this answer
    
Just for the reader's reference, there is a similar post devoted to biblatex: tex.stackexchange.com/q/22273 –  Audrey Jul 28 '13 at 2:47
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.