% \iffalse % !TEX encoding = UTF-8 Unicode % Remember to use \StopEventually{}, otherwise no Check Sum %<*internal> \begingroup \input docstrip.tex \keepsilent \preamble Copyright (C) 1991-2004 by Donald Arseneau (asnd@triumf.ca) Copyright (C) 2021-2024 by Claudio Beccari (claudio.beccari@gmail.com) License information appended \endpreamble \postamble Distributable under the LaTeX Project Public License, version 1.3c or higher (your choice). The latest version of this license is at: http://www.latex-project.org/lppl.txt This work is "maintained" This work consists of file wrapfig2.dtx, and the derived files wrapfig2.sty and wrapfig2.pdf, plus this file README.txt. \endpostamble \askforoverwritefalse \generate{\file{wrapfig2.sty}{\from{wrapfig2.dtx}{package}}} \def\tmpa{plain} \ifx\tmpa\fmtname\endgroup\expandafter\bye\fi \endgroup % % \fi % % \iffalse %<*package> %\NeedsTeXFormat{LaTeX2e}[2019/01/01] % %<*driver> \ProvidesFile{wrapfig2.dtx}% % %<+package>\ProvidesPackage{wrapfig2}% %^^A<+readme>File README.txt for package wrapfig2 %<*package|readme> [2024-01-18 v.7.0.0 Wrap text around figures, tables, framed text blocks] % %<*driver> % \documentclass{ltxdoc}\errorcontextlines=100 \hfuzz 10pt \usepackage[greek.ancient, english]{babel} \usepackage[utf8]{inputenc}% for vintage exec.s \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{mflogo} \usepackage{multicol,fancyvrb,verbatim,microtype,graphicx} \usepackage{amsmath,kantlipsum,wrapfig2,xspace} % \GetFileInfo{wrapfig2.dtx} \title{The \textsf{wrapfig2} package} \author{Claudio Beccari\qquad E-mail: \texttt{claudio.beccari at gmail.com}} \date{Version \fileversion~--~Last revised \filedate.} % \providecommand*\diff{\mathop{}\!\mathrm{d}} \providecommand*\ped[1]{\ensuremath{_{\mathrm{#1}}}} \renewcommand\meta[1]{{\normalfont\textlangle\textit{#1}\textrangle}} \renewcommand\marg[1]{\texttt{\{\meta{#1}\}}} \providecommand\opz{} \renewcommand\opz[1]{{\normalfont\texttt{\itshape#1}}} \providecommand\Marg{} \renewcommand\Marg[1]{\texttt{\{#1\}}} \providecommand\oarg{} \renewcommand\oarg[1]{\texttt{[\meta{#1}]}} \providecommand\Oarg{} \renewcommand\Oarg[1]{\texttt{[#1]}} \providecommand\aarg{} \renewcommand*\aarg[1]{\texttt{<\meta{#1}>}} \providecommand\Aarg{} \renewcommand\Aarg[1]{\texttt{<#1>}} \providecommand\barg{} \renewcommand\barg[1]{\texttt{\string|\meta{#1}\string|}} \providecommand\Barg{} \renewcommand\Barg[1]{\texttt{\string|#1\string|}} \providecommand\parg{} \renewcommand\parg[1]{\texttt{(\meta{#1})}} \providecommand\Parg{} \renewcommand\Parg[1]{\texttt{(#1)}} \providecommand\eTeX{} \renewcommand\eTeX{\lower0.5ex\hbox{$\varepsilon\!$}\TeX} \providecommand\pack{} \renewcommand\pack[1]{{\normalfont\texttt{#1}}} \providecommand\class{} \renewcommand\class[1]{{\normalfont\texttt{#1}}} \providecommand\env{} \renewcommand\env[1]{\meta{\textsf{\slshape#1}}}\let\amb\env \providecommand\Env{} \renewcommand\Env[1]{\textsf{\slshape#1}}\let\Amb\Env \providecommand\opt{} \renewcommand\opt[1]{\textsl{\meta{#1}}} \providecommand*\Bambiente[1]{\texttt{\char92begin\{#1\}}} \providecommand*\Eambiente[1]{\texttt{\char92end\{#1\}}} \let\Bamb\Bambiente \let\Benv\Bamb \let\Eamb\Eambiente \let\Eenv\Eamb \ProvideDocumentCommand\goodpagebreak{O{4}}{% \dimen10=#1\baselineskip \dimen8=\dimexpr\pagegoal-\pagetotal\relax \ifdim\dimen8 < \dimen10 \newpage\fi} \makeatletter \AfterEndPreamble{% \apptocmd{\TeX}{{}\xspace}{}{} \apptocmd{\LaTeX}{{}\xspace}{}{}} \DeclareRobustCommand\LaTeXe{% \LaTeX\@killglue\kern0.15em2$_{\textstyle \varepsilon}${}\xspace} \DeclareRobustCommand\LaTeXccix{% \LaTeX\@killglue\nobreakspace2.09{}\xspace} \DeclareRobustCommand\LaTeXiii{\LaTeX\@killglue\kern0.15em3{}\xspace} \DeclareRobustCommand*\pdfLaTeX{pdf\/\LaTeX} \DeclareRobustCommand*\LuaLaTeX{Lua\LaTeX} \DeclareRobustCommand*\XeLaTeX{% X\ifdim\fontdimen1\font=0pt\kern-0.15em\fi \lower.5ex\hbox{\rotatebox[origin=c]{180}{E}}% \ifdim\fontdimen1\font=0pt\kern-0.15em\else\kern-0.275em\fi \LaTeX} \providecommand\setfontsize{} \RenewDocumentCommand\setfontsize{O{1.2} m}{% \fontsize{#2}{\fpeval{#1*#2}}\selectfont} \providecommand\hz{\hskip0pt} \newenvironment{ttsintassi}{\begin{lrbox}{0} \minipage{\dimexpr\linewidth-2\fboxrule-2\fboxsep}\ttfamily\obeylines}% {\endminipage\end{lrbox}\center\fbox{\box0}\endcenter} % \begin{document}\errorcontextlines=100 \maketitle \columnseprule=0.4pt \begin{multicols}{2} \tableofcontents \end{multicols} \DocInput{wrapfig2.dtx} \end{document} % % \fi % % \begin{abstract} % This package \pack{wrapfig2} is a fork that extends Donald % Arseneau's package \pack{wrapfig} (version 3.6, dated 2003) by % adding some \LaTeXiii definitions that accept a final optional % star; its presence changes the meaning of the first optional % argument so that it becomes a correction to the number of % lines that must be indented in order to receive the wrapped % object. % % A new environment is added to the original \Env{wrapfigure} % and \Env{wraptable}, namely \Env{wraptext}; it may be used to % wrap a small framed text block on a possibly coloured % background; the philosophy of this new environment is % similar to that of the other two environments, but the syntax % was different with version~4 of this package, and is very % similar with version 5.0; a further important enhancement is % implemented in versions~6 and~7. Fall back options are % available for backwards compatibility. % % This version 7 is a new implementation of the \Env{wraptext} % environment, in the sense that it does not make use of the % \pack{curve2e} package so as to avoid some interferences with % other user selected packages. % \end{abstract} % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % {\color{red}\paragraph{Caution} This package requires a fairly % recent \LaTeX kernel, otherwise it won't work; any \LaTeX % kernel dated at least 2019 is~OK. % % Read carefully this document, because the are several pieces % of information concerning other packages that may be % incompatible with this \pack{wrapfig2} version. Special % warnings are typeset in red as this one.} % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Introduction} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % The purpose of this package is manyfold. On one side it tries % to upgrade the original software by Donald Arseneau by % using some parts of the \LaTeXiii modern language. On another % it creates a new environment, with the same philosophy % of the original Arseneau's ones, such that users % can emphasise short blocks of wrapped text by framing them % while typesetting the text on a coloured background. % % The original software had some idiosyncrasies; Donald Arseneau % described them in the documentation of his package; we must % admit that such idiosyncrasies might have been just slightly % reduced; but in any case, in order to avoid such peculiar % anomalies, it is sufficient to wrap the inserted object with a % reasonable number of lines, i.e. with reasonably long % paragraphs. % % The above implies that no wrapped object code should be % specified in the source file close the end of a paragraph, % unless it is followed by other paragraphs; again, no object % code should be inserted within any list; nor even close to the % end or to the beginning of a section. Arseneau's code is % capable of specifying the wrapping number of lines such that % two or more paragraphs can be indented so as to wrap a longish % insertion, but it is wise to avoid such risky situations. % Moreover, if the inserted object has a numbered caption, the % number might not result in the correct sequence with the % normal corresponding floating objects. % % Therefore the usefulness of the wrapping procedure depends % very much on the users' ability to move around their code % until a suitable position is found. Certainly a good place is % within a longish paragraph especially at the beginning of a % section; or at the beginning of a chapter that starts with % plain text, in particular just at the beginning of the chapter % first paragraph. % % The code of this package does very little, if anything, to % correct such idiosyncrasies. They are caused by the % limitations of the \cs{ShipOut} \LaTeXe kernel macro, and very % little we were able to do in addition to what Arseneau already % did. % % Another purpose of this package is to add another optional % argument so that the \meta{number of indented lines} argument % does not mean the total number, but the correction number to % add-to or subtract-from the value computed by the default % algorythm devised by Arseneau. % % We assume that most users first use the software to insert an % object to be wrapped by the surrounding text without % specifying any value with the specific optional argument; then % they evaluate the result, and if the space below the wrapped % object is too large, or if such space is too small they count % the necessary number of lines and specify it to be processed % during another document compilation. % When the object to be wrapped is tall, it is very easy to % miscount the necessary number of lines, while is is very easy % to evaluate the necessary small correction to the computed % value. % % A further purpose of this package is to define a new % environment, \Env{wraptext}, to wrap a framed text block % typeset on a possibly coloured background. % On \texttt{tex.stackexchange} a solution was suggested % to a user who was asking for such an arrangement; the solution % resorted to a specific use of the \Env{wrapfigure} environment % and used the \Env{tcolorbox} environment. % % We thought that an \emph{ad hoc} solution would be a better % one, since the parameters to be used for a figure have nothing % or little to do with a text, therefore most of them would be % useless with a wrapped text. Nevertheless the \meta{location} % of the wrapped text and the optional correction of the % indented lines number would still be necessary. We added also % the possibility of optionally specifying the measure of the % wrapped text, even if it should not be too different from a % half of the wrapping text measure. In facts, with a value too % different from \texttt{0.5\cs{linewidth}} either the wrapped % text has problems with inter word spacing and hyphenation % because of the small measure, or, on the opposite, the % indented lines of the wrapping text would have similar % problems. % % Notice that the first implementation of this package, % version~4, achieved the desired result but there were two % drawbacks: $(a)$ the syntax was rather different from that of % the other environments, and $(b)$ any possible caption was % typeset within the same framing environment. In version~5 both % drawbacks were eliminated, but since the environment syntax is % different, in oder to assure backwards compatibility a package % option was defined in order to fall back to the previous % version~4 behaviour; nevertheless we discourage this solution, % and invite uers to use the most recent version. In version 6 % the \Env{wraptext} environment was further enhanced so as to % accept several \texttt{key=value} settings concerning the text % appearance, the colours, and other details relative to the % wrapping process. Again another fall back option was defined % in order to use the same functionalities of version~5; again % we discourage using any fall back solution. This version~7 % does not use anymore the \pack{curve2e} functionalities, but % resorts to package \pack{pict2e}; the code is simpler and % several dozen lines shorter. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Environment syntax} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % The new syntax for \Env{wrapfigure} and \Env{wraptable} is % backwards compatible with the original one: just a final % optional star is added to the original list of arguments. % % The optional star is available only for the standard % \Env{wrapfigure} and \Env{wraptable} environments because the % backwards compatibility requires the first four optional and % mandatory arguments to be maintained identical. When the % optional star is specified, the \meta{indented lines number} % is interpreted as the correction to the computed value. % % Notice the different syntax in versions~4, 5, 6 and~7 of the % \Env{wraptext} syntax. % % \begin{ttsintassi}\setfontsize{8.00} %\Bambiente{wrapfigure}\oarg{indented lines number}\marg{location}\oarg{overhang}\oarg{width}\meta{$\star$} %\qquad\meta{figure} %\Eambiente{wrapfigure} %~ %\Bambiente{wraptable}\oarg{indented lines number}\marg{location}\oarg{overhang}\oarg{width}\meta{$\star$} %\qquad\meta{table} %\Eambiente{wraptable} %~ %\textnormal{\color{red}Package option \opt{WFold} required for backwards compatibility with version 4.*}. %~ %\Bambiente{wraptext}\oarg{location}\barg{width}\aarg{indented line number correction}\parg{caption label} %\qquad\meta{text to frame} %\Eambiente{wraptext} %~ %\textnormal{\color{red}Package option \opt{WFfive} required for backwards compatibility with version 5.*}. %~ %\Bambiente{wraptext}\oarg{indented lines number correction} \marg{location} \oarg{overhang} \marg{width} %\qquad \meta{optional colour settings} %\qquad\cs{includeframedtext}\oarg{insertion measure}\marg{text to frame}\oarg{\meta{frame thickness},\meta{frame separation}}\oarg{radius} %\Eambiente{wraptext} %~ %\textnormal{\color{red} No package option required for versions~6.* and~7.*}. %~ %\Bambiente{wraptext}\oarg{indented lines number correction}\marg{location}\oarg{overhang}\marg{width} %\cs{includeframedtext}\oarg{insertion measure}\marg{text to frame}\oarg{key=value settings}\oarg{radius} %\Eambiente{wraptext} % \end{ttsintassi} % % \noindent %\textcolor{red}{Please notice that the \Env{wraptext} % environment does not require any optional star, because the % specified indented lines number is always interpreted as its % \emph{correction, not its absolute value}; this difference is % clearly marked in the above syntax medallion. If users % specified the star in similitude with the other two % environments, with versions~5.* to~7.* the unnecessary % star produces a strongly emphasised warning message visible in % the editor console and in the \texttt{.log} file. With the old % version~4.* the unnecessary star is printed as part of the % text to be framed. %\newline % Please notice also that all three \Env{wraptext} syntaxes, % thanks to differently delimited optional arguments with % peculiar default values, become very similar when such % optional arguments are reduced to a minimum; only the % \meta{location} argument is delimited by brackets with the old % version and with braces with the newer ones.} % % It may be useful to compare the \cs{includeframedtext} macro, % used to insert a framed test into a \Env{wraptext} % environment, with \cs{includegraphics}, used to insert an % external image into a \Env{figure} environment. Their % functions are similar even if they refer to different objects % to include. Their codes are obviously very different and the % latter is much more complex than the former. The solution for % a framed text used by version~4 was inspired by the % information found on \texttt{tex.stackexchange} that used the % very elaborate \Env{tcolorbox} environment; version~5 used % instead a much simpler command \cs{framedbox} based on the % \pack{curve2e} package macro \cs{Curve}. Version 6.* admits % many settings, not just the \meta{frame thickness} and the % space around the framed text, but several others ones % collectively indicated with \meta{settings}; such settings % refer to colours, dimensions, styles, and so on, relative to % the text and to the frame; moreover they are set by % means of the \texttt{key=value} syntax. Version~7.* does not % use any more the \pack{curve2e} macro \cs{Curve}, % but it uses the simpler low level macros defined in package % \pack{pict2e}. The syntax is the same as with version~6.* but % the inner workings are much different and faster to execute. % As it can be seen, the logic, not the code, behind these % different macros are very similar. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\section{Examples} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % We display some examples by using fake objects and suitably % long paragraphs; some fake-language long-paragraphs are % obtained by means of the \pack{kantlipsum} package % functionalities; they are typeset with an italic font in order % to distinguish their text from the normal one. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{A wrapped figure} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % %\begin{wrapfigure}{r}{50mm} %\centering\unitlength=1mm %\begin{picture}(40,30) %\polyline(0,0)(0,30)(40,0)(0,0)(40,30)(0,30) %\Line(40,0)(40,30) %\end{picture} %\caption{A rectangle with its diagonals}\label{fig:figure} %\end{wrapfigure} %{\itshape \kant[1]} % The code used to type figure~\ref{fig:figure} is the following: % %\begin{flushleft}\ttfamily\obeylines% %\noindent\Bambiente{wrapfigure}\Marg{r}\Marg{50mm} %\cs{centering}\cs{unitlength}=1mm %\Bambiente{picture}\texttt{(40,30)} %\cs{polyline}\texttt{(0,0)(0,30)(40,0)(0,0)(40,30)(0,30)} %\cs{Line}\texttt{(40,0)(40,30)} %\Eambiente{picture} %\cs{caption}\Marg{A rectangle with its diagonals}\cs{label}\Marg{fig:figure} %\Eambiente{wrapfigure} %\Marg{\cs{itshape} \cs{kant}\Oarg{1}} %\end{flushleft} % % No asterisk was used because the package succeeded to % correctly compute the necessary number of indented lines. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{A wrapped table} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\begin{wraptable}[-1]{l}* %\centering % \begin{tabular}{cc} % \hline % First & Second\\ % Third & Fourth\\ % \hline %\end{tabular} %\caption{A small table}\label{tab;small-table} %\end{wraptable} %{\itshape \kant[2]} % % The wrapped small table~\ref{tab;small-table} has been typeset % by means of the following code. %\begin{flushleft}\ttfamily\obeylines %\Bambiente{wraptable}\Oarg{-1}\Marg{l}* %\quad\cs{centering} %\quad\Bambiente{tabular}\Marg{cc} %\qquad\cs{hline} %\qquad First \& Second\string \\ %\qquad Third \& Fourth\string \\ %\qquad\cs{hline} %\quad\Eambiente{tabular} %\quad\cs{caption}\Marg{A small table} %\Eambiente{wraptable} %\Marg{\cs{itshape} \cs{kant}\Oarg{2}} %\end{flushleft} % Notice the absence of the braced width value; as said below, % this braced value is optional, and the software autonomously % computes the width of the wrapped object. This feature may be % useful in many instances, although a smart use of this width % parameter might yield better looking results. % % Wrapping a small table is a little more difficult than % wrapping a figure, because the width of the inserted object is % not exactly known in advance, and it is difficult to estimate; % therefore it might be necessary to execute several trial % compilations. In any case a \cs{centering} command might help % to center the table within the indention of the wrapping text. % Nevertheless the software can compute the object width if a % zero value is specified, or if the \meta{width} parameter is % completely omitted together with its braces; this second % possibility is a feature of this package, that uses a % \LaTeXiii property by which even a braced argument can be % treated as an optional argument with a predefined default % value; see below more details about such feature. % % On the opposite if the user estimates that the table with its % caption might use 5~lines, and specified such a value as the % first (optional) argument to the environment, and no asterisk % is specified, the result is shown in % table~\ref{tab:wrong-wrapped-table}, but it is a very % poor one, with the last caption line overlapping the wrapping % text. % %\begin{wraptable}[5]{l} %\centering % \begin{tabular}{cc} % \hline % First & Second\\ % Third & Fourth\\ % \hline %\end{tabular} %\caption{A small table}\label{tab:wrong-wrapped-table} %\end{wraptable} %{\itshape \kant[2]} % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{A wrapped text} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \begin{wraptext}{l} % \includeframedtext{Text, text, text, text, text, text, text, text, text, text, text.} % \end{wraptext} % {\itshape \kant[3]} % % The above example was typeset with this simple code: %\begin{flushleft}\obeylines % \Bamb{wraptext}\Marg{l} % \cs{includeframedtext}\Marg{\ttfamily Text, text, text, text, text, text, text, text, text, text, text.} % \Eamb{wraptext} % \Marg{\cs{itshape} \cs{kant}[3]} %\end{flushleft} % % The result is the same as that obtainable with version~4 of % this package, but the \meta{location} argument specification % is braced instead of bracketed. % % Remember, though, what was previously remarked about using an % unnecessary optional star with the \Env{wraptext} environment; % with this package versions~5 to~7 the unnecessary star % produces a warning message, while with version~4 it prints the % star as if it was part of the text to be wrapped. % % If a caption is specified, version~4 would print it within the % framed box, while versions~5,~6, and~7 print a visible warning % message and in the \texttt{.log} file. % % \begin{wraptext}{r} % \includeframedtext{Text, text, text, text, text, text, text, text, text, text, text.} %\caption{A wrapped text}% % \end{wraptext} % {\itshape \kant[3]} % % With version~5 users have the possibility of choosing the % colours for all three elements of the framed text; if within % the \Env{wraptext} environment and before using % \cs{includeframedtext} the colours are set different from the % default light grey for the background, black for the text, % and almost black for the frame: % \begin{ttsintassi} %\cs{SetWFfrm}\marg{frame colour} %\cs{SetWFbgd}\marg{background colour} %\cs{SetWFtxt}\marg{text colour} % \end{ttsintassi} % Such commands, in versions~6 and~7, are already taken care by % the relevant \texttt{key=value} options, while with version~5 % these are user commands. See figure~\ref{fig:framed text} % typeset with various version~7 options. % %\begin{figure} %\makebox[\textwidth]{\includeframedtext{Text}[insertionwidth=0.45\linewidth] %\hfill %\includeframedtext{Text}[insertionwidth=0.45\linewidth,fboxrule=1mm]}\\[2ex] %^^A %\makebox[\textwidth]{\includeframedtext{Text}[insertionwidth=0.45\linewidth,textcolor=red,fboxrule=2pt] %\hfill %\includeframedtext{Text}[insertionwidth=0.45\linewidth,fontstyle=\Large]}\\[2ex] %^^A %\makebox[\textwidth]{\includeframedtext{Text}[insertionwidth=0.45\linewidth,backgroundcolor=yellow] %\hfill %\includeframedtext{Text}[insertionwidth=0.45\linewidth, framecolor=blue, backgroundcolor=yellow, fboxrule=1mm]}\\[2ex] %^^A % \makebox[\textwidth]{\includeframedtext{Text}[insertionwidth=0.5\linewidth, fboxrule=0pt, backgroundcolor=cyan, textcolor=white, fontstyle=\Huge\bfseries]} %\caption{Some framed text boxes with different dimensional % parameters, different font size, and different colours}\label{fig:framed text} %\end{figure} % % Figure~\ref{fig:framed text} used the following code, where it % is evident that the \cs{includeframedtext} command is % available even outside the \Env{wraptext} environment. %\begin{flushleft}\ttfamily\obeylines %\Bambiente{figure} %\cs{makebox}[\cs{textwidth}]\Marg{\cs{includeframedtext}\Marg{Text}\% %\qquad [insertionwidth=0.45\cs{linewidth}] %\quad\cs{hfill} %\quad\cs{includeframedtext}\Marg{Text}\% %\quad [insertionwidth=0.45\cs{linewidth},fboxrule=3pt]}\cs{\char92}[2ex] %\% %\cs{makebox}[\cs{textwidth}]\Marg{\cs{includeframedtext}\Marg{Text}\% %\quad [insertionwidth=0.45\cs{linewidth},textcolor=red,fboxrule=2pt] %\quad\cs{hfill} %\quad\cs{includeframedtext}\Marg{Text}\% %\qquad[insertionwidth=0.45\cs{linewidth},fontstyle=\cs{Large}]}\cs{\char92}[2ex] %\% %\cs{makebox}[\cs{textwidth}]{\cs{includeframedtext}\Marg{Text}\% %\quad[insertionwidth=0.45\cs{linewidth}, backgroundcolor=yellow] %\quad\cs{hfill} %\quad\cs{includeframedtext}\Marg{Text}\% %\qquad[insertionwidth=0.45\cs{linewidth},framecolor=blue, %\qquad backgroundcolor=yellow,fboxrule=1mm]}\cs{\char92}[2ex] %\% % \cs{makebox}[\cs{textwidth}]{\cs{includeframedtext}\Marg{Text}\% %\quad [insertionwidth=0.5\cs{linewidth}, fboxrule=0pt, %\qquad backgroundcolor=cyan,textcolor=white,fontstyle=\cs{Huge}\cs{bfseries}]} %\cs{caption}\Marg{Some framed text boxes ... different colours} %\cs{label}\Marg{fig:framed text} %\Eambiente{figure} %\end{flushleft} % % As it is possible to notice from figure~\ref{fig:framed text}, % versions~6 and~7 add another facility; the colours and % dimensions of the elements of the wrapped objects are inserted % as \textit{key=value} options to the \cs{includeframedtext} % third argument \meta{settings}; its default value is “empty”; % users can introduce as many options as they desire, among the % valid ones; if an option is misspelled or its value is not % coherent with its nature, either the option is ignored, or an % error is raised. The valid options are the following ones; % they are listed in alphabetical order, because the options % described with the \texttt{key=value} syntax do not require % either a specific order or their presence; users can therefore % specify from zero to nine options. %\begin{description} %^^A %\item{\ttfamily backgroundcolor} % sets the background colour among those defined by the default % set provided by package \pack{xcolor}. The default colour is % light grey. %^^A % \item{\ttfamily fboxrule} % sets the thickness of the frame; a zero value % is allowed, otherwise it should not be smaller than % \texttt{0.4pt}; on the opposite it should not be set too large % and \texttt{1mm} appears as a thick enough frame around the % wrapped text. %^^A % \item{\ttfamily fboxsep} % sets the distance of the frame from the wrapped text; by % default it is set to \texttt{1ex}; also in this case it is % better to avoid exaggerations. Notice that the default value % depends on the wrapped text font x-height. %^^A %\item{\ttfamily fontstyle} % sets any available \emph{declaration} that changes the % characteristics of a font: size, series, shape; it is possible % to use also the \cs{usefont} command with all its four % arguments, even the font encoding. This \pack{wrapfig2} has % available also the \cs{setfontsize} command that can select % any size with any font that has available at least a stepwise % continuous size set; for example the Latin Modern fonts have a % stepwise continuous size set, while Computer Modern have % available only a discrete size set. %^^A %\item{\ttfamily framecolor} % sets the color of the frame; the colours available are those % available with package \pack{xcolor} to which no options have % been specified; see its documentation and in case load %\pack{xcolor} with the desired options before this package % \pack{wrapfig2}. The default colour is a very dark grey. %^^A %\item{\ttfamily insertionwidth} % sets the insertion width; as it was previously specified, if % this width is too small or too large it will be automatically % reassigned a value within the allowed range. %^^A %\item{\ttfamily radius} % sets the optional radius of the frame rounded “corners”; if it % is not specified, such radius is equal to the default value of % \cs{fboxsep}. Although it is possible to use it, we suggest to % abide from using it. %^^A % \item{\ttfamily scalefactor} % sets the value that establishes a reasonable range of the % insertion width; users can specify any value in the range % $xy_0 = y\ped{min} \leq y \leq y\ped{max} = y_0/x$, where % $y_0$ is the default value, and $x$ is the scaling factor that % by default equals $0.8$; this means that if $y_0$ equals half % the current measure, the inserted wrapped text produces an % indentation of the wrapping lines approximately between 60\% % and 40\% the current measure; the wrapped text should never % have a too short measure and the wrapping indented lines never % have a too short measure. If users specify a different value % to this key, they might get problems with inter word spacing % and with hyphenation. %^^A %\item{\ttfamily textcolor} % sets the text colour among those available with the default % set provided by package \pack{xcolor}. The default colour is % black. %^^A %\end{description} % % These versions~6 and~7 have a more flexible way compared to % version~5 to specify the details relative to the framed text, % but they are relevant only for the \cs{includeframedtext} % command; the syntax for the \Env{wraptext} environment opening % command is identical. As it was previously shown, the syntax % of environment \Env{wraptext} for versions~7,~6, and~5 is % practically identical to the one used for both other % environments; actually, as it can be seen below in the code % description of versions~7, 6 and~5, it has a fairly longer % definition; it is required by the necessity of avoiding the % \cs{caption} changes foreseen in package{wrapfig} when % \pack{float} is used to define another floating object, but in % effects the new definition of the \Env{wraptext} environment % uses the same \cs{wrapfloat} and \cs{endwrapfloat} commands. % % In all three cases the \meta{width} parameter is a % \emph{braced optional argument}; for the \Env{wraptext} % environment its preset value is half the column width, that in % one column typesetting mode coincides with the text width. The % wrapped text is typeset in justified mode within a \cs{parbox} % argument; the measure of this text box should not be too small % (unless the text is less than one line long) otherwise the % inter word spacing might be too large; at the same time the % measure of the mini paragraph cannot be too large, otherwise % the indented wrapping lines, generally justified, might get a % bad word spacing. As it was already explained, it is % recommended to avoid specifying the optional \meta{widh} % outside the range of 40\% to 60\% the column width. Actually % specifying \texttt{0.2\cs{textwidth}} or % \texttt{0.4\cs{columnwidth}} when typesetting in two column % mode produces approximately the same result, because % \cs{columnwidth} is a little less than half the % \cs{textwidth}. In any case versions~7 to~5 of \Env{wrapfig2} % reset any specified width outside the above range to the % nearest range bound. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Remarks} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % The syntax of the original environments \amb{wrapfigure} and % \amb{wraptable} has not been changed, except for a last % optional star. The fact that the last \emph{braced argument is % optional} does not change the backward compatibility with the % original environments. % % Therefore the optional \meta{line number} argument maintains % its meaning, unless the optional star is specified; in such a % case that number assumes the meaning of a correction to the % computed number of the indented lines. % % The mandatory \meta{location} maintains its meaning and the % legal values are \texttt{l} (left), \texttt{r} (right), % \texttt{L} (floating left), \texttt{R} (floating right), % \texttt{i} (inner margin), \texttt{o} (outer margin), % \texttt{I} (floating inner margin), \texttt{O} (floating outer % margin). % % We tested all of them, but as a (possibly questionable) % personal choice we prefer to place the wrapped object at the % left of the text, without floating it and irrespective of the % folio parity. % %\begin{wraptext}{l}{0.5\textwidth}% %\includegraphics[width=\hsize]{stele-todi-small} %\caption{The Todi stela written in Gallic and Latin. % Gregorian Etruscan Museum in Rome.}\label{txt:todi-stela} %\end{wraptext} %{\itshape\kant[4]} % % As in the previous examples, we prefer to specify the wrapping % environment just before a sufficiently long paragraph. Should % the paragraph be too short to completely wrap the object, all % the environments are capable of counting the number of used % indented lines and to apply the remaining number (and the % \cs{overhang} amount) to the following paragraph(s); in these % circumstances it might be necessary to recourse to the % optional star in order to correct the indention, since the % mechanism does not consider the inter paragraph spacing that % \LaTeX introduces only at ship~out time. % % We avoid also to enter the wrapping environment before % paragraphs that are close to a page break; this action would % tickle the idiosyncrasies of the software, and requires moving % the wrapping environment some paragraphs before or after the % preferred one; but this can be done only while reviewing the % document, because any change in the previous source text might % change the situation if this adjustment is done while still % editing the document. % % Some of these idiosyncrasies might be avoided if the wrapped % objects are allowed to float. Even Arseneau's \pack{wrapfig} % allowed this feature, but according to our experience floating % objects may solve the problems produced when they are in the % chosen position, but they may create other problems; for % example, if the chosen position falls close the the end of a % page, and after that position a list starts; if the object % floats to the beginning of the next page, and the list is % still being processed, other errors emerge. For this reason % floating wrapped objects are not so safe, and the best % solution would be to chose their best position “by hand”. % % Juan Luis Varona Malumbres, whom we thank very much, noticed % that if the space left at the bottom of a page is scarse, it % may be that a section title falls alone at the bottom of the % page and the wrapping environment with its wrapping text gets % typeset on the next page; this of course is not acceptable. We % found the place to correct and versions~7 and~6 more often % than not do not exhibit any more this “feature”. Unfortunately % in some rare cases this “feature” pops up again; a % \cs{newpage} command before the section title solves the % problem. This rare feature could be avoided if the sectioning % commands are redefined; but this would imply modifications to % a large number of redefinitions due to the large varieties of % classes and packages that redefine such sectioning commands. % % With the standard environments the optional parameter % \meta{overhang} does exactly what its name implies: the % wrapped object protrudes into the adjacent margin exactly by % the specified amount. This parameter is not available for the % \Env{wraptext} environment, or better, it is still available % in versions~7, 6 and~5, but we recommend to abide from using % it; we believe that a wrapped text logically pairs the % wrapping text; of course this is just a personal opinion. % % The \meta{width} parameter has been already sufficiently % described; we just remember that for \Env{wraptext} this % parameter is optional and its default value amounts to half % the current measure; this insertion width can be specified but % it should not be too different from its default value $y_0$, % set to 50\% of the current measure. For the standard % environments this parameter value appears to be mandatory; % actually it really is a braced optional argument only for the % redefined environments \env{wrapfigure} and \env{wraptable}. % % Matter of facts, for the \Env{wraptext} environment we defined % a command in order to specify a factor $x$ so as to avoid % getting the object width outside the range % $xy_0 \leq y \leq y_0/x$, where $y_0$ is the preset default % width; if the authors specified a value outside this range, % the above environment automatically resets the insertion width % $y$ to the nearest bound. Of course authors have the % possibility to change the preset $x$ value, if they redefine % the \cs{WFscalefactor} macro, but such resetting is strongly % discouraged; the default value is~$0.8$. % %\begin{wraptext}{l} %\includeframedtext{^^A % \foreignlanguage{greek}{Κα᾽γὼ σὲ πατάξας διαλύσω τὸ κρανὶον}} % \caption{A sample text in Greek}\label{txt:greek} %\end{wraptext} %{\itshape\kant[7]} % % If optional parameters are not used and the mandatory ones are % reduced to a minimum (remember the \meta{width}, in spite of % being braced is optional) the three environments produce the % same results; the difference, in spite of the nature of the % wrapped object differs only with the environment name. % Text~\ref{txt:todi-stela} displays an \emph{image} that % contains some text; it is reasonable to insert it with the % \Env{wrapfigure} environment, but it is not absurd to insert % it with the \Env{wraptext} one, as we did with % text~\ref{txt:todi-stela}. % % The wrapped text may be written also in a foreign language, % even if it uses a different alphabet. Evidently this language % should be specified in the preamble of the author's document, % either when using \pack{babel} or \pack{polyglossia}. The % example text~\ref{txt:greek} was typeset with the following % code: %\begin{flushleft}\ttfamily\obeylines %\Bamb{wraptext}\Marg{l} %\cs{includeframedtext}\Marg{\% %\qquad\cs{foreignlanguage}\Marg{greek}\Marg{\foreignlanguage{greek}{Κα᾽γὼ σὲ πατάξας διαλύσω τὸ κρανὶον}}} %\cs{caption}\Marg{A sample text in Greek}\cs{label}\Marg{txt:greek} %\Eamb{wraptext} %\end{flushleft} % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Other floating objects} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Pictures and textual arrays may be floated by means of the % standard \amb{figure} and \amb{table} environments. But other % floating objects may be defined by means of other packages, % such as \pack{float}, or classes, such as \class{memoir}. % Besides floating, the main difference is the name of the % caption “label”: Figure, Table, Algorithm, Example, and so on, % in addition to the lists of such objects. % % If floating is not necessary, this package (as well as the % original one) allows to use the underlying environment % \Env{wrapfloat} that uses the same syntax as \Env{wrapfigure} % plus the mandatory name of the new object: even a figure % might be introduced without using \amb{wrapfigure}, by using % instead: %\begin{flushleft}\setfontsize{9.275}\ttfamily\obeylines %\Benv{wrapfloat}\Marg{figure}\oarg{line number}\marg{placement}\oarg{overhang}\marg{width}\meta{$\star$} %\quad\qquad\meta{image} %\Eenv{wrapfloat} %\end{flushleft} % Another \meta{object} might be wrapped by using: %\begin{flushleft}\ttfamily\obeylines %\Benv{wrapfloat}\marg{object name}\oarg{line number}\marg{location}\% %\quad \oarg{overhang}\marg{width}\meta{$\star$} %\qquad\qquad\meta{object} %\Eenv{wrapfloat} %\end{flushleft} % % By reading the documentation of the original \pack{wrapfig} % package, it may be assumed that, if the floating % \meta{location} codes have to be used, another floating object % with the desired \meta{object name} has to be previously % defined by means of the functionalities of other packages or % classes. But, if the non floating \meta{location} codes % are used, the presence of another \meta{floating object} % environment appears to be unnecessary. % % This is actually possible by “cheating” a little bit: it can % be actually wrapped any \meta{object} by using the % \Env{wrapfigure} environment, while assigning a different name % to the caption label; something similar to typeset a small % figure within a non floating environment. The obvious draw % back is that the caption is numbered as a figure. % % In order to avoid such drawbacks and to have a real floating % \meta{other object} environment it is necessary to procede by % defining a new real floating environment with that name. To do % this task, \pack{wrapfig2} versions~5,~6, and~7 use the % \pack{float} package. % % As it is possible to verify by reading the section where the % code is documented, the operation is not that simple because % \pack{float} redefines several internal macros that are % incompatible with both \pack{wrapfig} and \pack{wrapfig2}. % This is why, even with \pack{wrapfig2} in versions~5--7, that % load the \pack{float} package, the code for this environment % redefines the \cs{caption} command so that Arseneau had to % define some adjusting macros in order to deal with something % different from what it was with the \LaTeXe kernel. We did not % modify what Arseneau defined, although it did not work % correctly with the new \Env{text} floating environment. % Therefore we reinstated the \LaTeXe kernel relevant % definitions. % % It is possible that such resetting of the original definition % is necessary also with floating objects defined by other % means, for example by using the functionalities of the % \class{memoir} class. We admit we did not test this package % functionality with class \class{memoir}; % \textcolor{red}{feedback on this compatibility issue % is very welcome}. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section*{Acknowledgements} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % We gratefully thank Donald Arseneau who gave the \TeX % community the original \Env{wrapfig} package. For what % concerns wrapped text, we did not use Arseneau's \pack{framed} % package, because we wanted a frame with rounded corners. % Nevertheless, while developing our package, we experimented % also with his package that yields good results but with the % ordinary right angle frame corners. % % Thanks to Heinrich Fleck who submitted to our attention the % \texttt{tex.stackexchange} message where the problem of % wrapping text was presented possibly for the first time. The % solution presented in \texttt{tex.stackexchange} appears to be % oversimple, almost trivial; especially it does not solve the % problem of a caption if one is desired to describe that % wrapped text. Moreover the solution of % \texttt{tex.stackexchange} used in a very simple way the % \Env{tcolorbox} environment, that behind the scenes uses a % very heavy set of multifunctional macros that offer % functionalities that are not required for this problem. % % Warm thanks also to Juan Luis Varona % Malumbres for his % precious feedback and his suggestions. % % Herbert Voß spotted the necessity to follow a % specific loading order if the \pack{amsmath} % needs to be used; he was so kind to send us a % bug notice together with a minimum working example. % Thanks to Bruno Pagani who pinpointed the exact % point that conflicted with \pack{wrapfig2} so % that I could fix this conflict. Bruno Pagani % discovered also that package \pack{amstext} is % the source of this conflict and that this % package is loaded not only by \pack{amsmath} % but also by other packages such as, for example, % by \pack{siunitx}. % % Many thanks to Ulrike Fisher who found a loading order problem % reported on \texttt{tex.stackexchange} because a conflict with % package \pack{circledsteps}, that should be loaded bifore % \pack{wrapfig2}. Thanks a lot Ulrike. % %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \CheckSum{1382} % \StopEventually{} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %\iffalse %<*package> %\fi %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{The code} %^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Here we describe and comment the code of this package; % essentially only the initial parts need some comments; % because the final ones are almost identical to Arseneau's % original code. % % The usual specification of the format name and date, and the % identification of this specific package have been already % specified by the \texttt{.dtx} file. % % First of all we check if certain packages have already been % loaded; some of these packages, such as \pack{wrapfig}, that % might have been previously directly loaded, or might have been % loaded by other packages, are incompatible with this package % \pack{wrapfig2}. such packages, as \pack{caption} or % \pack{subcaption}, redefine some internals that we did not % want to replace so as to avoid other possible % incompatibilities. We first check if a specific macro with the % \texttt{WF} prefix has already been defined; if so, this % package \emph{loading} is aborted with a very visible error % message. In contrast the \emph{job} is not aborted, because % the presence of the original \pack{wrapfig} package might % still be sufficient; evidently there will be many errors if % some new user commands or environments are used. % %{\color{red}\paragraph{Caution} Besides the evident error % message, that might be neglected by the user, the job may % continue but it may produce several errors difficult to % interpret. Please, in these cases read the \texttt{.log} file % and look for error messages; there you are going to discover % what has gone wrong with your way of using this package.} % % \begin{macrocode} \ifcsname c@WF@wrappedlines\endcsname \PackageError{wrapfig2}{ \MessageBreak **************************************************\MessageBreak Package `wrapfig' has already been loaded perhaps \MessageBreak by other packages, for example caption or subcaption.\MessageBreak Such packages are incompatible with wrapfig2 \MessageBreak Loading of`wrapfig2' is aborted \MessageBreak **************************************************\MessageBreak }{You might type X and might get along without\MessageBreak this package if you don't use the new environment \MessageBreak `wraptext' and the new commands; otherwise you get \MessageBreak errors about such environment not being defined; \MessageBreak you must kill your job!} \expandafter\endinput\fi % \end{macrocode} % % We keep the original definition of the % \cs{WF@warning} and the original definition of % the \opt{verbose} option; but we add the new % \opt{WFold} and \opt{WFfive} options in order to % fall back to the functionalities of the previous % version~4 or~5, at least for what concerns the % \Env{wraptext} environment. % % % \begin{macrocode} \def\WF@warning{\PackageWarning{wrapfig2}} \DeclareOption{verbose}{\def\WF@info{\PackageInfo{wrapfig2}}} \newif\ifWFnew \let\ifWFnew\iftrue \newif\ifWFfive \let\ifWFfive\iffalse \DeclareOption{WFold}{\let\ifWFnew\iffalse} \DeclareOption{WFfive}{\let\ifWFnew\iffalse\let\ifWFfive\iftrue} \ProcessOptions % \end{macrocode} % % We load the \pack{etoolbox} package, in order to have % available its powerful macros. % % If it was not previously loaded, we load the \pack{xfp} % package, that allows us to perform precise calculations. % % Loading the \pack{xparse} package is necessary in order to use % one of its rare features that did not migrate to the \LaTeX % kernel. From the \LaTeX News Letter dated October 2020: %\begin{quote} % Most, but not all, of the argument types defined by % \pack{xparse} are now supported at the kernel level. In % particular, the types \texttt{g/G}, \texttt{l} and \texttt{u} % are not provided by the kernel code; these are % \emph{deprecated} but still available by explicitly loading % \pack{xparse}. All other argument types are now available % directly within the \LaTeXe kernel. %\end{quote} % The availability of these \emph{deprecated} types eases the % treatment of the backwards compatibility of this software with % the original \pack{wrapfig} and \pack{wraptable} % functionality. It deals with the mandatory \meta{width} % argument of the \Env{wrapfigure}, \Env{wraptable}, the new % \Env{wraptext}, and \Env{wrapfloat} environments, where it was % possible to specify a zero value. Now it is possible to omit % it completely because it is a \emph{braced optional argument} % with a \texttt{0pt} default value. % % % \begin{macrocode} \@ifpackageloaded{xparse}{}{\RequirePackage{xparse}} \@ifpackageloaded{xfp}{}{\RequirePackage{xfp}} \@ifpackageloaded{etoolbox}{}{\RequirePackage{etoolbox}} \@ifpackageloaded{float}{}{\RequirePackage{float}} \@ifpackageloaded{color}{}% {\@ifpackageloaded{xcolor}{}% {\RequirePackage{xcolor}}% } \@ifpackageloaded{pict2e}{}{\RequirePackage{pict2e}} \@ifpackageloaded{xkeyval}{}{\RequirePackage{xkeyval}} % \end{macrocode} % Notice that we loaded the \pack{xcolor} package without any % option in order to avoid option clash errors, and users who % want to use \pack{xcolor} with options should load it % \emph{before} this package \pack{wrapfig2}, versions~5--7. % {\color{red}Users are warned to pay attention to avoid loading % the \pack{color} package: they should never load it % before or after loading \pack{wrapfig2}; if they do, they % receive various warning or error messages because % \pack{xcolor} redefines some \pack{color} internal commands; % everything is explained in the \pack{xcolor} documentation.} % % In order to avoid conflicts with \pack{amstext} % and its |\text| command, we have to save its % definition before actually executing any part of % this package, and restore its value at the end % of this package; see the second part of this % procedure at the very end of this package. % \begin{macrocode} \ifcsdef{text}{\let\amsTextText\text}{} % \end{macrocode} % % In order to define the new floating object \texttt{text} we % have to load the package \pack{float}, but only if versions~6 % or later are used; in other words, only if the \cs{ifWFnew} % switch is \texttt{true}. % % If the \cs{chapter} command is or is not defined we have to % load the \pack{float} package with different options; for % example, if we are using the \class{article} class, the % \cs{chapter} command is undefined, and the last option might % become \opt{section} (although in the standard \class{article} % class, no floating object counter belongs to any other counter % reset list) so as to have the floating \Env{text} environment % correctly reset the right counter with the right label before % the object number. % \begin{macrocode} \ifboolexpr{ bool{WFfive} or bool{WFnew} }% {\floatstyle{plain}% \ifcsname chapter\endcsname \newfloat{text}{tbp}{lotx}[chapter]% \else \newfloat{text}{tbp}{lotx}% \fi \floatname{text}{Text}% redefine to localise in other languages \let\WF@text@caption\float@caption }{} % \end{macrocode} % % If the users wanted to add the \texttt{text} counter to some % sectioning command counter reset list, they might use the % \cs{counterwithin} command now available with the recent % updates of the \LaTeX kernel; see the \LaTeX newsletter~28 for % details (terminal command: \texttt{texdoc ltnews28}). Its % syntax is the following: %\begin{ttsintassi} %\cs{counterwithin}\marg{counter}\marg{main counter reset list} %\end{ttsintassi} % % Next we define some dimensions, boxes, token registers, % \TeX counters, and alias names, plus some color and macro % definitions. The \cs{WF@correctlines@switch} \TeX numeric % register (not a \LaTeX counter) is going to be used as a % boolean switch: if its value is zero, il means “false”, % otherwise it is “true”; in the other definitions below, it % will be set only to 0 or 1, depending on the % presence of the optional star. % \begin{macrocode} \newdimen\wrapoverhang \wrapoverhang\z@ \newdimen\WF@size \newcount\c@WF@wrappedlines \newbox\WF@box \newbox\NWF@box \newtoks\WF@everypar \newif\ifWF@float \newcount\WF@correctlines@switch \let\@@parshape\parshape \let\WF@@everypar\everypar \newlength\WFfrthick \newlength\WFfrgap \newlength\WFfrwidth \newlength\WFfrheight \newdimen\insertwidth \newlength\WFXR \newlength\WFYD \newlength\WFXL \newlength\WFYU \newdimen\radius \newdimen\WFinsertwidthL \newdimen\WFinsertwidthH \definecolor{WFbackground}{rgb}{0.95,0.95,0.95} \definecolor{WFframe}{rgb}{0.1,0.1,0.1} \colorlet{WFtext}{black} \def\SetWFbgd#1{\colorlet{WFbackground}{#1}} \def\SetWFfrm#1{\colorlet{WFframe}{#1}} \def\SetWFtxt#1{\colorlet{WFtext}{#1}} \def\WFsplitdimens#1,#2!{\fboxrule=#1\relax\fboxsep=#2\relax} \providecommand\setfontsize{} \RenewDocumentCommand\setfontsize{O{1.2} m}{% \fontsize{#2}{\fpeval{#1*#2}}\selectfont} \def\WFscalefactor{0.8}% \newcommand*\WFscalewidth{% \WFinsertwidthL=\fpeval{\WFscalefactor*0.5\columnwidth}\p@ \WFinsertwidthH=\fpeval{0.5\columnwidth/\WFscalefactor}\p@ \ifdim\insertwidth<\WFinsertwidthL \insertwidth=\WFinsertwidthL \else \ifdim\insertwidth>\WFinsertwidthH \insertwidth=\WFinsertwidthH \fi \fi }% % \end{macrocode} % We define several options that use the \texttt{key=value} % syntax. Above we have already loaded the \pack{xkeyval} % package that offers also some ‘X’ labeled macros that mimic % the corresponding \LaTeXe kernel macros, but that are % necessary for using the \pack{xkeyval} internal macros. We % chose the \texttt{wraptext} option family name, because such % options are to be used mostly within the % \cs{includeframedtext} macro. % The \cs{ExecuteOptionX} used here stands for a general % initialisation of the listed options, but it will be used also % within the \cs{includeframedtext} command in order to set the % specified options for the specific use of this command. % \begin{macrocode} \DeclareOptionX{scalefactor}[0.8]{\def\WFscalefactor{#1}} \DeclareOptionX{fboxrule}[1pt]{\fboxrule=#1} \DeclareOptionX{fboxsep}[1ex]{\fboxsep=#1} \DeclareOptionX{framecolor}[WFframe]{\SetWFfrm{#1}} \DeclareOptionX{backgroundcolor}[WFbackground]{\SetWFbgd{#1}} \DeclareOptionX{textcolor}[WFtext]{\SetWFtxt{#1}} \DeclareOptionX{fontstyle}[\normalfont]{#1} \DeclareOptionX{radius}[\fboxsep]{\radius=#1} \DeclareOptionX{insertionwidth}[0.5\columnwidth]{\insertwidth=#1} \DeclareOptionX*{\PackageWarning{wrapfig2}% {`\CurrentOption' ignored}} \ExecuteOptionsX{scalefactor, fboxrule, fboxsep, framecolor, backgroundcolor, textcolor, fontstyle, radius, insertionwidth} \ProcessOptionsX* % \end{macrocode} % % {\color{red}Should the format file be not so up to date, a % multitude of errors would be produced, and the user should % take care to load the \pack{xparse} and \pack{xfp} packages % before loading \pack{wrapfig2}. % Notice that most of the \pack{xparse} package functionalities % are already included in the format file at the date required % for this file. The \pack{xparse} package has been available % since about 2018; should the users have available a definitely % older \TeX system installation, either they upgrade it, or % they must avoid using this \pack{wrapfig2} package and should % use the original \pack{wrapfig} one; if they need to wrap % text, they should resort to some ingenious, not so trivial % tricks to do it.} % % Originally version~4 used the \pack{tcolorbox} package to % frame the wrapped text; we thought that loading that package % was too heavy on memory, even if the modern computers have % large working memories. But in order to maintain and track % possible errors the traced \texttt{.log} file would become too % large to be of any help; therefore in oder to draw a framed % box with rounded corners we thought it would be much simpler % to load the \pack{curve2e} package, just a second level % extension of the original \Env{picture} environment defined in % the \LaTeXe kernel; only some 30 lines of code are sufficient % to replace the extremely powerful \pack{tcolorbox} % functionalities otherwise required to frame wrapped text with % this \pack{wrapfig2} package. % % We were informed that \pack{curve2e} was incompatible with % some other packages, in particular its commands were not % compatible with the recent modification of the \Env{picture} % environment, that since 2019 is capable to use absolute % dimensional data, without reference to \cs{unitlength} % multipliers. Therefore we decided to avoid loading % \pack{curve2e} and used \pack{pict2e} internal low level % commands that are already upgraded to receive absolute % dimensioned parameters. Of course we had to redefine several % internal commands of \pack{wrapfig2}. Here we describe in % details such new macros. % % The definitions of the \Env{wrapfigure} and \Env{wraptable} % environments are very simple by means of the underlaying % \Env{wrapfloat} environments. % \begin{macrocode} \NewDocumentEnvironment{wrapfigure}{o m o G{0pt}}% {\wrapfloat{figure}[#1]{#2}[#3]{#4}}% {\endwrapfloat} \NewDocumentEnvironment{wraptable}{o m o G{0pt}}% {\wrapfloat{table}[#1]{#2}[#3]{#4}}% {\endwrapfloat} % \end{macrocode} % % Notice that the argument type descriptor \texttt{s} for the % optional star is not present in these definitions; if a star % is being used, it will be read by successive macros or % environments. % % In order to include the text to be wrapped the floating object % \Env{text} has already been defined, but we need a suitable % command to insert it with its frame into the \Env{wraptext} % environment body. Here is the code of some extra macros and of % the \Env{wraptext} environment. % % We start with redefining \cs{includeframedtext} valid for % versions~6 and~7, that accepts \texttt{key=value} options, and % give up the alternative definitions for older versions. % \begin{macrocode} \ifboolexpr{ bool{WFfive} or bool{WFnew} }% {\NewDocumentCommand\includeframedtext{% O{\insertwidth} m O{} o}{\bgroup% \ExecuteOptionsX{#3}% executes possible options \insertwidth=#1\WFscalewidth \framedbox{\insertwidth}{\fboxrule}{\fboxsep}[\radius]{#2}\egroup} }{} % \end{macrocode} % % Their simple syntax is the following %\begin{ttsintassi} %\cs{includeframedtext}\oarg{text width}\marg{text}\oarg{key=value settings}\oarg{radius} %\end{ttsintassi} % % The optional \meta{text width} is the (possibly scaled) width % computed by the \Env{wraptext} environment; but if authors % use this command outside the \Env{wraptext} environment, they % should specify a width; in any case the default value is half % the current measure \cs{linewidth}. % % The \meta{text} is the unformatted text to be wrapped; it will % be boxed and framed by the service macro \cs{framedbox}. % % The \meta{key-value settings} contains a comma separated list % of zero to nine settings with the syntax \texttt{key=value} % that are going to be used by both the \cs{includeframedtext} % and \cs{framedbox}. % % The last optional argument \meta{radius} (usable, but % actually useless because it can be set with a \emph{key=value} % option) is the curvature radius of the rounded frame corners; % its default value is going to be set to \cs{fboxsep}: in this % version its value is specified with the setting % \texttt{radius=\meta{dimension}} among the other % \meta{ket=value settings}; the default value is certainly the % best one, but users can specify a different value, of course % not too different from the default one. See some examples in % figure~\ref{fig:framed text}. % % The definition of \cs{framedbox} is reduced to very simple % settings (initially the \meta{text} is typeset within a % \cs{parbox} of reduced measure: in facts the specified % insertion width is diminished with the sum of twice the frame % thickness and the frame gap; in this way the box dimensions % are going to be used by \cs{Frame} to compute the centres of % the corner arcs so as to draw the curved corners box needed to % use the \cs{arc} \pack{pict2e} macro; the actual macro that % draws the background and the frame is \cs{Frame}; % nevertheless. it is \cs{framedbox} that decides to draw only % the background or also the box frame. % % The coloured background and the coloured frame have the same % contour; but the former is filled, while the latter is % stroked; we have to draw the same curve two times; first the % coloured background, then the superimposed frame % % This coloured framed curved corners rectangle is at the center % of the coordinate system of a \Env{picture} environment, and % has the correct dimensions to receive the boxed text; it is % trivial to center the text by means of a zero dimensioned box, % typical of the \Env{picture} environment. % % The code of this simple code is the following. % \begin{macrocode} \NewDocumentCommand\framedbox{m m m O{#3} m}{\bgroup % \dimen0=\dimexpr#1-(#2+#3)*2\relax \setbox0\hbox{\parbox{\dimen0}{\color{WFtext}#5}}% % \WFfrthick=#2\relax \WFXR=\dimexpr\wd0/2\relax \WFXL=-\WFXR% \WFYU=\dimexpr(\ht0+\dp0)/2\relax \WFYD=-\WFYU% \dimen4=#1\relax \dimen6=\dimexpr\ht0+\dp0+(#2+#3)*2\relax \dimen8=#4 % {\begin{picture}(\dimen4,\dimen6)(-0.5\dimen4,-0.5\dimen6) \Frame*{\dimen4}{\dimen6}{\dimen8}% \ifdim\WFfrthick>0pt\Frame{\dimen4}{\dimen6}{\dimen8}\fi \put(0mm,0mm){\makebox(0,0){\box0}}% % \end{picture}}% \egroup\ignorespaces} \NewDocumentCommand\Frame{s m m m}{% \bgroup \WFXR=\dimexpr#2/2\relax \WFXL=-\WFXR% \WFYU=\dimexpr#3/2\relax \WFYD=-\WFYU% \IfBooleanTF{#1}{\linethickness{0pt}\color{WFbackground}}% {\linethickness{\WFfrthick}\color{WFframe}}% % \moveto(\WFXR,\WFYD+#4)% \circlearc{\WFXR-#4}{\WFYU-#4}{#4}{0}{90}% \circlearc{\WFXL+#4}{\WFYU-#4}{#4}{90}{180}% \circlearc{\WFXL+#4}{\WFYD+#4}{#4}{180}{270}% \circlearc{\WFXR-#4}{\WFYD+#4}{#4}{270}{360}% \closepath \IfBooleanTF{#1}{\fillpath}{\strokepath}% % \egroup\ignorespaces} % \end{macrocode} % The syntax of \cs{framedbox} is the following. %\begin{ttsintassi}\setfontsize{8.5}\obeylines %\cs{framedbox}\marg{frame width}\marg{frame thickness}\marg{frame separation}\oarg{corner radius}\marg{text to be wrapped} %\end{ttsintassi}¬ % % The default value of the \meta{corner radius} is assigned so % as to equal argument number~3, that is the \meta{frame % separation} and both have a default value of \texttt{1ex}; % therefore they vary with the current font size. See % figure~\ref{fig:framed text}. The frame thickness is given a % default value of \texttt{1pt} if the command is used within % the body of the \cs{includeframedtext}; but if this command % received a different value the frame may be thicker, or even % vanish; we discourage values higher than \texttt{3pt} (about % \texttt{1mm}) and lower than \texttt{1pt} unless it is zero. % % The \cs{Frame} command syntax is the following %\begin{ttsintassi}\setfontsize{8.5}\obeylines %\cs{Frame}\meta{$\star$}\marg{frame width}\marg{frame height}\marg{corner radius} %\end{ttsintassi} % %\begin{wrapfigure}{i}{45mm} %\includegraphics[width=45mm]{LAPDFcolori} %\caption{Reduced size of Detlef Reimers's colour wheel} %\label{fig:colour-wheel} %\end{wrapfigure} % The optional $\star$ decides to avoid stroking; therefore the % macro just fills the contour with the background color; % without the $\star$ the contour is stroked with the frame % width and color. \cs{box0}, that contains the now formatted % text with the text color, shall be superimposed on the center % of the frame; of course it is the user's duty to select the % various colours so that they are contrasting; no white over % yellow, for example; but yellow over blue is OK; It is % convenient to give a look to the colour circle the single page % documentation of \pack{colors} by Detlef Reimers: % \texttt{texdoc colors}; figure~\ref{fig:colour-wheel}. Trace % a diameter on the circular drawing, and the colours at both % intersections with the wheel circumference are certainly % contrasting; of course users can work also with colours that % differ in density, typically white vs.~black. % % The definition of the \Env{wraptext} environment is more % detailed than that of \Env{wrapfigure} and \Env{wraptable}, % because most of the computations must be done on the % actual text to be wrapped, that does not have a specific % width; moreover the inserted text must not be too wide, nor % too slim in order to avoid problems with its justification or % the justification of the wrapping lines. The framed box width % is preset to 50\% of the normal text measure, but it can be % optionally specified to a different value (not too different % from 50\%); as with the other wrapping environments, % with versions~7 to~5 the inserted material width is a % \emph{braced optional argument}; with versions 6.0 and~7 the % default value of the \opz{radius} option is equal to % \cs{fboxsep}. % % For what concerns \Env{wraptext}, the opening statement % argument description list does not contain any descriptor for % an optional star. There is no need because the computation of % the insertion block height is pretty precise and at most the % user might desire one line more or less depending on the % measure of the whole formatted text, and that of the inserted % block and/or the measure of the indented wrapping lines; % sometimes it might be necessary to get rid of the space below % the inserted block when it gets typeset at the bottom of a % page. The star is not needed because for this environment % the optional first argument is always interpreted as the % indented lines number \emph{correction}; nevertheless if users % specify the optional star, as they are used to with the other % environments, such star produces a visible warning message % that reminds the user about its uselessness. % % It is true that some of the input parameters specified to the % opening command of any environment with \LaTeXiii are % available also to the closing commands; see the last paragraph % of section~2 in the \pack{xparse} documentation. %^^A % But the following definition uses the separate opening and % closing macros of the \Env{wrapfloat} environment; such % procedure breaks this second availability of the input % parameters, therefore it is necessary to save them into local % macros or count registers (remember that assignments to \TeX % count registers are \emph{local}, while assignment to \LaTeX\ % named counters, through the \cs{setcounter} macro and its % siblings, are \emph{global}) so that we can use their values % within the closing commands. % % The \cs{NWF@box} box register has been allocated at the code % beginning; remember that \LaTeXiii registers of any kind are % not limited in number as they were some years ago with % \LaTeXe. % % The last opening commands are conceived to box the object to % be wrapped, typeset within a coloured box with the default of % specified width; compared to version~4, these new versions~5 % to~7 do not use anymore the functionalities provided by % package \pack{tcolorbox}; instead they use the \pack{pic2e} % package functionalities to draw similar framed and shaded % boxes; this implies much less memory used by the almost % unlimited, but unused, functionalities of the \pack{tikz} % package on which \pack{tcolorbox} relies. Notice that the % plain \Env{picture} environment, extended with the % \pack{pict2e} package, can draw “ovals”, that is rectangles % with rounded corners, but, as far as we know, they have the % frame but cannot be colour filled. % % Notice the \Env{wraptext} has three definitions % depending on the logical switches \texttt{WFnew}, % \texttt{WFfive}; if one of these switches is \texttt{true} the % definitions apply to either version~5 or versions~6 to~7 of % this package; otherwise the last definition is a fall back to % the functionality and the syntax of the previous version~4 of % this package; in this case, in spite of the fact that the % previous version used package \pack{tcolorbox}, the new code % relies on the \pack{pict2e} functionalities in oder to get the % same results without using the memory heavy \pack{tcolorbox} % package. % % With version 7, the frame that surrounds the wrapped text % has the desired rounded corners; it is possible to easily % specify the background and the frame colours, that by default % are maintained to light grey and almost black respectively; % this flexibility allows to set also the frame thickness and % the gap width between the frame and its contents; by % default they are~1pt for the frame thickness, and~1ex for the % gap width, that changes with the font size. % % The number of indented lines is computed by means of the % \cs{fpeval} \LaTeXiii function; among the operands of this % function there is the number \texttt{2} used to take into % account the vertical space above and below the framed box. % It is possible that a value of \texttt{3} might reduce the % probability of using the \meta{line number correction}. But % it is not always true and we found that the chosen value is % a better choice. By increasing the corner arc radius it is % possible to modify the gap width. % % Eventually the \Env{wrapfloat} opening statement is created by % expanding the whole line complete of its arguments, by means % of the usual trick of defining a dummy macro within a group % that contains among its expansion the group closing command, % so that while it is being executed, it deletes itself from % memory. % % Notice that the syntax of the new \Env{wraptext} environment % is absolutely identical to that of the other two wrapping % environments in terms of \meta{line number correction}, % mandatory \meta{location}, optional \meta{overhang} and braced % optional \meta{width}. See below for the very different syntax % of the fall back version~4 opening \Env{wraptext} statement; % they become almost identical when no optional parameters are % specified, the only little difference being that the % \meta{location} argument is mandatory for versions~5 to~7, % while it is optional for version~4. % \begin{macrocode} \ifboolexpr{bool{WFnew} or bool{WFfive}}{% definition for versions 5 to 7 \NewDocumentEnvironment{wraptext}{O{0} m O{0pt} G{0.5\columnwidth} s}{% \insertwidth=#4\WFscalewidth \def\textplacement{#2}% \def\textcorrection{#1}% \def\textoverhang{#3}% \IfBooleanT{#5}{\PackageWarning{wrapfig2}{% *********************************************\MessageBreak With wraptext the optional star is useless \MessageBreak because the first optional argument always \MessageBreak means the "lines number CORRECTION" \MessageBreak *********************************************\MessageBreak}} \bgroup\edef\x{\egroup\noexpand\wrapfloat{text}% [\textcorrection]{\textplacement}[\textoverhang]{\insertwidth}*}\x% \def\caption{\unskip\unskip \refstepcounter\@captype \let\@tempf\@caption \unless\ifcsname @float@c@\@captype\endcsname \expandafter\expandafter\let \expandafter\@tempf\csname @float@c@\@captype\endcsname \fi \@dblarg{\@caption\@captype}% }% }{\endwrapfloat\ignorespaces}% % \end{macrocode} % % For the fallback to version~4 definition of this % \Env{wraptext} environment we have to start with the old list % of specifically delimited optional arguments. We remember that % this opening statement receives in order a bracket delimited % optional \meta{location} parameter, a vertical bar delimited % optional \meta{width}, an angle bracket delimited optional % \meta{line number correction}, a round parenthesis delimited % optional \meta{caption label}; the different delimiters allow % to specify any optional argument without regard with the other % ones, provided they are in the same logical order when more % than one optional argument is specified. % % Notice that the third optional argument contains the % \meta{line number correction}, therefore the star used with % the other environments is useless; contrary to versions~5 % to~7, if an asterisk is indadvertedly specified, it is typeset % as the first token of the wrapped test. % % The text to be wrapped, that forms the body of the % environment, must first be boxed into a correct width vertical % box; this is easily obtained with a \Env{minipage} % environment, of which the internal commands are used; this % insures that the text is typeset with the correct measure; % with the closing commands this boxed text is fed to the % \cs{framedbox} command, in order to be framed and assigned a % background color. % There is no possibility of specifying the colours unless the % whole \Env{wraptext} environment, preceded by explicit color % settings, is confined within a group delimited, for example, % by the \cs{begingroup} and \cs{endgroup} commands. % \begin{macrocode} }{% definition for version 4 fall back % \NewDocumentEnvironment{wraptext}% {O{l} D||{0.5\columnwidth} D<>{0} D(){text}}% {% Open environment \insertwidth=#2 \def\textplacement{#1}% \def\textcorrection{#3}% \def\WF@caption@label{#4}% \setbox0\hbox\bgroup \minipage{\dimexpr\insertwidth-2pt-6ex}% }{% Close environment \endminipage\egroup \begin{lrbox}{\NWF@box}% \framedbox{\box0}{1pt}{1ex}% \end{lrbox} \edef\NWF@wli]{\fpeval{% round((\ht\NWF@box+\dp\NWF@box)/\baselineskip,0)+2+\textcorrection}% }% \unles\ifhmode \leavevmode\noindent \fi \bgroup\edef\x{\egroup\noexpand\wrapfloat{\WF@caption@label}[\NWF@wli]% {\textplacement}{\the\insertwidth}}\x \box\NWF@box \endwrapfloat \ignorespaces } } % \end{macrocode} % % The opening command of the \Env{wrapfloat} environment % receives the mandatory and optional arguments plus the name of % the particular object to be wrapped. It is used to define the % prefix label of the caption number in case that the object is % described with a caption. The optional star is not explicit, % because it is going to be read by the \cs{WF@wr} macro. % % The closing command of \Env{wrapfloat} performs most of % the work necessary to wrap the box that contains the object % to be wrapped, but certain tasks are demanded to other service % macros. % % It is possible to set the width of the box if the \meta{width} % parameter is specified; otherwise it closes the \cs{hbox} that % was used; then it closes the main vertical box \cs{WF@box}. % After executing \cs{WF@floatstyhook}, necessary when package % \pack{float.sty} has been used, it saves the \meta{overhang} % value to be used when wrapping is actually performed; then it % verifies if the box height is too high to fit, or is too % short; possibly re-boxes this box in the same box register % with a negative initial vertical skip that raises the box % contents. % % Now comes the new actual definition of the fundamental % environment \Env{wrapfloat}; compared to the original % Arseneau's definition it is much longer, but it contains the % code that Arseneau, who used the \LaTeXe language, had to % split it in several macros in order to handle the multitude of % interspersed mandatory and optional arguments. % % The main function of this environment is to handle the box % that contains the figure, or the table, or the framed text, or % what else, so that the inserted box is preceded and followed % by suitable vertical spaces, and it is possible to compute the % number of lines to be indented; often this computed number is % correct; but in certain cases, when the code is used too close % or within prohibited wrapping text, such number might need to % be corrected. As it can be seen the optional star is not among % the argument descriptors of the opening commands; it will be % the following macro \cs{WR@wr} responsible of taking care of % the list of arguments and see if a star has been specified but % is still in the input flow. % % In order to handle any kind of wrapped object, this % environment first argument is the \meta{caption label}. It may % remain blank; but for wrapping figures or tables their % respective definitions specify the name of the floating object % they belong to; it is necessary that there exists a floating % environment with the same name of the wrapped object, even % when its wrapping environment is not specified with a floating % \meta{location} argument. % % \begin{macrocode} \NewDocumentEnvironment{wrapfloat}{m o m o G{\z@}}% {% open environment code \def\@captype{#1}\WF@wr[#2]{#3}[#4]{#5}% }{% close environment code \ifdim\hsize>\z@ \par\hrule\@width\hsize\@height\z@ % force width with % invisible rule \else \egroup \box\z@ % or close hbox \fi \egroup % close the vtop box; its width now is known \WF@floatstyhook % support for float.sty \def\width{\wd\WF@box}% \setlength\wrapoverhang{\WF@ovh}% \xdef\WF@ovh{\the\wrapoverhang}% save until wrapping \ifdim\ht\WF@box>\topskip \ht\WF@box\z@ \fi% too high, % set flag \ifdim\ht\WF@box<.5\p@ % too short, move up \global\setbox\WF@box\vtop{\vskip-1.4ex\unvbox\WF@box}% \fi \global\WF@size=% compute total box hight with \fpeval \fpeval{\ht\WF@box+\dp\WF@box+1.5\baselineskip+\tw@\intextsep}\p@ \aftergroup\WF@startfloating% use even when not floating \unless\ifWF@float \ifhmode {\unskip \parfillskip\z@skip \par \vskip-\parskip}% \aftergroup\noindent \fi \fi \global\@ignoretrue } % \end{macrocode} % % The working macro \cs{WF@wr} is defined with the \LaTeXiii % language; it grabs all the optional and mandatory arguments % in a single step, contrary to \LaTeXe that requires to split % the various steps in separate macros. In the definition code % we use also some commands, such as \cs{unless}, originally % defined by the \eTeX typesetting program extensions, that have % been included in the \pdfLaTeX, \XeLaTeX and \LuaLaTeX kernels % several years ago. % % Notice that the optional first (optional) argument, that % represents the number of indented lines or their correction % number, is saved into the macro \cs{WF@wli}, but if this % argument is not specified, \cs{WF@wli} is assigned the value % zero. The same happens for the \meta{overhang} optional % argument. % % After these adjustments, the software computes the box total % height plus some fixed amounts needed mostly to set the % wrapped material below the wrapping text first line. Here is % where the \LaTeXiii \cs{fpeval} computing function comes into % play so as to assign such height to \cs{WF@size}. Afterwards % some unusual macros are executed; they were devised by % Arseneau to deal with possibly floating wrapped objects. The % optional star is not accepted by this macro; if the user % specified it, it is still in the input flow; notice that the % \Env{wraptext} environment does not accept the optional star; % if the user indadvertedly specifies it for this environment, % a star appears at the beginning of the wrapped text with % version~4; with versions~5 to~7 the asterisk produces a % warning that remind users that this environment does not use % any optional star. In all three versions, in facts, the first % optional parameter is always interpreted as the \meta{line % number correction}. % % The braced \meta{width} fourth parameter (actually a % \textit{braced optional parameter}) may be specified to be % \texttt{0pt}; in any case \texttt{0pt} is the default % parameter value; if so, the object is treated at its natural % width, by boxing it into an hbox and using this box width as % the working width; of course this works only with % \Env{wrapfigure} and \Env{wraptable}, because what is being % wrapped has its own natural width; with text the width is the % default setting made with the \emph{braced optional argument} % described with the \texttt{G} descriptor. % \begin{macrocode} \NewDocumentCommand\WF@wr{o m o m s}{% \xdef\WF@wfname{wrap\@captype\space}% \unless\ifvoid\WF@box \WFclear \WF@collision \fi \xdef\WF@place{\string`\@car#2r\@nil}% \ifnum\lccode\WF@place=\WF@place \global\WF@floatfalse \else \global\WF@floattrue \fi \ifx\parshape\WF@fudgeparshape \unless\ifWF@float\\WF@collision\fi \else \ifx\par\@@par \ifnum\@@parshape>\z@\WF@conflict\fi \else \WF@conflict \fi \fi \IfValueTF{#1}% save optional line number or correction {\gdef\WF@wli{#1}}% {\gdef\WF@wli{0}}% % \IfValueTF{#3}% save optional overhang {\gdef\WF@ovh{#3}}% {\gdef\WF@ovh{\z@}}% % \global\setbox\WF@box\vtop\bgroup \setlength\hsize{#4}% set width \ifdim\hsize>\z@ \@parboxrestore \else \setbox\z@\hbox\bgroup \let\wf@@caption\caption \let\caption\wf@caption \ignorespaces \fi \IfBooleanTF{#5}% if star, set the numerical switch {\global\WF@correctlines@switch=\@ne}% {\global\WF@correctlines@switch=\z@}% } % \end{macrocode} % % At this point the main box \cs{WF@box} is opened in order to % store the object to be wrapped; with this box height the % software is going to compute the number of lines to be % indented, unless such a number has been specified and no star % was added to the input parameters. % % Also the \amb{wraptext} environment uses a box to collect the % framed text; the name of this second box must be different % from \cs{WF@box} otherwise interference of the various tasks % produces unrecoverable errors. This is why at the beginning of % this package we defined two different boxes: \cs{WF@box} and % \cs{NWF@box}. % % The trick of creating an alias for the \cs{caption} macro is % used by Arseneau to redefine one of the two macros according % to certain conditions. Here \cs{wf@caption} is actually % redefined if the \meta{width} parameter has been specified or % has been computed. % \begin{macrocode} \def\wf@caption{\relax% redefine \wf@caption if \hsize is zero \ifdim\hsize>\z@ \let\caption\wf@@caption \else \unskip \egroup \hsize\wd\z@ \@parboxrestore \box\z@% export \box0 \fi \caption } % \end{macrocode} % % One of the following unusual macros were introduced by % Arseneau to deal with paragraph parameters and possibly to % float the object to be wrapped. % \begin{macrocode} \def\WF@startfloating{% \WF@everypar\expandafter{\the\everypar}\let\everypar\WF@everypar \WF@@everypar{\ifvoid\WF@box\else\WF@floathand\fi \the\everypar \WF@wraphand }} % \end{macrocode} % The following macro is for floating wrapping environments. % \begin{macrocode} \def\WF@floathand{% \ifx\parshape\WF@fudgeparshape \WF@fltmes \else \ifx\par\@@par \ifnum\@@parshape=\z@ \ifdim\hangindent=\z@ \setbox\z@\lastbox \begingroup \@@par \WF@@everypar{}\WF@putfigmaybe \endgroup % after this group start wrapping \unless\ifvoid\z@ % replace indentation \box\z@ \fi \else \WF@fltmes \fi \else \WF@fltmes \fi \else \WF@fltmes \fi \fi} % \end{macrocode} % % On the contrary if there is enough space or if the wrapped % object cannot float, it gets output here. % \begin{macrocode} \def\WF@putfigmaybe{% \ifinner \vskip-\parskip \global\WF@floatfalse \let\pagetotal\maxdimen % kludge flag for "not top of page" \else % outer page {\advance\parskip\@tempdima\vskip-\parskip}% back up to base % line \penalty\interlinepenalty % update page parameters \@tempdimb\dimexpr\pagegoal - \pagetotal \relax% room left % on page \ifdim \@tempdimb<\z@ % page already full \global\WF@floatfalse \unless\ifdim-\@tempdimb>\pageshrink \pagebreak \fi \else \ifdim\WF@size>\@tempdimb% box does not fit in \@tempdimb \ifWF@float \dimen@ 0.5\baselineskip \else \dimen@ 2\baselineskip \fi \ifdim\pagestretch>\dimen@ \dimen@\pagestretch \fi \ifdim\pagefilstretch>\z@ \dimen@\@tempdimb \fi \ifdim\pagefillstretch>\z@ \dimen@\@tempdimb \fi \advance\dimen@ 0.5\baselineskip \ifdim\dimen@>\@tempdimb % stretch page contents \global\WF@floatfalse \pagebreak \fi \else % box fits in \@tempdimb \global\WF@floatfalse \fi \fi \vskip\@tempdima% return erased page depth \fi \noindent \ifWF@float \WF@fltmes \else % place insertion here \WF@info{Put \WF@wfname here:}% {\ifodd \if@twoside\c@page\else\@ne\fi% assign l/r to i/o placement \lccode`i`l\lccode`o`r\else \lccode`i`r\lccode`o`l% \fi \xdef\WF@place{\the\lccode\lccode\WF@place}% }% twice to get only l or r \hbox to\z@{% llap o rlap depending on l or r; % determine effective width \@tempdima\wd\WF@box \@tempdimb\WF@ovh \advance\@tempdima-\@tempdimb \advance\@tempdima\columnsep \@tempdimb\hsize \advance\@tempdimb-\@tempdima \xdef\WF@adjlw{\the\@tempdima}% \ifnum `l=\WF@place % object on left \hss \def\@tempa{\kern\columnsep}% take right gap into action \else % object on right \@tempdima\z@ % no left indentation \kern\@tempdimb \kern\columnsep \def\@tempa{\hss}% object overlaps space to the right \fi \ifdim\@tempdimb<\hsize \xdef\WF@wrapil{\the\@tempdima \the\@tempdimb}% % indent.number and length \xdef\WF@adjtlm{\the\@tempdima}% \else \xdef\WF@wrapil{\z@ \the\hsize}% \xdef\WF@adjlw{\z@}\xdef\WF@adjtlm{\z@}% \fi \ifdim\pagetotal=\z@ % put object at top of page \thepage \global\advance\WF@size-\intextsep \else % put object in middle of the page \setbox\WF@box\hbox{\lower\intextsep\box\WF@box}% \fi \dp\WF@box\z@ \box\WF@box \@tempa }% end \hbox to 0pt \aftergroup\WF@startwrapping \fi } % \end{macrocode} % % Here comes the very important macro that counts the indented % wrapping lines, so that wrapping is correct; of course the % limitations of the \LaTeX processing (needed to ship out a % complete page) forbid to take into account the spaces inserted % between paragraphs and/or those inserted between entries of % various listings. The idiosyncrasies of this package arise % from the fact that this macro cannot preview actions that have % not yet taken place when this macro is executed. % % This macro counts the lines to be indented by rounding the % division of the box height by the current base line base skip. % Notice that \texttt{WF@wrappedlines} is the name of a \LaTeX % named counter, not of a \TeX numeric register; therefore % special \LaTeX commands, such as \cs{setcounter} or % \cs{value}, have to be used in order to set or access the % numerical value stored within the \TeX register associated to % the \LaTeX counter name. % \begin{macrocode} \def\WF@startwrapping{% \ifnum\WF@wli=\z@ % no number was specified \setcounter{WF@wrappedlines}% {\fpeval{round(\WF@size/\baselineskip,0)}}% \xdef\WF@wli{\value{WF@wrappedlines}}% \else \ifnum\WF@correctlines@switch>\z@ % line number correction \setcounter{WF@wrappedlines} {\fpeval{round((\WF@size)/\baselineskip,0)+\WF@wli}}% \xdef\WF@wli{\the\c@WF@wrappedlines}% \else \setcounter{WF@wrappedlines}{\WF@wli}% absolute number % of lines \stepcounter{WF@wrappedlines}% \fi \fi \ifnum\c@WF@wrappedlines>\@ne % fine tuning \let\parshape\WF@fudgeparshape \let\WF@pspars\@empty \let\WF@@par\par \def\@setpar##1{\def\WF@@par{##1}}\def\par{\@par}\let\@par\WF@mypar \xdef\WF@restoretol{\tolerance\the\tolerance}\tolerance9999\relax \advance\linewidth-\WF@adjlw \advance\@totalleftmargin\WF@adjtlm \fi } % \end{macrocode} % % The next macro is the one that actually indents the wrapping % text lines and keeps track of the number of such processed % lines. It can work on more than a single paragraph. It resorts % to service macros that reiterate as long as the number of % indented lines is lower than the computed number of lines. % Possibly this process could be defined by means od the % \texttt{dowhile} or \texttt{whiledo} \LaTeXiii functions. % By now we did not afford this task, because first we would % like to see if the overall software is reliable. % \begin{macrocode} \def\WF@wraphand{% for indenting one or more paragraphs \ifnum\c@WF@wrappedlines<\tw@ \WF@finale \else \begingroup % create a parshape command \@tempcnta\@ne \let\WF@wrapil\relax \gdef\WF@ps{}% \@whilenum \@tempcnta<\c@WF@wrappedlines\do{% repeated indentation \xdef\WF@ps{\WF@ps\WF@wrapil}\advance\@tempcnta\@ne }% \endgroup \ifx\WF@pspars\@empty \@@parshape\c@WF@wrappedlines \WF@ps \WF@noil \else %use external `parshape' values to modify my parshape \WF@modps \fi \fi } % \end{macrocode} % % This macro resets the paragraph properties and terminates the % wrapping job. % \begin{macrocode} \def\WF@mypar{\relax \WF@@par \ifnum\@@parshape=\z@ \let\WF@pspars\@empty % reset parshape \fi \global\advance\c@WF@wrappedlines-\prevgraf \prevgraf\z@ \ifnum\c@WF@wrappedlines<\tw@ \WF@finale \fi } % \end{macrocode} % % These macros modify the paragraph settings. % \begin{macrocode} \def\WF@modps{\begingroup \afterassignment\@tempdimb \@tempdima\WF@pspars% % a=indent.num; b=width \advance\@tempdima-\WF@adjtlm \advance\@tempdimb\WF@adjlw \let\WF@wrapil\WF@pspars \edef\@tempb{\@@parshape\c@WF@wrappedlines \WF@ps \the\@tempdima \the\@tempdimb}% \expandafter\endgroup\@tempb } \let\@@setpar\@setpar \def\WF@noil{\z@ \hsize} \let\WF@pspars\@empty \def\WF@fudgeparshape{\relax \ifnum\c@WF@wrappedlines<\tw@ \WF@finale \else \afterassignment\WF@fudgeparshapee \fam \fi } \def\WF@fudgeparshapee{% \ifnum\fam=\@ne \expandafter \WF@parshapeee \else \WF@conflict \@@parshape\fam \fi } \def\WF@parshapeee#1#2{% \begingroup\delimitershortfall#1% \nulldelimiterspace#2% \advance \nulldelimiterspace by % \WF@adjlw \edef\@tempa{\def\noexpand\WF@pspars{% \the\delimitershortfall \the\nulldelimiterspace}}% \expandafter\endgroup\@tempa \WF@wraphand } % \end{macrocode} % % The following macro is the one that actually ends the single % wrapping job. % \begin{macrocode} \def\WF@finale{% \ifx\parshape\WF@fudgeparshape \WF@restoretol \let\@setpar\@@setpar \let\par\WF@@par \advance\linewidth\WF@adjlw \advance\@totalleftmargin-\WF@adjtlm \WF@info{Finish wrapping text}% \ifx\par\@@par \def\@par{\let\par\@@par\par}% \else \let\@par\WF@@par \fi \let\parshape\@@parshape \parshape=\ifx\WF@pspars\@empty \z@ \else \@ne \WF@pspars \fi \fi \ifvoid\WF@box \ifx\everypar\WF@everypar \let\everypar\WF@@everypar \everypar\expandafter{\the\WF@everypar}% \fi \fi } % \end{macrocode} % % At the very end everything is restored, and the used boxes % are emptied. % \begin{macrocode} \newcommand{\WFclear}{\par \unless\ifvoid\WF@box \vskip\bigskipamount \box\WF@box \let\everypar\WF@@everypar \everypar\expandafter{\the\WF@everypar}% \fi \global\c@WF@wrappedlines\z@ \WF@finale \global\WF@correctlines@switch\z@ } % \end{macrocode} % % The following code is one of those “dirty tricks” by which a % macro defined within a group is executed with the help of an %\cs{expandafter} command that bypasses an \cs{endgroup}; by so % doing, after execution nothing local to the group remains in % memory. % \begin{macrocode} \begingroup \toks0={\let\everypar\WF@@everypar \everypar\expandafter{\the\WF@everypar}% \let\parshape\@@parshape \let\@setpar\@@setpar } \toks1=\expandafter{\@arrayparboxrestore}% \toks2=\expandafter{\clearpage}% \edef\@tempa{% \def\noexpand\@arrayparboxrestore{\the\toks0 \the\toks1}% \def\noexpand\clearpage {\noexpand\protect\noexpand\WFclear \the\toks2}}% \expandafter\endgroup\@tempa % \end{macrocode} % % Donald Arseneau classifies the following macro as the one % that “pampers the RevTeX's stupidity”. % \begin{macrocode} \@ifundefined{@capwidth}{\let\@capwidth\hsize}{}% % \end{macrocode} % % This one, instead, issues a warning if a specific name % conflicts with another. % \begin{macrocode} \def\WF@conflict{\WF@warning {\WF@wfname used inside a conflicting environment}}% % \end{macrocode} % % While this one issues a warning when a wrapping environment is % too close to another one. % \begin{macrocode} \def\WF@collision{\WF@warning{Collision between wrapping environments}}% % \end{macrocode} % % And this one is when two wrapping environments are too close % to one another so that the second one is forced to move. % \begin{macrocode} \def\WF@fltmes{% message for floats \ifWF@float \WF@info{\WF@wfname floats}% \else \WF@warning{Stationary \WF@wfname forced to float}% \fi } % \end{macrocode} % % These two aliases are just service macros for this package; in % particular, the second one is used to insert info of any kind % within a source file. % \begin{macrocode} \let\WF@warning\@warning \let\WF@info\@gobble % \end{macrocode} % % Arseneau says that his \pack{wrapfig} package is already % compatible with package \pack{float.sty}, since, after % defining a new float \meta{foo}, it suffices to define the new % environment \Env{wrap\meta{foo}}. This fork version of his % package should do the same: it suffices to mimic the % definitions of environments \Env{wrapfigure} or % \Env{wraptable}. But as we saw with the \Env{wraptext}, the % above statement is not always true. % % Here there is some Arseneau's code that renders his % \pack{wrapfig} code compatible with \cs{newfloat} of class % \class{memoir}, and with \cs{newfloatlist} of package % \pack{ccaption}. We keep his code, but we did not test it with % this package. % \begin{macrocode} \let\WF@floatstyhook\relax \@ifundefined{newfloat}{}{% \newfloat comes from somewhere % besides float.sty \@ifundefined{restylefloat}{% \@ifclassloaded{memoir}{% \toks@=\expandafter\expandafter\expandafter {\csname\string\newfloat\endcsname [{#1}]{#2}{#3}{#4}% \newenvironment{wrap#2}{\wrapfloat{#2}}{\endwrapfloat}% }% Mmmm; this might be wrong. Not tested \edef\@tempa{\def\expandafter\noexpand\csname\string\newfloat \endcsname[##1]##2##3##4{\the\toks@}}% \@tempa }% end memoir support {}% other origins of \newfloat here? }{% float.sty handler. Ops: Two versions for % different versions % Changing \floatstyle or \restylefloat changes also \newfloat. \@ifundefined{float@restyle}% {% older float.sty \toks@=\expandafter{\restylefloat{##1}% env. might be % undefined \@namedef{wrap#1}{% \def\@captype{#1}\@nameuse{fst@#1}% \def\WF@floatstyhook{\let\@currbox\WF@box \columnwidth\wd\WF@box \global\setbox\WF@box\float@makebox}% \@ifnextchar[\WF@wr{\WF@wr[]}}% \expandafter\let\csname endwrap#1\endcsname \endwrapfigure }% \edef\@tempa{\def\noexpand\restylefloat##1{\the\toks@}}% }{% newer float.sty: uses \float@restyle, and \float@makebox % takes width arg \toks@=\expandafter{\float@restyle{#1}% env. might be % undefined \@namedef{wrap#1}{\def\@captype{#1}\@nameuse{fst@#1}% \def\WF@floatstyhook{\let\@currbox\WF@box \global\setbox\WF@box\float@makebox{\wd\WF@box}}% \@ifnextchar[\WF@wr{\WF@wr[]}}% \expandafter\let\csname endwrap#1\endcsname \endwrapfigure }% \edef\@tempa{\def\noexpand\float@restyle##1{\the\toks@}}% }% \@tempa % perform redefinitions % }% end float.sty handler }% end redefinitions of \newfloat \ifcsname newfloatlist\endcsname% support ccaption.sty \toks@=\expandafter\expandafter\expandafter {\csname\string\newfloatlist\endcsname [{#1}]{#2}{#3}{#4}{#5}% \@namedef{wrap#2}{\wrapfloat{#2}}% \expandafter\let\csname endwrap#2\endcsname \endwrapfloat }% \edef\@tempa{% \def\expandafter\noexpand\csname\string\newfloatlist\endcsname [##1]##2##3##4##5{\the\toks@}}% \@tempa \fi \ifcsdef{amsTextText}{\let\text\amsTextText}{} % \end{macrocode} % %\iffalse % %\fi % \Finale % %^^A \endinput