% \iffalse
% !TEX encoding = UTF-8 Unicode
% Remember to use \StopEventually{}, otherwise no Check Sum
%<*internal>
\begingroup
\input docstrip.tex
\keepsilent
\preamble
Copyright (C) 1991-2003 by Donald Arseneau (asnd@triumf.ca)
Copyright (C) 2021-2023 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>
[2023-09-03 v.6.2.1 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}
\usepackage{wrapfig2,amsmath,kantlipsum,xspace}
%
\GetFileInfo{wrapfig2.dtx}
\title{The \textsf{wrapfig2} package}
\author{Claudio Beccari\thanks{E-mail: \texttt{claudio dot beccari at gmail dot com}}}
\date{Version \fileversion~--~Last revised \filedate.}
%
\providecommand*\diff{\mathop{}\!\mathrm{d}}
\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 new 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 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 version~6. Fall back options are available for backwards
% compatibility.
% \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 2020 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 a document author
% 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 are sorry
% to admit that such idiosyncrasies might have been 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. by 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; not 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 document authors' 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 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 mechanism 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 coloured
% background. On \texttt{texstackexchange} a solution was suggested
% to a user who was asking for such an arrangement; the solution
% resorted to a specific use of the \Env{wrapfigure} environment 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 spaces 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. In version 6.0 the \Env{wraptext} environment was
% further enhanced so as to accept several \texttt{key=value} settings
% concerned wit 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.
%
%^^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, and~6 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 version~6.*}.
%~
%\Bambiente{wraptext}\oarg{indented lines number correction}\marg{location}\oarg{overhang}\marg{width}
%\qquad \meta{optional style settings}
%\qquad\cs{includeframedtext}\oarg{insertion measure}\marg{text to frame}\oarg{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.* and~6.* 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{texstackexchange} that used the very elaborate \Env{tcolorbox}
% environment; version~5 uses instead a much simpler command
% \cs{framedbox} based on the \pack{curve2e} package macro
% \cs{Curve}. Version 6.0 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. 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)
%\polygon(0,0)(40,0)(40,30)(0,30)
%\Line(0,0)(40,30)\Line(0,30)(40,0)
%\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{polygon}\texttt{(0,0)(40,0)(40,30)(0,30)}
%\cs{Line}\texttt{(0,0)(40,30)}\cs{Line}\texttt{(0,30)(40,0)}
%\Eambiente{picture}
%\cs{caption}\Marg{A rectangle with its diagonals}\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, 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 and~6 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 and~6 print it outside the framed box.
%
% \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 environment
% \Env{wraptext} and before using \cs{includeframedtext} the colours
% may be 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 version~6, 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~6 options.
%
%\begin{figure}
%\makebox[\textwidth]{\includeframedtext{Text}[insertionwidth=0.45\linewidth]
%\hfill
%\includeframedtext{Text}[insertionwidth=0.45\linewidth,fboxrule=3pt]}\\[2ex]
%\makebox[\textwidth]{\includeframedtext{Text}[insertionwidth=0.45\linewidth,textcolor=red,fboxrule=2pt]
%\hfill
%\includeframedtext{Text}[insertionwidth=0.45\linewidth,fontstyle=\Large]}\\[2ex]
%\makebox[\textwidth]{\includeframedtext{Text}[insertionwidth=0.45\linewidth,backgroundcolor=yellow]
%\hfill
%\includeframedtext{Text}[insertionwidth=0.45\linewidth,framecolor=blue,backgroundcolor=yellow,fboxrule=1mm]}\\[2ex]
% \makebox[\textwidth]{\includeframedtext{Text}[insertionwidth=0.5\linewidth, fboxrule=0pt, backgroundcolor=cyan, textcolor=white, fontstyle=\Huge\bfseries]}
%\caption{Some framed text boxes with different dimension 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},
% version~6 adds 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 a light grey.
%^^A
% \item{\ttfamily fboxrule} sets the thickness of the line
% around 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 line 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 wrapping 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 step wise 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 $y_0$ equals half the current measure and 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}
%
% This version~6 has 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 version~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 version~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~6 and~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.
%
% 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~6 and~5 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~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 personal opinion might be wrong.
%
% 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 and~6 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 and~6, 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{texstackexchange} message where the problem of wrapping text was
% presented possibly for the first time. The solution presented in
% \texttt{texstackexchange} 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{texstackexchange} 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
% Malumbresfor 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 me a
% bug notice together with a minimum working
% example.
% Thanks to Bruno Pagani who pinpointed the exact
% point that conflicts 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}.
%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \CheckSum{1427}
% \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}. \pack{wrapfig} might have been loaded by other
% packages, such as \pack{caption} or \pack{subcaption}, that 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 evident 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}
% Their availability 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}
\RequirePackage{xparse}
\@ifpackageloaded{xfp}{}{\RequirePackage{xfp}}
\@ifpackageloaded{etoolbox}{}{\RequirePackage{etoolbox}}
\@ifpackageloaded{float}{}{\RequirePackage{float}}
\@ifpackageloaded{color}{}{%
\@ifpackageloaded{xcolor}{}{\RequirePackage{xcolor}}%
}
\@ifpackageloaded{curve2e}{}{\RequirePackage{curve2e}}
\@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}, version~5 and~6. {\color{red}Users are warned
% to pay attention to this \pack{color} package loading: they should load
% it neither before nor 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 ordet to avoid conflicts with \pack{amstext}
% and its|\text| command, we have to save its
% definition before actually execution any part of
% this package, and restore ita 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~5 or~6
% 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}% come personalizzare con le diverse lingue?
\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
\newdimen\insertwidth
\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{tcolrbox} 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.
%
% 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 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 two different \cs{includeframedtext}, one for version~6, that accepts \texttt{key=velue} options, and another one for version~5, that requires only a comma separated list of dimensional values.
% \begin{macrocode}
\ifbool{WFnew}{%
\NewDocumentCommand\includeframedtext{%
O{\insertwidth} m O{} o}{\bgroup%
\ExecuteOptionsX{#3}% executes possible key=value options
\insertwidth=#1\WFscalewidth
\framedbox{#2}{\fboxrule}{\fboxsep}[\radius]\egroup}
}{}
\ifbool{WFfive}{%
\NewDocumentCommand\includeframedtext{O{\insertwidth} m O{1pt,1ex} o}%
{\bgroup
\WFsplitdimens #3!\relax
\IfNoValueTF{#4}%
{\framedbox{#2}{\fboxrule}{\fboxsep}}%
{\framedbox{#2}{\fboxrule}{\fboxsep}[#4]}
\egroup}%
}{}
% \end{macrocode}
%
% Their simple syntaxes are the following
%\begin{ttsintassi}
%~
%\% for version 6.0
%\cs{includeframedtext}\oarg{text width}\marg{text}\oarg{options}\oarg{radius}
%
%\% for version 5.0
%\cs{includeframedtext}\oarg{text width}\marg{text}\oarg{dimensions}\oarg{radius}
%\end{ttsintassi}
%
% The optional \meta{text width} is the (possibly scaled) width computed by the \Env{wraptext} environment; but if the 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{dimensions} are passed on to \cs{framedbox} command; they are a comma separated list of dimensions, namely the thickness of the frame and the necessary frame distance from the formatted text. The \meta{options} contains a comma separated list of zero to nine options with the syntax \texttt{key=vale} that are going to be used by both the \cs{includeframedtext} and \cs{framedbox}. The last optional \meta{radius} is the curvature radius of the rounded frame corners; the default value is going to be set to \cs{fboxsep}: in version~5 \cs{framedbox} by default sets it equal to the frame separation width, while with version~6 its value is received with the option \texttt{radius=\meta{dimension}}; the default value is certainly the best one, but the 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 the \cs{framedbox} command appears to be complicated; it is just an apparent complication due to the fact that it uses the powerful \cs{Curve} command that draws an arbitrary curved line or fills the area delimited by such curved line; it suffices to specify the nodes and the tangents to each node; the nodes are the points the line should pass through, their tangents may be specified with arbitrary vector components along the horizontal and vertical axes. For a rectangle such vector components are just 0 or $\pm 1$. The node coordinates of the rounded corners, on the opposite, must be determined with accuracy; we used the \cs{fpeval} function of package \pack{xfp}, that performs precise computations on operands in fractional decimal numbers; if the operands are dimensions, the operands are their fractional decimal values in printer points, the results of such operations are pure fractional decimal numbers without units; if the numerical result is to be interpreted again as the measure of a dimensional entity, \texttt{pt} must be appended to the assignments to a dimension register; within the \Env{picture} environment, any coordinate is expressed in multiples of \cs{unitlength}, therefore no unit of measure is necessary, once \cs{unitlength} has been specified.
%
% For a rectangle with curved corners of a given radius \cs{R}
% we have four quarter circles joined by straight lines; therefore
% we need eight nodes.
%
% 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 long but simple code is the following.
% \begin{macrocode}
\NewDocumentCommand\framedbox{ m m m O{#3}}{\bgroup
\fboxrule=#2\fboxsep=#3\relax
\setbox0\hbox{\fboxrule=\z@\fboxsep=#3\relax
\framebox{\parbox{% draw a framed box without the frame
\fpeval{\insertwidth-2\fboxrule-2\fboxsep}\p@}{\textcolor{WFtext}{#1}}}}
\unitlength=\fpeval{\wd0/100}\p@ % set the picture \unitlength
% determine the picture coordinates and displacement of the axes origin
\edef\x{100}%
\edef\y{\fpeval{(\ht0 +\dp0)/\unitlength}}%
\edef\xc{50}%
\edef\yc{\fpeval{\y/2}}\edef\R{\fpeval{#4/\unitlength}}%
\edef\R{\fpeval{#4/\unitlength}}% radius in unit lengths
% compute the horizontal and vertical shifts of the corner extrema
\edef\WFXds{\fpeval{-\xc+\R}}\edef\WFXsd{-\WFXds}%
\edef\WFYuo{\fpeval{\yc-\R}}\edef\WFYou{-\WFYuo}%
% compute the coordinates of the curved corners frame contour
\edef\PSEl{\WFXsd,-\yc}\edef\PSEu{\xc,\WFYou}\edef\PNEd{\xc,\WFYuo}%
\edef\PNEl{\WFXsd,\yc}\edef\PNWr{\WFXds,\yc}\edef\PNWd{-\xc,\WFYuo}%
\edef\PSWu{-\xc,\WFYou}\edef\PSWr{\WFXds,-\yc}%
\def\WFrectangle{% define the contour as the argument of \Curve
(\WFXsd,-\yc)<1,0>(\xc,\WFYou)<0,1>(\xc,\WFYuo)<0,1>%
(\WFXsd,\yc)<-1,0>(\WFXds,\yc)<-1,0>(-\xc,\WFYuo)<0,-1>%
(-\xc,\WFYou)<0,-1>(\WFXds,-\yc)<1,0>(\WFXsd,-\yc)<1,0>}%
\def\CurveStar{\Curve*}% define a macro for adding the asterisk
\begin{picture}(\x,\y)(-\xc,-\yc)
{\color{WFbackground}\expandafter\CurveStar\WFrectangle}% draw background
\ifdim\fboxrule>\z@% draw the frame if its thickness is not zero
{\color{WFframe}\linethickness{#2}\expandafter\Curve\WFrectangle}%
\fi
% put the text block in a null box at the coordinates origin
\put(0,0){\makebox(0,0)[cc]{\box0}}%
\end{picture}
\egroup}
% \end{macrocode}
% Its syntax is the following.
%\begin{ttsintassi}\setfontsize{8.5}\obeylines
%\cs{framedbox}\marg{text to be wrapped}\marg{frame thickness}\marg{frame separation}\oarg{corner radius}
%\end{ttsintassi}
%
% The default value of the \meta{corner radius} is assigned 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 definition of the \Env{wraptext} environment is more detailed,
% because most of the computations must be done on the actual text
% to be wrapped, that does not have a specific width; moreover the
% inserted text must not be too wide, nor too 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~6 and~5 the inserted material width is a \emph{braced
% optional argument}; with version 6.0 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 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.
%
% 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
% and~6 do not use anymore the functionalities provided by package
% \pack{tcolorbox}; instead they use the \pack{curve2e} 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 filled.
%
% Notice the \Env{wraptext} has two or three definitions depending on the
% logical switches \texttt{WFnew} and \texttt{WFfive}; if one of these
% switches is \texttt{true} the definitions apply to either version~5
% or~6 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 the the previous version
% used package \pack{tcolorbox}, the new code relies on the
% \pack{curve2e} functionalities in oder to get the same results
% without using the memory heavy \pack{tcolorbox} package.
%
% With version 6.0, 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
% separation width of the frame from its contents; by default
% they are~1pt for the frame thickness, and~1ex for the separation
% 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.
%
% Eventually the opening \Env{wrapfloat} 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 and~6,
% while it is optional for version~4.
% \begin{macrocode}
\ifboolexpr{bool{WFnew} or bool{WFfive}}{% definition for versions 5 and 6
\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 and~6, 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 be first 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 default 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
% \unskip % is the \unskip necessary?
\egroup \box\z@ % or close hbox
\fi
\egroup % close the vtop box; its width now is known
\WF@floatstyhook % support for float.sty
\def\width{\wd\WF@box}%
\setlength\wrapoverhang{\WF@ovh}%
\xdef\WF@ovh{\the\wrapoverhang}% save until wrapping
\ifdim\ht\WF@box>\topskip \ht\WF@box\z@ \fi% too high, set flag
\ifdim\ht\WF@box<.5\p@ % too short, move up
\global\setbox\WF@box\vtop{\vskip-1.4ex\unvbox\WF@box}%
\fi
\global\WF@size=% compute total box hight with \fpeval
\fpeval{\ht\WF@box+\dp\WF@box+1.5\baselineskip+\tw@\intextsep}\p@
\aftergroup\WF@startfloating % use even when not really floating
\unless\ifWF@float
\ifhmode
{\unskip \parfillskip\z@skip \par \vskip-\parskip}%
\aftergroup\noindent
\fi
\fi
\global\@ignoretrue
}
% \end{macrocode}
%
% The working macro \cs{WF@wr} is defined with the \LaTeXiii
% language; it grabs all the optional and mandatory arguments
% in a single step, contrary to \LaTeXe that requires to split
% the various steps in separate macros. In the definition code
% we use also some commands, such as \cs{unless}, originally
% defined by the \eTeX typesetting program extensions, that have
% been included in the \pdfLaTeX, \XeLaTeX and \LuaLaTeX kernels
% several years ago.
%
% Notice that the optional first (optional) argument, that represents
% the number of indented lines or their correction number, is saved
% into the macro \cs{WF@wli}, but if this argument is not specified,
% \cs{WF@wli} is assigned the value zero. The same happens for the
% \meta{overhang} optional argument.
%
% After these adjustments, 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, an
% asterisk appears at the beginning of the wrapped text with version~4;
% with versions~5 and~6 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 the asterisk is present 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 in case \hsize is zero
\ifdim\hsize>\z@
\let\caption\wf@@caption
\else
\unskip \egroup \hsize\wd\z@ \@parboxrestore \box\z@% empty \box0
\fi
\caption
}
% \end{macrocode}
%
% One of the following unusual macros was introduced by Arseneau
% to deal with paragraph parameters and possibly to float the
% object to be wrapped.
% \begin{macrocode}
\def\WF@startfloating{%
\WF@everypar\expandafter{\the\everypar}\let\everypar\WF@everypar
\WF@@everypar{\ifvoid\WF@box\else\WF@floathand\fi \the\everypar
\WF@wraphand
}}
% \end{macrocode}
% The following macro is for floating wrapping environments.
% \begin{macrocode}
\def\WF@floathand{%
\ifx\parshape\WF@fudgeparshape
\WF@fltmes
\else
\ifx\par\@@par
\ifnum\@@parshape=\z@
\ifdim\hangindent=\z@
\setbox\z@\lastbox \begingroup
\@@par \WF@@everypar{}\WF@putfigmaybe
\endgroup % after this group start wrapping
\unless\ifvoid\z@ % replace indentation
\box\z@
\fi
\else
\WF@fltmes
\fi
\else
\WF@fltmes
\fi
\else
\WF@fltmes
\fi
\fi}
% \end{macrocode}
%
% On the contrary if there is enough space or if the wrapped object
% cannot float, it gets output here.
% \begin{macrocode}
\def\WF@putfigmaybe{%
\ifinner
\vskip-\parskip \global\WF@floatfalse
\let\pagetotal\maxdimen % kludge flag for "not top of page"
\else % outer page
{\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 too high 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.n and length
\xdef\WF@adjtlm{\the\@tempdima}%
\else
\xdef\WF@wrapil{\z@ \the\hsize}%
\xdef\WF@adjlw{\z@}\xdef\WF@adjtlm{\z@}%
\fi
\ifdim\pagetotal=\z@ % put object at top of page \thepage
\global\advance\WF@size-\intextsep
\else % put object in middle of the page
\setbox\WF@box\hbox{\lower\intextsep\box\WF@box}%
\fi
\dp\WF@box\z@
\box\WF@box
\@tempa
}% end \hbox to 0pt
\aftergroup\WF@startwrapping
\fi
}
% \end{macrocode}
%
% Here comes the very important macro that counts the 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 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