Strona domowa Ostatnie zmiany Wiara Matematyka TeX Blog Varia O mnie English

2009-04-14 List of publications of a person (en)

Once in a while you want to typeset a list of publication of somebody (maybe yourself, maybe not). It would be good if this could be automated somehow.

I am a big fan of the amsrefs package, which is an excellent replacement for BibTeX. One of its nice features is that you don’t have to learn a strange language—everything is done within LaTeX. Changing amsrefs settings so that the author field is omitted in the bibliography is very easy; but then, a problem arises: sometimes you have coauthors, and you don’t want their names to disappear. A possible solution would be to store the author’s name and modify the author-typesetting macros so that they ingore it; this might be a good idea, although a bit difficult because you would have to take into consideration a few special cases, like having both “Smith, J.” and “Smith, John” disappear (and what about a paper by, say, Jack Newman and John Newman?). Having to do some manual work is not a big problem for me, especially that any good editor has a search-and-replace feature, so I went for another solution: change the relevant “author” into “coauthor” fields. And this is a code fragment I put into the preamble to achieve this:

\BibSpec{article}{%
  +{}  {\textit}                      {title}
  +{.} { }                            {part}
  +{:} { \textit}                     {subtitle}
  +{,} { \PrintContributions}         {contribution}
  +{.} { \PrintPartials}              {partial}
  +{,} { }                            {journal}
  +{}  { }                            {volume}
  +{}  { \PrintDatePV}                {date}
  +{,} { \issuetext}                  {number}
  +{,} { \eprintpages}                {pages}
  +{,} { }                            {status}
  +{,} { \PrintDOI}                   {doi}
  +{,} { available at \eprint}        {eprint}
  +{}  { \PrintTranslation}           {translation}
  +{;} { \PrintReprint}               {reprint}
  +{}  { \PrintCoAuthors}             {coauthor}
  +{.} { }                            {note}
  +{.} {}                             {transition}
}
\BibSpec{book}{%
  +{}  {\textit}                      {title}
  +{.} { }                            {part}
  +{:} { \textit}                     {subtitle}
  +{,} { \PrintEdition}               {edition}
  +{}  { \PrintEditorsB}              {editor}
  +{,} { \PrintTranslatorsC}          {translator}
  +{,} { \PrintContributions}         {contribution}
  +{,} { }                            {series}
  +{,} { \voltext}                    {volume}
  +{,} { }                            {publisher}
  +{,} { }                            {organization}
  +{,} { }                            {address}
  +{,} { \PrintDateB}                 {date}
  +{,} { }                            {status}
  +{}  { \PrintTranslation}           {translation}
  +{;} { \PrintReprint}               {reprint}
  +{}  { \PrintCoAuthors}             {coauthor}
  +{}  { \parenthesize}               {note}
  +{.} {}                             {transition}
}
\BibSpec{collection.article}{%
  +{}  {\textit}                      {title}
  +{.} { }                            {part}
  +{:} { \textit}                     {subtitle}
  +{,} { \PrintContributions}         {contribution}
  +{,} { \PrintConference}            {conference}
  +{}  {\PrintBook}                   {book}
  +{,} { }                            {booktitle}
  +{,} { \PrintDateB}                 {date}
  +{,} { }                            {pages}
  +{,} { }                            {status}
  +{,} { \PrintDOI}                   {doi}
  +{,} { available at \eprint}        {eprint}
  +{}  { \PrintTranslation}           {translation}
  +{;} { \PrintReprint}               {reprint}
  +{}  { \PrintCoAuthors}             {coauthor}
  +{}  { \parenthesize}               {note}
  +{.} {}                             {transition}
}
\BibSpec{report}{%
  +{}  {\textit}                      {title}
  +{.} { }                            {part}
  +{:} { \textit}                     {subtitle}
  +{,} { \PrintEdition}               {edition}
  +{,} { \PrintContributions}         {contribution}
  +{,} { Technical Report }           {number}
  +{,} { }                            {series}
  +{,} { }                            {organization}
  +{,} { }                            {address}
  +{,} { \PrintDateB}                 {date}
  +{,} { \eprint}                     {eprint}
  +{,} { }                            {status}
  +{}  { \PrintTranslation}           {translation}
  +{;} { \PrintReprint}               {reprint}
  +{}  { \PrintCoAuthors}             {coauthor}
  +{}  { \parenthesize}               {note}
  +{.} {}                             {transition}
}
\BibSpec{thesis}{%
  +{}  {\textit}                      {title}
  +{:} { \textit}                     {subtitle}
  +{,} { }                            {type}
  +{,} { }                            {organization}
  +{,} { }                            {address}
  +{,} { \PrintDateB}                 {date}
  +{,} { \eprint}                     {eprint}
  +{,} { }                            {status}
  +{}  { \PrintTranslation}           {translation}
  +{;} { \PrintReprint}               {reprint}
  +{}  { \PrintCoAuthors}             {coauthor}
  +{}  { \parenthesize}               {note}
  +{.} {}                             {transition}
}

\DefineAdditiveKey{bib}{coauthor}{\name}
\def\PrintCoAuthors#1{%
  \PrintNames{(coauthor\Plural{s}: }{)}{#1}%
}

(Note that most stuff is copied-and-pasted from the amsrefs source.)

Now how does this work? \BibSpec is a normal, user-level command documented in the amsrefs manual. \DefineAdditiveKey defines a new field, which is additive (i.e., may be repeated a few times in one bibliographical entry). Next we define the \PrintCoAuthors command (very similar to \PrintAuthors). The \PrintNames macro takes three arguments: the start string, the end string and the actual list (we are currently not really interested in its form).

(In fact, \PrintAuthors is a bit more complicated since it has to take care for inverting the name in certain cases; I skipped this problem here. To be sincere, I don’t know how to enable a similar option for coauthors:(.)

The last interesting part is the \Plural command, whose meaning should be obvious.

Now you can try the whole document:

\documentclass{article}

\usepackage{amsrefs}[2007/10/22]

\makeatletter
...
!!!PUT THE REST OF THE CODE FROM THE BEGINNING HERE!!!
...
\makeatother

\begin{document}

List of publications:
\begin{biblist}
  \normalsize % you don't want your publication list in \footnotesize!
  \bib{a1}{article}{
    author={Borkowski, Marcin},
    coauthor={Smith, John},
    title={Some paper},
    journal={Some Journal},
    volume={1},
    date={2001},
    pages={1\textendash 10},
  }
  \bib{a2}{article}{
    author={Borkowski, Marcin},
    coauthor={Smith, John},
    coauthor={Newman, Jack},
    title={Another paper},
    journal={Another Journal},
    volume={2},
    date={2002},
    number={1},
    pages={12\textendash 20},
  }
  \bib{b3}{book}{
    author={Borkowski, Marcin},
    coauthor={Smith, John},
    coauthor={Newman, Jack},
    coauthor={Brown, Jill},
    title={A book},
    publisher={A Publishing Company},
    date={2003},
  }
\end{biblist}

\end{document}

(this example should Just Work™;)—with reasonably recent TeX installation, at least).

Happy LaTeXing (and don’t forget to run LaTeX twice on this document)!

CategoryBlog, CategoryTeX, KategoriaLateXPorady, KategoriaLateX