44

I am trying to create my CV in Latex, after I got fed up with MS Word. I decided to use this template, just because it looks nice. But now I am struggling to add the list of my publications (stored in a bibtex file).

Ideally I would like the list to correspond to the overall layout of the document, so to be able to generate a list that looks like this:

\section{Publications} 
\cvitem{2012}{Authors 1, title 1,\textit{Journal}, etc} 
\cvitem{2011}{Authors 2, title 2,\textit{Journal}, etc}

If this is not possible, I would at least like to generate the entries using apa style from natbib, but sort them descending wrt the year of publication - because this seems more appropriate for a CV. How can I do it? EDIT: I tried to follow the approach to change one of the bst files, but I did it wrong for inproceedings. An example tex file is:

\documentclass{moderncv}
\moderncvstyle{classic}  
\moderncvcolor{blue}       

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@INPROCEEDINGS{a,
  author = {B},
  title = {C},
  booktitle = {D},
  year = {2004},
  pages = {373-385},
  publisher = {Springer},
}
\end{filecontents}

\firstname{E}
\familyname{Xample}
\begin{document}

\section{Publications}
\nocite{*}
\bibliographystyle{moderncv}
\bibliography{\jobname}
\end{document}

and the bst file I am using is (sorry for the big file):

ENTRY
  { address
    author
    booktitle
    chapter
    edition
    editor
    howpublished
    institution
    journal
    key
    month
    note
    number
    organization
    pages
    publisher
    school
    series
    title
    type
    volume
    year
  }
  {}
  { label }

INTEGERS { output.state before.all mid.sentence after.sentence after.block }

FUNCTION {init.state.consts}
{ #0 'before.all :=
  #1 'mid.sentence :=
  #2 'after.sentence :=
  #3 'after.block :=
}

STRINGS { s t }

FUNCTION {output.nonnull}
{ 's :=
  output.state mid.sentence =
    { ", " * write$ }
    { output.state after.block =
        { add.period$ write$
          newline$
          "\newblock " write$
        }
        { output.state before.all =
            'write$
            { add.period$ " " * write$ }
          if$
        }
      if$
      mid.sentence 'output.state :=
    }
  if$
  s
}

FUNCTION {output}
{ duplicate$ empty$
    'pop$
    'output.nonnull
  if$
}

FUNCTION {output.check}
{ 't :=
  duplicate$ empty$
    { pop$ "empty " t * " in " * cite$ * warning$ }
    'output.nonnull
  if$
}

FUNCTION {output.bibitem}
{ newline$
  "\cvitem{" write$
  year write$
  "}" write$
  newline$
  ""
  before.all 'output.state :=
}

FUNCTION {fin.entry}
{ add.period$
  write$
  newline$
}

