0

I'm learning the flowfram package and I intend a simple use of setting some frames on the page and have the text flowing through. My frames have different widths and I read from the flowfram manual that: «The command \framebreak is provided for situations where a paragraph spans two flow frames of different widths, as TEX’s output routine does not adjust to the new value of \hsize until the last paragraph of the previous frame has ended.» Is there a workaround to adding manual breaks? There is also another issue: an unexpected gap between frames.

Please see my MWE and tell me if I do something wrong. Thanks.

(PS: Sorry but I needed to use real text to show the \framebreak use so I just used this very interesting publicly available article that I was reading: https://k-larevue.com/permis-de-vivre-sur-adolfo-kaminsky/)

\documentclass[a5paper]{article}

\usepackage{lipsum} \usepackage{graphicx} \usepackage{flowfram}

\newflowframe* {0.3\textwidth}% width {0.3\textheight}% height {0\textwidth}% x position {0.7\textheight}% y position

\newflowframe* {0.7\textwidth} {0.7\textheight} {0\textwidth} {0\textheight}

%\newflowframe*{\textwidth}{0.4\textheight}{0pt}{0pt}

%\newstaticframe*{2in}{2in}{0pt}{0pt}

%\setstaticcontents*{1}{\includegraphics[height=2in]{chicken}}

\begin{document} \sloppy %\lipsum{1} Adolfo Kaminsky, né en 1925 en Argentine, est devenu une légende : le résistant faussaire connu pour s’être spécialisé dans la fabrication \framebreak de faux papiers au cours de la Seconde Guerre mondiale. Il voulut être peintre, il est devenu un photographe discret, hésitant à montrer son travail – avant que le Musée d’art et d’histoire du Judaïsme (mahJ) à Paris ne mette la lumière sur des dizaines de clichés pris pendant des décennies. Une vie clandestine, dans son œuvre comme dans ses engagements : après la guerre, il fabrique des faux papiers pour la Haganah, il est le faussaire des réseaux de soutien aux indépendantistes algériens dans les années 1950 et 1960, celui des révolutionnaires d’Amérique du Sud comme des opposants aux dictatures de l’Espagne, du Portugal et de Grèce… La philosophe Elisabeth de Fontenay témoigne de son admiration.    Adolfo posant avec ses Rolleiflex, Paris, 1997, photo prise par sa femme Leïla   L’artisanat des faux papiers, \framebreak comme la prise de vue photographique, incite à s’interroger sur ce qu’est l’authenticité, l’ici et le maintenant de l’original, cette \framebreak autorité de la chose même qui, échappant à la reproduction, ne saurait, à plus forte raison, subir de contrefaçon. Et pourtant, quelle vie véritable, véridique et vraie que celle d’Adolfo Kaminsky, ce faussaire, artisan de génie au service de la survie et de la liberté, cet artiste photographe qui tentera, quand il aura la liberté d’exister, de traduire par fragments la beauté du monde ! Un homme, fidèle à lui-même, qui a travaillé dans l’ombre de laboratoires clandestins et dans la lumière captée par le Rolleiflex. Instantané « Tu photographies n’importe quoi » lui dit un jour son frère. À une autre époque que ce temps de détresse, Adolfo Kaminsky aurait pu faire une carrière scientifique, mais il avait toujours voulu être peintre. Les photographes qui observent puis « prennent » une photo ont quelque chose du flâneur dont le coup d’œil et la saisie, dénués de voyeurisme, gardent leurs distances. Est-ce là capture, vol d’une image, d’un instant ? Non, chez lui, l’objectif est un oiseau qui se pose. Paris, l’eau, la nuit, les enfants, les marchés aux puces, les petits métiers, tels sont les sujets qu’il photographie. Le fabricant de faux papiers, quand la Libération le rendit à lui-même et aux siens, donna au droit de vivre un tout autre sens : le droit de persévérer dans son être propre, d’exister selon son gré, voire selon sa fantaisie. C’est la liberté que Kaminsky s’accorda en partie quand il se mit à vivre, à flâner et à photographier au grand jour tout en poursuivant son activité de clandestin au service de la France, puis des apatrides qui voulaient fonder un État juif et y vivre, puis aider les luttes de libération, de décolonisation et se battre contre les dictatures. Aussi est-ce un seul et même homme qu’’il faut célébrer, le regardant à la fois dans l’obscurité de la fabrique clandestine et dans la lumière d’un travail d’artiste. Il y avait un temps pour dire non aux nazis et à leurs acolytes, non encore aux tortures coloniales, et un autre pour dire oui à la beauté et à l’énigme du monde. Les deux temps pouvaient coexister. \end{document}

Haim
  • 487

3 Answers3

1

The key to using it is to format the page as is, find where the breaks occurs and add \framebreak at those locations.

\documentclass[a5paper]{article}

\usepackage{lipsum} \usepackage{graphicx} \usepackage{flowfram}

\newflowframe* {0.3\textwidth}% width {0.3\textheight}% height {0\textwidth}% x position {0.7\textheight}% y position

\newflowframe* {0.7\textwidth} {0.7\textheight} {0\textwidth} {0\textheight}

%\newflowframe*{\textwidth}{0.4\textheight}{0pt}{0pt}

%\newstaticframe*{2in}{2in}{0pt}{0pt}

%\setstaticcontents*{1}{\includegraphics[height=2in]{chicken}}

\begin{document} \sloppy %\lipsum{1} Adolfo Kaminsky, né en 1925 en Argentine, est devenu une légende : le résistant faussaire connu pour s’être spécialisé dans la\framebreak fabrication de faux papiers au cours de la Seconde Guerre mondiale. Il voulut être peintre, il est devenu un photographe discret, hésitant à montrer son travail – avant que le Musée d’art et d’histoire du Judaïsme (mahJ) à Paris ne mette la lumière sur des dizaines de clichés pris pendant des décennies. Une vie clandestine, dans son œuvre comme dans ses engagements : après la guerre, il fabrique des faux papiers pour la Haganah, il est le faussaire des réseaux de soutien aux indépendantistes algériens dans les années 1950 et 1960, celui des révolutionnaires d’Amérique du Sud comme des opposants aux dictatures de l’Espagne, du Portugal et de Grèce… La philosophe Elisabeth de Fontenay témoigne de son admiration.

Adolfo posant avec ses Rolleiflex, Paris, 1997, photo prise par sa femme Leïla

L’artisanat des faux papiers, comme\framebreak la prise de vue photographique, incite à s’interroger sur ce qu’est l’authenticité, l’ici et le maintenant de l’original, cette autorité de la chose\framebreak même qui, échappant à la reproduction, ne saurait, à plus forte raison, subir de contrefaçon. Et pourtant, quelle vie véritable, véridique et vraie que celle d’Adolfo Kaminsky, ce faussaire, artisan de génie au service de la survie et de la liberté, cet artiste photographe qui tentera, quand il aura la liberté d’exister, de traduire par fragments la beauté du monde ! Un homme, fidèle à lui-même, qui a travaillé dans l’ombre de laboratoires clandestins et dans la lumière captée par le Rolleiflex. Instantané Tu photographies n’importe quoi » lui dit un jour son frère. À une autre époque que ce temps de détresse, Adolfo Kaminsky aurait pu faire une carrière scientifique, mais il avait toujours voulu être peintre. Les photographes qui observent puis « prennent » une photo ont quelque chose du flâneur dont le coup d’œil et la saisie, dénués de voyeurisme, gardent leurs distances. Est-\framebreak ce là capture, vol d’une image, d’un instant ? Non, chez lui, l’objectif est un oiseau qui se pose. Paris, l’eau, la nuit, les enfants, les marchés aux\framebreak puces, les petits métiers, tels sont les sujets qu’il photographie. Le fabricant de faux papiers, quand la Libération le rendit à lui-même et aux siens, donna au droit de vivre un tout autre sens : le droit de persévérer dans son être propre, d’exister selon son gré, voire selon sa fantaisie. C’est la liberté que Kaminsky s’accorda en partie quand il se mit à vivre, à flâner et à photographier au grand jour tout en poursuivant son activité de clandestin au service de la France, puis des apatrides qui voulaient fonder un État juif et y vivre, puis aider les luttes de libération, de décolonisation et se battre contre les dictatures. Aussi est-ce un seul et même homme qu’’il faut célébrer, le regardant à la fois dans l’obscurité de la fabrique clandestine et dans la lumière d’un travail d’artiste. Il y avait un temps pour dire non aux nazis et à leurs acolytes, non encore aux tortures coloniales,\framebreak et un autre pour dire oui à la beauté et à l’énigme du monde. Les deux temps pouvaient coexister. \end{document}

John Kormylo
  • 79,712
  • 3
  • 50
  • 120
  • Thanks. This is what I thought. So is there no way to do this automatically? – Haim Mar 08 '23 at 22:48
  • Also: Why is there a gap between frames? Thanks – Haim Mar 08 '23 at 22:49
  • No. I've tried, but \afterpage doesn't work with flowfram. As for the gap (overlap), I suspect it is just a round off error. – John Kormylo Mar 08 '23 at 22:51
  • Thanks. I was hoping flowfram was superior to paracol to typeset a page with variable text boxes but I might go back to paracol, or maybe a mix of the two... – Haim Mar 08 '23 at 23:05
  • If you make the top frame a multiple of \baselineskip, the gap goes away. For paracol, see also https://tex.stackexchange.com/questions/659159/how-to-fill-up-white-spaces-in-wrapfigure-with-subfigures/659169?r=SearchResults&s=1%7C0.0000#659169 – John Kormylo Mar 08 '23 at 23:22
  • Thanks for the \baselineskip trick! Yes, I'm familiar with paracol and I found it a robust package, as you say in your answer. I typeset a 200 page book which is being published and I grew to like it. It was my hope to not have to deal with manual breaks page by page but I guess there is no way out... Might be a hard Tex limitation? – Haim Mar 09 '23 at 00:10
  • I realized you are also the author of the answer to this question: https://tex.stackexchange.com/questions/141924/how-to-typeset-a-complex-layout-like-a-page-of-the-talmud – Haim Mar 09 '23 at 00:30
  • Which is very interesting and presents several ways to proceed but ALL OF THEM involving some sort of manual breaks. – Haim Mar 09 '23 at 00:31
  • TeX formats each paracrph then splits it (\vsplit) at the end of a page/column/frame. The only alternative to manual paragraph breaks is \parshape, which is even more work so set up. Note the second solution to https://tex.stackexchange.com/questions/669240/latex-wrapfigure/669294?r=SearchResults&s=4%7C12.6674#669294 – John Kormylo Mar 09 '23 at 01:51
1

First, I have added \usepackage[T1]{fontenc} to eliminate the error about the « and the » in the text (without it, you will obtain LaTeX Error: Command \guillemetright unavailable in encoding OT1.). Also, you need this package option to eliminate the warning Warning: OT1 encoding should not be used for French (because, see below, we uses the french option for babel.

With the help of the microtype package (for shrink the characters so they can better fit in the narrow column), the french babel option (for hyphenations) and some help giving to LaTeX more hyphenations position (with \-), you could obtain after several trials a decent result. For example, without Kamin\-sky you will obtain underfull hbox (hyphenation at Ka-minsky instead of Kamin-sky). Other example, the word "devenu" (deve\-nu), because by default, there is no hyphenation here in order to avoid having "nu" in the begining of a line ("nu" is "naked" in French).

NOTE: I have also used the trick about \baselineskip from the comment of John Kormylo in his own answer.

\documentclass[a5paper]{article}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{flowfram}
\usepackage[shrink=30,stretch=25,babel=true,kerning=true]{microtype}

\newflowframe* {0.3\textwidth}% width {8\baselineskip}% height {0\textwidth}% x position {20\baselineskip}% y position

\newflowframe* {0.7\textwidth} {20\baselineskip} {0\textwidth} {0\textheight}

\begin{document}

Adolfo Kamin-sky, né en 1925 en Argentine, est deve-nu une légende : le résistant faussaire connu pour s’être spécialisé dans la fabrication de faux\framebreak papiers au cours de la Seconde Guerre mondiale. Il voulut être peintre, il est devenu un photographe discret, hésitant à montrer son travail – avant que le Musée d’art et d’histoire du Judaïsme (mahJ) à Paris ne mette la lumière sur des dizaines de clichés pris pendant des décennies. Une vie clandestine, dans son œuvre comme dans ses engagements : après la guerre, il fabrique des faux papiers pour la Haganah, il est le faussaire des réseaux de soutien aux indépendantistes algériens dans les années 1950 et 1960, celui des révolutionnaires d’Amérique du Sud comme des opposants aux dictatures de l’Espagne, du Portugal et de Grèce… La philosophe Elisabeth de Fontenay témoigne de son admiration.

Adolfo posant avec ses Rolleiflex, Paris, 1997, photo prise par sa femme Leïla

L’artisanat des faux papiers, comme la prise de vue photographique, incite à \framebreak s’interroger sur ce qu’est l’authentici-té, l’ici et le main- tenant de l’original, cette autorité de la chose même qui, échappant à la reproduction, ne\framebreak saurait, ne saurait, à plus forte raison, subir de contrefaçon. Et pourtant, quelle vie véritable, véridique et vraie que celle d’Adolfo Kaminsky, ce faussaire, artisan de génie au service de la survie et de la liberté, cet artiste photographe qui tentera, quand il aura la liberté d’exister, de traduire par fragments la beauté du monde ! Un homme, fidèle à lui-même, qui a travaillé dans l’ombre de laboratoires clandestins et dans la lumière captée par le Rolleiflex. Instantané Tu photographies n’importe quoi » lui dit un jour son frère. À une autre époque que ce temps de détresse, Adolfo Kaminsky aurait pu faire une carrière scientifique, mais il avait toujours voulu être peintre. Les photographes qui observent puis « prennent » une photo ont quelque chose du flâneur dont le coup d’œil et la saisie, dénués de voyeurisme, gardent leurs distances. Est-ce là capture, vol d’une image,\framebreak d’un instant ? Non, chez lui, l’objectif est un oiseau qui se pose. Paris, l’eau, la nuit, les enfants, les marchés aux puces, les petits métiers, tels sont les sujets\framebreak qu’il photographie. Le fabricant de faux papiers, quand la Libération le rendit à lui-même et aux siens, donna au droit de vivre un tout autre sens : le droit de persévérer dans son être propre, d’exister selon son gré, voire selon sa fantaisie. C’est la liberté que Kaminsky s’accorda en partie quand il se mit à vivre, à flâner et à photographier au grand jour tout en poursuivant son activité de clandestin au service de la France, puis des apatrides qui voulaient fonder un État juif et y vivre, puis aider les luttes de libération, de décolonisation et se battre contre les dictatures. Aussi est-ce un seul et même homme qu’il faut célébrer, le regardant à la fois dans l’obscurité de la fabrique clandestine et dans la lumière d’un travail d’artiste. Il y avait un temps pour dire non aux nazis et à leurs acolytes, non encore aux tortures coloniales, et un autre pour dire oui à la beauté et à l’énigme du monde. Les\framebreak deux temps pouvaient coexister. \end{document}

enter image description here

quark67
  • 4,166
0

I've decided to post an answer to this question because even the accepted answer is not what requested, i.e., an automatic solution. First, I will point out that this is a known problem of the package that comes from a core limitation of TeX*. In addition to that I want you to know that I'm no TeX expert and that this is not a perfect solution. Maybe someone more skilled than me will be able to expand this concept to a fully working solution, although I doubt this system has much more potential.

Example of how the system works and fails Figure: Example of how the system works and fails

First, a bit of context. Here I define the page layout.

\documentclass{article}
\usepackage{lipsum}
\usepackage[pages=absolute]{flowfram}

\showframebboxtrue % \newflowframe[<pages>]{<width>}{<height>}{<x>}{<y>}[<label>] \newflowframe[>0]{0.6\textwidth}{\textheight}{-0.1\textwidth}{0.1\textheight}[thick] \newflowframe[>0]{0.4\textwidth}{0.5\textheight}{0.6\textwidth}{0.6\textheight}[thin] \newstaticframe[>0]{0.7\textwidth}{0.45\textheight}{0.6\textwidth}{0.1\textheight}[image] \begin{staticcontents}{image} \hrule width\textwidth height0.45\textheight \end{staticcontents}

\global\newcount\numberofframes\numberofframes=2\relax

I've also stored the number of frames for later use. Here I define a \modulo macro for calculating #1 mod #2 and putting the result inside of \modulores.

\global\newcount\modulores
\def\modulo#1#2{
    \newcount\countA
    \newcount\countB
    \newcount\result
\countA=#1\relax
\countB=#2\relax

\result=\countA
\divide\result by \countB
\multiply\result by \countB
\advance\countA by -\result

\global\modulores=\countA\relax

}

Below is the core of the system that solves the issue. The \mypar macro eats the following paragraph and does three things:

  • first it calculates the available space in the frame;
  • then it guesses the number of lines that will fit inside the remaining space;
  • finally it uses \hangafter and \hangindent to adjust for the difference in width.

The fact that TeX decides how many lines to put in this frame and how many lines to put in the next frame using a rather complex algorithms prevents this simple system from determining the correct number of lines that fit in the page every time. As you can see in the second page of this example, the system is infact fallible.

\def\mypar#1\par{
    % here we can get the content of the paragraph and the position on the page before outputting the paragraph
    \newdimen\parheight\parheight=\dimexpr\pagegoal-\pagetotal-\pagedepth\relax
    % how many lines fit into the page
    \newcount\fittinglines\fittinglines=\numexpr\parheight/\baselineskip\relax
    % width of the current frame
    \getflowbounds\thethisframe\relax
    \newdimen\currentwidth\currentwidth=\ffareawidth\relax
    % width of the next frame thenextframe = (thethisframe + 1) mod numberofframes
    \newcount\nextframe
    \modulo{\numexpr\thethisframe}{\the\numberofframes}\relax
    \nextframe=\numexpr\the\modulores+1\relax
    \getflowbounds{\the\nextframe}\relax
    \newdimen\nextwidth\nextwidth=\ffareawidth\relax
    % indentation logic
    \ifnum\nextwidth=\currentwidth\relax
        #1\endgraf
    \else
        \ifnum\nextwidth<\currentwidth\relax
            % the next is thinner
            \hsize=\the\currentwidth\relax
            \hangafter=\fittinglines\relax
            \hangindent=\dimexpr\nextwidth-\currentwidth\relax
            % info: [\thethisframe,\the\currentwidth,\the\nextwidth,thinner]
            #1\endgraf
        \else
            % the next is wider
            \hsize=\the\nextwidth\relax
            \hangafter=-\fittinglines\relax
            \hangindent=\dimexpr\currentwidth-\nextwidth\relax
            % info: [\thethisframe,\the\currentwidth,\the\nextwidth,wider]
            #1\endgraf
        \fi
    \fi
    \vbox to\parskip{}
}

\begin{document} \emergencystretch 2em % avoid text overflow

\section{Lorem} \mypar\lipsum*[1] $$ \int_\Sigma \vec\nabla\times\vec F \hat n\textrm{d}\Sigma = \oint_\gamma \vec F \cdot \textrm{d}\vec s $$

\subsection{Ipsum} \lipsum*[2]

\mypar\lipsum*[3]

\mypar\lipsum*[4]

\section{Dolor} \mypar\lipsum*[5]

\mypar\lipsum*[6]

\subsection{Sit amet} \mypar\lipsum*[7]

\end{document}

The sum of all the above code snippets is a working example.

*This limitation is what prevented my first attempt from working; you can find my first try below

% this is the content of the current paragraph
\setbox100=\vbox{#1}\relax
% this is the part of paragraph that fits into the page
\setbox101=\vsplit100to\parheight\relax
% the non-fitting section of the paragraph is now inside box100
\ifvoid100#1\par\else\unvbox101\framebreak$[\the\hsize]$\unvbox100\fi

These were my attempts to solving the problem. I hope someone will benefit from them.

HomoVafer
  • 274