Flowfram - 文本宽度问题

Flowfram - 文本宽度问题

我正在学习 flowfram 包,我打算简单地在页面上设置一些框架并让文本流过。我的框架宽度不同,我从 flowfram 手册中读到:“命令 \framebreak 适用于段落跨越两个不同宽度的流框架的情况,因为 TEX 的输出例程直到前一框架的最后一段结束后才会调整到 \hsize 的新值。”有没有办法添加手动分隔符?还有另一个问题:框架之间出现意外间隙。

请查看我的 MWE 并告诉我我是否做错了什么。谢谢。

(PS:抱歉,但我需要使用真实文本来展示 \framebreak 的用途,所以我只是使用了我正在阅读的这篇非常有趣的公开文章: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}

答案1

使用它的关键是按原样格式化页面,找到发生中断的位置并\framebreak在这些位置添加。

\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}

答案2

首先,我添加了消除有关和的\usepackage[T1]{fontenc}错误«»以消除文本中LaTeX 错误:命令 \guillemetright 在编码 OT1 时不可用。)。此外,您还需要此包选项来消除警告警告:法语不应使用 OT1 编码(因为,见下文,我们使用french选项巴别塔

微型包(用于缩小字符,以便它们可以更好地适应狭窄的列),french 巴别塔选项(用于连字符)以及一些帮助为 LaTeX 提供更多连字符位置(使用\-),你可以获得经过多次尝试一个不错的结果。例如,没有Kamin\-sky您将获得未满的水平盒子(在卡明斯基代替卡明斯基)。另一个例子是单词“devenu”(deve\-nu),因为默认情况下,这里没有连字符,以避免在行首出现“nu”(“nu”在法语中是“裸体”的意思)。

\baselineskip注意:我也使用了John Kormylo 在自己的回答中的评论中的技巧。

\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}

在此处输入图片描述

答案3

我决定发布对这个问题的回答,因为即使是被接受的答案也不是所要求的,即自动解决方案。首先,我要指出的是,这是一个软件包的已知问题这是由于 TeX* 的核心限制。此外,我想让你知道,我不是 TeX 专家,而且这是不是一个完美的解决方案。也许有人比我更熟练,能够将这个概念扩展为一个完全可行的解决方案,尽管我怀疑这个系统是否具有更大的潜力。

系统如何工作和失败的示例 图:系统运行和故障的示例

首先,介绍一下背景。这里我定义了页面布局。

\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

我还存储了帧数以供稍后使用。这里我定义了一个\modulo宏来计算#1 mod #2并将结果放入 中\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
}

以下是解决该问题的系统核心。\mypar宏会吞噬以下段落并执行三件事:

  • 首先计算框架中的可用空间;
  • 然后猜测剩余空间内可以容纳的行数;
  • 最后使用\hangafter\hangindent来调整宽度的差异。

TeX 使用相当复杂的算法来决定将多少行放入此帧以及将多少行放入下一帧,这使得这个简单的系统无法每次都确定适合页面的正确行数。正如您在本示例的第二页中看到的那样,该系统实际上是容易出错的。

\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}

所有上述代码片段的总和就是一个工作示例。

*这个限制阻止了我的第一次尝试;你可以在下面找到我的第一次尝试

% 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

这些是我解决问题的尝试。我希望有人能从中受益。

相关内容