20

I'm using the following to span the bibliography to two columns:

\begin{multicols}{2}
\bibliographystyle{abbrv}
\bibliography{mybib}
\end{multicols}

Yet, the section title ("References" in the article document style) also appear as part of the two columns, while I want it to span the whole page. How can I do something equivalent to the following code, but still using BibTeX?

\section*{References}
\begin{multicols}{2}
\thebibliography{..}
\end{multicols}

Thanks.

4 Answers 4

7

Building upon Gonzalo's answer, I suggest to use the etoolbox package to selectively change the definitions of \thebibliography and \endthebibliography. Add the following to your preamble:

\usepackage{multicol}
\usepackage{etoolbox}
\patchcmd{\thebibliography}{\section*{\refname}}
    {\begin{multicols}{2}[\section*{\refname}]}{}{}
\patchcmd{\endthebibliography}{\endlist}{\endlist\end{multicols}}{}{}

EDIT: How does it work? The \patchcmd command needs five arguments, but you may ignore (as I did) the two last ones, which generate patching success/error messages. Argument no. 1 is the command to be "patched" (selectively changed), argument no. 2 is the part of the command definition that should be replaced, argument no. 3 is the replacement. (Because thebibliography is an environment, I had to patch the two commands that define it.)

2
  • 2
    Patching using \section*{\refname} has the problem that the solution does not work for report or book classes. You can use \list as the search pattern and replace it with {\list\begin{multicols}{2}}.
    – Guido
    Oct 17, 2012 at 10:32
  • @Guido True, but I prefer to use multicols optional second argument because I've had some trouble with regard to spacing if I start multicols after sectioning commands.
    – lockstep
    Oct 17, 2012 at 10:38
9

You can redefine the thebibliography environment to use two columns and use the optional argument of multicols to place the title; add the following lines to the preamble of your document:

\usepackage{multicol}

\makeatletter
\renewenvironment{thebibliography}[1]
     {\begin{multicols}{2}[\section*{\refname}]%
      \@mkboth{\MakeUppercase\refname}{\MakeUppercase\refname}%
      \list{\@biblabel{\@arabic\c@enumiv}}%
           {\settowidth\labelwidth{\@biblabel{#1}}%
            \leftmargin\labelwidth
            \advance\leftmargin\labelsep
            \@openbib@code
            \usecounter{enumiv}%
            \let\p@enumiv\@empty
            \renewcommand\theenumiv{\@arabic\c@enumiv}}%
      \sloppy
      \clubpenalty4000
      \@clubpenalty \clubpenalty
      \widowpenalty4000%
      \sfcode`\.\@m}
     {\def\@noitemerr
       {\@latex@warning{Empty `thebibliography' environment}}%
      \endlist\end{multicols}}
\makeatother

Now in the body of your document, simply use

\bibliographystyle{abbrv}
\bibliography{mybib}
5
  • Works great.. but it is unfortunate to need to redefine everything. I like the solution of lockstep for its brevity (although I am not sure I yet understand how it works)
    – Ran G.
    Jun 14, 2011 at 22:36
  • 3
    @Ran G. my solution doesn't redefine everything; it only changes two lines in the original definition of the thebibliography environment; lockstep's solution does exactly what I did, but with the help of a package. The idea in both cases is to make two replacements in the original definition: 1) Instead of \section*{\refname} use \begin{multicols}{2}[\section*{\refname}] and 2) Instead of \endlist use \endlist\end{multicols}. Jun 14, 2011 at 22:42
  • thanks for the explanations. Since I don't really understand the internals I try to avoid low-level hacks (that is, anything that begins with \makeatletter, etc :)
    – Ran G.
    Jun 14, 2011 at 22:52
  • How do you with your method change the name from References to e.g. Bibliography ?
    – chwi
    Oct 17, 2012 at 10:27
  • 2
    @Wilhelmsen there are a number of questions in this site addressing this issue. Depends on whether you use babel or not. Without babel: \renewcommand\refname{The New Name}, with babel you need \addto\captions<language>{\renewcommand\refname{The New Name}}, where <language> is the main language declared. Oct 17, 2012 at 11:54
4

If you're using natbib, The easiest way to tackle this problem is to use bibpreamble and bibpostamble:

\usepackage{multicol}

\renewcommand{\bibpreamble}{\begin{multicols}{2}}
\renewcommand{\bibpostamble}{\end{multicols}}

In this manner, only the references are placed in two columns and your title is left out. Nevertheless, it keeps the heading of the bibliography in the chapter-style. To change that, you could use e.g. bibsection:

\usepackage{natbib}

\renewcommand\bibsection{\section{\bibname}}
3
  • 1
    Welcome to TeX.SX! Could add compilable code? It would be easier for other people to test your solution.
    – Bobyandbob
    Jul 12, 2018 at 15:50
  • This seems neater than the other answers, and works for me.
    – Roly
    Jan 16, 2020 at 20:42
  • Perfect solution!
    – alexhg
    Jun 30, 2020 at 8:17
0

The easiest solution I found to have references in two columns is to use \twocolumn command like this:

\twocolumn
\bibliography{report}
\onecolumn
1
  • It seems that this solution yields an empty second column in each frame of the bibliography...
    – Laurent90
    Jan 18 at 10:11

You must log in to answer this question.

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