FUNCTION {new.block}
{ output.state before.all =
    'skip$
    { after.block 'output.state := }
  if$
}

FUNCTION {new.sentence}
{ output.state after.block =
    'skip$
    { output.state before.all =
        'skip$
        { after.sentence 'output.state := }
      if$
    }
  if$
}

FUNCTION {not}
{   { #0 }
    { #1 }
  if$
}

FUNCTION {and}
{   'skip$
    { pop$ #0 }
  if$
}

FUNCTION {or}
{   { pop$ #1 }
    'skip$
  if$
}

FUNCTION {new.block.checka}
{ empty$
    'skip$
    'new.block
  if$
}

FUNCTION {new.block.checkb}
{ empty$
  swap$ empty$
  and
    'skip$
    'new.block
  if$
}

FUNCTION {new.sentence.checka}
{ empty$
    'skip$
    'new.sentence
  if$
}

FUNCTION {new.sentence.checkb}
{ empty$
  swap$ empty$
  and
    'skip$
    'new.sentence
  if$
}

FUNCTION {field.or.null}
{ duplicate$ empty$
    { pop$ "" }
    'skip$
  if$
}

FUNCTION {emphasize}
{ duplicate$ empty$
    { pop$ "" }
    { "{\em " swap$ * "}" * }
  if$
}

INTEGERS { nameptr namesleft numnames }

FUNCTION {format.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
      nameptr #1 >
        { namesleft #1 >
            { ", " * t * }
            { numnames #2 >
                { "," * }
                'skip$
              if$
              t "others" =
                { " et~al." * }
                { " and " * t * }
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}

FUNCTION {format.authors}
{ author empty$
    { "" }
    { author format.names }
  if$
}

FUNCTION {format.editors}
{ editor empty$
    { "" }
    { editor format.names
      editor num.names$ #1 >
        { ", editors" * }
        { ", editor" * }
      if$
    }
  if$
}

FUNCTION {format.title}
{ title empty$
    { "" }
    { title "t" change.case$ }
  if$
}

FUNCTION {n.dashify}
{ 't :=
  ""
    { t empty$ not }
    { t #1 #1 substring$ "-" =
        { t #1 #2 substring$ "--" = not
            { "--" *
              t #2 global.max$ substring$ 't :=
            }
            {   { t #1 #1 substring$ "-" = }
                { "-" *
                  t #2 global.max$ substring$ 't :=
                }
              while$
            }
          if$
        }
        { t #1 #1 substring$ *
          t #2 global.max$ substring$ 't :=
        }
      if$
    }
  while$
}

FUNCTION {format.date}
{ year empty$
    { month empty$
        { "" }
        { "there's a month but no year in " cite$ * warning$
          month
        }
      if$
    }
    { month empty$
        'year
        { month " " * year * }
      if$
    }
  if$
}

FUNCTION {format.btitle}
{ title emphasize
}

FUNCTION {tie.or.space.connect}
{ duplicate$ text.length$ #3 <
    { "~" }
    { " " }
  if$
  swap$ * *
}

FUNCTION {either.or.check}
{ empty$
    'pop$
    { "can't use both " swap$ * " fields in " * cite$ * warning$ }
  if$
}

FUNCTION {format.bvolume}
{ volume empty$
    { "" }
    { "volume" volume tie.or.space.connect
      series empty$
        'skip$
        { " of " * series emphasize * }
      if$
      "volume and number" number either.or.check
    }
  if$
}

FUNCTION {format.number.series}
{ volume empty$
    { number empty$
        { series field.or.null }
        { output.state mid.sentence =
            { "number" }
            { "Number" }
          if$
          number tie.or.space.connect
          series empty$
            { "there's a number but no series in " cite$ * warning$ }
            { " in " * series * }
          if$
        }
      if$
    }
    { "" }
  if$
}

FUNCTION {format.edition}
{ edition empty$
    { "" }
    { output.state mid.sentence =
        { edition "l" change.case$ " edition" * }
        { edition "t" change.case$ " edition" * }
      if$
    }
  if$
}

INTEGERS { multiresult }

FUNCTION {multi.page.check}
{ 't :=
  #0 'multiresult :=
    { multiresult not
      t empty$ not
      and
    }
    { t #1 #1 substring$
      duplicate$ "-" =
      swap$ duplicate$ "," =
      swap$ "+" =
      or or
        { #1 'multiresult := }
        { t #2 global.max$ substring$ 't := }
      if$
    }
  while$
  multiresult
}

FUNCTION {format.pages}
{ pages empty$
    { "" }
    { pages multi.page.check
        { "pages" pages n.dashify tie.or.space.connect }
        { "page" pages tie.or.space.connect }
      if$
    }
  if$
}

FUNCTION {format.vol.num.pages}
{ volume field.or.null
  number empty$
    'skip$
    { "(" number * ")" * *
      volume empty$
        { "there's a number but no volume in " cite$ * warning$ }
        'skip$
      if$
    }
  if$
  pages empty$
    'skip$
    { duplicate$ empty$
        { pop$ format.pages }
        { ":" * pages n.dashify * }
      if$
    }
  if$
}

FUNCTION {format.chapter.pages}
{ chapter empty$
    'format.pages
    { type empty$
        { "chapter" }
        { type "l" change.case$ }
      if$
      chapter tie.or.space.connect
      pages empty$
        'skip$
        { ", " * format.pages * }
      if$
    }
  if$
}

FUNCTION {format.in.ed.booktitle}
{ booktitle empty$
    { "" }
    { editor empty$
        { "In " booktitle emphasize * }
        { "In " format.editors * ", " * booktitle emphasize * }
      if$
    }
  if$
}

FUNCTION {empty.misc.check}
{ author empty$ title empty$ howpublished empty$
  month empty$ year empty$ note empty$
  and and and and and
  key empty$ not and
    { "all relevant fields are empty in " cite$ * warning$ }
    'skip$
  if$
}

FUNCTION {format.thesis.type}
{ type empty$
    'skip$
    { pop$
      type "t" change.case$
    }
  if$
}

FUNCTION {format.tr.number}
{ type empty$
    { "Technical Report" }
    'type
  if$
  number empty$
    { "t" change.case$ }
    { number tie.or.space.connect }
  if$
}

FUNCTION {format.article.crossref}
{ key empty$
    { journal empty$
        { "need key or journal for " cite$ * " to crossref " * crossref *
          warning$
          ""
        }
        { "In {\em " journal * "\/}" * }
      if$
    }
    { "In " key * }
  if$
  " \cite{" * crossref * "}" *
}

FUNCTION {format.crossref.editor}
{ editor #1 "{vv~}{ll}" format.name$
  editor num.names$ duplicate$
  #2 >
    { pop$ " et~al." * }
    { #2 <
        'skip$
        { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
            { " et~al." * }
            { " and " * editor #2 "{vv~}{ll}" format.name$ * }
          if$
        }
      if$
    }
  if$
}

FUNCTION {format.book.crossref}
{ volume empty$
    { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
      "In "
    }
    { "Volume" volume tie.or.space.connect
      " of " *
    }
  if$
  editor empty$
  editor field.or.null author field.or.null =
  or
    { key empty$
        { series empty$
            { "need editor, key, or series for " cite$ * " to crossref " *
              crossref * warning$
              "" *
            }
            { "{\em " * series * "\/}" * }
          if$
        }
        { key * }
      if$
    }
    { format.crossref.editor * }
  if$
  " \cite{" * crossref * "}" *
}

FUNCTION {format.incoll.inproc.crossref}
{ editor empty$
  editor field.or.null author field.or.null =
  or
    { key empty$
        { booktitle empty$
            { "need editor, key, or booktitle for " cite$ * " to crossref " *
              crossref * warning$
              ""
            }
            { "In {\em " booktitle * "\/}" * }
          if$
        }
        { "In " key * }
      if$
    }
    { "In " format.crossref.editor * }
  if$
  " \cite{" * crossref * "}" *
}

FUNCTION {article}
{ output.bibitem
  "{" write$
  format.authors "author" output.check 
  format.title "title" output.check
  journal emphasize "journal" output.check
  format.vol.num.pages output
  fin.entry
  "}" write$
}

FUNCTION {book}
{ output.bibitem
  author empty$
    { format.editors "author and editor" output.check }
    { format.authors output.nonnull
      crossref missing$
        { "author and editor" editor either.or.check }
        'skip$
      if$
    }
  if$
  new.block
  format.btitle "title" output.check
  crossref missing$
    { format.bvolume output
      new.block
      format.number.series output
      new.sentence
      publisher "publisher" output.check
      address output
    }
    { new.block
      format.book.crossref output.nonnull
    }
  if$
  format.edition output
  format.date "year" output.check
  new.block
  note output
  fin.entry
}

FUNCTION {booklet}
{ output.bibitem
  format.authors output
  new.block
  format.title "title" output.check
  howpublished address new.block.checkb
  howpublished output
  address output
  format.date output
  new.block
  note output
  fin.entry
}

FUNCTION {inbook}
{ output.bibitem
  author empty$
    { format.editors "author and editor" output.check }
    { format.authors output.nonnull
      crossref missing$
        { "author and editor" editor either.or.check }
        'skip$
      if$
    }
  if$
  new.block
  format.btitle "title" output.check
  crossref missing$
    { format.bvolume output
      format.chapter.pages "chapter and pages" output.check
      new.block
      format.number.series output
      new.sentence
      publisher "publisher" output.check
      address output
    }
    { format.chapter.pages "chapter and pages" output.check
      new.block
      format.book.crossref output.nonnull
    }
  if$
  format.edition output
  format.date "year" output.check
  new.block
  note output
  fin.entry
}

FUNCTION {incollection}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.title "title" output.check
  new.block
  crossref missing$
    { format.in.ed.booktitle "booktitle" output.check
      format.bvolume output
      format.number.series output
      format.chapter.pages output
      new.sentence
      publisher "publisher" output.check
      address output
      format.edition output
      format.date "year" output.check
    }
    { format.incoll.inproc.crossref output.nonnull
      format.chapter.pages output
    }
  if$
  new.block
  note output
  fin.entry
}

FUNCTION {inproceedings}
{ output.bibitem
  "{" write$
  format.authors "author" output.check 
  format.title "title" output.check
  format.in.ed.booktitle "booktitle" output.check
  format.bvolume output
  format.number.series output
  format.pages output
    address empty$
      { organization output
        publisher output
      }
      { address output.nonnull
        organization output
        publisher output
      }
    if$
  fin.entry
  "}" write$
}

FUNCTION {conference} { inproceedings }

FUNCTION {manual}
{ output.bibitem
  author empty$
    { organization empty$
        'skip$
        { organization output.nonnull
          address output
        }
      if$
    }
    { format.authors output.nonnull }
  if$
  new.block
  format.btitle "title" output.check
  author empty$
    { organization empty$
        { address new.block.checka
          address output
        }
        'skip$
      if$
    }
    { organization address new.block.checkb
      organization output
      address output
    }
  if$
  format.edition output
  format.date output
  new.block
  note output
  fin.entry
}

FUNCTION {mastersthesis}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.title "title" output.check
  new.block
  "Master's thesis" format.thesis.type output.nonnull
  school "school" output.check
  address output
  format.date "year" output.check
  new.block
  note output
  fin.entry
}

FUNCTION {misc}
{ output.bibitem
  format.authors output
  title howpublished new.block.checkb
  format.title output
  howpublished new.block.checka
  howpublished output
  format.date output
  new.block
  note output
  fin.entry
  empty.misc.check
}

FUNCTION {phdthesis}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.btitle "title" output.check
  new.block
  "PhD thesis" format.thesis.type output.nonnull
  school "school" output.check
  address output
  format.date "year" output.check
  new.block
  note output
  fin.entry
}

FUNCTION {proceedings}
{ output.bibitem
  editor empty$
    { organization output }
    { format.editors output.nonnull }
  if$
  new.block
  format.btitle "title" output.check
  format.bvolume output
  format.number.series output
  address empty$
    { editor empty$
        { publisher new.sentence.checka }
        { organization publisher new.sentence.checkb
          organization output
        }
      if$
      publisher output
      format.date "year" output.check
    }
    { address output.nonnull
      format.date "year" output.check
      new.sentence
      editor empty$
        'skip$
        { organization output }
      if$
      publisher output
    }
  if$
  new.block
  note output
  fin.entry
}

FUNCTION {techreport}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.title "title" output.check
  new.block
  format.tr.number output.nonnull
  institution "institution" output.check
  address output
  format.date "year" output.check
  new.block
  note output
  fin.entry
}

FUNCTION {unpublished}
{ output.bibitem
  "{" write$
  format.authors "author" output.check 
  format.title "title" output.check
  note "note" output.check
  fin.entry
  "}" write$
}

FUNCTION {default.type} { misc }

MACRO {jan} {"January"}

MACRO {feb} {"February"}

MACRO {mar} {"March"}

MACRO {apr} {"April"}

MACRO {may} {"May"}

MACRO {jun} {"June"}

MACRO {jul} {"July"}

MACRO {aug} {"August"}

MACRO {sep} {"September"}

MACRO {oct} {"October"}

MACRO {nov} {"November"}

MACRO {dec} {"December"}

MACRO {acmcs} {"ACM Computing Surveys"}

MACRO {acta} {"Acta Informatica"}

MACRO {cacm} {"Communications of the ACM"}

MACRO {ibmjrd} {"IBM Journal of Research and Development"}

MACRO {ibmsj} {"IBM Systems Journal"}

MACRO {ieeese} {"IEEE Transactions on Software Engineering"}

MACRO {ieeetc} {"IEEE Transactions on Computers"}

MACRO {ieeetcad}
 {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}

MACRO {ipl} {"Information Processing Letters"}

MACRO {jacm} {"Journal of the ACM"}

MACRO {jcss} {"Journal of Computer and System Sciences"}

MACRO {scp} {"Science of Computer Programming"}

MACRO {sicomp} {"SIAM Journal on Computing"}

MACRO {tocs} {"ACM Transactions on Computer Systems"}

MACRO {tods} {"ACM Transactions on Database Systems"}

MACRO {tog} {"ACM Transactions on Graphics"}

MACRO {toms} {"ACM Transactions on Mathematical Software"}

MACRO {toois} {"ACM Transactions on Office Information Systems"}

MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}

MACRO {tcs} {"Theoretical Computer Science"}

READ

FUNCTION {sortify}
{ purify$
  "l" change.case$
}

INTEGERS { len }

FUNCTION {chop.word}
{ 's :=
  'len :=
  s #1 len substring$ =
    { s len #1 + global.max$ substring$ }
    's
  if$
}

FUNCTION {sort.format.names}
{ 's :=
  #1 'nameptr :=
  ""
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { nameptr #1 >
        { "   " * }
        'skip$
      if$
      s nameptr "{vv{ } }{ll{ }}{  ff{ }}{  jj{ }}" format.name$ 't :=
      nameptr numnames = t "others" = and
        { "et al" * }
        { t sortify * }
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}

FUNCTION {sort.format.title}
{ 't :=
  "A " #2
    "An " #3
      "The " #4 t chop.word
    chop.word
  chop.word
  sortify
  #1 global.max$ substring$
}

FUNCTION {year.sort}
{ year empty$
    { key empty$
        { "to sort, need year or key in " cite$ * warning$
          ""
        }
        { key sortify }
      if$
    }
    { year sort.format.names }
  if$
}

FUNCTION {author.sort}
{ author empty$
    { key empty$
        { "to sort, need author or key in " cite$ * warning$
          ""
        }
        { key sortify }
      if$
    }
    { author sort.format.names }
  if$
}

FUNCTION {author.editor.sort}
{ author empty$
    { editor empty$
        { key empty$
            { "to sort, need author, editor, or key in " cite$ * warning$
              ""
            }
            { key sortify }
          if$
        }
        { editor sort.format.names }
      if$
    }
    { author sort.format.names }
  if$
}

FUNCTION {author.organization.sort}
{ author empty$
    { organization empty$
        { key empty$
            { "to sort, need author, organization, or key in " cite$ * warning$
              ""
            }
            { key sortify }
          if$
        }
        { "The " #4 organization chop.word sortify }
      if$
    }
    { author sort.format.names }
  if$
}

FUNCTION {editor.organization.sort}
{ editor empty$
    { organization empty$
        { key empty$
            { "to sort, need editor, organization, or key in " cite$ * warning$
              ""
            }
            { key sortify }
          if$
        }
        { "The " #4 organization chop.word sortify }
      if$
    }
    { editor sort.format.names }
  if$
}

FUNCTION {presort}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.sort
    { type$ "proceedings" =
        'editor.organization.sort
        { type$ "manual" =
            'author.organization.sort
            'year.sort
          if$
        }
      if$
    }
  if$
  "    "
  *
  author field.or.null
  sort.format.names
  *
  "    "
  *
  title field.or.null
  sort.format.title
  *
  #1 entry.max$ substring$
  'sort.key$ :=
}

ITERATE {presort}

SORT

STRINGS { longest.label }

INTEGERS { number.label longest.label.width }

FUNCTION {initialize.longest.label}
{ "" 'longest.label :=
  #1 'number.label :=
  #0 'longest.label.width :=
}

FUNCTION {longest.label.pass}
{ number.label int.to.str$ 'label :=
  number.label #1 + 'number.label :=
  label width$ longest.label.width >
    { label 'longest.label :=
      label width$ 'longest.label.width :=
    }
    'skip$
  if$
}

EXECUTE {initialize.longest.label}

ITERATE {longest.label.pass}

FUNCTION {begin.bib}
{ 
}

EXECUTE {begin.bib}

EXECUTE {init.state.consts}

REVERSE {call.type$}

FUNCTION {end.bib}
{ 
}

EXECUTE {end.bib}
9
  • I think it would be useful if you could create an MWE. From what you say I assume you use BibTeX, so you need to include your bibliography using \bibliography{cv_bib}. The style could be \bibliographystyle{apalike} and if you want to show all elements in the bibliography without citing them you nee \nocite{*}. Note that the order is alphabetic, so with \bibliographystyle{unsrt} you can sort manually.
    – Jörg
    Dec 7, 2012 at 15:50
  • This sounds like a job for biblatex. (Although moderncv does not support it, there's an adaptation called koma-moderncvclassic which allows using biblatex.) This answer looks like a good starting point. Dec 7, 2012 at 16:01
  • I should add that I am not sure if there is a simple and automatic way to use apalike and sort the bibliography chronologically. However, it could be easily achieved using biber and biblatex.
    – Jörg
    Dec 7, 2012 at 16:03
  • 1
    Ah, Christian was quicker.
    – Jörg
    Dec 7, 2012 at 16:03
  • I should also add that while it's quite easy to sort by year, things get more complicated if you care about the order of publications of the same year. For that reason, I switched back to manually sorting the bib file and using an unsorted style. (This is less an issue if you do not number the publications, though.) Dec 7, 2012 at 16:10

3 Answers 3

27

Here's a solution using bibtex and standard moderncv. You need to hack a suitable BibTeX style; a good starting point is plainyr, since it already has sorting by year and looks similar the mock-up in your question.

  1. Make a copy of plainyr.bst (use kpsewhere or CTAN to find it) and call it, e.g., plainyrrev.bst.

  2. Edit FUNCTION {output.bibitem} as follows:

    FUNCTION {output.bibitem}
    { newline$
      "\cvitem{" write$
      year write$
      "}" write$
      newline$
      "{" write$
      ""
      before.all 'output.state :=
    }
    
  3. Edit FUNCTION {fin.entry} as follows:

    FUNCTION {fin.entry}
    { add.period$
      write$
      newline$
      "}" write$
    }
    
  4. Remove everything relating to the bibliography environment from FUNCTION {begin.bib} and FUNCTION {end.bib}:

    FUNCTION {begin.bib}
    {
    }
    

    and

    FUNCTION {end.bib}
    {
      newline$
    }
    
  5. Replace ITERATE {call.type$} by REVERSE {call.type$}.

  6. Optional: If you want each year to appear only for the first paper of that year, add

    STRINGS {oldyear}
    
    FUNCTION {year.or.none}
    { 's :=
        oldyear empty$
         { s 'oldyear := s }
         { s oldyear =
             { "" }
             { s 'oldyear := s }
           if$
         }
        if$
    }
    

    before FUNCTION {output.bibitem} and there change the line

    year write$
    

    to

    year year.or.none write$
    

    (shamelessly adapted from this answer).

Then,

\documentclass{moderncv}
\moderncvstyle{classic}  
\moderncvcolor{blue}       

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{A01,
  author = {Author, A.},
  journal = {Good Journal},
  year = {2001},
  title = {Alpha},
}
@article{B02,
  author = {Buthor, B.},
  journal = {Very Good Journal},
  year = {2008},
  title = {Bravo},
}
@article{C03,
  author = {Cuthor, C.},
  journal = {Also Good Journal},
  year = {2004},
  title = {Charlie},
}
@article{D04,
  author = {Duthor, D.},
  year = {2004},
  journal = {Best Journal},
  title = {Delta},
}
\end{filecontents}

\firstname{E}
\familyname{Xample}
\begin{document}

\section{Publications}
\nocite{*}
\bibliographystyle{plainyrrev}
\bibliography{\jobname}

\end{document}

does the trick:

publications

12
  • Thanks for your answer! I am trying to implement is now, but I am getting the error: (./Grzegorz Andruszkiewicz CV.bbl) Runaway argument? {Grzegorz Andruszkiewicz, Krzysztof Ciebiera, Marcin Gozdalik, Cezary\ETC. ! File ended while scanning use of \\cvitem. &lt;inserted text&gt; \par l.138 \bibliography{../bib/andruszkiewicz}. How do I debug this?
    – Grzenio
    Dec 11, 2012 at 17:57
  • @Grzenio -- Can you add a minimal working example to your question? (Strip out everything but the publications section from your CV, and post the BibTeX entry that gives you trouble.) Then I'll take a look at it. Dec 11, 2012 at 18:45
  • Hi, it would be easier if I could debug it myself. Otherwise I will bother you with each and every detail all the time :)
    – Grzenio
    Dec 11, 2012 at 21:22
  • Looks like my function for INPROCEEDINGS doesn't end the curly braces (this is the oldest entry). The function is as follows: FUNCTION {inproceedings} { output.bibitem "{" write$ format.authors "author" output.check format.title "title" output.check format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output format.pages output address empty$ { organization output publisher output } { address output.nonnull organization output publisher output } if$ fin.entry "}" write$ }
    – Grzenio
    Dec 11, 2012 at 21:24
  • 1
    @Grzenio -- Found the problem: Apparently end.bib does need a final newline$. I've edited the answer accordingly. Sorry! Dec 12, 2012 at 21:42
26

As mentioned by Jörg, biblatex (with any backend) already supports this sorting scheme via the load-time option setting sorting=ydnt. For the bibliography layout, you can add year item labels and incorporate moderncv's thebibliography layout parameters via \defbibenvironment.

\documentclass{moderncv}
\moderncvstyle{classic}
\moderncvcolor{blue}
\usepackage[style=authoryear,sorting=ydnt,dashed=false]{biblatex}

\renewbibmacro*{date}{}
\renewbibmacro*{date+extrayear}{}
\renewbibmacro*{issue+date}{}
\newcommand*{\bibyear}{}

\defbibenvironment{bibliography}
  {\list
     {\iffieldequals{year}{\bibyear}
        {}
        {\printfield{year}%
         \savefield{year}{\bibyear}}}
     {\setlength{\topsep}{0pt}% layout parameters based on moderncvstyleclassic.sty
      \setlength{\labelwidth}{\hintscolumnwidth}%
      \setlength{\labelsep}{\separatorcolumnwidth}%
      \setlength{\itemsep}{\bibitemsep}%
      \leftmargin\labelwidth%
      \advance\leftmargin\labelsep}%
      \sloppy\clubpenalty4000\widowpenalty4000}
  {\endlist}
  {\item}

\firstname{John}
\familyname{Doe}
\addbibresource{biblatex-examples.bib}

\begin{document}
\makecvtitle
\nocite{companion,bertram,cicero,augustine}
\printbibliography[title={Publications}]
\end{document}

enter image description here

In theory this same approach should work for the koma-moderncvclassic package, but it is actually not fully compatible with biblatex; its custom \maketitle command has some odd side-effects on \printbibliography.

7
  • 7
    In my opinion, this is the cleanest solution.
    – sfat
    Sep 4, 2014 at 17:38
  • If I do a \begin{refsection}, what is the recommended way to force the year to be shown? That is, what is the recommended way to reset \bibyear? Feb 22, 2016 at 23:46
  • I've been happily using this for quite a while, until just now I noticed that it had started printing the years again. I had to add \renewbibmacro*{labelyear+extradate}{} to suppress that (using the APA style). Jan 17, 2018 at 18:31
  • Also, if you want to print non-year years (for submitted, in prep, etc.), you need to use the labelyear field instead of the year field. Jan 17, 2018 at 18:32
  • @Audrey how can one make the item text smaller (not the year)? The command \cventry uses a smaller font for the body text. When there are many items in the bibliography, a smaller font would take up less space. How can the text in the hint column (that is, the year) stay the same, and the text of the body be smaller? I tried with \renewcommand*{\bibfont}{\normalfont\small}, but it affects the year, too. Mar 20, 2019 at 18:44
9

This is a partial (and not completely working answer) using koma-moderncvclassic, biblatex and biber.

Sorting descending by year is easy (sorting=ydnt), but it get's difficult because we have to wrap the year and the rest of the bibliography into \cvlist{<year>}{<everything else>}.

What I tried to do is: First, remove the brackets and delimiter from the year; Second, remove the year from the author bibmacro; Third go directly into the Bibliography Driver for article, change the order and wrap everything into \cvlist.

As lockstep discusses, changing the driver directly can be a bad idea (but here I don't see another way). The answer is incomplete in the sense that in only works for articles here, and that there is a ghost-line between entries that I can't get rid of.

Edit: I just saw in your comments that the template of your choice is not in KOMA-CV. Would you consider switching your template? Fixing my answer to make it properly working is probably easier than doing the same in BibTeX.

\documentclass{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage[%
 backend=biber,% or bibtex8
 style=authoryear,%
 sorting=ydnt,% sorted by year, descending
]{biblatex}

\usepackage{xpatch}

\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@article{A01,
  author = {Author, A.},
  journal = {Good Journal},
  year = {2001},
  title = {Alpha},
}
@article{B02,
  author = {Buthor, B.},
  journal = {Very Good Journal},
  year = {2008},
  title = {Bravo},
}
@article{C03,
  author = {Cuthor, C.},
  journal = {Bad Journal},
  year = {2003},
  title = {Charlie},
}
@article{D04,
  author = {Duthor, D.},
  year = {2004},
  journal = {Mediocre Journal},
  title = {Delta},
}
\end{filecontents}

\addbibresource{\jobname.bib}


\newcommand*{\firstname}{Minna}
\newcommand*{\familyname}{von Barnhelm}

\usepackage[myblue]{koma-moderncvclassic} % color theme as option; default = myblue; other predefined colors that may be used: red, green, blue, cyan, magenta, yellow, black, white, darkgray, gray, lightgray

%remove brackets from year
\xpatchbibmacro{date+extrayear}{%
  \printtext[parens]}{\printtext}{}{}

% remove year from the author bibmacro
\xpatchbibmacro{author}{%
 \usebibmacro{date+extrayear}}
 {}{}{}

%change order and wrap into \cvline
\DeclareBibliographyDriver{article}{%
\cvline{\usebibmacro{date+extrayear}}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author/translator+others}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{title}%
  \newunit
  \printlist{language}%
  \newunit\newblock
  \usebibmacro{byauthor}%
  \newunit\newblock
  \usebibmacro{bytranslator+others}%
  \newunit\newblock
  \printfield{version}%
  \newunit\newblock
  \usebibmacro{in:}%
  \usebibmacro{journal+issuetitle}%
  \newunit
  \usebibmacro{byeditor+others}%
  \newunit
  \usebibmacro{note+pages}%
  \newunit\newblock
  \iftoggle{bbx:isbn}
    {\printfield{issn}}
    {}%
  \newunit\newblock
  \usebibmacro{doi+eprint+url}%
  \newunit\newblock
  \usebibmacro{addendum+pubstate}%
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \newunit\newblock
  \usebibmacro{related}%
  \usebibmacro{finentry}}%
  }


\defbibheading{bibliography}[Publications]{\section{#1}}

\begin{document}
\nocite{*}
\printbibliography

\end{document}

enter image description here

1
  • After trying it, it seems that this solution works out of the box even for moderncv. Maybe there are some hidden issues I'm missing, of course.
    – T. Verron
    Mar 14, 2013 at 15:32

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .