% \iffalse % !TEX encoding = UTF-8 Unicode % Remember to use \StopEventually{}, otherwise no Check Sum %<*internal> \begingroup \input docstrip.tex \keepsilent \preamble Copyright (C) 1991-2003 by Donald Arseneau (asnd@triumf.ca) Copyright (C) 2021 by Claudio Beccari (claudio.beccari@gmail.com) License information appended \endpreamble \postamble Distributable under the LaTeX Project Public License, version 1.3c or higher (your choice). The latest version of this license is at: http://www.latex-project.org/lppl.txt This work is "maintained" This work consists of file wrapfig2.dtx, and the derived files wrapfig2.sty and wrapfig2.pdf, plus the auxiliary file README.txt. \endpostamble \askforoverwritefalse \generate{\file{wrapfig2.sty}{\from{wrapfig2.dtx}{package}}} \def\tmpa{plain} \ifx\tmpa\fmtname\endgroup\expandafter\bye\fi \endgroup % % \fi % % \iffalse %<*package> %\NeedsTeXFormat{LaTeX2e}[2019/01/01] % %<*driver> \ProvidesFile{wrapfig2.dtx}% % %<+package>\ProvidesPackage{wrapfig2}% %^^A<+readme>File README.txt for package wrapfig2 %<*package|readme> [2021-12-21 v.4.0 Wrapfig extended] % %<*driver> % \documentclass{ltxdoc}\errorcontextlines=100 \hfuzz 10pt \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{mflogo} \usepackage{multicol,amsmath,fancyvrb,graphicx,verbatim,pict2e,trace} \usepackage{xfp,xcolor,wrapfig2,tcolorbox,kantlipsum,xspace} \GetFileInfo{wrapfig2.dtx} \title{The \textsf{wrapfig2} package} \author{Claudio Beccari\thanks{E-mail: \texttt{claudio dot beccari at gmail dot com}}} \date{Version \fileversion~--~Last revised \filedate.} \providecommand*\diff{\mathop{}\!\mathrm{d}} \renewcommand\meta[1]{{\normalfont\textlangle\textit{#1}\textrangle}} \renewcommand\marg[1]{\texttt{\{\meta{#1}\}}} \providecommand\opz{} \renewcommand\opz[1]{{\normalfont\texttt{\itshape#1}}} \providecommand\Marg{} \renewcommand\Marg[1]{\texttt{\{#1\}}} \providecommand\oarg{} \renewcommand\oarg[1]{\texttt{[\meta{#1}]}} \providecommand\Oarg{} \renewcommand\Oarg[1]{\texttt{[#1]}} \providecommand\aarg{} \renewcommand*\aarg[1]{\texttt{<\meta{#1}>}} \providecommand\Aarg{} \renewcommand\Aarg[1]{\texttt{<#1>}} \providecommand\barg{} \renewcommand\barg[1]{\texttt{\string|\meta{#1}\string|}} \providecommand\Barg{} \renewcommand\Barg[1]{\texttt{\string|#1\string|}} \providecommand\parg{} \renewcommand\parg[1]{\texttt{(\meta{#1})}} \providecommand\Parg{} \renewcommand\Parg[1]{\texttt{(#1)}} \providecommand\eTeX{} \renewcommand\eTeX{\lower0.5ex\hbox{$\varepsilon\!$}\TeX} \providecommand\pack{} \renewcommand\pack[1]{{\normalfont\texttt{#1}}} \providecommand\class{} \renewcommand\class[1]{{\normalfont\texttt{#1}}} \providecommand\env{} \renewcommand\env[1]{\meta{\textsf{\slshape#1}}}\let\amb\env \providecommand\Env{} \renewcommand\Env[1]{\textsf{\slshape#1}}\let\Amb\Env \providecommand*\Bambiente[1]{\texttt{\char92begin\{#1\}}} \providecommand*\Eambiente[1]{\texttt{\char92end\{#1\}}} \let\Bamb\Bambiente \let\Benv\Bamb \let\Eamb\Eambiente \let\Eenv\Eamb \makeatletter \AfterEndPreamble{% \apptocmd{\TeX}{{}\xspace}{}{} \apptocmd{\LaTeX}{{}\xspace}{}{}} \DeclareRobustCommand\LaTeXe{% \LaTeX\@killglue\kern0.15em2$_{\textstyle \varepsilon}${}\xspace} \DeclareRobustCommand\LaTeXccix{% \LaTeX\@killglue\nobreakspace2.09{}\xspace} \DeclareRobustCommand\LaTeXiii{\LaTeX\@killglue\kern0.15em3{}\xspace} \DeclareRobustCommand*\pdfLaTeX{pdf\/\LaTeX} \DeclareRobustCommand*\LuaLaTeX{Lua\LaTeX} \DeclareRobustCommand*\XeLaTeX{% X\ifdim\fontdimen1\font=0pt\kern-0.15em\fi \lower.5ex\hbox{\rotatebox[origin=c]{180}{E}}% \ifdim\fontdimen1\font=0pt\kern-0.15em\else\kern-0.275em\fi \LaTeX} \providecommand\setfontsize{} \RenewDocumentCommand\setfontsize{O{1.2} m}{% \fontsize{#2}{\fpeval{#1*#2}}\selectfont} \newwrite\example@out \ProvideDocumentEnvironment{Esempio}{ O{\footnotesize} D(){0.50}} % All definitions and assignments are local % #1 := LaTeX font size command or \setfontsize{} % %2 := \textwidth percentage for the code box; the complement, less the % column gap, for the resulting compiled code % Syntax: \begin{Esempio}[]() % {\par\addvspace{3.0ex plus 0.8ex minus 0.5ex}\vskip -\parskip \dimendef\Wboxu=2570 \dimendef\Wboxd=2572 \Wboxu=#2\textwidth\relax \Wboxd=\dimexpr\linewidth-\columnsep-\Wboxu\relax \begingroup \@bsphack \immediate\openout\example@out\jobname-temp.tex \let\do\@makeother\dospecials\catcode`\^^M\active \def\verbatim@processline{% \immediate\write\example@out{\the\verbatim@line}}% \verbatim@start\relax}% {\immediate\closeout\example@out\@esphack\endgroup \begin{lrbox}{0}% \begin{minipage}{\textwidth}% \begin{minipage}{\Wboxu}% #1\relax \verbatiminput{\jobname-temp.tex} \end{minipage}% \hfill \begin{minipage}{\Wboxd}\raggedleft \input{\jobname-temp}% \end{minipage} \end{minipage}% \end{lrbox}% \medskip \noindent\makebox[\textwidth]{\box0}% \par } \providecommand\hz{\hskip0pt} \newenvironment{ttsintassi}{\begin{lrbox}{0} \minipage{\dimexpr\linewidth-2\fboxrule-2\fboxsep}\ttfamily\obeylines}% {\endminipage\end{lrbox}\center\fbox{\box0}\endcenter} % \begin{document}\errorcontextlines=100 \maketitle \columnseprule=0.4pt \begin{multicols}{2} \tableofcontents \end{multicols} \DocInput{wrapfig2.dtx} \end{document} % % \fi % % \begin{abstract} % This new package \pack{wrapfig2} is a fork that upgrades Donald % Arseneau's package \pack{wrapfig} (version 2.6, dated 2003) by % adding some \LaTeXiii definitions that accept a final optional star; % its presence changes the meaning of the first optional % argument so that it becomes a correction to the number of lines % that must be indented in order to receive the wrapped object. % A new environment is added to the traditional \Env{wrapfigure} % and \Env{wraptable}, namely \Env{wraptext}; it may be used % to wrap a small framed text block on a grey background; the % philosophy of this new environment is similar to that of the % other two environments, but the syntax is different. % \end{abstract} % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \paragraph{Caution} This package requires a fairly recent % \LaTeX kernel, otherwise it won't work; any \LaTeX kernel dated % at least 2020 is~OK. %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Introduction} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % The purpose of this package is twofold. On one side it tries % to modernise the original software by Donald Arseneau by % upgrading it to the \LaTeXiii modern language. On the other it % creates a new environment, with the same philosophy % of the original Arseneau's ones, such that a document author % can emphasise short blocks of text by framing them while % typesetting the text on a coloured background by means of % the \pack{tcolorbox} functionalities, and wrapping this % inserted text with the surrounding main text. % % The original software had some idiosyncrasies; Donald Arseneau % described them in the documentation of his package; I am sorry % to say that such idiosyncrasies have not been reduced; but in any case % the solution is to wrap the inserted object with a sufficient % number of lines, i.e. by a sufficiently long paragraph. % % The above implies that no wrapped object code should be inserted % by the end of a paragraph; again no object code should be inserted % within any list; not even close to the end or to the % beginning of section. Arseneau's code is capable of % specifying the wrapping number of lines such that two or more % paragraphs can be indented so as to wrap a longish insertion, % but it is wise to avoid such risky situations. Moreover, if the % inserted figure or table has a numbered caption, the number might % not result in the correct order with the normal corresponding % floating objects. % % Therefore the usefulness of the wrapping procedure depends very % much from the document author ability to move around his/her code % until a suitable position is found. Certainly a good place is % within a longish first section at the beginning of a new chapter. % % The code of this package does not do anything to correct such % idiosyncrasies. They are caused by the limitations of the % \cs{ShipOut} native \TeX/\LaTeXe macro, and very little can be done in % addition to what Arseneau already did. % % Another purpose of this package is to add an option so that the % \meta{number of indented lines} argument does not mean the total % number, but the correction number to add-to or subtract-from to the % value computed by the default mechanism devised by Arseneau. We assume % that any user first uses the software to insert an object to be wrapped % by the surrounding text without specifying any value with the % specific optional argument; then evaluates the result, and if the % space below the wrapped object is too large, or if such space is % too small s/he counts the necessary number of lines and specifies % it to be processed during another document compilation. When the % object to be wrapped is tall, it is very easy to miscount the % necessary number of lines, while is is very easy to evaluate the % necessary small correction to the default computed value. % % A third purpose of this package is to define a new environment, % \Env{wraptext}, to wrap a framed text block typeset on a grey % background as if it were a figure. On \texttt{texstackexchange} % a solution was suggested to a user who was asking for such an % arrangement; the solution resorted to a specific use of the % \Env{wrapfigure} environment. We thought that an \emph{ad hoc} % solution would be a better one, since the parameters to be used for a % figure have nothing or little to do with a text, therefore most % of them would be useless with a wrapped text. Nevertheless the % \meta{location} of the wrapped text and the optional correction % of the indented lines number would still be necessary. We added also % the possibility of optionally specifying the measure of the % wrapped text, even if this measure should not be too different % from a half of the wrapping text measure: with a value too different % from \texttt{0.5\cs{linewidth}} either the wrapped text has problems % with inter word spaces and hyphenation because of the small measure, % or, on the opposite, the indented lines of the wrapping text have % similar problems. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Environment syntax} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % The new syntax for \Env{wrapfigure} and \Env{wraptable} is backwards % compatible with the original one: just a final optional star is % added to the original list of arguments. % As the list of arguments shows, the \Env{wraptext} environment has % similar features, but all its arguments are optional, so that they % may be specified independently from one another, provided that, when % they are more than one, they are specified in the order % shown in the syntax table. % % The optional star is available only for the standard \Env{wrapfigure} % and \Env{wraptable} environments because the backwards compatibility % requires the first four optional and mandatory arguments. When the % optional star is specified, the \meta{indented lines number} is % interpreted as the correction to the computed number. % % \begin{ttsintassi}\setfontsize{8.10} %\Bambiente{wrapfigure}\oarg{indented lines number}\marg{location}\oarg{overhang}\oarg{width}\meta{$\star$} %\qquad\meta{figure} %\Eambiente{wrapfigure} %~ %\Bambiente{wraptable}\oarg{indented lines number}\marg{location}\oarg{overhang}\oarg{width}\meta{$\star$} %\qquad\meta{table} %\Eambiente{wraptable} %~ %\Bambiente{wraptext}\oarg{location}\barg{width}\aarg{indented line number correction}\parg{caption label} %\qquad\meta{wrapped framed text} %\Eambiente{wraptext} % \end{ttsintassi} % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\section{Examples} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % We display some examples by using fake objects such that suitably % long paragraphs are available; some fake language long paragraphs are % obtained by means of the \pack{kantlipsum} package functionalities. % They contain paragraphs that look as Kant's sentences, but we % doubt that Immanuel Kant ever wrote such texts\dots % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{A wrapped figure} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % %\begin{wrapfigure}{r}{50mm}* %\centering\unitlength=1mm %\begin{picture}(40,30) %\polygon(0,0)(40,0)(40,30)(0,30) %\Line(0,0)(40,30)\Line(0,30)(40,0) %\end{picture} %\caption{A rectangle} %\end{wrapfigure} % % \kant[1] % % % The code used to type the above figure is the following: % %\begin{flushleft}\obeylines% %\noindent\Bambiente{wrapfigure}\Marg{r}\Marg{50mm} %\cs{centering}\cs{unitlength}=1mm %\Bambiente{picture}\texttt{(40,30)} %\cs{polygon}\texttt{(0,0)(40,0)(40,30)(0,30)} %\cs{Line}\texttt{(0,0)(40,30)}\cs{Line}\texttt{(0,30)(40,0)} %\Eambiente{picture} %\cs{caption}\Marg{A rectangle with its diagonals} %\Eambiente{wrapfigure} %~ %\cs{kant}\Oarg{1} %\end{flushleft} % % No asterisk was used because the package succeeded to correctly % compute the necessary number of indented lines. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{A wrapped table} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Wrapping a small table is a little more difficult than wrapping % a figure, because the width of the inserted object is not known % exactly in advance and is difficult to estimate; therefore it is % possible that several trial compilations are necessary. In any % case a \cs{centering} command might help to center the table % within the indention of the wrapping text. Nevertheless the % software can compute the object width if a zero value is specified % or if the mandatory \meta{width} parameter is completely omitted; % this second possibility is a feature of this package, that uses a % \LaTeXiii property by which even a braced argument can be treated % as an optional argument with a predefined default value; see below % more details about this feature. % %\begin{wraptable}{l} %\centering % \begin{tabular}{cc} % \hline % First & Second\\ % Third & Fourth\\ % \hline %\end{tabular} %\caption{A small table} %\end{wraptable} % %\kant[2] % % The above wrapped small table has been typeset by means of the % following code. %\begin{flushleft}\ttfamily\obeylines %\Bambiente{wraptable}\Marg{l} %\quad\cs{centering} %\quad\Bambiente{tabular}\Marg{cc} %\qquad\cs{hline} %\qquad First \& Second\string \\ %\qquad Third \& Fourth\string \\ %\qquad\cs{hline} %\quad\Eambiente{tabular} %\quad\cs{caption}\Marg{A small table} %\Eambiente{wraptable} %\cs{kant}\Oarg{2} %\end{flushleft} % % You notice the absence of the braced width value; as said above, % this braced value is optional, and the software autonomously % computes the width of the wrapped object. This feature may be % useful in many instances, although we think that a smart use of % this width parameter might yield better looking results. % % On the opposite if the user estimates that the table with its % caption might use 5 lines, and specified such a value as the % first (optional) argument to the environment, the result would % be this poor one, with the last caption line overlapping the % wrapping text. % %\begin{wraptable}[5]{l} %\centering % \begin{tabular}{cc} % \hline % First & Second\\ % Third & Fourth\\ % \hline %\end{tabular} %\caption{A small table} %\end{wraptable} %\kant[2] % % If % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{A wrapped text} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \begin{wraptext} % Text, text, text, text, text, text, text, text, text, text, text. % \end{wraptext} % \kant[3] %\enlargethispage{-2\baselineskip} % % The above example was typeset with this simple code: %\begin{flushleft}\obeylines % \Bamb{wraptext} % \ttfamily Text, text, text, text, text, text, text, text, text, text, text. % \Eamb{wraptext} % \cs{kant}[3] %\end{flushleft} % % As it was previously shown, the syntax for the \Env{wraptext} % environment is a little different from that of the other two % environments. The logic behind it is substantially the same; % the \meta{width} parameter is optional; its preset value is % half the column width, that in one column typesetting mode % coincides with the text width. The wrapped text is typeset % in justified mode within a \Env{minipage} environment; the % measure of this mini page should not be too small (unless % the text is less than one line long) otherwise the inter % word spacing might be too large; at the same time the measure % of the mini page cannot be too large, otherwise the indented % wrapping lines, generally justified, might get a bad word % spacing. Therefore it is suggested to avoid specifying the % optional \meta{widh} outside the range of 40\% to 60\% the % column width. Actually specifying \texttt{0.2\cs{textwidth}} % or \texttt{0.4\cs{columnwidth}} when typesetting in two column % mode produces approximately the same result, because % \cs{columnwidth} is a little less than half the \cs{textwidth}. % % A warning is necessary: if a caption is entered % within the environment, such caption gets typeset within the % background coloured frame. We think that a framed text does not % require any caption; if such caption were necessary, then the % user should resort to other means, for example, to a standalone % small PDF file containing the framed shaded text to be imported % as a figure with the \amb{wrapfigure} environment. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Remarks} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % The syntax of the original environments \amb{wrapfigure} and % \amb{wraptable} has not been changed, except for a last optional % star. The fact that the last braced argument is optional does not % change the backward compatibility with the original environments. % % Therefore the optional \meta{line number} argument maintains its % meaning, unless the optional star is specified; in such a case that % number assumes the meaning of a correction to the computed number % of the indented lines. % % The mandatory \meta{placement} maintains its meaning and the legal % values are \texttt{l} (left), \texttt{r} (right), \texttt{L} % (floating left), \texttt{R} (floating right), \texttt{i} % (inner margin), \texttt{o} (outer margin), \texttt{I} % (floating inner margin), \texttt{O} (floating outer margin). % % We tested all of them, but as a personal choice we prefer to % place the wrapped object at the left of the text, without % floating it and irrespective of the page number parity. % % As in the previous examples, we prefer to specify the wrapping % environment before a sufficiently long paragraph. Should the % paragraph be too short to completely wrap the object, all % the environments are capable of counting the number of indented % lines and to apply the \cs{overhang} command with the remaining % line number to the following paragraph(s); in these circumstances % it might be necessary to recourse to the optional star in order % to correct the indention, since the mechanism does not consider % the inter paragraph spacing that \TeX introduces only at ship~out % time. % % We avoid also to enter the wrapping environment before paragraphs % that are close to a page break; this action would tickle the % idiosyncrasies of the software, and requires moving the wrapping % environment some paragraphs before or after the preferred one; but % this can be done only while reviewing the document, because any % change in the previous source text might change the situation % if this adjustment is done while still editing the document. % % With the standard environments the optional parameter \meta{overhang} % does exactly what its name implies: the wrapped object protrudes % into the adjacent margin exactly by the specified amount. This % parameter is not available for the \Env{wraptext} environment; % we believe that a wrapped text logically pairs the wrapping text; % of course this opinion might be wrong and in future upgrades we % might add this functionality. % % The \meta{width} parameter has been already sufficiently described; % we just remember that for \Env{wraptext} this parameter is optional % and its default value amounts to half the current measure; it can % be specified but it should not be too different from 50\% the % current measure. For the standard environments this parameter value % is mandatory, but, we recall, for the redefined environments % \env{wrapfigure} and \env{wraptable}, this braced argument is optional. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Other floating objects} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Pictures and textual arrays may be floated by means of the standard % \amb{figure} and \amb{table} environments. But other floating % objects may be defined by means of the \pack{float} package, % just to name one, or classes. Besides floating, the main difference % is the name of the caption “label”: Figure, Table, Algorithm, % Example, and so on. % % If floating is not necessary, this package (as well as the original % one) allows to use the underlying environment \Env{wrapfloat} % that uses the same syntax as \Env{wrapfigure} plus the mandatory % name of the new object: even a figure might be introduced without % using \amb{wrapfigure}, by using instead: %\begin{flushleft}\ttfamily\obeylines %\Benv{wrapfloat}\Marg{figure}\oarg{line number}\marg{placement}\% %\quad \oarg{overhang}\marg{width}\meta{$\star$} %\qquad\qquad\meta{image} %\Eenv{wrapfloat} %\end{flushleft} % Another \meta{object} may be wrapped by using: %\begin{flushleft}\ttfamily\obeylines %\Benv{wrapfloat}\marg{object name}\oarg{line number}\marg{placement}\% %\quad \oarg{overhang}\marg{width}\meta{$\star$} %\qquad\qquad\meta{object} %\Eenv{wrapfloat} %\end{flushleft} % % If the floating \meta{placement} codes have to be used, another % floating object with the desired \meta{object name} has to be % previously defined by means of the functionalities of other % packages or classes. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \CheckSum{1061} % \StopEventually{} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{The code} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Here we describe and comment the code of this package; essentially % only the initial parts need some comments; because the final ones % are almost identical to the original Arseneau's code. % % We start with the usual specification of the format name and date, % and the identification of this specific package. We possibly load % the \pack{etoolbox} package, because we immediately need a % test on the existence of an @-protected macro; should this macro % already been defined by the class or other packages (including a % previous loading of this package or the previous Arseneau's one) % the loading is immediately aborted. If is was not previously loaded, % we load the \pack{xfp} package, that allows us to perform precise % calculations. Loading the \pack{xparse} package is necessary in % order to use one of its rare features that did not migrate % to the \LaTeX kernel. From the \LaTeX News Letter dated October 2020: %\begin{quote} % Most, but not all, of the argument types defined by \pack{xparse} % are now supported at the kernel level. In particular, the types % \texttt{g/G}, \texttt{l} and \texttt{u} are not provided by the % kernel code; these are \emph{deprecated} but still available by % explicitly loading \pack{xparse}. All other argument types are % now available directly within the \LaTeXe kernel. %\end{quote} % For now their availability eases the treatment of the backwards % compatibility of this software with the original \pack{wrapfig} % functionality. It deals with the mandatory \meta{width} argument % of the \pack{wrapfigure}, \pack{wraptable}, and \pack{wrapfloat} % environments, where it was possible to specify a zero value. % Now it is possible to omit it completely because it is a % \emph{braced optional argument}. % %\iffalse %<*package> %\fi % \begin{macrocode} \NeedsTeXFormat{LaTeX2e}[2020-01-01] \ProvidesPackage{wrapfig2}% [2021-11-30 v.4.0 Wrap text around figures, tables, framed text blocks] \@ifpackageloaded{etoolbox}{}{\RequirePackage{etoolbox}} \ifcsdef{c@WF@wrappedlines}{\endinput}{} \ifcsdef{fpeval}{}{\RequirePackage{xfp}} \RequirePackage{xparse} % \end{macrocode} % % Next we define some dimensions, boxes, token registers, \TeX counters, % and alias names. The \cs{WF@correctlines@switch} \TeX numeric register % (not a \LaTeX counter) is going to be used a boolean switch; if its % value is zero, il means “false”, otherwise is “true”; in the other % definitions below, it will be set only to 0 or 1, depending on the % presence of the optional star. % \begin{macrocode} \newdimen\wrapoverhang \wrapoverhang\z@ \newdimen\WF@size \newcounter{WF@wrappedlines} \newbox\WF@box \newbox\NWF@box \newtoks\WF@everypar \newif\ifWF@float \newcount\WF@correctlines@switch \newdimen\insertwidth \let\@@parshape\parshape \let\WF@@everypar\everypar % \end{macrocode} % % In what follows we are going to use very often the functionalities % of the \pack{xparse} package that are mostly already included into % the \LaTeX kernel; but, since we use one of this functionalities that % have not migrated to the \LaTeX kernel, we load it, as they remain % available with that package; nevertheless we specified a % \LaTeX format date insuring that the \LaTeXiii syntax is available. % % Should the format file be an older one, a multitude of errors would be % produced, and the user should take care to load the \pack{xparse} % and \pack{xfp} packages before loading \pack{wrapfig2}. % Notice that most of the \pack{xparse} package functionalities % at the date required for the format file are already included. The % \pack{xparse} package has been available about in 2018; should the user % have available a definitely older \TeX system installation, s/he % should upgrade it, or must avoid using this \pack{wrapfig2} package % and use the original one; if s/he needs to wrap text, s/he should % resort to some ingenious tricks to do it. % % The opening command of the \Env{wrapfloat} environment receives % the mandatory and optional arguments plus the name of the particular % object to be wrapped. It is used to define the prefix label of the % caption number in case that the object is described with a caption. The % optional star is not explicit, because it is going to be read by % the \cs{WF@wr} macro. % % The closing command of \Env{wrapfloat} performs most of % the work necessary to wrap the box that contains the object % to be wrapped, but certain tasks are demanded to other service % macros. % % It may set the width of the box if the \meta{width} parameter % is specified; otherwise it closes the \cs{hbox} that was used; % then it closes the main vertical box \cs{WF@box}. After executing % \cs{WF@floatstyhook}, necessary when package \pack{float.sty} % has been used, it saves the \meta{overhang} value to be used when % wrapping is actually performed; then it verifies if the box height % is too high to fit, or is too short; possibly re-boxes this box % in the same box register with a negative initial vertical skip % that raises the box contents. % % The definitions of the \Env{wrapfigure} and \Env{wraptable} % environments are very simple by means of the underlaying % \Env{wrapfloat} environments. % \begin{macrocode} \NewDocumentEnvironment{wrapfigure}{o m o G{0pt}}% {\wrapfloat{figure}[#1]{#2}[#3]{#4}}% {\endwrapfloat} \NewDocumentEnvironment{wraptable}{o m o G{0pt}}% {\wrapfloat{table}[#1]{#2}[#3]{#4}}% {\endwrapfloat} % \end{macrocode} % % The definition of the \Env{wraptext} environment is more detailed, % because most of the computations must be done on the actual text % to be wrapped, that does not have a specific width; moreover the % inserted text must not be too wide, nor too short in order to avoid % problems for its justification or the justification of the wrapping % text. The framed box width is preset to 50\% of the normal text measure, % but it can be optionally specified to a different value (not too % different from 50\%), while for the other environments the wrapped % material width is an \emph{optional braced parameter}. % % For what concerns the \Env{wraptext} environment, see below, % because the code is a little more complicated and requires some % explanation. % In facts the first statement argument description list does not % contain any descriptor for an optional star. There is no need % because the computation of the insertion block height is pretty % precise and at most the user might desire one line more or less % depending on the measure of the whole text, and that of the % inserted block and/or the measure of the indented wrapped lines. % % It is true that some of the input parameters specified to the opening % command with \LaTeXiii are available also to the closing commands; see % the last paragraph of section~2 in the \pack{xparse} documentation. % But the following definition, besides using special delimiters for % optional parameters, uses the separate opening and closing % macros of the \Env{wrapfloat} environment; such procedure % apparently breaks this second availability of the input parameters, % therefore it is necessary to save them into local macros or count % registers (assignments of \TeX count registers are \emph{local}, % while assignment of the \LaTeX\ named counters, through the % \cs{setcounter} macro and its siblings, are \emph{global}) so % that we can use their values within the closing commands. % % The \cs{NWF@box} has been assigned at the beginning; remember % that \LaTeXiii registers of any kind are not limited in number % as they were some years ago even with \LaTeXe. % The last opening commands are conceived to box the object to be % wrapped, typeset within a \Env{minipage} with the default or % specified width; such box, and the \Env{tcolorbox} and % \Env{minipage} environments are closed at the beginning of the % closing commands, so that what is necessary in order to place the % wrapped boxed text is easy to be executed. % % The number of indented lines is computed by means of the % \cs{fpeval} \LaTeXiii function; among the operands of this % function there is the value \texttt{2} used to take into % account the vertical space used by \Env{tcolorbox} to % separate the frame from its contents. It is possible that % a value of \texttt{3} might reduce the probability of using the % \meta{line number correction}. But it is not always true and we % found that the chosen value is a better choice. % % Eventually the opening \Env{wrapfloat} statement is created by % expanding the whole line complete of arguments, by means of the % usual trick of defining a dummy macro within a group that contains % among its expansion the group closing command, so that while % it is being executed, it deletes itself from memory. % \begin{macrocode} \NewDocumentEnvironment{wraptext}% {O{l} D||{0.5\columnwidth} D<>{0} D(){figure}}% {% Open environment \insertwidth=#2\relax \def\textplacement{#1}% \def\textcorrection{#3}% \def\WF@caption@label{#4}% \begin{lrbox}\NWF@box% This box is to contain the framed text \minipage{\insertwidth}% \tcolorbox }{% Close environment \endtcolorbox\endminipage\end{lrbox}% \edef\NWF@wli% \NWF@wli is a macro, not a counter {% \fpeval{% round((\ht\NWF@box+\dp\NWF@box)/\baselineskip,0)+2+\textcorrection }% }% \ifhmode\unskip\else\leavevmode\noindent\fi \bgroup\edef\x{\egroup\noexpand\wrapfloat{\WF@caption@label}[\NWF@wli]% {\textplacement}{\the\insertwidth}}\x \box\NWF@box % Output framed box containing text \endwrapfloat \ignorespaces } % \end{macrocode} % % Now comes the definition of the fundamental environment \Env{wrapfloat}; % compared to the original Arseneau's definition it is much longer, % but it contains the code that Arseneau, who wrote the code in % \LaTeXe language, had to split in several macros in order to % handle the multitude of interspersed mandatory and optional % arguments. % % The main function of this environment is to handle the box that % contains the figure, or the table, or the framed test, or what % else, so that the inserted box is preceded and followed by the % suitable vertical spaces, and it is possible to compute the % number of lines to be indented; often this computed number is correct; % but in certain cases, when the code is used too close or % within prohibited wrapping text, such number might need to be % corrected. As it can be seen the optional star is not among % the argument descriptors of the opening commands; it will be % the following macro \cs{WR@wr} to take care of examining % the list of arguments and see if a star has been specified and % not yet read by the preceding commands. % % In order to handle any kind of wrapped object, this environment % first argument is the \meta{caption label}. It may remain blank; % but for wrapping figures or tables their respective definitions % specify the name of the floating object they belong to; it is not % necessary that there exists a floating environment with the same % name of the wrapped object, when its wrapping environment is not % specified with a floating \meta{placement} argument. % % \begin{macrocode} \NewDocumentEnvironment{wrapfloat}{m o m o G{\z@}}% {\def\@captype{#1}\WF@wr[#2]{#3}[#4]{#5}}% {\ifdim\hsize>\z@ \par\hrule\@width\hsize\@height\z@ % force width with invisible rule \else \unskip \egroup \box\z@ % or close hbox \fi \egroup % close the vtop box; its width now is known \WF@floatstyhook % support for float.sty \def\width{\wd\WF@box}% \setlength\wrapoverhang{\WF@ovh}% \xdef\WF@ovh{\the\wrapoverhang}% save until wrapping \ifdim\ht\WF@box>\topskip \ht\WF@box\z@ \fi% too high, set flag \ifdim\ht\WF@box<.5\p@ % too short, move up \global\setbox\WF@box\vtop{\vskip-1.4ex\unvbox\WF@box}% \fi \global\WF@size=% compute total box hight with \fpeval \fpeval{\ht\WF@box+\dp\WF@box+1.5\baselineskip+\tw@\intextsep}\p@ \aftergroup\WF@startfloating % use even when not really floating \unless\ifWF@float \ifhmode {\unskip \parfillskip\z@skip \par \vskip-\parskip}% \aftergroup\noindent \fi \fi \global\@ignoretrue } % \end{macrocode} % % The working macro \cs{WF@wr} is defined with the \LaTeXiii % language; it grabs all the optional and mandatory arguments % in a single step, contrary to \LaTeXe that requires to split % the various steps in separate macros. In the definition code % we use also some commands, such as \cs{unless}, originally % defined by the \eTeX typesetting program extensions, that have % been included in the \pdfLaTeX, \XeLaTeX and \LuaLaTeX kernels % several years ago. % % Notice that the optional first (optional) argument, that represents % the number of indented lines or their correction number, is saved % into the macro \cs{WF@wli}, but if this argument is not specified, % \cs{WF@wli} is assigned the value zero. The same happens for the % \meta{overhang} optional argument. % % After these adjustments, it computes the box total height plus some % fixed amounts needed mostly to set the wrapped material below the % first wrapping text first line. Here is where the \LaTeXiii % \cs{fpeval} computing macro comes into play so as to assign such % height to \cs{WF@size}. Some unusual macros are executed; they % were devised by Arseneau to deal with possibly floating wrapped % objects. The optional star is not accepted by this macro; if the user % specified it, it is still in the input flux; notice that the % \Env{wraptext} environment does not accept the optional star; if % the user specifies it for this environment, an asterisk appears % at the beginning of the wrapped text. % % The mandatory \texttt{\#4} \meta{width} parameter (actually a % \meta{optional braced parameter}) may be specified % to be \texttt{0pt}; in any case \texttt{0pt} is the default parameter % value; if so, the object is treated at its natural width, by % boxing it into an hbox and using this hbox width as the working width % \begin{macrocode} \NewDocumentCommand\WF@wr{o m o m s}{% \xdef\WF@wfname{wrap\@captype\space}% \unless\ifvoid\WF@box \WFclear \WF@collision \fi \xdef\WF@place{\string`\@car#2r\@nil}% \ifnum\lccode\WF@place=\WF@place \global\WF@floatfalse \else \global\WF@floattrue \fi \ifx\parshape\WF@fudgeparshape \unless\ifWF@float\\WF@collision\fi \else \ifx\par\@@par \ifnum\@@parshape>\z@\WF@conflict\fi \else \WF@conflict \fi \fi \IfValueTF{#1}% save optional line number or correction {\gdef\WF@wli{#1}}% {\gdef\WF@wli{0}}% % \IfValueTF{#3}% save optional overhang {\gdef\WF@ovh{#3}}% {\gdef\WF@ovh{\z@}}% % \global\setbox\WF@box\vtop\bgroup \setlength\hsize{#4}% set width \ifdim\hsize>\z@ \@parboxrestore \else \setbox\z@\hbox\bgroup \let\wf@@caption\caption \let\caption\wf@caption \ignorespaces \fi \IfBooleanTF{#5}% if the asterisk is present set the numerical switch {\global\WF@correctlines@switch=\@ne}% {\global\WF@correctlines@switch=\z@}% \global\@ignoretrue } % \end{macrocode} % % At this point the main box \cs{WF@box} is opened in order to % store the object to be wrapped; with this box height the software % is going to compute the number of lines to be indented, unless % such a number has been specified and no star was added to the % input parameters. % % Also the \amb{wraptext} environment uses a box to collect the % framed text; the name of this second box must be different from % \cs{WF@box} otherwise interference of the various tasks produces % unrecoverable errors. This is why at the beginning of this % package we defined two different boxes: \cs{WF@box} and \cs{NWF@box}. % % The trick of creating an alias for the \cs{caption} macro is % used by Arseneau to redefine one of the two macros according to % certain conditions. Here \cs{wf@caption} is actually redefined % if the \meta{width} parameter has been specified. % \begin{macrocode} \def\wf@caption{\relax% redefine \wf@caption in case \hsize is zero \ifdim\hsize>\z@ \let\caption\wf@@caption \else \unskip \egroup \hsize\wd\z@ \@parboxrestore \box\z@% empty \box0 \fi \caption } % \end{macrocode} % % One of these unusual macros was introduced by Arseneau % to deal with paragraph parameters and possibly to float the % object to be wrapped. % \begin{macrocode} \def\WF@startfloating{% \WF@everypar\expandafter{\the\everypar}\let\everypar\WF@everypar \WF@@everypar{\ifvoid\WF@box\else\WF@floathand\fi \the\everypar \WF@wraphand }} % \end{macrocode} % The following macro is for floating wrapping environments. % \begin{macrocode} \def\WF@floathand{% \ifx\parshape\WF@fudgeparshape \WF@fltmes \else \ifx\par\@@par \ifnum\@@parshape=\z@ \ifdim\hangindent=\z@ \setbox\z@\lastbox \begingroup \@@par \WF@@everypar{}\WF@putfigmaybe \endgroup % after this group start wrapping \unless\ifvoid\z@ % replace indentation \box\z@ \fi \else \WF@fltmes \fi \else \WF@fltmes \fi \else \WF@fltmes \fi \fi} % \end{macrocode} % % On the contrary if there is enough space or if the wrapped object % cannot float, it gets output here. % \begin{macrocode} \def\WF@putfigmaybe{% \ifinner \vskip-\parskip \global\WF@floatfalse \let\pagetotal\maxdimen % kludge flag for "not top of page" \else % outer page \@tempdima\pagedepth % save page depth {\advance\parskip\@tempdima\vskip-\parskip}% back up to base line \penalty\interlinepenalty % update page parameters \@tempdimb\pagegoal \advance\@tempdimb-\pagetotal % room left on page \ifdim \@tempdimb<\z@ % page already full \global\WF@floatfalse \unless\ifdim-\@tempdimb>\pageshrink \pagebreak \fi \else \ifdim\WF@size>\@tempdimb% box too high does not fit in \@tempdimb \ifWF@float \dimen@.5\baselineskip \else \dimen@ 2\baselineskip \fi \ifdim\pagestretch>\dimen@ \dimen@\pagestretch \fi \ifdim\pagefilstretch>\z@ \dimen@\@tempdimb \fi \ifdim\pagefillstretch>\z@ \dimen@\@tempdimb \fi \advance\dimen@.5\baselineskip \ifdim\dimen@>\@tempdimb % stretch page contents \global\WF@floatfalse \pagebreak \fi \else % box fits in \@tempdimb \global\WF@floatfalse \fi \fi \vskip\@tempdima\relax % return erased page depth \fi \noindent \ifWF@float \WF@fltmes \else % place insertion here \WF@info{Put \WF@wfname here:}% {\ifodd \if@twoside\c@page\else\@ne\fi % assign l/r to i/o placement \lccode`i`l\lccode`o`r\else \lccode`i`r\lccode`o`l% \fi \xdef\WF@place{\the\lccode\lccode\WF@place}% }% twice to get only l or r \hbox to\z@{% llap o rlap depending on lor r; calc effective width \@tempdima\wd\WF@box \@tempdimb\WF@ovh \advance\@tempdima-\@tempdimb \advance\@tempdima\columnsep \@tempdimb\hsize \advance\@tempdimb-\@tempdima \xdef\WF@adjlw{\the\@tempdima}% \ifnum `l=\WF@place % object on left \hss \def\@tempa{\kern\columnsep}% take right gap into action \else % insert on light \@tempdima\z@ % no left indentation \kern\@tempdimb \kern\columnsep \def\@tempa{\hss}% object overlaps space to the right \fi \ifdim\@tempdimb<\hsize \xdef\WF@wrapil{\the\@tempdima \the\@tempdimb}% indent.n and length \xdef\WF@adjtlm{\the\@tempdima}% \else \xdef\WF@wrapil{\z@ \the\hsize}% \xdef\WF@adjlw{\z@}\xdef\WF@adjtlm{\z@}% \fi \ifdim\pagetotal=\z@ % put object at top of page \thepage \global\advance\WF@size-\intextsep \else % put object in middle of the page \setbox\WF@box\hbox{\lower\intextsep\box\WF@box}% \fi \dp\WF@box\z@ \box\WF@box \@tempa }% end \hbox to 0pt \aftergroup\WF@startwrapping \fi } % \end{macrocode} % % Here comes the very important macro that counts the wrapping indented % lines, so that wrapping is correct; of course the limitations % of the \TeX and \LaTeX processing (needed to ship out a complete % page) forbid to take into account the spaces inserted between % paragraphs and/or those inserted between entries of various % listings. The idiosyncrasies of this package arise from the % fact that this macro cannot preview actions that have not % yet taken place when this macro is executed. % % This macro is the one that counts the lines to be indented by % rounding the division of the box height by the current base % line skip. Notice that \texttt{WF@wrappedlines} is the name % of a \LaTeX named counter, not of a \TeX numeric register; % therefore special LaTeX commands, such as \cs{setocounter} or % \cs{value}, have to be used in order to set or access the % numerical value stored within the \TeX register associated % to the \LaTeX counter name. % \begin{macrocode} \def\WF@startwrapping{% \ifnum\WF@wli=\z@ % no number was specified \setcounter{WF@wrappedlines}% {\fpeval{round(\WF@size/\baselineskip,0)}}% \xdef\WF@wli{\value{WF@wrappedlines}}% \else \ifnum\WF@correctlines@switch>\z@ % line number correction \setcounter{WF@wrappedlines} {\fpeval{round((\WF@size)/\baselineskip,0)+\WF@wli}}% \xdef\WF@wli{\value{WF@wrappedlines}}% \else \setcounter{WF@wrappedlines}{\WF@wli}% absolute number of lines \global\advance\c@WF@wrappedlines\@ne \fi \fi \ifnum\c@WF@wrappedlines>\@ne % fine tuning \let\parshape\WF@fudgeparshape \let\WF@pspars\@empty \let\WF@@par\par \def\@setpar##1{\def\WF@@par{##1}}\def\par{\@par}\let\@par\WF@mypar \xdef\WF@restoretol{\tolerance\the\tolerance}\tolerance9999 \advance\linewidth-\WF@adjlw \advance\@totalleftmargin\WF@adjtlm \fi} % \end{macrocode} % % The next macro is the one that actually indents the wrapping text lines % and keeps track of the number of such processed lines. It can work % on more than a single paragraph. It resorts to service macros that % reiterate as long as the number of indented lines is lower than the % computed number of lines. Possibly this process could be defined by % means od the \texttt{dowhile} or \texttt{whiledo} \LaTeXiii functions. % By now we did not afford this task, because first we would like to % see if the overall software is reliable. % \begin{macrocode} \def\WF@wraphand{% for indenting one or more paragraphs \ifnum\c@WF@wrappedlines<\tw@ \WF@finale \else \begingroup % create a parshape command \@tempcnta\@ne \let\WF@wrapil\relax \gdef\WF@ps{}% \@whilenum \@tempcnta<\c@WF@wrappedlines\do{% repeated indentation \xdef\WF@ps{\WF@ps\WF@wrapil}\advance\@tempcnta\@ne }% \endgroup \ifx\WF@pspars\@empty \@@parshape\c@WF@wrappedlines \WF@ps \WF@noil \else % use external `parshape' values to modify my parshape \WF@modps \fi \fi } % \end{macrocode} % % This macro resets the paragraph properties and terminates the job. % \begin{macrocode} \def\WF@mypar{\relax \WF@@par \ifnum\@@parshape=\z@ \let\WF@pspars\@empty % reset parshape \fi \global\advance\c@WF@wrappedlines-\prevgraf \prevgraf\z@ \ifnum\c@WF@wrappedlines<\tw@ \WF@finale \fi } % \end{macrocode} % % These macros are to modify the paragraph settings. % \begin{macrocode} \def\WF@modps{\begingroup \afterassignment\@tempdimb \@tempdima\WF@pspars % a=indent.num, b= width \advance\@tempdima-\WF@adjtlm \advance\@tempdimb\WF@adjlw \let\WF@wrapil\WF@pspars \edef\@tempb{\@@parshape\c@WF@wrappedlines \WF@ps \the\@tempdima \the\@tempdimb}% \expandafter\endgroup\@tempb } \let\@@setpar\@setpar \def\WF@noil{\z@ \hsize} \let\WF@pspars\@empty \def\WF@fudgeparshape{\relax \ifnum\c@WF@wrappedlines<\tw@ \WF@finale \else \afterassignment\WF@fudgeparshapee \fam \fi } \def\WF@fudgeparshapee{% \ifnum\fam=\@ne \expandafter \WF@parshapeee \else \WF@conflict \@@parshape\fam \fi } \def\WF@parshapeee#1#2{% \begingroup\delimitershortfall#1% \nulldelimiterspace#2% \advance \nulldelimiterspace by \WF@adjlw \edef\@tempa{\def\noexpand\WF@pspars{% \the\delimitershortfall \the\nulldelimiterspace}}% \expandafter\endgroup\@tempa \WF@wraphand } % \end{macrocode} % % The following macro is the one that actually ends the single % wrapping job. % \begin{macrocode} \def\WF@finale{% \ifx\parshape\WF@fudgeparshape \WF@restoretol \let\@setpar\@@setpar \let\par\WF@@par \advance\linewidth\WF@adjlw \advance\@totalleftmargin-\WF@adjtlm \WF@info{Finish wrapping text}% \ifx\par\@@par \def\@par{\let\par\@@par\par}% \else \let\@par\WF@@par \fi \let\parshape\@@parshape \parshape=\ifx\WF@pspars\@empty \z@ \else \@ne \WF@pspars \fi \fi \ifvoid\WF@box \ifx\everypar\WF@everypar \let\everypar\WF@@everypar \everypar\expandafter{\the\WF@everypar}% \fi \fi } % \end{macrocode} % % At the very end everything is restored, and the used boxes are emptied. % \begin{macrocode} \newcommand{\WFclear}{\par \unless\ifvoid\WF@box \vskip\bigskipamount \box\WF@box \let\everypar\WF@@everypar \everypar\expandafter{\the\WF@everypar}% \fi \global\c@WF@wrappedlines\z@ \WF@finale \global\WF@correctlines@switch\z@ } % \end{macrocode} % % The following code is one of those “dirty tricks” by which a macro % defined within a group is executed with the help of an %\cs{expandafter} command that bypasses an \cs{endgroup}; by so doing % nothing local to the group remains in memory. % \begin{macrocode} \begingroup \toks0={\let\everypar\WF@@everypar \everypar\expandafter{\the\WF@everypar}% \let\parshape\@@parshape \let\@setpar\@@setpar } \toks1=\expandafter{\@arrayparboxrestore}% \toks2=\expandafter{\clearpage}% \edef\@tempa{% \def\noexpand\@arrayparboxrestore{\the\toks0 \the\toks1}% \def\noexpand\clearpage {\noexpand\protect\noexpand\WFclear \the\toks2}}% \expandafter \endgroup\@tempa % \end{macrocode} % % Donald Arseneau classifies the following macro as the one % that “pampers the RevTeX's stupidity”. % \begin{macrocode} \@ifundefined{@capwidth}{\let\@capwidth\hsize}{}% % \end{macrocode} % % This one, instead, issues a warning if a specific name conflicts % with another. % \begin{macrocode} \def\WF@conflict{\WF@warning {\WF@wfname used inside a conflicting environment}}% % \end{macrocode} % % While this one issues a warning when a wrapping environment is % too close to another one. % \begin{macrocode} \def\WF@collision{\WF@warning{Collision between wrapping environments}}% % \end{macrocode} % % And this one is when two wrapping environments are too close to % one another so that the second one is forced to float. % \begin{macrocode} \def\WF@fltmes{% message for floats \ifWF@float \WF@info{\WF@wfname floats}% \else \WF@warning{Stationary \WF@wfname forced to float}% \fi } % \end{macrocode} % % These two aliases are just service macros for this package; in % particular, the second one is used to insert info of any kind % within a source file. % \begin{macrocode} \let\WF@warning\@warning \let\WF@info\@gobble % \end{macrocode} % % Arseneau says that his \pack{wrapfig} package is already compatible % with package \pack{float.sty}, since, after defining a new float % \meta{foo}, it suffices to define the new environment % \Env{wrap\meta{foo}}. This fork version of his package should do % the same: is suffices to mimic the definitions of environments % \Env{wrapfigure} or \Env{wraptable}. % % Here there is some Arseneau's code that renders his \pack{wrapfig} % code compatible with \cs{newfloat} of class \class{memoir}, and % with \cs{newfoatlist} of package \pack{ccaption}. We leave his code % hereafter; but we did not test it with this package. % \begin{macrocode} \let\WF@floatstyhook\relax % \@ifundefined{newfloat}{}{% \newfloat comes from somewhere besides % float.sty \@ifundefined{restylefloat}{% \@ifclassloaded{memoir}{% \toks@=\expandafter\expandafter\expandafter {\csname\string\newfloat\endcsname [{#1}]{#2}{#3}{#4}% \newenvironment{wrap#2}{\wrapfloat{#2}}{\endwrapfloat}% }% Mmmm; this might be wrong. Not tested \edef\@tempa{\def\expandafter\noexpand\csname\string\newfloat\endcsname [##1]##2##3##4{\the\toks@}}% \@tempa }% end memoir support {}% other origins of \newfloat here? }{% float.sty handler. Ops: Two versions for different versions % Changing \floatstyle or \restylefloat changes \newfloat too. \@ifundefined{float@restyle}% {% older float.sty \toks@=\expandafter{\restylefloat{#1}% env. might be undefined \@namedef{wrap#1}{% \def\@captype{#1}\@nameuse{fst@#1}% \def\WF@floatstyhook{\let\@currbox\WF@box \columnwidth\wd\WF@box \global\setbox\WF@box\float@makebox}% \@ifnextchar[\WF@wr{\WF@wr[]}}% \expandafter\let\csname endwrap#1\endcsname \endwrapfigure }% \edef\@tempa{\def\noexpand\restylefloat##1{\the\toks@}}% }{% newer float.sty: uses \float@restyle, and \float@makebox % takes width arg \toks@=\expandafter{\float@restyle{#1}% env. might be undefined \@namedef{wrap#1}{\def\@captype{#1}\@nameuse{fst@#1}% \def\WF@floatstyhook{\let\@currbox\WF@box \global\setbox\WF@box\float@makebox{\wd\WF@box}}% \@ifnextchar[\WF@wr{\WF@wr[]}}% \expandafter\let\csname endwrap#1\endcsname \endwrapfigure }% \edef\@tempa{\def\noexpand\float@restyle##1{\the\toks@}}% }% \@tempa % perform redefinitions % }% end float.sty handler }% end redefinitions of \newfloat \ifcsname newfloatlist\endcsname% support ccaption.sty \toks@=\expandafter\expandafter\expandafter {\csname\string\newfloatlist\endcsname [{#1}]{#2}{#3}{#4}{#5}% \@namedef{wrap#2}{\wrapfloat{#2}}% \expandafter\let\csname endwrap#2\endcsname \endwrapfloat }% \edef\@tempa{% \def\expandafter\noexpand\csname\string\newfloatlist\endcsname [##1]##2##3##4##5{\the\toks@}}% \@tempa \fi % \end{macrocode} % We never described the package options; this code was present % in Arseneau's code and ve leave it here, with the necessary % package name change. We think that this \opz{verbose} option % was and remains useless, since the instances of command % \cs{WF@info} were mostly commented out in the original code; % in any case, input of this code is stopped if the % \cs{DeclareOption} command is not defined; this command was % defined with \LaTeXe; therefore this is a residual of the old % times when \LaTeXccix was still in use, more than 25 years % ago\dots % \begin{macrocode} \@ifundefined{DeclareOption}{\endinput}{% \def\WF@warning{\PackageWarning{wrapfig2}}% \DeclareOption{verbose}{\def\WF@info{\PackageInfo{wrapfig2}}}% \ProcessOptions \AtEndDocument{\WFclear}}% \endinput % \end{macrocode} %\iffalse % %\fi % \Finale % %^^A \endinput