Patch wrapfig, um mit Zeilen statt mit Absätzen zu arbeiten

Patch wrapfig, um mit Zeilen statt mit Absätzen zu arbeiten

Ich glaube, ich habe eine Idee, wie sich einige der folgenden Probleme lindern lassen:

Zwei schwebende Wrapfiguren in einer Reihe

aber ich bin nicht sicher, wie ich es umsetzen soll. Ein wesentlicher Teil des Floating-Problems scheint mit der Beharrlichkeit zusammenzuhängen, das Wrapfig an den Anfang eines Absatzes zu setzen. Wie kann ich diese Einschränkung lockern?

Ich setze beispielsweise ein Wrapfig vor einen Absatz, der in der Mitte einen Seitenumbruch hat. Das Wrapfig würde zum nächsten Absatz übergehen (der beispielsweise zu klein sein könnte – bevor der Abschnitt endet – oder von einem anderen Wrapfig verwendet wird) und den aktuellen Absatz vollständig ignorieren. Wenn ich den Absatz jedoch in zeilengroße, kleine Absätze aufteile, würde das Wrapfig bei der ersten Gelegenheit beginnen. Anstatt in kleine Absätze aufzuteilen (oder das Wrapfig bei jeder Dokumentänderung manuell innerhalb eines Absatzes zu positionieren), möchte ich die Absatzbeschränkung aufheben.


BEARBEITEN

Die folgenden Kommentare haben mich zum Nachdenken gebracht:

Low-Level-Latex – ist eine Überarbeitung nötig?

Antwort1

Das könnte Sie interessieren. Es handelte sich um einen Versuch, dies \parshapeauf mehrere Absätze und Gleichungen anzuwenden.

\documentclass{article}
\usepackage{mwe}
\usepackage{showframe}
\tracingmacros=1

% global varaibles
\newtoks\MSeverypar
\newcounter{MScount}
\newcounter{MSlines}
\newlength{\MSleft}
\newlength{\MSright}
\newlength{\MSvert}
\newsavebox{\MSbox}
\newif{\ifMSdone}
\newif{\ifMSnext}
\newcommand{\MSparshape}{}% reserve global name
\newcommand{\MSnextshape}{}% reserve gloval name

\newenvironment{minishape}[1]% #1 = shape blocks (left,right,vert)
 {\MSeverypar=\expandafter{\the\everypar}
  \def\END{\END}% token only. Do not expand!
  \setcounter{MScount}{0}%
  \xdef\MSlastleft{0pt}%
  \xdef\MSlastright{0pt}%
  \MSparse#1\empty\END% save instructions as macros
  \edef\MStotal{\theMScount}%
  \setcounter{MScount}{0}%
  \MSnext
  \everypar{\MSparagraph}}{}

