summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/rotating/rotating.dtx
blob: cfc6bed03110766949feedc5d5a9ba843658ba68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
%
% \iffalse
%
% $Id: rotating.dtx,v 1.21 2010/01/26 13:25:07 rf10 Exp rf10 $
%
% File: rotating.dtx
% Copyright 1995--1999 Sebastian Rahtz and Leonor Barroca
% Copyright 2001--2003,2007--2009 Robin Fairbairns
% Mail contact: rf10@cam.ac.uk
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% 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.3c or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Robin Fairbairns.
%
% This work consists of the files rotating.dtx and rotating.ins,
% and the derived file rotating.sty, and testing material
% examples.tex and cat.eps
% 
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
%<*dtx>
\ProvidesFile{rotating.dtx}%
%</dtx>
%<package>\ProvidesPackage{rotating}%
    [2009/03/28 v2.16b
%<package>  rotated objects in LaTeX%
%<*dtx>
            rotating package source file%
%</dtx>
        ]% $Id: rotating.dtx,v 1.21 2010/01/26 13:25:07 rf10 Exp rf10 $
%<*dtx>
\documentclass{ltxdoc}
\GetFileInfo{rotating.dtx}
\begin{document}
 \title{A package for rotated objects in \LaTeX\thanks{This file has
        version number \fileversion, last revised \filedate}}
    \author{Robin Fairbairns\thanks{Contact: rf10@cam.ac.uk}
      \and Sebastian Rahtz \and Leonor Barroca}
 \date{printed \today}
 \maketitle
 \tableofcontents
%  \listoffigures
%  \listoftables
 \DocInput{rotating.dtx}
