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