% \iffalse
% !TEX encoding = UTF-8 Unicode
% Remember to use \StopEventually{}, otherwise no Check Sum
%<*internal>
\begingroup
\input docstrip.tex
\keepsilent
\preamble
Copyright (C) 1991-2004 by Donald Arseneau (asnd@triumf.ca)
Copyright (C) 2021-2024 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 this 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>
[2024-01-18 v.7.0.0 Wrap text around figures, tables, framed text blocks]
%
%<*driver>
%
\documentclass{ltxdoc}\errorcontextlines=100
\hfuzz 10pt
\usepackage[greek.ancient, english]{babel}
\usepackage[utf8]{inputenc}% for vintage exec.s
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{mflogo}
\usepackage{multicol,fancyvrb,verbatim,microtype,graphicx}
\usepackage{amsmath,kantlipsum,wrapfig2,xspace}
%
\GetFileInfo{wrapfig2.dtx}
\title{The \textsf{wrapfig2} package}
\author{Claudio Beccari\qquad E-mail: \texttt{claudio.beccari at gmail.com}}
\date{Version \fileversion~--~Last revised \filedate.}
%
\providecommand*\diff{\mathop{}\!\mathrm{d}}
\providecommand*\ped[1]{\ensuremath{_{\mathrm{#1}}}}
\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\opt{}
\renewcommand\opt[1]{\textsl{\meta{#1}}}
\providecommand*\Bambiente[1]{\texttt{\char92begin\{#1\}}}
\providecommand*\Eambiente[1]{\texttt{\char92end\{#1\}}}
\let\Bamb\Bambiente \let\Benv\Bamb
\let\Eamb\Eambiente \let\Eenv\Eamb
\ProvideDocumentCommand\goodpagebreak{O{4}}{%
\dimen10=#1\baselineskip
\dimen8=\dimexpr\pagegoal-\pagetotal\relax
\ifdim\dimen8 < \dimen10 \newpage\fi}
\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}
\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 package \pack{wrapfig2} is a fork that extends Donald
% Arseneau's package \pack{wrapfig} (version 3.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 original \Env{wrapfigure}
% and \Env{wraptable}, namely \Env{wraptext}; it may be used to
% wrap a small framed text block on a possibly coloured
% background; the philosophy of this new environment is
% similar to that of the other two environments, but the syntax
% was different with version~4 of this package, and is very
% similar with version 5.0; a further important enhancement is
% implemented in versions~6 and~7. Fall back options are
% available for backwards compatibility.
%
% This version 7 is a new implementation of the \Env{wraptext}
% environment, in the sense that it does not make use of the
% \pack{curve2e} package so as to avoid some interferences with
% other user selected packages.
% \end{abstract}
%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% {\color{red}\paragraph{Caution} This package requires a fairly
% recent \LaTeX kernel, otherwise it won't work; any \LaTeX
% kernel dated at least 2019 is~OK.
%
% Read carefully this document, because the are several pieces
% of information concerning other packages that may be
% incompatible with this \pack{wrapfig2} version. Special
% warnings are typeset in red as this one.}
%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \section{Introduction}
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% The purpose of this package is manyfold. On one side it tries
% to upgrade the original software by Donald Arseneau by
% using some parts of the \LaTeXiii modern language. On another
% it creates a new environment, with the same philosophy
% of the original Arseneau's ones, such that users
% can emphasise short blocks of wrapped text by framing them
% while typesetting the text on a coloured background.
%
% The original software had some idiosyncrasies; Donald Arseneau
% described them in the documentation of his package; we must
% admit that such idiosyncrasies might have been just slightly
% reduced; but in any case, in order to avoid such peculiar
% anomalies, it is sufficient to wrap the inserted object with a
% reasonable number of lines, i.e. with reasonably long
% paragraphs.
%
% The above implies that no wrapped object code should be
% specified in the source file close the end of a paragraph,
% unless it is followed by other paragraphs; again, no object
% code should be inserted within any list; nor even close to the
% end or to the beginning of a 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 object has a numbered caption, the
% number might not result in the correct sequence with the
% normal corresponding floating objects.
%
% Therefore the usefulness of the wrapping procedure depends
% very much on the users' ability to move around their code
% until a suitable position is found. Certainly a good place is
% within a longish paragraph especially at the beginning of a
% section; or at the beginning of a chapter that starts with
% plain text, in particular just at the beginning of the chapter
% first paragraph.
%
% The code of this package does very little, if anything, to
% correct such idiosyncrasies. They are caused by the
% limitations of the \cs{ShipOut} \LaTeXe kernel macro, and very
% little we were able to do in addition to what Arseneau already
% did.
%
% Another purpose of this package is to add another optional
% argument 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 the value computed by the default
% algorythm devised by Arseneau.
%
% We assume that most users first use the software to insert an
% object to be wrapped by the surrounding text without
% specifying any value with the specific optional argument; then
% they evaluate the result, and if the space below the wrapped
% object is too large, or if such space is too small they count
% the necessary number of lines and specify 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 computed
% value.
%
% A further purpose of this package is to define a new
% environment, \Env{wraptext}, to wrap a framed text block
% typeset on a possibly coloured background.
% On \texttt{tex.stackexchange} 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
% and used the \Env{tcolorbox} 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 it should not be too different from a
% half of the wrapping text measure. In facts, with a value too
% different from \texttt{0.5\cs{linewidth}} either the wrapped
% text has problems with inter word spacing and hyphenation
% because of the small measure, or, on the opposite, the
% indented lines of the wrapping text would have similar
% problems.
%
% Notice that the first implementation of this package,
% version~4, achieved the desired result but there were two
% drawbacks: $(a)$ the syntax was rather different from that of
% the other environments, and $(b)$ any possible caption was
% typeset within the same framing environment. In version~5 both
% drawbacks were eliminated, but since the environment syntax is
% different, in oder to assure backwards compatibility a package
% option was defined in order to fall back to the previous
% version~4 behaviour; nevertheless we discourage this solution,
% and invite uers to use the most recent version. In version 6
% the \Env{wraptext} environment was further enhanced so as to
% accept several \texttt{key=value} settings concerning the text
% appearance, the colours, and other details relative to the
% wrapping process. Again another fall back option was defined
% in order to use the same functionalities of version~5; again
% we discourage using any fall back solution. This version~7
% does not use anymore the \pack{curve2e} functionalities, but
% resorts to package \pack{pict2e}; the code is simpler and
% several dozen lines shorter.
%
%^^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.
%
% 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 to be maintained identical. When the
% optional star is specified, the \meta{indented lines number}
% is interpreted as the correction to the computed value.
%
% Notice the different syntax in versions~4, 5, 6 and~7 of the
% \Env{wraptext} syntax.
%
% \begin{ttsintassi}\setfontsize{8.00}
%\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}
%~
%\textnormal{\color{red}Package option \opt{WFold} required for backwards compatibility with version 4.*}.
%~
%\Bambiente{wraptext}\oarg{location}\barg{width}\aarg{indented line number correction}\parg{caption label}
%\qquad\meta{text to frame}
%\Eambiente{wraptext}
%~
%\textnormal{\color{red}Package option \opt{WFfive} required for backwards compatibility with version 5.*}.
%~
%\Bambiente{wraptext}\oarg{indented lines number correction} \marg{location} \oarg{overhang} \marg{width}
%\qquad \meta{optional colour settings}
%\qquad\cs{includeframedtext}\oarg{insertion measure}\marg{text to frame}\oarg{\meta{frame thickness},\meta{frame separation}}\oarg{radius}
%\Eambiente{wraptext}
%~
%\textnormal{\color{red} No package option required for versions~6.* and~7.*}.
%~
%\Bambiente{wraptext}\oarg{indented lines number correction}\marg{location}\oarg{overhang}\marg{width}
%\cs{includeframedtext}\oarg{insertion measure}\marg{text to frame}\oarg{key=value settings}\oarg{radius}
%\Eambiente{wraptext}
% \end{ttsintassi}
%
% \noindent
%\textcolor{red}{Please notice that the \Env{wraptext}
% environment does not require any optional star, because the
% specified indented lines number is always interpreted as its
% \emph{correction, not its absolute value}; this difference is
% clearly marked in the above syntax medallion. If users
% specified the star in similitude with the other two
% environments, with versions~5.* to~7.* the unnecessary
% star produces a strongly emphasised warning message visible in
% the editor console and in the \texttt{.log} file. With the old
% version~4.* the unnecessary star is printed as part of the
% text to be framed.
%\newline
% Please notice also that all three \Env{wraptext} syntaxes,
% thanks to differently delimited optional arguments with
% peculiar default values, become very similar when such
% optional arguments are reduced to a minimum; only the
% \meta{location} argument is delimited by brackets with the old
% version and with braces with the newer ones.}
%
% It may be useful to compare the \cs{includeframedtext} macro,
% used to insert a framed test into a \Env{wraptext}
% environment, with \cs{includegraphics}, used to insert an
% external image into a \Env{figure} environment. Their
% functions are similar even if they refer to different objects
% to include. Their codes are obviously very different and the
% latter is much more complex than the former. The solution for
% a framed text used by version~4 was inspired by the
% information found on \texttt{tex.stackexchange} that used the
% very elaborate \Env{tcolorbox} environment; version~5 used
% instead a much simpler command \cs{framedbox} based on the
% \pack{curve2e} package macro \cs{Curve}. Version 6.* admits
% many settings, not just the \meta{frame thickness} and the
% space around the framed text, but several others ones
% collectively indicated with \meta{settings}; such settings
% refer to colours, dimensions, styles, and so on, relative to
% the text and to the frame; moreover they are set by
% means of the \texttt{key=value} syntax. Version~7.* does not
% use any more the \pack{curve2e} macro \cs{Curve},
% but it uses the simpler low level macros defined in package
% \pack{pict2e}. The syntax is the same as with version~6.* but
% the inner workings are much different and faster to execute.
% As it can be seen, the logic, not the code, behind these
% different macros are very similar.
%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\section{Examples}
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% We display some examples by using fake objects and suitably
% long paragraphs; some fake-language long-paragraphs are
% obtained by means of the \pack{kantlipsum} package
% functionalities; they are typeset with an italic font in order
% to distinguish their text from the normal one.
%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{A wrapped figure}
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
%\begin{wrapfigure}{r}{50mm}
%\centering\unitlength=1mm
%\begin{picture}(40,30)
%\polyline(0,0)(0,30)(40,0)(0,0)(40,30)(0,30)
%\Line(40,0)(40,30)
%\end{picture}
%\caption{A rectangle with its diagonals}\label{fig:figure}
%\end{wrapfigure}
%{\itshape \kant[1]}
% The code used to type figure~\ref{fig:figure} is the following:
%
%\begin{flushleft}\ttfamily\obeylines%
%\noindent\Bambiente{wrapfigure}\Marg{r}\Marg{50mm}
%\cs{centering}\cs{unitlength}=1mm
%\Bambiente{picture}\texttt{(40,30)}
%\cs{polyline}\texttt{(0,0)(0,30)(40,0)(0,0)(40,30)(0,30)}
%\cs{Line}\texttt{(40,0)(40,30)}
%\Eambiente{picture}
%\cs{caption}\Marg{A rectangle with its diagonals}\cs{label}\Marg{fig:figure}
%\Eambiente{wrapfigure}
%\Marg{\cs{itshape} \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%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\begin{wraptable}[-1]{l}*
%\centering
% \begin{tabular}{cc}
% \hline
% First & Second\\
% Third & Fourth\\
% \hline
%\end{tabular}
%\caption{A small table}\label{tab;small-table}
%\end{wraptable}
%{\itshape \kant[2]}
%
% The wrapped small table~\ref{tab;small-table} has been typeset
% by means of the following code.
%\begin{flushleft}\ttfamily\obeylines
%\Bambiente{wraptable}\Oarg{-1}\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}
%\Marg{\cs{itshape} \cs{kant}\Oarg{2}}
%\end{flushleft}
% Notice the absence of the braced width value; as said below,
% 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 a smart use of this width
% parameter might yield better looking results.
%
% Wrapping a small table is a little more difficult than
% wrapping a figure, because the width of the inserted object is
% not exactly known in advance, and it is difficult to estimate;
% therefore it might be necessary to execute several trial
% compilations. 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 \meta{width} parameter is
% completely omitted together with its braces; 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 such feature.
%
% 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, and no asterisk
% is specified, the result is shown in
% table~\ref{tab:wrong-wrapped-table}, but it is a very
% 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}\label{tab:wrong-wrapped-table}
%\end{wraptable}
%{\itshape \kant[2]}
%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{A wrapped text}
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{wraptext}{l}
% \includeframedtext{Text, text, text, text, text, text, text, text, text, text, text.}
% \end{wraptext}
% {\itshape \kant[3]}
%
% The above example was typeset with this simple code:
%\begin{flushleft}\obeylines
% \Bamb{wraptext}\Marg{l}
% \cs{includeframedtext}\Marg{\ttfamily Text, text, text, text, text, text, text, text, text, text, text.}
% \Eamb{wraptext}
% \Marg{\cs{itshape} \cs{kant}[3]}
%\end{flushleft}
%
% The result is the same as that obtainable with version~4 of
% this package, but the \meta{location} argument specification
% is braced instead of bracketed.
%
% Remember, though, what was previously remarked about using an
% unnecessary optional star with the \Env{wraptext} environment;
% with this package versions~5 to~7 the unnecessary star
% produces a warning message, while with version~4 it prints the
% star as if it was part of the text to be wrapped.
%
% If a caption is specified, version~4 would print it within the
% framed box, while versions~5,~6, and~7 print a visible warning
% message and in the \texttt{.log} file.
%
% \begin{wraptext}{r}
% \includeframedtext{Text, text, text, text, text, text, text, text, text, text, text.}
%\caption{A wrapped text}%
% \end{wraptext}
% {\itshape \kant[3]}
%
% With version~5 users have the possibility of choosing the
% colours for all three elements of the framed text; if within
% the \Env{wraptext} environment and before using
% \cs{includeframedtext} the colours are set different from the
% default light grey for the background, black for the text,
% and almost black for the frame:
% \begin{ttsintassi}
%\cs{SetWFfrm}\marg{frame colour}
%\cs{SetWFbgd}\marg{background colour}
%\cs{SetWFtxt}\marg{text colour}
% \end{ttsintassi}
% Such commands, in versions~6 and~7, are already taken care by
% the relevant \texttt{key=value} options, while with version~5
% these are user commands. See figure~\ref{fig:framed text}
% typeset with various version~7 options.
%
%\begin{figure}
%\makebox[\textwidth]{\includeframedtext{Text}[insertionwidth=0.45\linewidth]
%\hfill
%\includeframedtext{Text}[insertionwidth=0.45\linewidth,fboxrule=1mm]}\\[2ex]
%^^A
%\makebox[\textwidth]{\includeframedtext{Text}[insertionwidth=0.45\linewidth,textcolor=red,fboxrule=2pt]
%\hfill
%\includeframedtext{Text}[insertionwidth=0.45\linewidth,fontstyle=\Large]}\\[2ex]
%^^A
%\makebox[\textwidth]{\includeframedtext{Text}[insertionwidth=0.45\linewidth,backgroundcolor=yellow]
%\hfill
%\includeframedtext{Text}[insertionwidth=0.45\linewidth, framecolor=blue, backgroundcolor=yellow, fboxrule=1mm]}\\[2ex]
%^^A
% \makebox[\textwidth]{\includeframedtext{Text}[insertionwidth=0.5\linewidth, fboxrule=0pt, backgroundcolor=cyan, textcolor=white, fontstyle=\Huge\bfseries]}
%\caption{Some framed text boxes with different dimensional
% parameters, different font size, and different colours}\label{fig:framed text}
%\end{figure}
%
% Figure~\ref{fig:framed text} used the following code, where it
% is evident that the \cs{includeframedtext} command is
% available even outside the \Env{wraptext} environment.
%\begin{flushleft}\ttfamily\obeylines
%\Bambiente{figure}
%\cs{makebox}[\cs{textwidth}]\Marg{\cs{includeframedtext}\Marg{Text}\%
%\qquad [insertionwidth=0.45\cs{linewidth}]
%\quad\cs{hfill}
%\quad\cs{includeframedtext}\Marg{Text}\%
%\quad [insertionwidth=0.45\cs{linewidth},fboxrule=3pt]}\cs{\char92}[2ex]
%\%
%\cs{makebox}[\cs{textwidth}]\Marg{\cs{includeframedtext}\Marg{Text}\%
%\quad [insertionwidth=0.45\cs{linewidth},textcolor=red,fboxrule=2pt]
%\quad\cs{hfill}
%\quad\cs{includeframedtext}\Marg{Text}\%
%\qquad[insertionwidth=0.45\cs{linewidth},fontstyle=\cs{Large}]}\cs{\char92}[2ex]
%\%
%\cs{makebox}[\cs{textwidth}]{\cs{includeframedtext}\Marg{Text}\%
%\quad[insertionwidth=0.45\cs{linewidth}, backgroundcolor=yellow]
%\quad\cs{hfill}
%\quad\cs{includeframedtext}\Marg{Text}\%
%\qquad[insertionwidth=0.45\cs{linewidth},framecolor=blue,
%\qquad backgroundcolor=yellow,fboxrule=1mm]}\cs{\char92}[2ex]
%\%
% \cs{makebox}[\cs{textwidth}]{\cs{includeframedtext}\Marg{Text}\%
%\quad [insertionwidth=0.5\cs{linewidth}, fboxrule=0pt,
%\qquad backgroundcolor=cyan,textcolor=white,fontstyle=\cs{Huge}\cs{bfseries}]}
%\cs{caption}\Marg{Some framed text boxes ... different colours}
%\cs{label}\Marg{fig:framed text}
%\Eambiente{figure}
%\end{flushleft}
%
% As it is possible to notice from figure~\ref{fig:framed text},
% versions~6 and~7 add another facility; the colours and
% dimensions of the elements of the wrapped objects are inserted
% as \textit{key=value} options to the \cs{includeframedtext}
% third argument \meta{settings}; its default value is “empty”;
% users can introduce as many options as they desire, among the
% valid ones; if an option is misspelled or its value is not
% coherent with its nature, either the option is ignored, or an
% error is raised. The valid options are the following ones;
% they are listed in alphabetical order, because the options
% described with the \texttt{key=value} syntax do not require
% either a specific order or their presence; users can therefore
% specify from zero to nine options.
%\begin{description}
%^^A
%\item{\ttfamily backgroundcolor}
% sets the background colour among those defined by the default
% set provided by package \pack{xcolor}. The default colour is
% light grey.
%^^A
% \item{\ttfamily fboxrule}
% sets the thickness of the frame; a zero value
% is allowed, otherwise it should not be smaller than
% \texttt{0.4pt}; on the opposite it should not be set too large
% and \texttt{1mm} appears as a thick enough frame around the
% wrapped text.
%^^A
% \item{\ttfamily fboxsep}
% sets the distance of the frame from the wrapped text; by
% default it is set to \texttt{1ex}; also in this case it is
% better to avoid exaggerations. Notice that the default value
% depends on the wrapped text font x-height.
%^^A
%\item{\ttfamily fontstyle}
% sets any available \emph{declaration} that changes the
% characteristics of a font: size, series, shape; it is possible
% to use also the \cs{usefont} command with all its four
% arguments, even the font encoding. This \pack{wrapfig2} has
% available also the \cs{setfontsize} command that can select
% any size with any font that has available at least a stepwise
% continuous size set; for example the Latin Modern fonts have a
% stepwise continuous size set, while Computer Modern have
% available only a discrete size set.
%^^A
%\item{\ttfamily framecolor}
% sets the color of the frame; the colours available are those
% available with package \pack{xcolor} to which no options have
% been specified; see its documentation and in case load
%\pack{xcolor} with the desired options before this package
% \pack{wrapfig2}. The default colour is a very dark grey.
%^^A
%\item{\ttfamily insertionwidth}
% sets the insertion width; as it was previously specified, if
% this width is too small or too large it will be automatically
% reassigned a value within the allowed range.
%^^A
%\item{\ttfamily radius}
% sets the optional radius of the frame rounded “corners”; if it
% is not specified, such radius is equal to the default value of
% \cs{fboxsep}. Although it is possible to use it, we suggest to
% abide from using it.
%^^A
% \item{\ttfamily scalefactor}
% sets the value that establishes a reasonable range of the
% insertion width; users can specify any value in the range
% $xy_0 = y\ped{min} \leq y \leq y\ped{max} = y_0/x$, where
% $y_0$ is the default value, and $x$ is the scaling factor that
% by default equals $0.8$; this means that if $y_0$ equals half
% the current measure, the inserted wrapped text produces an
% indentation of the wrapping lines approximately between 60\%
% and 40\% the current measure; the wrapped text should never
% have a too short measure and the wrapping indented lines never
% have a too short measure. If users specify a different value
% to this key, they might get problems with inter word spacing
% and with hyphenation.
%^^A
%\item{\ttfamily textcolor}
% sets the text colour among those available with the default
% set provided by package \pack{xcolor}. The default colour is
% black.
%^^A
%\end{description}
%
% These versions~6 and~7 have a more flexible way compared to
% version~5 to specify the details relative to the framed text,
% but they are relevant only for the \cs{includeframedtext}
% command; the syntax for the \Env{wraptext} environment opening
% command is identical. As it was previously shown, the syntax
% of environment \Env{wraptext} for versions~7,~6, and~5 is
% practically identical to the one used for both other
% environments; actually, as it can be seen below in the code
% description of versions~7, 6 and~5, it has a fairly longer
% definition; it is required by the necessity of avoiding the
% \cs{caption} changes foreseen in package{wrapfig} when
% \pack{float} is used to define another floating object, but in
% effects the new definition of the \Env{wraptext} environment
% uses the same \cs{wrapfloat} and \cs{endwrapfloat} commands.
%
% In all three cases the \meta{width} parameter is a
% \emph{braced optional argument}; for the \Env{wraptext}
% environment 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 \cs{parbox}
% argument; the measure of this text box 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 paragraph cannot be too large, otherwise
% the indented wrapping lines, generally justified, might get a
% bad word spacing. As it was already explained, it is
% recommended 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}. In any case versions~7 to~5 of \Env{wrapfig2}
% reset any specified width outside the above range to the
% nearest range bound.
%
%^^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 \emph{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{location} 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 (possibly questionable)
% personal choice we prefer to place the wrapped object at the
% left of the text, without floating it and irrespective of the
% folio parity.
%
%\begin{wraptext}{l}{0.5\textwidth}%
%\includegraphics[width=\hsize]{stele-todi-small}
%\caption{The Todi stela written in Gallic and Latin.
% Gregorian Etruscan Museum in Rome.}\label{txt:todi-stela}
%\end{wraptext}
%{\itshape\kant[4]}
%
% As in the previous examples, we prefer to specify the wrapping
% environment just 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 used
% indented lines and to apply the remaining number (and the
% \cs{overhang} amount) 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
% \LaTeX 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.
%
% Some of these idiosyncrasies might be avoided if the wrapped
% objects are allowed to float. Even Arseneau's \pack{wrapfig}
% allowed this feature, but according to our experience floating
% objects may solve the problems produced when they are in the
% chosen position, but they may create other problems; for
% example, if the chosen position falls close the the end of a
% page, and after that position a list starts; if the object
% floats to the beginning of the next page, and the list is
% still being processed, other errors emerge. For this reason
% floating wrapped objects are not so safe, and the best
% solution would be to chose their best position “by hand”.
%
% Juan Luis Varona Malumbres, whom we thank very much, noticed
% that if the space left at the bottom of a page is scarse, it
% may be that a section title falls alone at the bottom of the
% page and the wrapping environment with its wrapping text gets
% typeset on the next page; this of course is not acceptable. We
% found the place to correct and versions~7 and~6 more often
% than not do not exhibit any more this “feature”. Unfortunately
% in some rare cases this “feature” pops up again; a
% \cs{newpage} command before the section title solves the
% problem. This rare feature could be avoided if the sectioning
% commands are redefined; but this would imply modifications to
% a large number of redefinitions due to the large varieties of
% classes and packages that redefine such sectioning commands.
%
% 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, or better, it is still available
% in versions~7, 6 and~5, but we recommend to abide from using
% it; we believe that a wrapped text logically pairs the
% wrapping text; of course this is just a personal opinion.
%
% 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; this insertion width can be specified but
% it should not be too different from its default value $y_0$,
% set to 50\% of the current measure. For the standard
% environments this parameter value appears to be mandatory;
% actually it really is a braced optional argument only for the
% redefined environments \env{wrapfigure} and \env{wraptable}.
%
% Matter of facts, for the \Env{wraptext} environment we defined
% a command in order to specify a factor $x$ so as to avoid
% getting the object width outside the range
% $xy_0 \leq y \leq y_0/x$, where $y_0$ is the preset default
% width; if the authors specified a value outside this range,
% the above environment automatically resets the insertion width
% $y$ to the nearest bound. Of course authors have the
% possibility to change the preset $x$ value, if they redefine
% the \cs{WFscalefactor} macro, but such resetting is strongly
% discouraged; the default value is~$0.8$.
%
%\begin{wraptext}{l}
%\includeframedtext{^^A
% \foreignlanguage{greek}{Κα᾽γὼ σὲ πατάξας διαλύσω τὸ κρανὶον}}
% \caption{A sample text in Greek}\label{txt:greek}
%\end{wraptext}
%{\itshape\kant[7]}
%
% If optional parameters are not used and the mandatory ones are
% reduced to a minimum (remember the \meta{width}, in spite of
% being braced is optional) the three environments produce the
% same results; the difference, in spite of the nature of the
% wrapped object differs only with the environment name.
% Text~\ref{txt:todi-stela} displays an \emph{image} that
% contains some text; it is reasonable to insert it with the
% \Env{wrapfigure} environment, but it is not absurd to insert
% it with the \Env{wraptext} one, as we did with
% text~\ref{txt:todi-stela}.
%
% The wrapped text may be written also in a foreign language,
% even if it uses a different alphabet. Evidently this language
% should be specified in the preamble of the author's document,
% either when using \pack{babel} or \pack{polyglossia}. The
% example text~\ref{txt:greek} was typeset with the following
% code:
%\begin{flushleft}\ttfamily\obeylines
%\Bamb{wraptext}\Marg{l}
%\cs{includeframedtext}\Marg{\%
%\qquad\cs{foreignlanguage}\Marg{greek}\Marg{\foreignlanguage{greek}{Κα᾽γὼ σὲ πατάξας διαλύσω τὸ κρανὶον}}}
%\cs{caption}\Marg{A sample text in Greek}\cs{label}\Marg{txt:greek}
%\Eamb{wraptext}
%\end{flushleft}
%
%^^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 other packages,
% such as \pack{float}, or classes, such as \class{memoir}.
% Besides floating, the main difference is the name of the
% caption “label”: Figure, Table, Algorithm, Example, and so on,
% in addition to the lists of such objects.
%
% 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}\setfontsize{9.275}\ttfamily\obeylines
%\Benv{wrapfloat}\Marg{figure}\oarg{line number}\marg{placement}\oarg{overhang}\marg{width}\meta{$\star$}
%\quad\qquad\meta{image}
%\Eenv{wrapfloat}
%\end{flushleft}
% Another \meta{object} might be wrapped by using:
%\begin{flushleft}\ttfamily\obeylines
%\Benv{wrapfloat}\marg{object name}\oarg{line number}\marg{location}\%
%\quad \oarg{overhang}\marg{width}\meta{$\star$}
%\qquad\qquad\meta{object}
%\Eenv{wrapfloat}
%\end{flushleft}
%
% By reading the documentation of the original \pack{wrapfig}
% package, it may be assumed that, if the floating
% \meta{location} 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. But, if the non floating \meta{location} codes
% are used, the presence of another \meta{floating object}
% environment appears to be unnecessary.
%
% This is actually possible by “cheating” a little bit: it can
% be actually wrapped any \meta{object} by using the
% \Env{wrapfigure} environment, while assigning a different name
% to the caption label; something similar to typeset a small
% figure within a non floating environment. The obvious draw
% back is that the caption is numbered as a figure.
%
% In order to avoid such drawbacks and to have a real floating
% \meta{other object} environment it is necessary to procede by
% defining a new real floating environment with that name. To do
% this task, \pack{wrapfig2} versions~5,~6, and~7 use the
% \pack{float} package.
%
% As it is possible to verify by reading the section where the
% code is documented, the operation is not that simple because
% \pack{float} redefines several internal macros that are
% incompatible with both \pack{wrapfig} and \pack{wrapfig2}.
% This is why, even with \pack{wrapfig2} in versions~5--7, that
% load the \pack{float} package, the code for this environment
% redefines the \cs{caption} command so that Arseneau had to
% define some adjusting macros in order to deal with something
% different from what it was with the \LaTeXe kernel. We did not
% modify what Arseneau defined, although it did not work
% correctly with the new \Env{text} floating environment.
% Therefore we reinstated the \LaTeXe kernel relevant
% definitions.
%
% It is possible that such resetting of the original definition
% is necessary also with floating objects defined by other
% means, for example by using the functionalities of the
% \class{memoir} class. We admit we did not test this package
% functionality with class \class{memoir};
% \textcolor{red}{feedback on this compatibility issue
% is very welcome}.
%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \section*{Acknowledgements}
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% We gratefully thank Donald Arseneau who gave the \TeX
% community the original \Env{wrapfig} package. For what
% concerns wrapped text, we did not use Arseneau's \pack{framed}
% package, because we wanted a frame with rounded corners.
% Nevertheless, while developing our package, we experimented
% also with his package that yields good results but with the
% ordinary right angle frame corners.
%
% Thanks to Heinrich Fleck who submitted to our attention the
% \texttt{tex.stackexchange} message where the problem of
% wrapping text was presented possibly for the first time. The
% solution presented in \texttt{tex.stackexchange} appears to be
% oversimple, almost trivial; especially it does not solve the
% problem of a caption if one is desired to describe that
% wrapped text. Moreover the solution of
% \texttt{tex.stackexchange} used in a very simple way the
% \Env{tcolorbox} environment, that behind the scenes uses a
% very heavy set of multifunctional macros that offer
% functionalities that are not required for this problem.
%
% Warm thanks also to Juan Luis Varona % Malumbres for his
% precious feedback and his suggestions.
%
% Herbert Voß spotted the necessity to follow a
% specific loading order if the \pack{amsmath}
% needs to be used; he was so kind to send us a
% bug notice together with a minimum working example.
% Thanks to Bruno Pagani who pinpointed the exact
% point that conflicted with \pack{wrapfig2} so
% that I could fix this conflict. Bruno Pagani
% discovered also that package \pack{amstext} is
% the source of this conflict and that this
% package is loaded not only by \pack{amsmath}
% but also by other packages such as, for example,
% by \pack{siunitx}.
%
% Many thanks to Ulrike Fisher who found a loading order problem
% reported on \texttt{tex.stackexchange} because a conflict with
% package \pack{circledsteps}, that should be loaded bifore
% \pack{wrapfig2}. Thanks a lot Ulrike.
%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \CheckSum{1382}
% \StopEventually{}
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%\iffalse
%<*package>
%\fi
%^^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 Arseneau's
% original code.
%
% The usual specification of the format name and date, and the
% identification of this specific package have been already
% specified by the \texttt{.dtx} file.
%
% First of all we check if certain packages have already been
% loaded; some of these packages, such as \pack{wrapfig}, that
% might have been previously directly loaded, or might have been
% loaded by other packages, are incompatible with this package
% \pack{wrapfig2}. such packages, as \pack{caption} or
% \pack{subcaption}, redefine some internals that we did not
% want to replace so as to avoid other possible
% incompatibilities. We first check if a specific macro with the
% \texttt{WF} prefix has already been defined; if so, this
% package \emph{loading} is aborted with a very visible error
% message. In contrast the \emph{job} is not aborted, because
% the presence of the original \pack{wrapfig} package might
% still be sufficient; evidently there will be many errors if
% some new user commands or environments are used.
%
%{\color{red}\paragraph{Caution} Besides the evident error
% message, that might be neglected by the user, the job may
% continue but it may produce several errors difficult to
% interpret. Please, in these cases read the \texttt{.log} file
% and look for error messages; there you are going to discover
% what has gone wrong with your way of using this package.}
%
% \begin{macrocode}
\ifcsname c@WF@wrappedlines\endcsname
\PackageError{wrapfig2}{
\MessageBreak
**************************************************\MessageBreak
Package `wrapfig' has already been loaded perhaps \MessageBreak
by other packages, for example caption or subcaption.\MessageBreak
Such packages are incompatible with wrapfig2 \MessageBreak
Loading of`wrapfig2' is aborted \MessageBreak
**************************************************\MessageBreak
}{You might type X and might get along without\MessageBreak
this package if you don't use the new environment \MessageBreak
`wraptext' and the new commands; otherwise you get \MessageBreak
errors about such environment not being defined; \MessageBreak
you must kill your job!}
\expandafter\endinput\fi
% \end{macrocode}
%
% We keep the original definition of the
% \cs{WF@warning} and the original definition of
% the \opt{verbose} option; but we add the new
% \opt{WFold} and \opt{WFfive} options in order to
% fall back to the functionalities of the previous
% version~4 or~5, at least for what concerns the
% \Env{wraptext} environment.
%
%
% \begin{macrocode}
\def\WF@warning{\PackageWarning{wrapfig2}}
\DeclareOption{verbose}{\def\WF@info{\PackageInfo{wrapfig2}}}
\newif\ifWFnew \let\ifWFnew\iftrue
\newif\ifWFfive \let\ifWFfive\iffalse
\DeclareOption{WFold}{\let\ifWFnew\iffalse}
\DeclareOption{WFfive}{\let\ifWFnew\iffalse\let\ifWFfive\iftrue}
\ProcessOptions
% \end{macrocode}
%
% We load the \pack{etoolbox} package, in order to have
% available its powerful macros.
%
% If it 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}
% The availability of these \emph{deprecated} types eases the
% treatment of the backwards compatibility of this software with
% the original \pack{wrapfig} and \pack{wraptable}
% functionality. It deals with the mandatory \meta{width}
% argument of the \Env{wrapfigure}, \Env{wraptable}, the new
% \Env{wraptext}, and \Env{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}
% with a \texttt{0pt} default value.
%
%
% \begin{macrocode}
\@ifpackageloaded{xparse}{}{\RequirePackage{xparse}}
\@ifpackageloaded{xfp}{}{\RequirePackage{xfp}}
\@ifpackageloaded{etoolbox}{}{\RequirePackage{etoolbox}}
\@ifpackageloaded{float}{}{\RequirePackage{float}}
\@ifpackageloaded{color}{}%
{\@ifpackageloaded{xcolor}{}%
{\RequirePackage{xcolor}}%
}
\@ifpackageloaded{pict2e}{}{\RequirePackage{pict2e}}
\@ifpackageloaded{xkeyval}{}{\RequirePackage{xkeyval}}
% \end{macrocode}
% Notice that we loaded the \pack{xcolor} package without any
% option in order to avoid option clash errors, and users who
% want to use \pack{xcolor} with options should load it
% \emph{before} this package \pack{wrapfig2}, versions~5--7.
% {\color{red}Users are warned to pay attention to avoid loading
% the \pack{color} package: they should never load it
% before or after loading \pack{wrapfig2}; if they do, they
% receive various warning or error messages because
% \pack{xcolor} redefines some \pack{color} internal commands;
% everything is explained in the \pack{xcolor} documentation.}
%
% In order to avoid conflicts with \pack{amstext}
% and its |\text| command, we have to save its
% definition before actually executing any part of
% this package, and restore its value at the end
% of this package; see the second part of this
% procedure at the very end of this package.
% \begin{macrocode}
\ifcsdef{text}{\let\amsTextText\text}{}
% \end{macrocode}
%
% In order to define the new floating object \texttt{text} we
% have to load the package \pack{float}, but only if versions~6
% or later are used; in other words, only if the \cs{ifWFnew}
% switch is \texttt{true}.
%
% If the \cs{chapter} command is or is not defined we have to
% load the \pack{float} package with different options; for
% example, if we are using the \class{article} class, the
% \cs{chapter} command is undefined, and the last option might
% become \opt{section} (although in the standard \class{article}
% class, no floating object counter belongs to any other counter
% reset list) so as to have the floating \Env{text} environment
% correctly reset the right counter with the right label before
% the object number.
% \begin{macrocode}
\ifboolexpr{ bool{WFfive} or bool{WFnew} }%
{\floatstyle{plain}%
\ifcsname chapter\endcsname
\newfloat{text}{tbp}{lotx}[chapter]%
\else
\newfloat{text}{tbp}{lotx}%
\fi
\floatname{text}{Text}% redefine to localise in other languages
\let\WF@text@caption\float@caption
}{}
% \end{macrocode}
%
% If the users wanted to add the \texttt{text} counter to some
% sectioning command counter reset list, they might use the
% \cs{counterwithin} command now available with the recent
% updates of the \LaTeX kernel; see the \LaTeX newsletter~28 for
% details (terminal command: \texttt{texdoc ltnews28}). Its
% syntax is the following:
%\begin{ttsintassi}
%\cs{counterwithin}\marg{counter}\marg{main counter reset list}
%\end{ttsintassi}
%
% Next we define some dimensions, boxes, token registers,
% \TeX counters, and alias names, plus some color and macro
% definitions. The \cs{WF@correctlines@switch} \TeX numeric
% register (not a \LaTeX counter) is going to be used as a
% boolean switch: if its value is zero, il means “false”,
% otherwise it 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
\newcount\c@WF@wrappedlines
\newbox\WF@box
\newbox\NWF@box
\newtoks\WF@everypar
\newif\ifWF@float
\newcount\WF@correctlines@switch
\let\@@parshape\parshape
\let\WF@@everypar\everypar
\newlength\WFfrthick
\newlength\WFfrgap
\newlength\WFfrwidth
\newlength\WFfrheight
\newdimen\insertwidth
\newlength\WFXR \newlength\WFYD
\newlength\WFXL \newlength\WFYU
\newdimen\radius
\newdimen\WFinsertwidthL
\newdimen\WFinsertwidthH
\definecolor{WFbackground}{rgb}{0.95,0.95,0.95}
\definecolor{WFframe}{rgb}{0.1,0.1,0.1}
\colorlet{WFtext}{black}
\def\SetWFbgd#1{\colorlet{WFbackground}{#1}}
\def\SetWFfrm#1{\colorlet{WFframe}{#1}}
\def\SetWFtxt#1{\colorlet{WFtext}{#1}}
\def\WFsplitdimens#1,#2!{\fboxrule=#1\relax\fboxsep=#2\relax}
\providecommand\setfontsize{}
\RenewDocumentCommand\setfontsize{O{1.2} m}{%
\fontsize{#2}{\fpeval{#1*#2}}\selectfont}
\def\WFscalefactor{0.8}%
\newcommand*\WFscalewidth{%
\WFinsertwidthL=\fpeval{\WFscalefactor*0.5\columnwidth}\p@
\WFinsertwidthH=\fpeval{0.5\columnwidth/\WFscalefactor}\p@
\ifdim\insertwidth<\WFinsertwidthL
\insertwidth=\WFinsertwidthL
\else
\ifdim\insertwidth>\WFinsertwidthH
\insertwidth=\WFinsertwidthH
\fi
\fi
}%
% \end{macrocode}
% We define several options that use the \texttt{key=value}
% syntax. Above we have already loaded the \pack{xkeyval}
% package that offers also some ‘X’ labeled macros that mimic
% the corresponding \LaTeXe kernel macros, but that are
% necessary for using the \pack{xkeyval} internal macros. We
% chose the \texttt{wraptext} option family name, because such
% options are to be used mostly within the
% \cs{includeframedtext} macro.
% The \cs{ExecuteOptionX} used here stands for a general
% initialisation of the listed options, but it will be used also
% within the \cs{includeframedtext} command in order to set the
% specified options for the specific use of this command.
% \begin{macrocode}
\DeclareOptionX{scalefactor}[0.8]{\def\WFscalefactor{#1}}
\DeclareOptionX{fboxrule}[1pt]{\fboxrule=#1}
\DeclareOptionX{fboxsep}[1ex]{\fboxsep=#1}
\DeclareOptionX{framecolor}[WFframe]{\SetWFfrm{#1}}
\DeclareOptionX{backgroundcolor}[WFbackground]{\SetWFbgd{#1}}
\DeclareOptionX{textcolor}[WFtext]{\SetWFtxt{#1}}
\DeclareOptionX{fontstyle}[\normalfont]{#1}
\DeclareOptionX{radius}[\fboxsep]{\radius=#1}
\DeclareOptionX{insertionwidth}[0.5\columnwidth]{\insertwidth=#1}
\DeclareOptionX*{\PackageWarning{wrapfig2}%
{`\CurrentOption' ignored}}
\ExecuteOptionsX{scalefactor, fboxrule, fboxsep,
framecolor, backgroundcolor, textcolor, fontstyle, radius,
insertionwidth}
\ProcessOptionsX*
% \end{macrocode}
%
% {\color{red}Should the format file be not so up to date, 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
% are already included in the format file at the date required
% for this file. The \pack{xparse} package has been available
% since about 2018; should the users have available a definitely
% older \TeX system installation, either they upgrade it, or
% they must avoid using this \pack{wrapfig2} package and should
% use the original \pack{wrapfig} one; if they need to wrap
% text, they should resort to some ingenious, not so trivial
% tricks to do it.}
%
% Originally version~4 used the \pack{tcolorbox} package to
% frame the wrapped text; we thought that loading that package
% was too heavy on memory, even if the modern computers have
% large working memories. But in order to maintain and track
% possible errors the traced \texttt{.log} file would become too
% large to be of any help; therefore in oder to draw a framed
% box with rounded corners we thought it would be much simpler
% to load the \pack{curve2e} package, just a second level
% extension of the original \Env{picture} environment defined in
% the \LaTeXe kernel; only some 30 lines of code are sufficient
% to replace the extremely powerful \pack{tcolorbox}
% functionalities otherwise required to frame wrapped text with
% this \pack{wrapfig2} package.
%
% We were informed that \pack{curve2e} was incompatible with
% some other packages, in particular its commands were not
% compatible with the recent modification of the \Env{picture}
% environment, that since 2019 is capable to use absolute
% dimensional data, without reference to \cs{unitlength}
% multipliers. Therefore we decided to avoid loading
% \pack{curve2e} and used \pack{pict2e} internal low level
% commands that are already upgraded to receive absolute
% dimensioned parameters. Of course we had to redefine several
% internal commands of \pack{wrapfig2}. Here we describe in
% details such new macros.
%
% 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}
%
% Notice that the argument type descriptor \texttt{s} for the
% optional star is not present in these definitions; if a star
% is being used, it will be read by successive macros or
% environments.
%
% In order to include the text to be wrapped the floating object
% \Env{text} has already been defined, but we need a suitable
% command to insert it with its frame into the \Env{wraptext}
% environment body. Here is the code of some extra macros and of
% the \Env{wraptext} environment.
%
% We start with redefining \cs{includeframedtext} valid for
% versions~6 and~7, that accepts \texttt{key=value} options, and
% give up the alternative definitions for older versions.
% \begin{macrocode}
\ifboolexpr{ bool{WFfive} or bool{WFnew} }%
{\NewDocumentCommand\includeframedtext{%
O{\insertwidth} m O{} o}{\bgroup%
\ExecuteOptionsX{#3}% executes possible options
\insertwidth=#1\WFscalewidth
\framedbox{\insertwidth}{\fboxrule}{\fboxsep}[\radius]{#2}\egroup}
}{}
% \end{macrocode}
%
% Their simple syntax is the following
%\begin{ttsintassi}
%\cs{includeframedtext}\oarg{text width}\marg{text}\oarg{key=value settings}\oarg{radius}
%\end{ttsintassi}
%
% The optional \meta{text width} is the (possibly scaled) width
% computed by the \Env{wraptext} environment; but if authors
% use this command outside the \Env{wraptext} environment, they
% should specify a width; in any case the default value is half
% the current measure \cs{linewidth}.
%
% The \meta{text} is the unformatted text to be wrapped; it will
% be boxed and framed by the service macro \cs{framedbox}.
%
% The \meta{key-value settings} contains a comma separated list
% of zero to nine settings with the syntax \texttt{key=value}
% that are going to be used by both the \cs{includeframedtext}
% and \cs{framedbox}.
%
% The last optional argument \meta{radius} (usable, but
% actually useless because it can be set with a \emph{key=value}
% option) is the curvature radius of the rounded frame corners;
% its default value is going to be set to \cs{fboxsep}: in this
% version its value is specified with the setting
% \texttt{radius=\meta{dimension}} among the other
% \meta{ket=value settings}; the default value is certainly the
% best one, but users can specify a different value, of course
% not too different from the default one. See some examples in
% figure~\ref{fig:framed text}.
%
% The definition of \cs{framedbox} is reduced to very simple
% settings (initially the \meta{text} is typeset within a
% \cs{parbox} of reduced measure: in facts the specified
% insertion width is diminished with the sum of twice the frame
% thickness and the frame gap; in this way the box dimensions
% are going to be used by \cs{Frame} to compute the centres of
% the corner arcs so as to draw the curved corners box needed to
% use the \cs{arc} \pack{pict2e} macro; the actual macro that
% draws the background and the frame is \cs{Frame};
% nevertheless. it is \cs{framedbox} that decides to draw only
% the background or also the box frame.
%
% The coloured background and the coloured frame have the same
% contour; but the former is filled, while the latter is
% stroked; we have to draw the same curve two times; first the
% coloured background, then the superimposed frame
%
% This coloured framed curved corners rectangle is at the center
% of the coordinate system of a \Env{picture} environment, and
% has the correct dimensions to receive the boxed text; it is
% trivial to center the text by means of a zero dimensioned box,
% typical of the \Env{picture} environment.
%
% The code of this simple code is the following.
% \begin{macrocode}
\NewDocumentCommand\framedbox{m m m O{#3} m}{\bgroup
%
\dimen0=\dimexpr#1-(#2+#3)*2\relax
\setbox0\hbox{\parbox{\dimen0}{\color{WFtext}#5}}%
%
\WFfrthick=#2\relax
\WFXR=\dimexpr\wd0/2\relax \WFXL=-\WFXR%
\WFYU=\dimexpr(\ht0+\dp0)/2\relax \WFYD=-\WFYU%
\dimen4=#1\relax \dimen6=\dimexpr\ht0+\dp0+(#2+#3)*2\relax
\dimen8=#4
%
{\begin{picture}(\dimen4,\dimen6)(-0.5\dimen4,-0.5\dimen6)
\Frame*{\dimen4}{\dimen6}{\dimen8}%
\ifdim\WFfrthick>0pt\Frame{\dimen4}{\dimen6}{\dimen8}\fi
\put(0mm,0mm){\makebox(0,0){\box0}}%
%
\end{picture}}%
\egroup\ignorespaces}
\NewDocumentCommand\Frame{s m m m}{%
\bgroup
\WFXR=\dimexpr#2/2\relax \WFXL=-\WFXR%
\WFYU=\dimexpr#3/2\relax \WFYD=-\WFYU%
\IfBooleanTF{#1}{\linethickness{0pt}\color{WFbackground}}%
{\linethickness{\WFfrthick}\color{WFframe}}%
%
\moveto(\WFXR,\WFYD+#4)%
\circlearc{\WFXR-#4}{\WFYU-#4}{#4}{0}{90}%
\circlearc{\WFXL+#4}{\WFYU-#4}{#4}{90}{180}%
\circlearc{\WFXL+#4}{\WFYD+#4}{#4}{180}{270}%
\circlearc{\WFXR-#4}{\WFYD+#4}{#4}{270}{360}%
\closepath
\IfBooleanTF{#1}{\fillpath}{\strokepath}%
%
\egroup\ignorespaces}
% \end{macrocode}
% The syntax of \cs{framedbox} is the following.
%\begin{ttsintassi}\setfontsize{8.5}\obeylines
%\cs{framedbox}\marg{frame width}\marg{frame thickness}\marg{frame separation}\oarg{corner radius}\marg{text to be wrapped}
%\end{ttsintassi}¬
%
% The default value of the \meta{corner radius} is assigned so
% as to equal argument number~3, that is the \meta{frame
% separation} and both have a default value of \texttt{1ex};
% therefore they vary with the current font size. See
% figure~\ref{fig:framed text}. The frame thickness is given a
% default value of \texttt{1pt} if the command is used within
% the body of the \cs{includeframedtext}; but if this command
% received a different value the frame may be thicker, or even
% vanish; we discourage values higher than \texttt{3pt} (about
% \texttt{1mm}) and lower than \texttt{1pt} unless it is zero.
%
% The \cs{Frame} command syntax is the following
%\begin{ttsintassi}\setfontsize{8.5}\obeylines
%\cs{Frame}\meta{$\star$}\marg{frame width}\marg{frame height}\marg{corner radius}
%\end{ttsintassi}
%
%\begin{wrapfigure}{i}{45mm}
%\includegraphics[width=45mm]{LAPDFcolori}
%\caption{Reduced size of Detlef Reimers's colour wheel}
%\label{fig:colour-wheel}
%\end{wrapfigure}
% The optional $\star$ decides to avoid stroking; therefore the
% macro just fills the contour with the background color;
% without the $\star$ the contour is stroked with the frame
% width and color. \cs{box0}, that contains the now formatted
% text with the text color, shall be superimposed on the center
% of the frame; of course it is the user's duty to select the
% various colours so that they are contrasting; no white over
% yellow, for example; but yellow over blue is OK; It is
% convenient to give a look to the colour circle the single page
% documentation of \pack{colors} by Detlef Reimers:
% \texttt{texdoc colors}; figure~\ref{fig:colour-wheel}. Trace
% a diameter on the circular drawing, and the colours at both
% intersections with the wheel circumference are certainly
% contrasting; of course users can work also with colours that
% differ in density, typically white vs.~black.
%
% The definition of the \Env{wraptext} environment is more
% detailed than that of \Env{wrapfigure} and \Env{wraptable},
% 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 slim in order to avoid problems with its justification or
% the justification of the wrapping lines. 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\%); as with the other wrapping environments,
% with versions~7 to~5 the inserted material width is a
% \emph{braced optional argument}; with versions 6.0 and~7 the
% default value of the \opz{radius} option is equal to
% \cs{fboxsep}.
%
% For what concerns \Env{wraptext}, the opening 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 formatted text, and that of the inserted
% block and/or the measure of the indented wrapping lines;
% sometimes it might be necessary to get rid of the space below
% the inserted block when it gets typeset at the bottom of a
% page. The star is not needed because for this environment
% the optional first argument is always interpreted as the
% indented lines number \emph{correction}; nevertheless if users
% specify the optional star, as they are used to with the other
% environments, such star produces a visible warning message
% that reminds the user about its uselessness.
%
% It is true that some of the input parameters specified to the
% opening command of any environment with \LaTeXiii are
% available also to the closing commands; see the last paragraph
% of section~2 in the \pack{xparse} documentation.
%^^A
% But the following definition uses the separate opening and
% closing macros of the \Env{wrapfloat} environment; such
% procedure breaks this second availability of the input
% parameters, therefore it is necessary to save them into local
% macros or count registers (remember that assignments to \TeX
% count registers are \emph{local}, while assignment to \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} box register has been allocated at the code
% beginning; remember that \LaTeXiii registers of any kind are
% not limited in number as they were some years ago with
% \LaTeXe.
%
% The last opening commands are conceived to box the object to
% be wrapped, typeset within a coloured box with the default of
% specified width; compared to version~4, these new versions~5
% to~7 do not use anymore the functionalities provided by
% package \pack{tcolorbox}; instead they use the \pack{pic2e}
% package functionalities to draw similar framed and shaded
% boxes; this implies much less memory used by the almost
% unlimited, but unused, functionalities of the \pack{tikz}
% package on which \pack{tcolorbox} relies. Notice that the
% plain \Env{picture} environment, extended with the
% \pack{pict2e} package, can draw “ovals”, that is rectangles
% with rounded corners, but, as far as we know, they have the
% frame but cannot be colour filled.
%
% Notice the \Env{wraptext} has three definitions
% depending on the logical switches \texttt{WFnew},
% \texttt{WFfive}; if one of these switches is \texttt{true} the
% definitions apply to either version~5 or versions~6 to~7 of
% this package; otherwise the last definition is a fall back to
% the functionality and the syntax of the previous version~4 of
% this package; in this case, in spite of the fact that the
% previous version used package \pack{tcolorbox}, the new code
% relies on the \pack{pict2e} functionalities in oder to get the
% same results without using the memory heavy \pack{tcolorbox}
% package.
%
% With version 7, the frame that surrounds the wrapped text
% has the desired rounded corners; it is possible to easily
% specify the background and the frame colours, that by default
% are maintained to light grey and almost black respectively;
% this flexibility allows to set also the frame thickness and
% the gap width between the frame and its contents; by
% default they are~1pt for the frame thickness, and~1ex for the
% gap width, that changes with the font size.
%
% The number of indented lines is computed by means of the
% \cs{fpeval} \LaTeXiii function; among the operands of this
% function there is the number \texttt{2} used to take into
% account the vertical space above and below the framed box.
% 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. By increasing the corner arc radius it is
% possible to modify the gap width.
%
% Eventually the \Env{wrapfloat} opening statement is created by
% expanding the whole line complete of its 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.
%
% Notice that the syntax of the new \Env{wraptext} environment
% is absolutely identical to that of the other two wrapping
% environments in terms of \meta{line number correction},
% mandatory \meta{location}, optional \meta{overhang} and braced
% optional \meta{width}. See below for the very different syntax
% of the fall back version~4 opening \Env{wraptext} statement;
% they become almost identical when no optional parameters are
% specified, the only little difference being that the
% \meta{location} argument is mandatory for versions~5 to~7,
% while it is optional for version~4.
% \begin{macrocode}
\ifboolexpr{bool{WFnew} or bool{WFfive}}{% definition for versions 5 to 7
\NewDocumentEnvironment{wraptext}{O{0} m O{0pt} G{0.5\columnwidth} s}{%
\insertwidth=#4\WFscalewidth
\def\textplacement{#2}%
\def\textcorrection{#1}%
\def\textoverhang{#3}%
\IfBooleanT{#5}{\PackageWarning{wrapfig2}{%
*********************************************\MessageBreak
With wraptext the optional star is useless \MessageBreak
because the first optional argument always \MessageBreak
means the "lines number CORRECTION" \MessageBreak
*********************************************\MessageBreak}}
\bgroup\edef\x{\egroup\noexpand\wrapfloat{text}%
[\textcorrection]{\textplacement}[\textoverhang]{\insertwidth}*}\x%
\def\caption{\unskip\unskip
\refstepcounter\@captype
\let\@tempf\@caption
\unless\ifcsname @float@c@\@captype\endcsname
\expandafter\expandafter\let
\expandafter\@tempf\csname @float@c@\@captype\endcsname
\fi
\@dblarg{\@caption\@captype}%
}%
}{\endwrapfloat\ignorespaces}%
% \end{macrocode}
%
% For the fallback to version~4 definition of this
% \Env{wraptext} environment we have to start with the old list
% of specifically delimited optional arguments. We remember that
% this opening statement receives in order a bracket delimited
% optional \meta{location} parameter, a vertical bar delimited
% optional \meta{width}, an angle bracket delimited optional
% \meta{line number correction}, a round parenthesis delimited
% optional \meta{caption label}; the different delimiters allow
% to specify any optional argument without regard with the other
% ones, provided they are in the same logical order when more
% than one optional argument is specified.
%
% Notice that the third optional argument contains the
% \meta{line number correction}, therefore the star used with
% the other environments is useless; contrary to versions~5
% to~7, if an asterisk is indadvertedly specified, it is typeset
% as the first token of the wrapped test.
%
% The text to be wrapped, that forms the body of the
% environment, must first be boxed into a correct width vertical
% box; this is easily obtained with a \Env{minipage}
% environment, of which the internal commands are used; this
% insures that the text is typeset with the correct measure;
% with the closing commands this boxed text is fed to the
% \cs{framedbox} command, in order to be framed and assigned a
% background color.
% There is no possibility of specifying the colours unless the
% whole \Env{wraptext} environment, preceded by explicit color
% settings, is confined within a group delimited, for example,
% by the \cs{begingroup} and \cs{endgroup} commands.
% \begin{macrocode}
}{% definition for version 4 fall back
%
\NewDocumentEnvironment{wraptext}%
{O{l} D||{0.5\columnwidth} D<>{0} D(){text}}%
{% Open environment
\insertwidth=#2
\def\textplacement{#1}%
\def\textcorrection{#3}%
\def\WF@caption@label{#4}%
\setbox0\hbox\bgroup
\minipage{\dimexpr\insertwidth-2pt-6ex}%
}{% Close environment
\endminipage\egroup
\begin{lrbox}{\NWF@box}%
\framedbox{\box0}{1pt}{1ex}%
\end{lrbox}
\edef\NWF@wli]{\fpeval{%
round((\ht\NWF@box+\dp\NWF@box)/\baselineskip,0)+2+\textcorrection}%
}%
\unles\ifhmode
\leavevmode\noindent
\fi
\bgroup\edef\x{\egroup\noexpand\wrapfloat{\WF@caption@label}[\NWF@wli]%
{\textplacement}{\the\insertwidth}}\x
\box\NWF@box
\endwrapfloat
\ignorespaces
}
}
% \end{macrocode}
%
% 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 is possible to 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.
%
% Now comes the new actual 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 used the \LaTeXe language, had to
% split it 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 text, or
% what else, so that the inserted box is preceded and followed
% by 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} responsible of taking care of
% the list of arguments and see if a star has been specified but
% is still in the input flow.
%
% 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 necessary that there exists a floating
% environment with the same name of the wrapped object, even
% when its wrapping environment is not specified with a floating
% \meta{location} argument.
%
% \begin{macrocode}
\NewDocumentEnvironment{wrapfloat}{m o m o G{\z@}}%
{% open environment code
\def\@captype{#1}\WF@wr[#2]{#3}[#4]{#5}%
}{% close environment code
\ifdim\hsize>\z@
\par\hrule\@width\hsize\@height\z@ % force width with
% invisible rule
\else
\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 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, the software computes the box total
% height plus some fixed amounts needed mostly to set the
% wrapped material below the wrapping text first line. Here is
% where the \LaTeXiii \cs{fpeval} computing function comes into
% play so as to assign such height to \cs{WF@size}. Afterwards
% 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 flow; notice that the
% \Env{wraptext} environment does not accept the optional star;
% if the user indadvertedly specifies it for this environment,
% a star appears at the beginning of the wrapped text with
% version~4; with versions~5 to~7 the asterisk produces a
% warning that remind users that this environment does not use
% any optional star. In all three versions, in facts, the first
% optional parameter is always interpreted as the \meta{line
% number correction}.
%
% The braced \meta{width} fourth parameter (actually a
% \textit{braced optional 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 box width as
% the working width; of course this works only with
% \Env{wrapfigure} and \Env{wraptable}, because what is being
% wrapped has its own natural width; with text the width is the
% default setting made with the \emph{braced optional argument}
% described with the \texttt{G} descriptor.
% \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 star, set the numerical switch
{\global\WF@correctlines@switch=\@ne}%
{\global\WF@correctlines@switch=\z@}%
}
% \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 or
% has been computed.
% \begin{macrocode}
\def\wf@caption{\relax% redefine \wf@caption if \hsize is zero
\ifdim\hsize>\z@
\let\caption\wf@@caption
\else
\unskip \egroup \hsize\wd\z@
\@parboxrestore \box\z@% export \box0
\fi
\caption
}
% \end{macrocode}
%
% One of the following unusual macros were 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
{\advance\parskip\@tempdima\vskip-\parskip}% back up to base
% line
\penalty\interlinepenalty % update page parameters
\@tempdimb\dimexpr\pagegoal - \pagetotal \relax% 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 does not fit in \@tempdimb
\ifWF@float
\dimen@ 0.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@ 0.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% 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 l or r;
% determine 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 % object on right
\@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.number 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 indented
% wrapping lines, so that wrapping is correct; of course the
% limitations of the \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 counts the lines to be indented by rounding the
% division of the box height by the current base line base 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{setcounter} 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{\the\c@WF@wrappedlines}%
\else
\setcounter{WF@wrappedlines}{\WF@wli}% absolute number
% of lines
\stepcounter{WF@wrappedlines}%
\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\relax
\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
% wrapping 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 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, after execution 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 move.
% \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: it suffices to mimic the
% definitions of environments \Env{wrapfigure} or
% \Env{wraptable}. But as we saw with the \Env{wraptext}, the
% above statement is not always true.
%
% Here there is some Arseneau's code that renders his
% \pack{wrapfig} code compatible with \cs{newfloat} of class
% \class{memoir}, and with \cs{newfloatlist} of package
% \pack{ccaption}. We keep his code, 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 also \newfloat.
\@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
\ifcsdef{amsTextText}{\let\text\amsTextText}{}
% \end{macrocode}
%
%\iffalse
%
%\fi
% \Finale
%
%^^A \endinput