\end{document}
%</dtx>
% \fi
% \CheckSum{485}
% \begin{abstract}
% This article documents a \LaTeX\ package, `rotating.sty',
% which performs most sorts of
% rotation one might like, including rotation of complete floating
% figures and tables.
% \end{abstract}
%
% \section{Introduction}
%
% The package provides:
% \begin{itemize}
% \item two new environments, \texttt{sidewaystable} and
%   \texttt{sidewaysfigure}, each of which produces a single page-size
%   float with contents rotated $\pm90$\,degrees; and
% \item a variety of other rotation-related commands and environments.
% \end{itemize}
%
% Note that the package uses rotation facilities from the
% \textsf{graphicx} package.  When generating DVI output, users should
% note that rotation is typically \emph{not} visible in a DVI viewer:
% conversion to, and viewing, PostScript or PDF is necessary.
%
% \section{Usage} 
%
% \subsection{Package options}
%
% Sideways figures and tables always take up the whole page. In
% single-sided documents, they may be rotated so that the bottom of
% the figures is on the left (package option
% `\texttt{counterclockwise}') or the right (package option
% `\texttt{clockwise}').  The default is to turn so that the bottom is
% on the right (option `\texttt{clockwise}').
%
% Option `\texttt{anticlockwise}' is an alias for
% `\texttt{counterclockwise}'.
%
% If the `\texttt{twoside}' option has been given to the main document
% class (either explicitly, or implicitly as in the default for book
% class), the package will rotate sideways figures according to the
% page number (this requires at least two passes through \LaTeX{}).
% If you want the `\texttt{twoside}' option, but want the figures
% always in one direction, use the `\texttt{figuresright}' or
% `\texttt{figuresleft}' options to the package.
%
% The package can produce a lot of logging information; the
% amount of information is controlled by the package options
% `\texttt{quiet}' (fewest messages; default), `\texttt{log}' and
% `\texttt{chatter}' (most messages).
%
% All other options are passed to the \textsf{graphicx} package when
% it is loaded to provide rotation functions.
%
% \subsection{Float environments}
%
% The environments \texttt{sidewaystable} and \texttt{sidewaysfigure}
% introduce landscape-form floating tables and figures, respectively.
% (Each of the environments has a ``starred'' version, such as
% \texttt{sidewaystable*}, for a single-column float in a double-column
% area of the document.)
%
% New rotated environments may be declared using the combined
% facilities of the float and rotfloat packages. 
%
% \subsection{Other environments and commands}
% The package provides other \LaTeX\ environments:
% \begin{description}
% \item[\mdseries\ttfamily sideways] prints the contents of the
%   environment turned through 90 degrees counterclockwise;
% \item[\mdseries\ttfamily turn] prints the contents turned through an
%   arbitrary angle (the argument to the environment);
% \item[\mdseries\ttfamily rotate] prints the contents turned through
%   an arbitrary angle but does \emph{not} leave any space for the result
% \end{description}
%
% The command \cs{turnbox}\marg{angle}\marg{matter to turn} is a macro
% version of the \texttt{rotate} environment.
%
% A set of examples is given in the file \texttt{examples.tex}
%
% \subsection{Positioning}
%
% Floats appear one to a page, and are positioned by spacer skips that
% appear (logically) above and below the floating object.  The skips,
% \cs{rotFPtop} and \cs{rotFPbot}, are initialised from the standard
% \LaTeX{} (internal) \cs{@fptop} and \cs{@fpbot} skips.  As a result,
% by default, rotated floats appear horizontally centred on their
% float pages.
%
% Some sensible values for the registers are:
% \par\noindent
% \begin{tabular}{@{}llp{3in}@{}}
%   \cs{rotFPtop} & \cs{rotFPbot} & Effect \\
%   \hline
%   0pt plus 1fil & 0pt plus 1fil & figure/table appears in middle 
%                                   (default value)               \\
%   0pt           & 0pt plus 1fil & figure/table appears with its top
%                                   nearest the edge of the page   \\
%   0pt plus 1fil & 0pt plus 2fil & figure/table's bottom appears
%                                   twice as far from the edge as the
%                                   top does
% \end{tabular}
%
% \StopEventually{}
%
% \section{Setup}
% Now we present the documented code.  First, package options.
%
% Note that the \texttt{clockwise} and \texttt{counterclockwise}
% options are present for compatibility only.
%    \begin{macrocode}
%<*package>
\DeclareOption{clockwise}{%
 \AtBeginDocument{\setkeys{Grot}{units=360}}%
}
\DeclareOption{counterclockwise}{%
 \AtBeginDocument{\setkeys{Grot}{units=-360}}%
}
\DeclareOption{anticlockwise}{\ds@counterclockwise}
%    \end{macrocode}
% Control figure orientation
%    \begin{macrocode}
\DeclareOption{figuresleft}{%
  \@rot@twosidefalse 
  \def\rot@LR{0}%
}
\DeclareOption{figuresright}{%
 \@rot@twosidefalse 
 \def\rot@LR{-1}%
}
%    \end{macrocode}
%
% control messages:
%    \begin{macrocode}
\newif\ifrot@messages
\DeclareOption{quiet}{%
  \rot@messagesfalse
  \let\rot@message\@gobble % pro tem -- should suppress altogether
}
\DeclareOption{log}{%
  \rot@messagestrue
  \def\rot@message{\PackageInfo{rotating}}%
}
\DeclareOption{chatter}{%
  \rot@messagestrue
  \def\rot@message{\PackageWarning{rotating}}%
}
%    \end{macrocode}
%
% \begin{macro}{\if@rot@twoside}
% \begin{macro}{\rot@LR}
% A couple of commands for passing rotation direction around
%    \begin{macrocode}
\newif\if@rot@twoside
\if@twoside 
  \@rot@twosidetrue
\else
  \@rot@twosidefalse
\fi
\def\rot@LR{-1}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% Pass any unknown options to the \textsf{graphicx} package, and
% set up defaults and process the options.
%    \begin{macrocode}
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{graphicx}}
\ExecuteOptions{clockwise,quiet}
\ProcessOptions
%    \end{macrocode}
%
% Other initialisation
%    \begin{macrocode}
\RequirePackage{graphicx}
\RequirePackage{ifthen}
%    \end{macrocode}
%
% \begin{macro}{\rotdriver}
% The command \cs{rotdriver} allows a user to specify an initialisation file,
% a sort of non-automatically-loaded driver (in the graphics, hyperref
% sense).
%    \begin{macrocode}
\def\rotdriver#1{\makeatletter\input{#1.def}\makeatother}
%    \end{macrocode}
% \end{macro}
% 
% The \texttt{r@tfl@t} counter is used when generating `labels' for
% determining what side of the page the float is on, in twoside mode.
%    \begin{macrocode}
\newcounter{r@tfl@t}
\setcounter{r@tfl@t}{0}
%    \end{macrocode}
%
% Positioning skips (see above).
%    \begin{macrocode}
\newskip\rotFPtop \rotFPtop=\@fptop
\newskip\rotFPbot \rotFPbot=\@fpbot
%    \end{macrocode}
%
% \section{Turning and rotation environments}
% \begin{macro}{sideways}
% Environment to turn the contents through 90 degrees.
%    \begin{macrocode}
\def\sideways{%
  \Grot@setangle{90}%
  \setbox\z@\color@hbox\ignorespaces}
