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

首先,我添加了消除文本中有關 the和 the 的\usepackage[T1]{fontenc}錯誤(沒有它,您將獲得«»LaTeX 錯誤:指令 \guillemetright 在編碼 OT1 時不可用。)。另外,您需要此軟體包選項來消除警告警告:法語不應使用 OT1 編碼(因為,請參閱下文,我們使用該french選項通天塔

在的幫助下微型包(用於縮小字符,以便它們可以更好地適應狹窄的列),french 通天塔選項(用於連字符)和一些幫助為 LaTeX 提供更多連字符位置(帶有\-),您可以獲得經過幾次嘗試一個不錯的結果。例如,沒有Kamin\-sky您將獲得未滿的 hbox(連字符位於卡明斯基代替卡明斯基)。其他範例,單字「devenu」( deve\-nu),因為預設情況下,這裡沒有連字符,以避免在行首出現「nu」(「nu」在法語中是「naked」)。

\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

這些都是我解決問題的嘗試。我希望有人能從中受益。

相關內容