3

In a two column text (with multicol), the first column is composed of a long paragraph, ending a line before the column end. Then a parskip is added, which makes the last line of the column empty. The result is that the second column is ended a line after the first column.

Is there a way to avoid this, and make the two column end at the same place? (without modifying the text, or inserting some commands inside it to manually fix the problem - the text is generated by a program, and it'd be cumbersome to go over all such places and manually fix them)

MWE:

\documentclass[12pt]{book}

\usepackage{multicol}       
\setlength{\columnsep}{1.5pc}   

\setlength{\parindent}{0pt}     
\setlength{\parskip}{1ex plus 0.2ex minus 0.2ex}    


%%%%%%%%%%%        DATA        %%%%%%%%%%%

\begin{document}
\begin{multicols}{2}

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vel turpis nunc eget lorem. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus sed. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. Nunc id cursus metus aliquam eleifend mi. Phasellus vestibulum lorem sed risus ultricies tristique nulla aliquet. Tristique et egestas quis ipsum suspendisse ultrices gravida dictum fusce. Mi sit amet mauris commodo quis imperdiet massa tincidunt. In ante metus dictum at tempor commodo. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo nulla. Commodo quis imperdiet massa tincidunt nunc pulvinar sapien et ligula. Ultrices dui sapien eget mi proin sed libero enim sed. Bibendum at varius vel pharetra. Imperdiet nulla malesuada pellentesque elit eget. Amet commodo nulla facilisi nullam vehicula ipsum a. Eu tincidunt tortor aliquam nulla facilisi cras fermentum odio. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Ipsum a arcu cursus vitae.\\
Eu consequat ac felis donec et odio pellentesque diam volutpat. Ornare suspendisse sed nisi lacus sed viverra. Et sollicitudin.

Quam quisque id diam vel. Sed enim ut sem viverra aliquet. Elit eget gravida cum sociis natoque penatibus et magnis. Id faucibus nisl tincidunt eget nullam. Faucibus purus in massa tempor nec feugiat. Morbi tristique senectus et netus et malesuada fames ac. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Turpis egestas pretium aenean pharetra magna. Sit amet volutpat consequat mauris nunc congue nisi.

Urna et pharetra pharetra massa. Nec feugiat in fermentum posuere urna. Turpis massa tincidunt dui ut. Tempor orci eu lobortis elementum. Sed felis eget velit aliquet. Pellentesque nec nam aliquam sem et tortor consequat. Lorem ipsum dolor sit amet consectetur adipiscing elit. Pellentesque elit eget gravida cum sociis natoque. Duis ultricies lacus sed turpis tincidunt. Quisque non tellus orci ac auctor augue mauris. Duis tristique sollicitudin nibh sit amet commodo. Eget velit aliquet sagittis id consectetur purus ut faucibus. Arcu cursus euismod quis viverra nibh cras pulvinar mattis. Eget duis at tellus at urna condimentum. Nec nam aliquam sem et tortor consequat id porta. Convallis posuere morbi leo urna molestie at elementum eu. Nibh mauris cursus mattis molestie a iaculis.\\
Elementum facilisis leo vel fringilla est. Adipiscing elit ut aliquam purus sit. Et magnis dis parturient montes nascetur. 


\end{multicols}
\end{document}

EDIT

Answering some points from the comments, and the given answers.

Background

This project is not a regular book. It's a kind of a dictionary, in Hebrew.

That dictionary is written in Word (not by myself). I wrote a Python program that parses the .docx file, and creates from it HTML pages that goes to an Android application, and creates from it also a .tex file, in order to allow new printing of the book.

The book is already in print, and was prepared with some proprietary program (manually from the .docx file - before I wrote my Python program). Now the author wishes to issue an updated print of the dictionary, that would look as close as possible to the existing printed book.

A picture of the printed book can be seen in this question.

The dictionary has definitions, and some definitions are grouped together. Therefore, the usual LaTeX notion of 'paragraph' isn't sufficient. I need "paragraph" and some sort of "sub-paragraph" - or "paragraph" and "group-of-paragraphs". I solved this with using \\ to separate atomic definitions, that should be in the same group, and paragraph breaks to separate groups of paragraphs. That's way it also looks like the original printed book.

BTW, in Hebrew it's very uncommon to indent new paragraphs. The common practice is no indent, and vertical space between the paragraphs.

Column issue

What should happen in case of a two columns book, and a paragraph that ends at the end of the first column? Well, we can debate this. But the author of this book wants that the two columns will end at the same line. I.e., there won't be parskip in that case. However, he wants that to be achieved without moving text line(s) from the one column to another. I'm trying to help him do that.

Can't we make LaTeX to simply ignore the parskip in such scenario, and slightly increase all spaces between the lines, in order to make the columns end at the same place?

After all, that was achieved with the software he worked with before. And that was done by human typesetters before...

  • 1
    As long as you not know exactly what you are doing, please use the parskip package instead of setting \parindent and \parskip manually. However, in this special case it does not change your situation. – Martin Scharrer Jan 24 at 13:59
  • You have come across a a standard problem when using a zero \parindent` and non-zero \parskip. In your case, never mind the odd line spacing, how is the reader to know that the second column starts with a new paragraph? – Peter Wilson Jan 24 at 18:39
  • The user would have to understand it from the context... – Zvika Jan 25 at 7:23
  • But a first paragraph line at bottom of a page (or column) is penalized by LaTeX. Isn't it nicer to have a blank line there ? Or are you looking for some kind of grid typesetting (then use a \parskip of 1\baselineskip). In this example this doesn't change output but avoids bad boxes warnings. – user4686 Jan 26 at 17:02
  • 1
    As I tried to explain to you in github.com/latex3/latex2e/issues/116 what you are asking for above is what I call an "impossible document", i.e., one that can't be rendered if all requirements are obeyed, so you have to say which requirement (or requirements) you like to see violated in that particular situation, e.g., can the column height change? Or can the baselineskip vary in both columns, or ...? Right now you ask for space between paragraphs and that just happens to be at the column bottom so the column has a hole, simple as that. – Frank Mittelbach Jan 27 at 10:54
6
+50

Updated code

Here is a solution that reduces the column height on the page if it detects a column that has no stretch whatsoever. It is now a bit more tested (but still possibly wrong/fragile). In particular it now fixes the 255 box not empty remarked about in the comment. That was actually a bug on my part:

  • I recopied box255 for trial use, but that means that 255 gets assigned on the level of the output routine.
  • as a result after the shipout when box 255 is empty it doesn't stay empty but eventually gets restored ... weird TeX box behavior

The code now counts reduction/trials and and stops if too many occur (customizable, default 2). Also it reduces exactly to the natural height not fixed by one baselineskip.

Nevertheless, one might want to allow a tiny bit of flexibility in the baselineskip (depending on the case). For the hebrew dictionary that is probably a good idea.

I also changed the sample document slightly to add some larger font in the beginning (making the first line not really fitting at all) and to show the case that after removing one line the problem then shows up on the other column. Thus it here stabilizes by removing 2 lines.

\documentclass[12pt]{book}

\usepackage%[balancingshow]
     {multicol}       
\setlength{\columnsep}{1.5pc}   

\setlength{\parindent}{0pt}     
\setlength{\parskip}{1ex plus 0.2ex minus 0.2ex}    


%% allow a small amount of variation on baselines (in the hebrew dict
%% case that might in fact be enough already

\makeatletter
\renewcommand\normalsize{%
   \@setfontsize\normalsize\@xiipt{14.5pt plus 0.001pt}%
   \abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@
   \abovedisplayshortskip \z@ \@plus3\p@
   \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
   \belowdisplayskip \abovedisplayskip
   \let\@listi\@listI}
\makeatother

%% should be done for other sizes used as well (by taking the
%% definition from size1?.clo and changing it in a similar way

%% how often does the code rety shortening the page before giving
%% up. The example needs 2 tries but that is about the maximum one
%% should do.

\newcommand\hebrewmaxtrials{2}




\usepackage{etoolbox}


\makeatletter

% patch the multicol command to move the galley cutting into its own command
% also save box 255 content for recursion

\patchcmd\multi@column@out
   {\process@cols\mult@gfirstbox{%
        \setbox\count@
            \vsplit\@cclv to\dimen@
            \set@keptmarks
            \setbox\count@
                 \vbox to\dimen@
                  {\unvbox\count@
                   \ifshr@nking\vfilmaxdepth\fi}%
           }%
   \setbox\mult@rightbox
       \vsplit\@cclv to\dimen@
   \set@keptmarks
   \setbox\mult@rightbox\vbox to\dimen@
          {\unvbox\mult@rightbox
           \ifshr@nking\vfilmaxdepth\fi}%
  }
  {
   \setbox\hebrewissuebox\copy\@cclv
   \hebrewissueprocessgalley
  }
  {\typeout{multicol patch success}}
  {\typeout{multicol patch failed}\ERROR}


\newbox\hebrewissuebox
\newcount\hebrewissuecnt
\newdimen\hebrewissuetrialsize
\hebrewissuetrialsize\maxdimen

\newif\ifhebrewissue



\def\hebrewissueprocessgalley{%
   \typeout{Hebrew process galley trial with size \the\dimen@ ...}%
   \process@cols\mult@gfirstbox{%
        \setbox\count@
            \vsplit\@cclv to\dimen@
            \set@keptmarks
            \setbox\count@
                 \vbox to\dimen@
                  {\unvbox\count@
                   \ifshr@nking\vfilmaxdepth\fi}%
% if badness is 10000 the column is badly underfull 
% we take that as an indication that
         \typeout{   column badness \the\badness}%
         \ifnum\badness=\@M 
% (just for a bit of tracing ...
            \@tempcnta\count@
            \advance\@tempcnta-\mult@rightbox
            \divide\@tempcnta \tw@
            \typeout{Column \the\@tempcnta\space underfull -> let's see further ...}%
% )
            \setbox\@tempboxa\vbox{\unvcopy\count@}%  %natural size
            \ifdim\hebrewissuetrialsize>\ht\@tempboxa
               \hebrewissuetrialsize\ht\@tempboxa
            \fi  
            \@tempdima\ht\@tempboxa
            \advance\@tempdima 1sp
            \advance\@tempdima \parskip
            \setbox\@tempboxa\vbox  to\@tempdima{\unvbox\@tempboxa}% % 1sp + \parskip larger
            % if badness is again 10000 there is no stretch anywhere in that box
            % (or so little that it should be considered acceptable)
            % so we are in the issue situation
            \typeout{   column badness \the\badness}%
            \ifnum\badness=\@M 
              \hebrewissuetrue 
              \typeout{\@spaces ... -> fail -> retry later with size \the\hebrewissuetrialsize}%
            \else
              \typeout{\@spaces ... -> that one is ok after all}%
            \fi
         \fi
           }%
   \setbox\mult@rightbox
       \vsplit\@cclv to\dimen@
   \set@keptmarks
   \setbox\mult@rightbox\vbox to\dimen@
          {\unvbox\mult@rightbox
           \ifshr@nking\vfilmaxdepth\fi}%
   \typeout{   column badness \the\badness}%
   \ifnum\badness=\@M
      \typeout{Rightmost column underfull  -> let's see further ...}%
      \setbox\@tempboxa\vbox{\unvcopy\mult@rightbox}%  %natural size
      \ifdim\hebrewissuetrialsize>\ht\@tempboxa
        \hebrewissuetrialsize\ht\@tempboxa
      \fi  
      \@tempdima\ht\@tempboxa
      \advance\@tempdima 1sp%
      \advance\@tempdima \parskip
      \setbox\@tempboxa\vbox  to\@tempdima{\unvbox\@tempboxa}% % 1sp + \parskip larger
      % if badness is again 10000 there is no stretch anywhere in that box
      % (or so little that it should be considered acceptable)
      % so we are in the issue situation
      \ifnum\badness=\@M 
        \hebrewissuetrue 
        \typeout{\@spaces ... -> fail -> retry later with size \the\hebrewissuetrialsize}%}%
      \else
        \typeout{\@spaces ... -> that one is ok after all}%
      \fi
   \fi
   \ifhebrewissue
     \hebrewissuefalse
     \dimen@\hebrewissuetrialsize
     \ifnum \hebrewmaxtrials > \hebrewissuecnt 
       \advance\hebrewissuecnt\@ne
       % global necessary here because we explicitly set box here
       % (otherwise unboxing later doesn't really fully work and the
       % content gets restored at output routine end:
       \global\setbox\@cclv\copy\hebrewissuebox       
       \hebrewissueprocessgalley               % recurse
     \else
       \typeout{... \hebrewmaxtrials\space reductions already ... give up and use this cut after all}%
     \fi
   \else 
     \typeout{No (more) underfull columns}%
   \fi
}
\makeatother


%%%%%%%%%%%        DATA        %%%%%%%%%%%

\begin{document}
\begin{multicols}{2}


\Large Lorem ipsum dolor sit amet, \normalsize consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vel turpis nunc eget lorem. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus sed. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. Nunc id cursus metus aliquam eleifend mi. Phasellus vestibulum lorem sed risus ultricies tristique nulla aliquet. Tristique et egestas quis ipsum suspendisse ultrices gravida dictum fusce. Mi sit amet mauris commodo quis imperdiet massa tincidunt. In 
ante metus dictum at tempor commodo. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo nulla. Commodo quis imperdiet massa tincidunt nunc pulvinar sapien et ligula. Ultrices dui sapien eget mi proin sed libero enim sed. Bibendum at varius vel pharetra. Imperdiet nulla malesuada pellentesque elit eget. Amet commodo nulla facilisi nullam vehicula ipsum a. Eu tincidunt tortor aliquam nulla facilisi cras fermentum odio. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Ipsum a arcu cursus vitae.\\
Eu consequat ac felis donec et odio pellentesque diam volutpat. Ornare suspendisse sed nisi lacus sed
viverra. Et sollicitudin.

Quam quisque id diam vel. Sed enim ut sem viverra aliquet. Elit eget gravida cum sociis natoque penatibus et magnis. Id faucibus nisl tincidunt eget nullam. Faucibus purus in massa tempor nec feugiat. Morbi tristique senectus et netus et malesuada fames ac. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Turpis egestas pretium aenean pharetra magna. Sit amet volutpat consequat mauris nunc congue nisi.
\\ % FMi
Urna et pharetra pharetra massa. Nec feugiat in fermentum posuere urna. Turpis massa tincidunt dui ut. Tempor orci eu lobortis elementum. Sed felis eget velit aliquet. Pellentesque nec nam aliquam sem et tortor consequat. Lorem ipsum dolor sit amet consectetur adipiscing elit. Pellentesque elit eget gravida cum sociis natoque. Duis ultricies lacus sed turpis tincidunt. Quisque non tellus orci ac auctor augue mauris. Duis tristique sollicitudin nibh sit amet commodo. Eget velit aliquet sagittis id consectetur purus ut faucibus. Arcu cursus euismod quis viverra nibh cras pulvinar mattis. Eget duis at tellus at urna condimentum. Nec nam aliquam sem et tortor consequat id porta. Convallis posuere morbi leo urna molestie at elementum eu. Nibh mauris cursus mattis molestie a iaculis.

%\\
Elementum facilisis leo vel fringilla est. Adipiscing elit ut aliquam purus sit. Et magnis dis parturient montes nascetur. 
Elementum facilisis leo vel fringilla est. Adipiscing elit ut aliquam purus sit. Et magnis dis parturient montes nascetur. 
Elementum facilisis leo vel fringilla est. Adipiscing elit ut aliquam purus sit. Et magnis dis parturient montes nascetur. 
Elementum facilisis leo vel fringilla est. Adipiscing elit ut aliquam purus sit. Et magnis dis parturient montes nascetur. 


\end{multicols}
\end{document}

Running that you get a lot of data as the code talks to you:

Hebrew process galley trial with size 548.5pt...
 column badness 10000
Column 1 underfull -> let's see further ...
 column badness 10000
    ... -> fail -> retry later with size 534.0pt
 column badness 10000
Rightmost column underfull -> let's see further ...
    ... -> fail -> retry later with size 534.0pt
Hebrew process galley trial with size 534.0pt...
 column badness 0
 column badness 10000
Rightmost column underfull -> let's see further ...
    ... -> fail -> retry later with size 519.5pt
Hebrew process galley trial with size 519.5pt...
 column badness 0
 column badness 10000
Rightmost column underfull -> let's see further ...
    ... -> fail -> retry later with size 510.16667pt
... 2 reductions already ... give up and use this cut after all

And the result then is looking like this:

enter image description here

As an alternative we can run with \hebrewmaxtrials set to 0 (ie not using the code and only do baselineskip stretching) in which case we get this:

enter image description here

As I said above, in the case of the hebrew dict that might be all that is needed.

  • Thanks for this solution. I tried it in my original document, and got many pages with only one line. Tried to "play" with the MWE given in the question - just duplicated the content of the "DATA" - and got the following error: ! Output routine didn't use all of \box255. l.130 And idea? – Zvika Feb 3 at 11:47
  • @Zvika yes, I more or less expected that. As I wrote the above only works if your columns are multiple of baselineskip. If I remember correctly from your original example you change font sizes several times and so probably you have lines which are not equally spaced. That means one has to compromise and also make the solution give up after reducing once instead of recursing until nothis is left. That plus possibly add a tiny bit of flexibility into \baselineskip so that that can stretch too. Maybe I do later have some time to add that but perhaps not today. – Frank Mittelbach Feb 3 at 13:45
  • Really thanks! And of course, don't feel obliged to do it soon... Whenever you'll have time to do it, I'd be very thankful :-) – Zvika Feb 3 at 14:38
  • @Zvika I believe I addressed your points in the updated code – Frank Mittelbach Feb 4 at 9:30
  • Wow. Looks great! Thanks. Is it possible to add this as an "official" option, to some package? It might interest other users as well... – Zvika Feb 4 at 10:08
2

With your given code you get the following very bad layout:

enter image description here

Please see the red arrows, marked wirh 1. What should that mean? A new thought? If you are not using indention of the first line for a new thought usualy one use a small skip between the paragraphs (see red arrow 2).

Your wrong new line results in using the code

pellentesque diam volutpat commodo. Ipsum a arcu cursus vitae.\\ % <=============
Eu consequat ac felis donec et odio pellentesque diam volutpat. Ornare 

LaTeX is not MS word! Never use \\ to start a new paragraph, simply use a blank line:

pellentesque diam volutpat commodo. Ipsum a arcu cursus vitae.

Eu consequat ac felis donec et odio pellentesque diam volutpat. Ornare 

If there should not start a new thought simple delete \\

Assuming you mean new thought with \\ lets look us at the new code

\documentclass[12pt]{book}

\usepackage{multicol}       
\setlength{\columnsep}{1.5pc}   

\setlength{\parindent}{0pt}     
\setlength{\parskip}{1ex plus 0.2ex minus 0.2ex}    
%\usepackage[indent]{parskip}


%%%%%%%%%%%        DATA        %%%%%%%%%%%

\begin{document}
\begin{multicols}{2}

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod 
tempor incididunt ut labore et dolore magna aliqua. Vel turpis nunc eget 
lorem. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus 
sed. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. 
Nunc id cursus metus aliquam eleifend mi. Phasellus vestibulum lorem sed 
risus ultricies tristique nulla aliquet. Tristique et egestas quis ipsum 
suspendisse ultrices gravida dictum fusce. Mi sit amet mauris commodo 
quis imperdiet massa tincidunt. In ante metus dictum at tempor commodo. 
Adipiscing elit duis tristique sollicitudin nibh sit amet commodo nulla. 
Commodo quis imperdiet massa tincidunt nunc pulvinar sapien et ligula. 
Ultrices dui sapien eget mi proin sed libero enim sed. Bibendum at 
varius vel pharetra. Imperdiet nulla malesuada pellentesque elit eget. 
Amet commodo nulla facilisi nullam vehicula ipsum a. Eu tincidunt tortor 
aliquam nulla facilisi cras fermentum odio. In hendrerit gravida rutrum 
quisque non tellus orci ac auctor. Consequat ac felis donec et odio 
pellentesque diam volutpat commodo. Ipsum a arcu cursus vitae.%\\

Eu consequat ac felis donec et odio pellentesque diam volutpat. Ornare 
suspendisse sed nisi lacus sed viverra. Et sollicitudin.

Quam quisque id diam vel. Sed enim ut sem viverra aliquet. Elit eget 
gravida cum sociis natoque penatibus et magnis. Id faucibus nisl tincidunt 
eget nullam. Faucibus purus in massa tempor nec feugiat. Morbi tristique 
senectus et netus et malesuada fames ac. Mauris pellentesque pulvinar 
pellentesque habitant morbi tristique senectus. Turpis egestas pretium 
aenean pharetra magna. Sit amet volutpat consequat mauris nunc congue nisi.

Urna et pharetra pharetra massa. Nec feugiat in fermentum posuere urna. 
Turpis massa tincidunt dui ut. Tempor orci eu lobortis elementum. Sed 
felis eget velit aliquet. Pellentesque nec nam aliquam sem et tortor 
consequat. Lorem ipsum dolor sit amet consectetur adipiscing elit. 
Pellentesque elit eget gravida cum sociis natoque. Duis ultricies lacus 
sed turpis tincidunt. Quisque non tellus orci ac auctor augue mauris. 
Duis tristique sollicitudin nibh sit amet commodo. Eget velit aliquet 
sagittis id consectetur purus ut faucibus. Arcu cursus euismod quis 
viverra nibh cras pulvinar mattis. Eget duis at tellus at urna 
condimentum. Nec nam aliquam sem et tortor consequat id porta. Convallis 
posuere morbi leo urna molestie at elementum eu. Nibh mauris cursus 
mattis molestie a iaculis.%\\

Elementum facilisis leo vel fringilla est. Adipiscing elit ut aliquam 
purus sit. Et magnis dis parturient montes nascetur. 


\end{multicols}
\end{document}

and its (still bad) result:

enter image description here

The issue is now the red arrow marked with !. The reader has to guess if there is starting a new thought (paragraph) or not. Looking on the last line in column 1 you can see that the line is not completely filled so you can guess it is a new thought (paragraph).

To avoid this guessing just use package parskip like :

\documentclass[12pt]{book}

\usepackage{multicol}       
\setlength{\columnsep}{1.5pc}   

\usepackage[indent]{parskip}


%%%%%%%%%%%        DATA        %%%%%%%%%%%

\begin{document}
\begin{multicols}{2}

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod 
tempor incididunt ut labore et dolore magna aliqua. Vel turpis nunc eget 
lorem. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus 
sed. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. 
Nunc id cursus metus aliquam eleifend mi. Phasellus vestibulum lorem sed 
risus ultricies tristique nulla aliquet. Tristique et egestas quis ipsum 
suspendisse ultrices gravida dictum fusce. Mi sit amet mauris commodo 
quis imperdiet massa tincidunt. In ante metus dictum at tempor commodo. 
Adipiscing elit duis tristique sollicitudin nibh sit amet commodo nulla. 
Commodo quis imperdiet massa tincidunt nunc pulvinar sapien et ligula. 
Ultrices dui sapien eget mi proin sed libero enim sed. Bibendum at 
varius vel pharetra. Imperdiet nulla malesuada pellentesque elit eget. 
Amet commodo nulla facilisi nullam vehicula ipsum a. Eu tincidunt tortor 
aliquam nulla facilisi cras fermentum odio. In hendrerit gravida rutrum 
quisque non tellus orci ac auctor. Consequat ac felis donec et odio 
pellentesque diam volutpat commodo. Ipsum a arcu cursus vitae.%\\

Eu consequat ac felis donec et odio pellentesque diam volutpat. Ornare 
suspendisse sed nisi lacus sed viverra. Et sollicitudin.

Quam quisque id diam vel. Sed enim ut sem viverra aliquet. Elit eget 
gravida cum sociis natoque penatibus et magnis. Id faucibus nisl tincidunt 
eget nullam. Faucibus purus in massa tempor nec feugiat. Morbi tristique 
senectus et netus et malesuada fames ac. Mauris pellentesque pulvinar 
pellentesque habitant morbi tristique senectus. Turpis egestas pretium 
aenean pharetra magna. Sit amet volutpat consequat mauris nunc congue nisi.

Urna et pharetra pharetra massa. Nec feugiat in fermentum posuere urna. 
Turpis massa tincidunt dui ut. Tempor orci eu lobortis elementum. Sed 
felis eget velit aliquet. Pellentesque nec nam aliquam sem et tortor 
consequat. Lorem ipsum dolor sit amet consectetur adipiscing elit. 
Pellentesque elit eget gravida cum sociis natoque. Duis ultricies lacus 
sed turpis tincidunt. Quisque non tellus orci ac auctor augue mauris. 
Duis tristique sollicitudin nibh sit amet commodo. Eget velit aliquet 
sagittis id consectetur purus ut faucibus. Arcu cursus euismod quis 
viverra nibh cras pulvinar mattis. Eget duis at tellus at urna 
condimentum. Nec nam aliquam sem et tortor consequat id porta. Convallis 
posuere morbi leo urna molestie at elementum eu. Nibh mauris cursus 
mattis molestie a iaculis.%\\

Elementum facilisis leo vel fringilla est. Adipiscing elit ut aliquam 
purus sit. Et magnis dis parturient montes nascetur. 


\end{multicols}
\end{document}

Now the reader does not have to guess if there is a new paragraph starting or not: Indention means new paragraph:

enter image description here

  • 1
    It doesn't make much sense to speak about thoughts in a lorem ipsum document. In the real document (which is actually in hebrew) "the first column is composed of a long paragraph" which ends one line before the column ends. A solution must keep this characteristic. – Ulrike Fischer Jan 27 at 13:21
  • 3
    @UlrikeFischer well, that information (language hebrew) was not mentioned in the given question :-( – Mensch Jan 27 at 13:24
  • It is not really important. The lorem lipsum should be indication enough that the example should represent a certain length/distribuation of the text. Also the question explicitly describes the length of the first paragraph. – Ulrike Fischer Jan 27 at 13:31

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.