다음 문제 중 일부를 완화하는 방법에 대한 아이디어가 있다고 생각합니다.
하지만 그것을 구현하는 방법을 잘 모르겠습니다. 플로팅 문제의 상당 부분은 단락 시작 부분에 포장 그림을 넣으라는 주장과 관련이 있는 것 같습니다. 이 제한을 어떻게 완화합니까?
예를 들어, 중간에 페이지 나누기가 있는 단락 앞에 포장 그림을 넣었습니다. 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}