0

Let's say I have a multicolumn document, and what I'd like to do is produce an alternate version of the same document which basically puts each column (with the same linebreaks and columnbreaks) on its own page. (with lots of space around the text for note taking). This will either be a simple case of hooking into the new column macro, or an absolute nightmare, I'm guessing.

So for this MWE:

\documentclass[twocolumn=true]{scrartcl}
\usepackage{lipsum}
\begin{document}
\lipsum
\end{document}

I want to modify this code so as to have a switch I can set to true that gives me a three-page document with each column on its own page. That is, each column with the same linebreaks and column breaks as is produced by the above code.

One approach would be to just set the page geometry to whatever one column takes up, but that's going to be pretty fragile and will need redoing whenever I change the format of the twocolumn version... So I'm wondering if there's a way to do better?

Methods that achieve the same result for different methods of getting a two column layout might also be considered...

2 Answers 2

1

This looks like a job for flowfram!

\documentclass[twocolumn=true]{scrartcl}
\usepackage{flowfram}
\usepackage{lipsum}

\newflowframe[all]{\columnwidth}{\textheight}{0pt}{0pt}

\begin{document}
\onecolumn
\lipsum
\end{document}
3
  • If a float gets pushed onto the next page, this causes problems. But it's still a more elegant solution than mine was!
    – Seamus
    Oct 17, 2021 at 11:40
  • This seems to move page breaks in my actual use case. I'm guessing because I change the value of \columnsep?
    – Seamus
    Oct 17, 2021 at 16:22
  • @Seamus - Probably. \newflowframe sets the width in the preamble. Oct 17, 2021 at 16:28
0

If two column layout is being set using LaTeX's \twocolumn mode, then you can set each column on its own page by adding a \clearpage to the end of the code that sets the first column. So, I copied the code of \@outputdblcol from latex.ltx in texmf-dist/tex/latex/base and added the \clearpage, wrapped it in an if and hey presto:

\documentclass[twocolumn=true]{scrartcl}
\newif\ifmakeonecol
% \makeonecolfalse
\makeonecoltrue

\makeatletter
\ifmakeonecol
\def\@outputdblcol{%
  \if@firstcolumn
    \global\@firstcolumnfalse
    \global\setbox\@leftcolumn\copy\@outputbox
    \splitmaxdepth\maxdimen
    \vbadness\maxdimen
     \setbox\@outputbox\vbox{\unvbox\@outputbox\unskip}%
     \setbox\@outputbox\vsplit\@outputbox to\maxdimen
    \toks@\expandafter{\topmark}%
    \xdef\@firstcoltopmark{\the\toks@}%
    \toks@\expandafter{\splitfirstmark}%
    \xdef\@firstcolfirstmark{\the\toks@}%
    \ifx\@firstcolfirstmark\@empty
      \global\let\@setmarks\relax
    \else
      \gdef\@setmarks{%
        \let\firstmark\@firstcolfirstmark
        \let\topmark\@firstcoltopmark}%
      \fi
      \clearpage % <<-- addition
    \else
    \global\@firstcolumntrue
    \setbox\@outputbox\vbox{%
     \hb@xt@\textwidth{%
        \hb@xt@\columnwidth{\box\@leftcolumn \hss}%
        \hfil
        {\normalcolor\vrule \@width\columnseprule}%
        \hfil
       \hb@xt@\columnwidth{\box\@outputbox \hss}}}%
  \@combinedblfloats
    \@setmarks
    \@outputpage
    \begingroup
      \@dblfloatplacement
      \@startdblcolumn
      \@whilesw\if@fcolmade \fi{\@outputpage
     \@startdblcolumn}%
    \endgroup
    \fi}%
  \fi
\makeatother

\usepackage{lipsum}
\begin{document}
\lipsum
\end{document}

This should be fairly robust unless anything else starts redefining how columns are set, or uses another method of creating columns...

Floats will appear on the "spare" half of each page. I imagine that could be remedied, but it's fine for my usecase.

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.