15

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.

6

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.)

|improve this answer|||||
  • 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 '12 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 '12 at 10:38
8

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}
|improve this answer|||||
  • 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 '11 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}. – Gonzalo Medina Jun 14 '11 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 '11 at 22:52
  • How do you with your method change the name from References to e.g. Bibliography ? – chwi Oct 17 '12 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. – Gonzalo Medina Oct 17 '12 at 11:54
1

The easiest way to tackle this problem is to use bibpreamble and bibpostamble:

\usepackage{multicols}

\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}}
|improve this answer|||||
  • Welcome to TeX.SX! Could add compilable code? It would be easier for other people to test your solution. – Bobyandbob Jul 12 '18 at 15:50
  • This seems neater than the other answers, and works for me. – Roly Jan 16 at 20:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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