Исправьте wrapfig для работы со строками вместо абзацев

Исправьте wrapfig для работы со строками вместо абзацев

Думаю, у меня есть идея, как решить некоторые из следующих проблем:

Две плавающие фигурки в ряд

но я не уверен, как это реализовать. Значительная часть проблемы с плаванием, похоже, связана с настойчивым требованием разместить wrapfig в начале абзаца. Как мне смягчить это ограничение?

Например, я помещаю wrapfig перед абзацем, в середине которого есть разрыв страницы. Wrapfig переместится к следующему абзацу (который, например, может быть слишком мал — до окончания раздела — или использоваться другим wrapfig), полностью игнорируя текущий абзац. Однако, если я разобью абзац на маленькие абзацы размером со строку, то wrapfig начнется при первой же возможности. Вместо того чтобы разбивать абзац на маленькие абзацы (или вручную позиционировать wrapfig внутри абзаца каждый раз, когда документ изменяется), я бы хотел снять ограничение абзаца.


РЕДАКТИРОВАТЬ

Комментарии ниже заставили меня задуматься:

Низкокалорийный латекс — нужно ли его преобразовать?

решение1

Вам это может показаться интересным. Это была попытка применить \parshapeк нескольким абзацам и уравнениям.

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

Связанный контент