% \iffalse meta-comment % % Copyright (c) 1995-2004 Axel Sommerfeldt (rotfloat@sommerfeldt.net) % % This file is part of the rotfloat package. % ------------------------------------------ % % It may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.2 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.2 or later is part of all distributions of LaTeX % version 1999/12/01 or later. % % \fi % \CheckSum{215} % % \iffalse %<*driver> \NeedsTeXFormat{LaTeX2e}[1994/12/01] \documentclass{ltxdoc} \setlength{\parindent}{0pt} \setlength{\parskip}{\smallskipamount} \begin{document} \DocInput{rotfloat.dtx} \end{document} % % \fi % % \newcommand*{\purerm}[1]{{\upshape\mdseries\rmfamily #1}} % \newcommand*{\puresf}[1]{{\upshape\mdseries\sffamily #1}} % \newcommand*{\purett}[1]{{\upshape\mdseries\ttfamily #1}} % % \changes{v1.0}{30 Mar 95}{First release} % \changes{v1.1}{ 2 Feb 02}{Revised and adapted to new versions of float and rotating} % \changes{v1.1a}{20 Feb 02}{Minor cosmetic changes} % \changes{v1.2}{4 Jan 04}{Revised and support of [H] implemented} % % \GetFileInfo{rotfloat.sty} % \def\fileversion{1.2} % \def\filedate{2004/01/04} % \title{The \puresf{rotfloat} package\thanks{This package has version number % \fileversion, last revised \filedate.}} % \author{Axel Sommerfeldt\\\texttt{rotfloat@sommerfeldt.net}} % \date{2004/01/04} % \maketitle % % \begin{abstract} % The \textsf{float} package~\cite{float} provides commands to define new floats % of various styles (|plain|, |boxed|, |ruled|, and userdefined ones); % the \textsf{rotating} package~\cite{rotating} provides new environments (|sidewaysfigure| % and |sidewaystable|) which are rotated by $90^\circ$ or $270^\circ$. % But what about new rotated floats, e.g.\ a rotated ruled one? % This package makes this possible; it builds a bridge between both packages % and extend the commands from the \textsf{float} package to define rotated % versions of the new floats, too. % \end{abstract} % % \section{The user interface} % To use this package just put the line % \begin{quote} % |\usepackage|\oarg{options}|{rotfloat}| % \end{quote} % into the preamble of your document. The options are exactly the same as % for the \textsf{rotating} package, because all options will be passed to % the \textsf{rotating} package. % (The \textsf{rotfloat} package hasn't got any own options at all). % % \DescribeMacro{\newfloat} % \DescribeMacro{\restylefloat} % The commands |\newfloat| and |\restylefloat| from the \textsf{float} package % (re)define the float type \meta{type} and now additionally a rotated one called % \meta{\purett{sideways}type}: % \begin{quote} % |\newfloat|\marg{type}\marg{placement}\marg{ext}\oarg{within}\\ % |\restylefloat|\marg{type} % \end{quote} % % \begin{minipage}[t]\textwidth % E.g.\ the code % \begin{quote} % |\floatstyle{ruled}|\\ % |\floatname{program}{Program}|\\ % |\newfloat{program}{tbp}{lop}[section]| % \end{quote} % defines the new floating environments |program|, |program*|, % |sidewaysprogram|, and |sidewaysprogram*| % which behave equivalent to |figure|, |figure*|, % |sidewaysfigure|, and |sidewaysfigure*|. % (Note that |sidewaysfigure*| has been introduced to version $2.10$ of the \puresf{rotating} % package, therefore you only get a |sidewaysprogram*| environment if you use this or a newer % version of the \puresf{rotating} package.) % \end{minipage} % % \begin{minipage}[t]\textwidth % The code % \begin{quote}\nopagebreak% % |\floatstyle{boxed}|\\ % |\restylefloat{table}| % \end{quote} % will restyle the environments |table|, |table*|, |sidewaystable|, and |sidewaystable*|. % \end{minipage} % % Please take a look at the \textsf{float} package for a complete description % of these commands. % Additionally an example file is provided with this package. % % \section{What has changed since version {1.0}?} % Version $1.0$ of this package was a quick \& dirty hack. The % version $1.1$ took it all more serious, it patched less code from % the float package and especially it let the |[H]| code for the % not-sideways floats intact. Furthermore it was adapted to the new % version 1.3 of the float and 2.10 of the rotating package. % % This version $1.2$ is a further step in this direction. It was revised again % to make it even more compatible to different versions of the float package. % As an effect of this |[H]| for sideways floats is now fully supported % (this could be desirable when used in cooperation with the \puresf{afterpage} package), % furthermore a bug was fixed that caused problems if the \puresf{rotfloat} % package was used together with the \puresf{color} package. % % \section{A final note} % This package was tested with the versions $1.2$, $1.2c$, $1.2d$, $1.2e$, $1.3c$, % and $1.3d$ of the \textsf{float} package and version $2.6$, $2.9$, $2.10$, $2.12$, % and $2.13$ of the \textsf{rotating} package. % % You should \emph{not} use this package together with older versions of them! % Future versions of these packages may make some trouble, but I hope they will not. % If they do please don't hesitate to send me a bug report including a simple non-working % example and the log file produced by \LaTeX. % % \section{Further reading} % % I recommend the following documents for further reading: % % \begin{itemize} % \item % The \TeX\ FAQ - Frequently asked questions about \TeX\ and \LaTeX : % \begin{quote}\texttt{http://faq.tug.org/}\end{quote} % % \item % A French FAQ can be found at % \begin{quote}\texttt{http://www.grappa.univ-lille3.fr/FAQ-LaTeX/}\end{quote} % % \item % A German FAQ can be fount at % \begin{quote}\texttt{http://www.dante.de/faq/de-tex-faq/}\end{quote} % % \item % \textsf{epslatex} from Keith Reckdahl contains many tips around % graphics in \LaTeXe. You will find this document in the directory % \begin{quote}\texttt{ftp://ftp.ctan.org/pub/tex/info/}\end{quote} % as \texttt{epslatex.ps} and \texttt{epslatex.pdf}. % % There is also a french translation available at % \begin{quote}\texttt{ftp://ftp.ctan.org/pub/tex/info/fepslatex.ps}\end{quote} % % \item % \emph{``Gleitobjekte -- die richtige Schmierung''} from Axel Reichert % is a German documentation about floating environments in general. % You will find it here: % \begin{quote}\texttt{ftp://ftp.ctan.org/pub/tex/info/german/gleitobjekte/}\end{quote} % \end{itemize} % % % \section{Thanks} % % I would like to thank Katja Melzner, Anselm Lingnau, Sebastian Rahtz, % and \hbox{Wojciech} \hbox{Pietron}. % % \StopEventually{ % \begin{thebibliography}{9} % \bibitem{float} % Anselm Lingnau: % \textsl{An Improved Environment for Floats}, % 2001/11/08 % \bibitem{rotating} % Sebastian Rahtz and Leonor Barroca: % \textsl{A style option for rotated objects in \LaTeX}, % 1997/09/26 % \end{thebibliography} % } % \setlength{\parskip}{0pt plus 1pt} % % \DoNotIndex{\@ifnextchar,\@ifundefined,\@namedef,\@nameuse} % \DoNotIndex{\bgroup,\columnwidth,\csname,\def,\edef,\egroup,\else,\endcsname} % \DoNotIndex{\empty,\expandafter,\fi,\global,\ifx,\let,\newcommand,\noexpand} % \DoNotIndex{\renewcommand,\setbox,\textheight,\typeout,\undefined,\vbox} % \DoNotIndex{\CurrentOption,\DeclareOption,\ExecuteOptions,\NeedsTeXFormat} % \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\ProvidesPackage,\RequirePackage} % % \iffalse %<*package> % \fi % % \section{The code} % % \emph{Note:} % If you really want to know what's exactly going on here, you have to study the % code from the packages \textsf{float} and \textsf{rotating} first! % % \subsection{The identification part} % % \begin{macrocode} \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesPackage{rotfloat}[2004/01/04 v1.2 Combining float+rotating package (AS)] % \end{macrocode} % % \subsection{The package loading part} % % Of course this package needs the \textsf{float} and the \textsf{rotating} % package, so we load them both here. % (The \textsf{rotfloat} package hasn't got any own options, so we just pass % everything we get to the \textsf{rotating} package.) % \changes{v1.1a}{19 Feb 02}{Use \cs{RequirePackageWithOptions} for rotating} % % \begin{macrocode} \RequirePackage{float}[1994/06/20] % >= version 1.2 \RequirePackageWithOptions{rotating}%[1995/01/06] % >= version 2.6 % \end{macrocode} % % \subsection{Adaption of the float package} % \changes{v1.0a}{1 Apr 95}{Blew \cs{float@end} up} % % We have different code for version $1.2$ and version $1.3$ of % the \textsf{float} package. If |\@float@HH| is not defined we assume % version $1.2$, otherwise version $1.3$. % \changes{v1.1a}{19 Feb 02}{\cs{wlog} changed to \cs{PackageInfo}} % % \begin{macrocode} \ifx\@float@HH\undefined \PackageInfo{rotfloat}{float package v1.2 detected} % \end{macrocode} % % First the code for version $1.2$ of the float package: % % \begin{macro}{\restylefloat} % \changes{v1.0a}{1 Apr 95}{Extra |\bgroup| removed} % \changes{v1.1}{1 Feb 02}{We define a *-sideways float as well} % % The new code for |\restylefloat| behaves like the old one, but it defines % a sideways float as well. % If |\@rotdblfloat| is defined we have loaded \textsf{rotating} version $2.10$ % or newer. In this case we can define a star form as well. % % \begin{macrocode} \let\rotfloat@restyle\restylefloat \renewcommand*\restylefloat[1]{% \rotfloat@restyle{#1}% \@namedef{sideways#1}{\rotfloat@float{#1}}% \expandafter\let\csname endsideways#1\endcsname\float@end \ifx\@rotdblfloat\@undefined \else \@namedef{sideways#1*}{\rotfloat@dblfloat{#1*}}% \expandafter\let\csname endsideways#1*\endcsname\float@dblend \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\rotfloat@float} % \changes{v1.2}{29 Dec 03}{We use the original definitions via |\@namedef| now} % % What differs sideways floats from `normal' ones? % \begin{enumerate} % \item % |\hsize|, |\textwidth|, and |\columnwidth| are set to |\textheight|. % Usually this is done in |\@xrotfloat| (\puresf{rotating} package) % but this time we have to do it for ourself because the \puresf{float} % package handles floats differently: % % It collects its contents ($=$ |\@currbox|) first, so it can build up a new % float contents (including the current one) later on. % This step is neccessary because the \puresf{float} package will take care % of the placement of the |\caption|. Furthermore it can add rules, boxes and % so on here, whatever the actual float style wants to. % (This is done in |\float@makebox|.) % % Note that we don't set |\hsize| here, because |\@xfloat| (part of \LaTeX) % will set |\hsize| to |\columnwidth| anyway. % % \item % We build up the float contents with |\rotfloat@makebox| (instead of % |\float@makebox|) which rotates the contents additionally. % \end{enumerate} % % \begin{macrocode} \newcommand\rotfloat@float{% \textwidth\textheight \columnwidth\textheight \let\rotfloat@@makebox\float@makebox \let\float@makebox\rotfloat@makebox \@nameuse} % \end{macrocode} % \end{macro} % % \begin{macro}{\rotfloat@dblfloat} % % For double column floats we use |\rotdblfloat@makebox| here. % % \begin{macrocode} \newcommand\rotfloat@dblfloat{% \textwidth\textheight \columnwidth\textheight \let\rotfloat@@makebox\float@makebox \let\float@makebox\rotdblfloat@makebox \@nameuse} % \end{macrocode} % \end{macro} % % \begin{macro}{\@HHfloat} % \changes{v1.1}{1 Feb 02}{Leave H-code intact for normal floats} % \changes{v1.2}{29 Dec 03}{Leave H-code intact for sideways floats, too} % % For sideways floats with a placement specifier |[H]| the original code % of |\@HHfloat| from the \puresf{float} package is sufficient. % But we have to take care that at the end of the float |\rotfloat@endH| % will be called instead of |\float@endH| so we can handle them correctly % later on. % % \begin{macrocode} \let\rotfloat@HH\@HHfloat \def\@HHfloat#1{% \expandafter\let\csname endsideways#1\endcsname\rotfloat@endH % \expandafter\let\csname endsideways#1*\endcsname\rotfloat@dblendH \let\end@float\relax \rotfloat@HH{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\rotfloat@endH} % % The \puresf{float} package defines this command to close a floating % environment with a |[H]| placement specifier: % \begin{quote} % |\newcommand\float@endH{%|\\ % | \egroup| (\emph{or} |\@endfloatbox|)\\ % | \vskip\intextsep|\\ % | \if@flstyle\float@makebox\egroup\else\box\@currbox\fi|\\ % | \vskip\intextsep\relax}| % \end{quote} % % The |\egroup| (or |\@endfloatbox|) will close the |\@currbox| first. % Afterwards the contents of the float will be typeset HERE, surrounded by % some extra skip. % If the float was defined with |\newfloat| or |\restylefloat|, % |\float@makebox| will be used to build up the float contents. % (An extra |\egroup| is needed to finish off the |\bgroup| that % precedes the |\@nameuse| in the |\begin{|\meta{float}|}| commands. % See the code documentation of the \puresf{float} package $v1.2$ for % details.) % Otherwise the vanilla |\@currbox| will be used. % % Here comes our version: % If the float was defined with |\newfloat| or |\restylefloat| % (that means |\if@flstyle| is true) % we can use the original code from the \puresf{float} package % because |\float@makebox| was replaced with |\rotfloat@makebox| anyway. % (See our definition of |\rotfloat@float| for details.) % % But if this is not the case (that means |\if@flstyle| is false) % we have to close the rotated float first. % This is usually done with |\end@rotfloat| (which is part of the % \puresf{rotating} package) but there is a caveat: |\end@rotfloat| % uses |\end@float| which normally closes a floating environment. % But we don't want to support floating here (well, that's why the user % has specified the placement |[H]|), so we re-define |\end@float| to % |\relax| which does simply nothing. % (Note that this re-definition takes place in |\@HHfloat| because % |\end@rotfloat| closes some environments first, so our re-definition % would get lost if we would make it here.) % Afterwards the original code from the \puresf{float} package % ($=$ |\float@endH|) is sufficient again. % % \begin{macrocode} \newcommand\rotfloat@endH{% \if@flstyle \else % \let\end@float\relax \end@rotfloat \fi \float@endH} % \end{macrocode} % \end{macro} % % \begin{macro}{\rotfloat@makebox} % % Finally: The typesetting of a (re-styled) rotated float. % % This is quite simple: We put the |\float@makebox| inside % a rotated environment. For this purpose we use |\@rotfloat| % and |\end@rotfloat| which usually begin and end a rotated floating % environment; they are provided by the \puresf{rotating} package. % But we have to keep the floating stuff outside, so % we define |\@float| (which is used by |\@rotfloat|) and % |\end@float| (which is used by |\end@rotfloat|) to do nothing. % % \begin{macrocode} \newcommand\rotfloat@makebox{% \vbox{% \def\@float##1[##2]{}\let\end@float\relax \@rotfloat{}[]% \rotfloat@@makebox \end@rotfloat}} % \end{macrocode} % \end{macro} % % \begin{macro}{\rotdblfloat@makebox} % % Well, this is quite the same as |\rotfloat@makebox| but we use the % appropriate macros for the star-variants of floating environments here. % % \begin{macrocode} \newcommand\rotdblfloat@makebox{% \vbox{% \def\@float##1[##2]{}\let\end@dblfloat\relax \@rotdblfloat{}[]% \rotfloat@@makebox \end@rotdblfloat}} % \end{macrocode} % \end{macro} % % So far the code for the version $1.2$ of the float package. % % \begin{macrocode} \else % \end{macrocode} % % Now the code for the \puresf{float} package version $1.3$: % % It is mainly the same, so we only tell you the small differences compared to % the code inside the branch for the \puresf{float} package version $1.2$ here. % % \begin{macrocode} \PackageInfo{rotfloat}{float package v1.3 detected} % \end{macrocode} % % \begin{macro}{\float@restyle} % We have to extend |\float@restyle| instead of |\restylefloat| here, % so |\restylefloat*| will still work. % \begin{macrocode} \let\rotfloat@restyle\float@restyle \renewcommand*\float@restyle[1]{% \rotfloat@restyle{#1}% \@namedef{sideways#1}{\rotfloat@float{#1}}% \expandafter\let\csname endsideways#1\endcsname\float@end \ifx\@rotdblfloat\@undefined \else \@namedef{sideways#1*}{\rotfloat@dblfloat{#1*}}% \expandafter\let\csname endsideways#1*\endcsname\float@dblend \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\rotfloat@float} % \begin{macro}{\rotfloat@dblfloat} % These two don't have to be changed. % \begin{macrocode} \newcommand\rotfloat@float{% \textwidth\textheight \columnwidth\textheight \let\rotfloat@@makebox\float@makebox \let\float@makebox\rotfloat@makebox \@nameuse} \newcommand\rotfloat@dblfloat{% \textwidth\textheight \columnwidth\textheight \let\rotfloat@@makebox\float@makebox \let\float@makebox\rotdblfloat@makebox \@nameuse} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\@float@HH} % We have to extend |\@float@HH| instead of |\@HHfloat| here. % \begin{macrocode} \let\rotfloat@HH\@float@HH \def\@float@HH#1{% \expandafter\let\csname endsideways#1\endcsname\rotfloat@endH % \expandafter\let\csname endsideways#1*\endcsname\rotfloat@dblendH \let\end@float\relax \rotfloat@HH{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\rotfloat@endH} % This one hasn't to be changed. % \begin{macrocode} \newcommand\rotfloat@endH{% \if@flstyle \else % \let\end@float\relax \end@rotfloat \fi \float@endH} % \end{macrocode} % \end{macro} % % \begin{macro}{\rotfloat@makebox} % \begin{macro}{\rotdblfloat@makebox} % |\float@makebox| has a parameter here which will be set to |\columnwidth| or % |\textwidth|. (In the \puresf{float} package $v1.2$ the |\columnwidth| was % hard wired into |\float@makebox|.) So we have to pass this parameter through % the original version of |\float@makebox| which we have saved to % |\rotfloat@@makebox| within |\rotfloat@float|.) % \begin{macrocode} \newcommand*\rotfloat@makebox[1]{% \vbox{% \def\@float##1[##2]{}\let\end@float\relax \@rotfloat{}[]% \rotfloat@@makebox{#1}% \end@rotfloat}} \newcommand*\rotdblfloat@makebox[1]{% \vbox{% \def\@float##1[##2]{}\let\end@dblfloat\relax \@rotdblfloat{}[]% \rotfloat@@makebox{#1}% \end@rotdblfloat}} % \end{macrocode} % \end{macro} % \end{macro} % % That's all folks. % % \begin{macrocode} \fi % \end{macrocode} % % \iffalse % % \fi % \Finale % \endinput