\def\MSparse#1(#2,#3,#4)#5\END{% #1=throwaway #2=left, #3=right, #4=vert, #5=next
  \ifx!#4\relax
    \xdef\MSlastleft{#2}%
    \xdef\MSlastright{#3}%b
  \else
    \stepcounter{MScount}%
    \expandafter\xdef\csname MSleft\theMScount\endcsname{#2}%
    \expandafter\xdef\csname MSright\theMScount\endcsname{#3}%
    \expandafter\xdef\csname MSvert\theMScount\endcsname{#4}%
  \fi
  \ifx\empty#5\relax\else\expandafter\MSparse#5\END\fi}
  
\newcommand{\MSmerge}[2]{\edef\MSshape{#1 #2}}

\long\def\MSparagraph#1\par{% \everypar#2)
  \setcounter{MSlines}{1}%
  \global\let\MSparshape=\MSnextshape
  \MSdonefalse
  \loop
    \MSmakebox{#1}%
    \MSsplitbox
  \ifMSdone\else\repeat
  \global\advance\MSvert by -\parskip
  \ifnum\value{MScount}>\MStotal\relax
    \stepcounter{MSlines}%
    \MSmerge{\MSparshape}{\MSnextshape}%
    \global\let\MSparshape=\MSshape
  \fi
  \MSmerge{\theMSlines}{\MSparshape}%
  \parshape=\MSshape #1\par}
  
\newcommand{\MSmakebox}[1]% #1 = paragraph
{\bgroup
  \clubpenalty=0
  \widowpenalty=0
  \displaywidowpenalty=0
  \predisplaypenalty=0
  \postdisplaypenalty=0
  \interlinepenalty=0
  \everypar=\expandafter{\the\MSeverypar}
  \MSmerge{\theMSlines}{\MSparshape}%
  \global\setbox\MSbox=\vbox{\parshape=\MSshape \strut#1\strut}%
\egroup}

\newcommand{\MSsplitbox}% extend \MSparshape
{\bgroup% local varaibles and loops
  \countdef\count=1
  \dimendef\delta=0
  \dimendef\test=1
  \count=1
  \loop\ifnum\count<\value{MSlines}%
    \advance\count by 1
    \global\setbox0=\vsplit\MSbox to \baselineskip%
  \repeat
  \MSnextfalse
  \loop
    \delta=\ht\MSbox
    \advance\delta by \dp\MSbox
    \ifdim\delta>0pt\relax
      \global\setbox0=\vsplit\MSbox to \baselineskip%
      \advance\delta by -\ht\MSbox
      \advance\delta by -\dp\MSbox
      \ifdim\delta>\MSvert
        \count=\value{MScount}%
        \ifnum\count<\MStotal\relax
          \advance\count by 1
          \ifdim\MSleft<\csname MSleft\the\count\endcsname\relax \MSnext
          \else
            \ifdim\MSright<\csname MSright\the\count\endcsname\relax \MSnext\fi
          \fi
        \fi
      \fi
      \stepcounter{MSlines}% global
      \MSmerge{\MSparshape}{\MSnextshape}%
      \global\let\MSparshape=\MSshape
      \global\advance\MSvert by -\delta
      \ifdim\MSvert>0pt\relax\else\MSnext\fi
    \else
      \global\MSdonetrue
      \MSnexttrue
    \fi
  \ifMSnext\else\repeat
\egroup}

\newcommand{\MSnext}{% at end of block
  \MSnexttrue
  \ifnum\value{MScount}<\MStotal\relax
    \stepcounter{MScount}%
    \global\advance\MSvert by \csname MSvert\theMScount\endcsname\relax%
    \global\MSleft=\csname MSleft\theMScount\endcsname%
    \global\MSright=\csname MSright\theMScount\endcsname%
  \else
    \stepcounter{MScount}%
    \global\MSdonetrue
    \global\MSleft=\MSlastleft\relax
    \global\MSright=\MSlastright\relax
  \fi
  \MSmerge{\the\MSleft}{\the\dimexpr\linewidth-\MSleft-\MSright}%
  \global\let\MSnextshape=\MSshape
}

\begin{document}

\begin{minishape}{(.25in,.25in,1in) (.5in,.5in,1.5in)}
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit,
vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida
mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna.
Donec vehicula augue eu neque. Pellentesque habitant morbi tristique senectus
et netus et malesuada fames ac turpis egestas. Mauris ut leo. Cras viverra
metus rhoncus sem. Nulla et lectus vestibulum urna fringilla ultrices. Phasellus
eu tellus sit amet tortor gravida placerat. Integer sapien est, iaculis in, pretium
quis, viverra ac, nunc. Praesent eget sem vel leo ultrices bibendum. Aenean
faucibus. Morbi dolor nulla, malesuada eu, pulvinar at, mollis ac, nulla. 
Curabitur auctor semper nulla. Donec varius orci eget risus. Duis nibh mi, congue
eu, accumsan eleifend, sagittis quis, diam. Duis eget orci sit amet orci dignissim
rutrum.

Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi. Morbi
auctor lorem non justo. Nam lacus libero, pretium at, lobortis vitae, ultricies et,
tellus. Donec aliquet, tortor sed accumsan bibendum, erat ligula aliquet magna,
vitae ornare odio metus a mi. Morbi ac orci et nisl hendrerit mollis. Suspendisse
ut massa. Cras nec ante. Pellentesque a nulla. Cum sociis natoque penatibus et
magnis dis parturient montes, nascetur ridiculus mus. Aliquam tincidunt urna.
Nulla ullamcorper vestibulum turpis. Pellentesque cursus luctus mauris.

\end{minishape}

\end{document}

verwandte Informationen