\def\endsideways{%
  \unskip\color@endbox
  \Grot@x\z@
  \Grot@y\z@
  \Grot@box
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{turn}
% Rotate the contents of the environment, leaving the appropriate space
%    \begin{macrocode}
\def\turn#1{%
  \Grot@setangle{#1}%
  \setbox\z@\color@hbox\ignorespaces}
\def\endturn{%
  \unskip\color@endbox
  \Grot@x\z@
  \Grot@y\z@
  \Grot@box
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{rotate}
% Rotate the contents of the environment, leaving \emph{no space}.
%    \begin{macrocode}
\def\rotate#1{%
  \Grot@setangle{#1}%
  \setbox\z@\color@hbox\ignorespaces}
\def\endrotate{%
  \unskip\color@endbox
  \Grot@x\z@
  \Grot@y\z@
  \wd0\z@\dp0\z@\ht0\z@
  \Grot@box
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\turnbox}
% A macro version of the `rotate' environment. 
%    \begin{macrocode}
\def\turnbox#1#2{%
  \Grot@setangle{#1}%
%    \end{macrocode}
% Note: grouping within the box makes \cs{color@hbox} unnecessary, I think.
%    \begin{macrocode}
  \setbox\z@\hbox{{#2}}%
  \Grot@x\z@\Grot@y\z@
  \wd0\z@\dp0\z@\ht0\z@
  \Grot@box
}
%    \end{macrocode}
% \end{macro}
% \section{Sideways figures and tables}
% Now for the macros to provide a complete
% environment for sideways figures and tables.
% We define two environments |sidewaysfigure| and 
% |sidewaystable| that
% fit in with the normal table and figure floats. These are `fixed'
% environments that  just do 90 degree rotation, but it would be easy
% to parameterize this to do other rotations if needed (the mind
% boggles\ldots)
% 
% \begin{macro}{\@rotfloat}
% \begin{macro}{\@xrotfloat}
% \begin{macro}{\rot@float@box}
% First a generalised `rotfloat' environment. We need to intercept
% \LaTeX's float macros, in order to change the assumed width of a
% float being |\columnwidth|. We want it to work on a width of
% |\textheight| so that when we rotate the float, it comes out
% the right height. This is not actually very satisfactory, since what
% we \emph{really} want is for rotated floats to occupy the space they
% actually \emph{use}. The captions are a problem --- since they can
% precede the figure or table, we cannot set them in a box of the
% right width (ie the \emph{height} of the forthcoming object), because
% it has not happened yet. The result of these difficulties is that
% rotated figures  always end up as full page figures.
%    \begin{macrocode}
\newsavebox\rot@float@box
\def\@rotfloat#1{%
  \@ifnextchar[%
    {\@xrotfloat{#1}}%
    {\edef\@tempa{\noexpand\@xrotfloat{#1}[\csname fps@#1\endcsname]}\@tempa}%
}
\def\@xrotfloat#1[#2]{%
  \@float{#1}[#2]%
%    \end{macrocode}
% Set the float contents in
% a box of width \cs{textheight} instead of \cs{columnwidth}. 
%    \begin{macrocode}
  \begin{lrbox}\rot@float@box
  \begin{minipage}\textheight
 }
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\end@rotfloat}
% We call \LaTeX's \cs{end@float} macro having previously rotated
% the box \cs{@currbox}.
% The rotation is either clockwise or
% anti-clockwise, depending on whether the page is odd or even;
% in oneside mode it is always odd.
%    \begin{macrocode}
\def\end@rotfloat{%
%    \end{macrocode}
% If we are going to know whether pages are odd or even, 
% we need to use the a variant \cs{pageref} mechanism and our own
% specialised labels.
%    \begin{macrocode}
   \end{minipage}\end{lrbox}%
   \stepcounter{r@tfl@t}%
   \rot@label{RF\ther@tfl@t}%
   \rot@pageref{RF\ther@tfl@t}{\R@@page}%
   \edef\@tempa{Adding sideways \@captype\space on page \R@@page\space}
   \rot@mess@toks\expandafter{\@tempa}
   \wd\rot@float@box\z@
   \ht\rot@float@box\z@
   \dp\rot@float@box\z@
   \vbox to \textheight{%
%    \end{macrocode}
% We need to know for sure which direction rotation is going to
% be in, so locally reset the graphics units.
%    \begin{macrocode}
    \setkeys{Grot}{units=360}%
    \if@rot@twoside
    \else
      \let\R@@page\rot@LR
    \fi 
    \ifthenelse{\isodd{\R@@page}}{% 
      \if@rot@twoside
        \rot@mess@toks\expandafter{\the\rot@mess@toks (right hand page)}%
      \fi
      \vfill 
      \@@line{%
        \hskip\rotFPtop
        \rotatebox{90}{\box\rot@float@box}%
        \hskip\rotFPbot
      }%
    }{% 
      \if@rot@twoside
        \rot@mess@toks\expandafter{\the\rot@mess@toks (left hand page)}%
      \fi
      \@@line{%
        \hskip\rotFPbot
        \rotatebox{-90}{\box\rot@float@box}%
        \hskip\rotFPtop
      }%
      \vfill
    }% 
    \rot@message{\the\rot@mess@toks}
  }% 
  \end@float
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\sidewaysfigure}
% \begin{macro}{\endsidewaysfigure}
% \begin{macro}{\sidewaystable}
% \begin{macro}{\endsidewaystable}
% The following definitions set up two environments, 
% \texttt{sidewaystable} and \texttt{sidewaysfigure}, which uses this
% type of float. Naturally, users may need to change these to suit
% their local style. Both contribute to the normal lists of figures
% and tables.
%    \begin{macrocode}
\def\sidewaysfigure{\@rotfloat{figure}}
%
\let\endsidewaysfigure\end@rotfloat
%
\def\sidewaystable{\@rotfloat{table}}
\let\endsidewaystable\end@rotfloat
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@rotdblfloat}
% \begin{macro}{\end@rotdblfloat}
% Handling double column floats
%    \begin{macrocode}
\def\@rotdblfloat{%
  \if@twocolumn\expandafter\@rotdbflt\else\expandafter\@rotfloat\fi
}
\def\@rotdbflt#1{\@ifnextchar[{\@rotxdblfloat{#1}}{\@rotxdblfloat{#1}[tp]}}
\def\@rotxdblfloat#1[#2]{%
  \@float{#1}[#2]%
  \hsize\textwidth\linewidth\textwidth
  \begin{lrbox}\rot@float@box
  \begin{minipage}\textheight
}
\def\end@rotdblfloat{%
%    \end{macrocode}
% If we are going to know whether pages are odd or even, 
% we need to use the \cs{pageref} mechanism, and labels. But
% Labels won't work \emph{unless} the user has put in a
% caption. Beware!
%    \begin{macrocode}
  \end{minipage}\end{lrbox}%
  \stepcounter{r@tfl@t}%
  \rot@label{RF\ther@tfl@t}%
  \rot@pageref{RF\ther@tfl@t}{\R@@page}%
  \edef\@tempa{Adding sideways \@captype\space on page \R@@page\space}
  \rot@mess@toks\expandafter{\@tempa}
  \@tempdima\ht\rot@float@box
  \advance\@tempdima by \dp\rot@float@box
%   \ifrot@messages
%     \rot@message{BOX wd: \the\wd\rot@float@box,
%       ht: \the\ht\rot@float@box, dp: \the\dp\rot@float@box:
%       so shift by .5 of \the\@tempdima}%
%   \fi
  \wd\rot@float@box\z@
  \ht\rot@float@box\z@
  \dp\rot@float@box\z@
  \vbox to \textheight{%
%    \end{macrocode}
% We need to know for sure which direction rotation is going to
% be in, so locally reset the graphics units.
%    \begin{macrocode}
    \setkeys{Grot}{units=360}%
    \if@rot@twoside
    \else
      \let\R@@page\rot@LR
    \fi 
    \ifthenelse{\isodd{\R@@page}}{% 
      \ifrot@messages
        \if@rot@twoside
	  \rot@mess@toks\expandafter{\the\rot@mess@toks (right hand page)}%
	\fi
      \fi
      \vfill 
      \@@line{%
        \hskip\rotFPtop
        \rotatebox{90}{\box\rot@float@box}%
        \hskip\rotFPbot
      }%
    }{% 
      \ifrot@messages
        \if@rot@twoside
	  \rot@mess@toks\expandafter{\the\rot@mess@toks (left hand page)}%
	\fi
      \fi% 
      \@@line{%
        \hskip\rotFPbot
        \rotatebox{-90}{\box\rot@float@box}%
        \hskip\rotFPtop
      }%
      \vfill
    }% 
    \rot@message{\the\rot@mess@toks}%
  }% 
  \end@dblfloat
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{environment}{sidewaysfigure*}
% \begin{environment}{sidewaystable*}
%    \begin{macrocode}
\newenvironment{sidewaystable*}
               {\@rotdblfloat{table}}
               {\end@rotdblfloat}
\newenvironment{sidewaysfigure*}
               {\@rotdblfloat{figure}}
               {\end@rotdblfloat}

%    \end{macrocode}
% \end{environment}
% \end{environment}
%
% \begin{macro}{\rot@label}
% \begin{macro}{\rot@thepage}
% \begin{macro}{\rot@pageref}
% \begin{macro}{\rot@protected@write}
% \begin{macro}{\if@rot@refundefined}
% Note that we used \cs{rot@label}, not \cs{label}; this
% variant writes (just) the \emph{true} page number, not the
% value of \cs{thepage}; this ``true'' value then needs special
% treatment in \cs{protected@write}, just as
% \cs{thepage} already has.
% \cs{rot@pageref}\marg{generated label name}\marg{cs to set to
% pageno} then returns the labelled page's number (or 0 if label not
% yet defined).  If label not defined, flags using
% \cs{rot@refundefinedtrue} for end-document to pick up.  (later...)
%    \begin{macrocode}
\def\rot@thepage{\@arabic\c@page}
\def\rot@label#1{\@bsphack
  \rot@protected@write{\@auxout}{}%
         {\string\newlabel{#1}{\rot@thepage}}%
  \@esphack}
\def\rot@pageref#1#2{%
  \expandafter\ifx\csname r@#1\endcsname\relax
    \global\@rot@refundefinedtrue
    \def#2{0}%
  \else
    \edef#2{\csname r@#1\endcsname}%
  \fi
}
\long\def\rot@protected@write#1#2#3{%
  \begingroup
    \let\rot@thepage\relax
    #2%
    \let\protect\@unexpandable@protect
    \edef\reserved@a{\write#1{#3}}%
    \reserved@a
  \endgroup
  \if@nobreak\ifvmode\nobreak\fi\fi
}
\newif\if@rot@refundefined
\global\@rot@refundefinedfalse
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\rot@mess@toks}
% A token register to build up debugging messages
%    \begin{macrocode}
\newtoks\rot@mess@toks
%    \end{macrocode}
% \end{macro}
%
% \subsection{Rotated captions only}
%
% \begin{macro}{\rotcaption}
% \begin{macro}{\@makerotcaption}
% Sometimes you may find that the rotation of complete figures does
% not give quite the right result, since they always take up the whole
% page. You may prefer to rotate the caption and the float contents
% separately within a conventional figure. Here we offer a suggestion
% for a \cs{rotcaption} command, which inserts the caption rotated
% by 90 degrees. It is essentially a copy of the normal captioning
% code.
% Packages which define the \cs{@makecaption} command may also need
% to define \cs{@makerotcaption}.
%    \begin{macrocode}
\def\rotcaption{\refstepcounter\@captype\@dblarg{\@rotcaption\@captype}}
\long\def\@rotcaption#1[#2]#3{%
  \addcontentsline{\csname ext@#1\endcsname}{#1}{%
    \protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}}%
  \par
  \begingroup
    \@parboxrestore
    \normalsize
    \@makerotcaption{\csname fnum@#1\endcsname}{#3}%
  \endgroup}
  \long\def\@makerotcaption#1#2{%
    \setbox\@tempboxa\color@hbox#1: #2\color@endbox
    \ifdim \wd\@tempboxa > .8\vsize
      \rotatebox{90}{%
        \begin{minipage}{.8\textheight}#1: #2\end{minipage}%
      }%
    \else%
      \rotatebox{90}{\box\@tempboxa}%
    \fi
  \nobreak
  \hspace{12pt}%
}
%</package>
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \section{Last-minute infrastructure}
%
% \begin{macro}{\color@hbox}
% \begin{macro}{\color@endbox}
% These macros aren't provided in \LaTeX{}, by default (I seem to have
% assumed that they were\dots)
%    \begin{macrocode}
\AtBeginDocument{%
  \providecommand\color@hbox{\hbox\bgroup}%
  \providecommand\color@vbox{\vbox\bgroup}%
  \providecommand\color@endbox{\egroup}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \section{History}
%
% Version 2.0 is a complete re-write, with most of the work now
% being done by the \LaTeXe\ graphics package.
%
% Version 2.1 provides a `clockwise' option to reinstate the behaviour
% described in the `\LaTeX\ Companion'
%
% Version 2.2 just intercepts the standard float macros instead
% of copying and changing the. The `twoside' option is obeyed.
%
% Version 2.5 corrects problems in sideways figures.
%
% Version 2.6 is a rewrite of the sideways floats via Frank Mittelbach
% (to whom many thanks for looking at the  mangy code).
%
% Version 2.7 is checked for \LaTeX\ of December 94, and adds the option
% of twoside behaviour independent of the general twoside.
%
% Version 2.8 cleans up some mistakes pointed out by Harald Axel
% Sommerfeldt.
%
% Version 2.9 cleans up some (more) mistakes pointed out by Harald
% Axel Sommerfeldt.
%
% Version 2.13a permits positioning of rotated floats in the same way
% as they are positioned in `normal' floats.
%
% Version 2.14 is the first to be published anywhere as the outcome of
% maintenance by Robin Fairbairns.
%
% Version 2.15 deals with page-numbering bug for auto-float-rotation,
% and tidying of messages; published to ctan
%
% Version 2.16 uses colour boxes as necessary; published to ctan.
% Version 2.16a provides the colour box commands \cs{AtBeginDocument}.
%
% \Finale
\endinput
%