This question and its answers might help (I didn't study it in detail). I was lucky in this question because OP didn't want to have index page numbers in index at all, but how to do that in case she would? Technically we typesetted small dictionaries of terms, not two independent indices.
There is a proposal to use the flowfram
package and my solution which uses two separate documents which are combined together later. This solution wouldn't work in case of clickable index page numbers. The hyperlinks would be gone if we used \includepdf
(that's a command from the pdfpages
package) or \includegraphics
(that's a command from the graphicx
package).
I was thinking to save current position in the document (\pdfsavepos
from pdfTeX) of every index entry by wrapping the \item
command at a xindy
level. After that it would be possible to decide if to typeset index entry shifted to right or left side or even jump to some other location on the current page (it's just a theoretical situation when shifting and swapping 3+ columns), e.g. by using the \makebox
command. It would be possible but not effective.
I started to think about moving the columns as they are. When I used \oddsidemargin
, and \evensidemargin
eventually, shifted by \columnwidth
+\columnsep
, it moved the left columns to the right position. Then I changed the \columnsep
dimension (right columns moved in front of the left columns) and I've got a solution with one remaining problem: we needed to fix header and footer which were also shifted. It could be done. I continued in my experiments and I used \leftskip
and \rightskip
instead of \oddsidemargin
. I believe this is a solution but I haven't tested that in practice, yet. The two columns are swapped and if there were hyperlinks they would have worked.
I enclose an example and a preview of 5+5 pages: 5 pages with common two-column regime (the first row of pictures), the other 5 pages with swapped columns (the second row of pictures).
% run: *latex mal-columns.tex
\documentclass[a4paper]{article}
%\pagestyle{empty}
\parindent=0pt
\usepackage{multicol}
%\newdimen\oldoddsidemargin
%\oldoddsidemargin=\oddsidemargin
\newdimen\oldcolumnsep
\oldcolumnsep=\columnsep
\newcount\maltemp
\newdimen\dimtemp
\usepackage{kantlipsum}
\def\textbonus{{\normalsize\kant[1-5]}}
\columnseprule=3pt
\begin{document}
\Huge\bfseries % For better reading...
Regular page in one-column regime...
\newpage
%This is a common typesetting...
\begin{multicols}{2}
%\typeout{\the\columnwidth,\the\columnsep}%
\textbonus
\loop
\advance\maltemp by 1
\the\maltemp\par
\ifnum\maltemp<130\repeat
%\columnbreak
\end{multicols}
% Measuring dimensions...
\newpage
\begin{multicols}{2}
%\typeout{\the\columnwidth, \the\columnsep}%
% Working except the header+footer...
\dimtemp=\columnwidth
\advance\dimtemp by \columnsep
\global\leftskip=\dimtemp
\global\rightskip=\dimtemp
%\global\advance\oddsidemargin by \columnwidth
%\global\advance\oddsidemargin by \columnsep
\end{multicols}
% Columns reversed...
\columnsep=-2\textwidth
\advance\columnsep by -\oldcolumnsep
\maltemp=0
\begin{multicols}{2}
\textbonus
\loop
\advance\maltemp by 1
\the\maltemp\par
\ifnum\maltemp<130\repeat
\end{multicols}
% Return to normal typesetting...
\newpage
%\oddsidemargin=\oldoddsidemargin
\leftskip=0pt%
\rightskip=0pt%
Let's get back to typesetting in one-column regime\ldots
\end{document}

bidi
package (luabidi
, perhaps too?) is offering a solution out of the box (untested).