\NeedsTeXFormat{LaTeX2e} \ProvidesPackage{hvfloat}[2003/05/31 rotating of floating objects] %% %% IMPORTANT NOTICE: %% %% This is file `hvfloat.sty', %% %% Herbert Voss %% %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License Distributed from CTAN archives %% in directory macros/latex/base/lppl.txt. %% %% DESCRIPTION: %% `hvfloat' offers rotating of captions and objects for floats %% \def\fileversion{1.1} \def\filedate{2003/05/31} \message{`hvfloat' v\fileversion, \filedate\space (Herbert Voss)} % % \RequirePackage{graphicx} \RequirePackage{keyval} \RequirePackage{ifthen} % \newif\ifhv@fbox \hv@fboxfalse \DeclareOption{fbox}{% \hv@fboxtrue% \setlength{\fboxsep}{1pt}% } \ProcessOptions\relax % \newlength{\hvObjectWidth} \newlength{\hvCapWidth} \newlength{\hvMaxCapWidth} \newsavebox{\hvObjectBox} \newsavebox{\hvCaptionBox} \newsavebox{\hvOBox} % \newif\ifhv@useOBox \newif\ifhv@nonFloat \newif\ifhv@onlyText \newif\ifhv@framedCaption \newif\ifhv@framedObject % \def\hvSet@boolkey#1#2{% \csname hv@#2\ifx\relax#1\relax true\else#1\fi\endcsname} % \define@key{hvSet}{floatPos}[htbp]{ % LaTeX's position parameters htbp \def\hvSet@floatPos{#1}% } \define@key{hvSet}{rotAngle}[0]{ % rotates caption AND image together \def\hvSet@rotAngle{#1}% } \define@key{hvSet}{capWidth}[.8]{ % object (w)idth)|object (h)eight| \def\hvSet@capWidth{#1}% } \define@key{hvSet}{capAngle}[0]{ % -360..+360 \def\hvSet@capAngle{#1}% } \define@key{hvSet}{capPos}[b]{ % (l)eft|(b)ottom|(t)op|(r)ight \def\hvSet@capPos{#1}% it is relativ to the object } \define@key{hvSet}{capVPos}[c]{ % (b)ottom|(c)enter|(t)op \def\hvSet@capVPos{#1}% it is relativ to the object } \define@key{hvSet}{objectPos}[c]{ % (l)eft|(c)enter|(r)ight \def\hvSet@objectPos{#1}% it is relativ to the document } \define@key{hvSet}{objectAngle}[0]{ % -360..+360 \def\hvSet@objectAngle{#1}% } \define@key{hvSet}{floatCapSep}[5]{ % a width with the unit pt \def\hvSet@floatCapSep{#1}% } \define@key{hvSet}{useOBox}[false]{ % use of the hvOBox contents \lowercase{\hvSet@boolkey{#1}}{useOBox}% } \define@key{hvSet}{nonFloat}[false]{% Do not use float environment \lowercase{\hvSet@boolkey{#1}}{nonFloat}% } \define@key{hvSet}{onlyText}[false]{% Write the caption only as text \lowercase{\hvSet@boolkey{#1}}{onlyText}% } \define@key{hvSet}{framedCaption}[false]{% boxed caption \lowercase{\hvSet@boolkey{#1}}{framedCaption}% } \define@key{hvSet}{framedObject}[false]{% boxed object \lowercase{\hvSet@boolkey{#1}}{framedObject}% } % \def\setDefaults{% \setkeys{hvSet}{% floatPos=htbp, rotAngle=0, capWidth=0.8, capAngle=0,% capPos=b, capVPos=c, objectPos=c, objectAngle=0,% floatCapSep=5, useOBox=false, nonFloat=false,% onlyText=false}% } \setDefaults% \ifhv@fbox \setkeys{hvSet}{framedCaption=true, framedObject=true}% \fi % \def\hv@Top{t} \def\hv@Bottom{b} \def\hv@Right{r} \def\hv@Left{l} \def\hv@Center{c} \def\hv@Width{w} \def\hv@Height{h} \def\hv@Zero{0} % \newlength{\hvAboveCaptionSkip} \newlength{\hvBelowCaptionSkip} \setlength{\belowcaptionskip}{\abovecaptionskip}% it is in latex.ltx = 0pt \newcommand{\saveCaptionSkip}{% \setlength{\hvAboveCaptionSkip}{\abovecaptionskip} \setlength{\hvBelowCaptionSkip}{\belowcaptionskip} \setlength{\abovecaptionskip}{0pt} \setlength{\belowcaptionskip}{0pt} } \newcommand{\restoreCaptionSkip}{% \setlength{\abovecaptionskip}{\hvAboveCaptionSkip} \setlength{\belowcaptionskip}{\hvBelowCaptionSkip} } % % \newcommand{\figcaption}[2][]{\def\@captype{figure}% \ifthenelse{\equal{#1}{}}{\caption{#2}}{\caption[#1]{#2}}} \newcommand{\tabcaption}[2][]{\def\@captype{table}% \ifthenelse{\equal{#1}{}}{\caption{#2}}{\caption[#1]{#2}}} % % % \def\hvFloat{\@ifnextchar[{\do@hvFloat}{\do@hvFloat[]}} \def\do@hvFloat[#1]#2#3{% \setDefaults% \ifthenelse{\equal{#1}{}}{}{\setkeys{hvSet}{#1}}% \gdef\hv@floatType{#2}% \ifthenelse{\equal{#2}{}}{\setkeys{hvSet}{nonFloat=true}}{}% \gdef\hv@floatObject{#3}% \@ifnextchar[{\do@@hvFloat}{\do@@hvFloat[]}% } \def\do@@hvFloat[#1]#2#3{% \def\hv@shortCap{#1} \def\hv@longCap{#2} \def\hv@label{#3} %\newcommand*{\hvFloat}[5][]{% % [#1}: keyvalues % #2: type figure | table | ... % #3: float contents % [#4]: short caption % #5: caption % #6: label % \setDefaults% % \def\@tempa{#1}% % \ifx\@tempa\empty\else\setkeys{hvSet}{#1}\fi% set options, only when not empty \def\@tempa{90}% \ifx\hvSet@rotAngle\@tempa \setlength{\hvMaxCapWidth}{\textheight} \else \setlength{\hvMaxCapWidth}{\linewidth} \fi % % First we save the object in \hvObjectBox % \ifx\hvSet@objectAngle\hv@Zero % rotate the object? \savebox{\hvObjectBox}{\ifhv@useOBox\usebox{\hvOBox}\else\hv@floatObject\fi} \else \savebox{\hvObjectBox}{% \rotatebox{\hvSet@objectAngle}{% \ifhv@useOBox\usebox{\hvOBox}\else\hv@floatObject\fi}} \fi \setlength{\hvObjectWidth}{\wd\hvObjectBox} % % Now we save the caption with its defined \hvCapWidth % \ifx\hvSet@capWidth\hv@Width \setlength{\hvCapWidth}{\hvObjectWidth} \else \ifx\hvSet@capWidth\hv@Height \setlength{\hvCapWidth}{\ht\hvObjectBox} \else \setlength{\hvCapWidth}{\hvObjectWidth} \ifx\hvSet@capPos\hv@Left \addtolength{\hvMaxCapWidth}{-\hvObjectWidth} \fi \ifx\hvSet@capPos\hv@Right \addtolength{\hvMaxCapWidth}{-\hvObjectWidth} \fi \ifdim\hvSet@capWidth\columnwidth<\hvMaxCapWidth \setlength{\hvCapWidth}{\hvSet@capWidth\columnwidth} \else \setlength{\hvCapWidth}{\hvMaxCapWidth} \fi \fi \fi % % now we have the object and the caption with the right % rotated angles saved in boxes % \def\fps@figure{\hvSet@floatPos} \ifhv@nonFloat% \begingroup% Start the nonfloat part \else% \begin{\hv@floatType}% Start the floating environment \fi% \saveCaptionSkip% we put this space ourselve \ifx\hvSet@capAngle\hv@Width % need rotation? \sbox{\hvCaptionBox}{% \begin{minipage}[b]{\hvCapWidth}% minipage, to get hyphenation \ifhv@nonFloat% \ifhv@onlyText% #2% \else% \ifthenelse{\equal{\hv@floatType}{figure}}{% \ifthenelse{\equal{#1}{}}{\figcaption{#2}}{\figcaption[#1]{#2}}% }{% \ifthenelse{\equal{#1}{}}{\tabcaption{#2}}{\tabcaption[#1]{#2}}% }% \fi% \else% \ifx\hv@shortCap\empty\caption{#2}\else\caption[#1]{#2}\fi% \fi% \label{#3}% \end{minipage}% }% \else% \sbox{\hvCaptionBox}{% \rotatebox{\hvSet@capAngle}{% \begin{minipage}[b]{\hvCapWidth}% minipage, to get hyphenation \ifhv@nonFloat% \ifhv@onlyText% #2% \else% \ifthenelse{\equal{\hv@floatType}{figure}}{% \ifthenelse{\equal{#1}{}}{\figcaption{#2}}{\figcaption[#1]{#2}}% }{% \ifthenelse{\equal{#1}{}}{\tabcaption{#2}}{\tabcaption[#1]{#2}}% }% \fi% \else% \ifx\hv@shortCap\empty\caption{#2}\else\caption[#1]{#2}\fi% \fi% \label{#3}% \end{minipage}% }% }% \fi% %% \restoreCaptionSkip% save old values \ifx\hvSet@objectPos\hv@Right% \raggedleft% \else% \ifx\hvSet@objectPos\hv@Center% \ifhv@nonFloat% \hspace*{\fill}% \else% \centering \fi% \fi% \fi% % % to rotate object and caption together, we save all in another box % the caption comes first, if its on the left or the top % \savebox{\@tempboxa}{% \ifx\hvSet@capPos\hv@Left % caption on left side \ifx\hvSet@capVPos\hv@Center% \ifhv@framedCaption% \fbox{\parbox{\wd\hvCaptionBox}{\usebox{\hvCaptionBox}}}% \else \parbox{\wd\hvCaptionBox}{\usebox{\hvCaptionBox}} \fi% \hspace{\hvSet@floatCapSep pt}% capfloatsep \ifhv@framedObject% \fbox{\parbox{\wd\hvObjectBox}{\usebox{\hvObjectBox}}} \else \parbox{\wd\hvObjectBox}{\usebox{\hvObjectBox}} \fi% \else% \ifx\hvSet@capVPos\hv@Top % caption at top \ifhv@framedCaption% \fbox{\raisebox{-\height}{\usebox{\hvCaptionBox}}}% \else \raisebox{-\height}{\usebox{\hvCaptionBox}}% \fi \hspace{\hvSet@floatCapSep pt}% capfloatsep \ifhv@framedObject% \fbox{\raisebox{-\height}{\usebox{\hvObjectBox}}}% \else \raisebox{-\height}{\usebox{\hvObjectBox}}% \fi% \else% caption on bottom \ifhv@framedCaption% \fbox{\usebox{\hvCaptionBox}} \else \usebox{\hvCaptionBox} \fi% \hspace{\hvSet@floatCapSep pt}% \ifhv@framedObject% \fbox{\usebox{\hvObjectBox}} \else \usebox{\hvObjectBox} \fi% \fi% \fi% \else \ifx\hvSet@capPos\hv@Top \ifdim\wd\hvCaptionBox>\wd\hvObjectBox \begin{minipage}{\wd\hvCaptionBox} \else \begin{minipage}{\wd\hvObjectBox} \fi \centering \ifhv@framedCaption% \fbox{\usebox{\hvCaptionBox}}\\[\hvBelowCaptionSkip] \else \usebox{\hvCaptionBox}\\[\hvBelowCaptionSkip]% \fi% \ifhv@framedObject% \fbox{\usebox{\hvObjectBox}}% \else \usebox{\hvObjectBox}% \fi% \end{minipage} \else \ifx\hvSet@capPos\hv@Bottom \ifdim\wd\hvCaptionBox>\wd\hvObjectBox \begin{minipage}{\wd\hvCaptionBox} \else \begin{minipage}{\wd\hvObjectBox} \fi \centering \ifhv@framedObject \fbox{\usebox{\hvObjectBox}}\\[\hvAboveCaptionSkip] \else \usebox{\hvObjectBox}\\[\hvAboveCaptionSkip] \fi% \ifhv@framedCaption \fbox{\usebox{\hvCaptionBox}}% \else \usebox{\hvCaptionBox}% \fi% \end{minipage} \else% the last option: put the caption on the right \ifx\hvSet@capVPos\hv@Center% \ifhv@framedObject \fbox{\parbox{\wd\hvObjectBox}{\usebox{\hvObjectBox}}} \else \parbox{\wd\hvObjectBox}{\usebox{\hvObjectBox}} \fi% \hspace{\hvSet@floatCapSep pt}% \ifhv@framedCaption \fbox{\parbox{\wd\hvCaptionBox}{\usebox{\hvCaptionBox}}}% \else \parbox{\wd\hvCaptionBox}{\usebox{\hvCaptionBox}} \fi% \else% \ifx\hvSet@capVPos\hv@Top \ifhv@framedObject \fbox{\raisebox{-\height}{\usebox{\hvObjectBox}}}% \else \raisebox{-\height}{\usebox{\hvObjectBox}}% \fi% \hspace{\hvSet@floatCapSep pt}% \ifhv@framedCaption \fbox{\raisebox{-\height}{\usebox{\hvCaptionBox}}}% \else \raisebox{-\height}{\usebox{\hvCaptionBox}}% \fi \else \ifhv@framedObject \fbox{\usebox{\hvObjectBox}}% \else \usebox{\hvObjectBox}% \fi \hspace{\hvSet@floatCapSep pt}% \ifhv@framedCaption \fbox{\usebox{\hvCaptionBox}}% \else \usebox{\hvCaptionBox}% \fi% \fi% \fi \fi \fi \fi }% End savebox Object and caption % % now we rotate the object and caption, if needed % \ifx\hvSet@rotAngle\hv@Zero \usebox{\@tempboxa} \else \rotatebox{\hvSet@rotAngle}{\usebox{\@tempboxa}} \fi \ifhv@nonFloat \ifx\hvSet@objectPos\hv@Center \ifhv@nonFloat \hspace{\fill} \fi \fi \endgroup% End the nonfloat part \else \end{\hv@floatType}% End the floating environment \fi \ifhv@fbox % reset local settings \setkeys{hvSet}{framedCaption=true, framedObject=true} \fi } % \endinput