% \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-02-23 v.6.1.1 Wrap text around figures, tables, framed text blocks] % %<*driver> % \documentclass{ltxdoc}\errorcontextlines=100 \hfuzz 10pt \usepackage[greek.ancient, english]{babel} \usepackage[utf8]{inputenc} \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 the % other two 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 reccommended 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 Malumbres for his precious % feedback and his suggestions. % % Herbert Voß spotted the necessity to follow a specific loading % order if the \pack{amsmath} needs to be used; he was so kind to % send me a bug notice together with a minimum working example. % Thanks a lot Herbert! The best I could do to manage this bug % consisted in adding an error message, if \pack{wrapfig2} during its % loading process found \pack{amsmath} already loaded. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \CheckSum{1428} % \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} % % {\color{red}{\paragraph{Loading order} Some users needed to use % \pack{wrapfig2} in documents where they required also the % \pack{amsmath} package functionalities; they noticed that some % incompatibility showed up if package \pack{amsmath} was input % before \pack{wrapfig2}. Such incompatibility vanishes if % \pack{amsmath} is loaded \emph{after} \pack{wrapfig2}. This % package now issues an error message if it finds \pack{amsmath} % already loaded.}} % \begin{macrocode} \@ifpackageloaded{amsmath}{% \PackageError{wrapfig2}{ \MessageBreak +++++++++++++++++++++++++++++++++++++++++++\MessageBreak Package amsmath already loaded \MessageBreak If you need amsmath, load it after wrapfig2\MessageBreak Expect error messages \MessageBreak +++++++++++++++++++++++++++++++++++++++++++\MessageBreak \MessageBreak }{Abort the job}}{\relax} % \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 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}% \IfBooleanTF{#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 \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 % \end{macrocode} % %\iffalse % %\fi % \Finale % %^^A \endinput