My solution introduces the \langs{text1}{text2}{text3} macro with desired output. The implementation calculates the coefficients for all three columns and uses \vsplit with these coefficients if the text spans multiple pages.
Of course, my solution is in plain TeX but if you need to use it in another formats, I believe that this will be no problem.
\newdimen\colhsize
\newcount\tmpnum \newdimen\tmpdim
\newdimen\pagesize \newdimen \maxht \newdimen\coef
\newif\ifrepeat
{\lccode`\?=`\p \lccode`\!=`\t \lowercase{\gdef\ignorept#1?!{#1}}}
\def\langs#1#2#3{\setbox1=\vbox{\setbaselines #1}\setbox0=\vsplit1 to0pt
\setbox2=\vbox{\setbaselines #2}\setbox0=\vsplit2 to0pt
\setbox3=\vbox{\setbaselines #3}\setbox0=\vsplit3 to0pt \printlangs
}
\def\setbaselines{\penalty0
\advance\baselineskip by 0pt plus1em \relax
\advance\hsize by-4em \divide\hsize by3
}
\def\printlangs{\par \repeattrue
\loop \maxht=\ht1
\ifdim\maxht<\ht2 \maxht=\ht2 \fi \ifdim\maxht<\ht3 \maxht=\ht3 \fi
\pagesize=\pagegoal
\ifdim\pagesize=\maxdimen \pagesize=\vsize
\else \advance\pagesize by-\baselineskip \fi
\advance\pagesize by-\pagetotal
\ifdim\maxht>\pagesize
\tmpnum=\maxht \divide\tmpnum by256
\splitlang1 \splitlang2 \splitlang3
\putlangboxes\pagesize{11}{12}{13}\vfil\break
\else \putlangboxes\maxht123 \repeatfalse \fi
\ifrepeat \repeat
}
\def\splitlang#1 {\coef=\ht#1 \divide\coef by\tmpnum \multiply\coef by256
\tmpdim=\pagesize
\ifdim\ht#1=\maxht \else \advance\tmpdim by-\baselineskip \fi
\setbox 1#1=\vsplit #1 to \expandafter\ignorept\the\coef \tmpdim
}
\def\putlangboxes#1#2#3#4{\hbox{\vbox to#1{\unvbox#2}\kern2em
\vbox to#1{\unvbox#3}\kern2em \vbox to#1{\unvbox#4}}}
%%% The test:
\def\text{Rr eiewb ei s sd fuz dhg fg zd jd ffj xds c sg xv fxdz xvv zhx cdfg.}
\def\textA{\text\par\text\text\par\text}
\def\textB{\text\text\text\par\text\text\par\text\text}
\def\textC{\text\text\par\text\text\text}
This text is before language columns. \text\text
\langs{Language one: \textA\textA\textA\textA\textA\textA\textA\textA}
{Language two: \textB\textB\textB\textB\textB\textB\textB\textB}
{Language three: \textC\textC\textC\textC\textC\textC\textC\textC}
This text follows. \text\text
\bye
Explanation of implementation details. The text1 is set to box1 as \vbox with \baselineskip=\baselineskip plus\vsize. This makes potential stretching of \baselineskip. The text2 is set to box2 and text3 to box3 similarly. The first element of all boxes are \penalty0. The first \vsplit to all three boxes is applied at this \penalty0 in order to set the \splittopskip above the first line in all boxes. This ensures that the first line will be at the same position in all three boxes when we will do \vbox to something{\unvbox1} etc.
The \printlangs macro measures the space on the page \pagesize and does the loop of splitting texts. The \maxht is maximal height of the boxes. If \maxht>\pagesize then we need to split the boxes and repeat the loop. Else we need to print the boxes and end the loop. The macro \splitlang does the \vsplit of the given box to the given size \pagesize multiplied by coeeficient \ht-of current box over \maxht. The result of the splitting is stored from box1 to box11, from box2 to box12, from box3 to box13.
The macro \putlangboxes prints \hbox{\vbox{}\vbox{}\vbox{}}, i.e the three columns and does reboxing all given boxes to the size given in #1.
Edid: I have had a bug in the \setbaselines: \advance\baselineskip by 0pt plus\vsize. The \vsize value was incremented per each line and as the result the value was overfull at line 49 and next lines have had negative plus value. Solution: I write plus1em. This value will never overfull. Another solution: write plus1fil.
\baselineskip=12pt plus 1fill. – Malipivo Mar 17 '15 at 09:44