% \iffalse meta-comment % % Copyright (C) 2010 by Robert Marik % ----------------------------------------------------- % % This file 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 % % \iffalse %<*driver> \ProvidesFile{ocgtools.dtx} % %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{ocgtools} %<*package> [2013/08/05 v0.95a ocgtools.dtx file] % % %<*driver> \documentclass{ltxdoc} \usepackage{a4wide,url,color} \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{ocgtools.dtx} \PrintChanges \PrintIndex \end{document} % % \fi % % \CheckSum{1091} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % % \changes{v0.5}{2010/04/01}{First public version} % \changes{v0.6}{2010/04/10}{Keeping document's dirty for Adobe % Acrobat users} \changes{v0.7}{2010/05/01}{Each (mini)text layer % can get its own colors, fixed layerHshift and layerVshift macros, % options \texttt{inactive} and \texttt{active}} % \changes{v0.8}{2010/05/10}{Minor fix related to fancytooltips % package} \changes{v0.8a}{2010/11/19}{Minor fix related to color in % new eforms package} \changes{v0.9}{2010/12/18}{fixcolor option, % options processed by xkeyval, parameter allowed to transparent % option} \changes{v0.91}{2011/01/25}{support for pictures from % multipage PDF files} \changes{v0.95}{2013/06/24}{fixcolor option % replaced by /S /Transparency /I true /CS /DeviceRGB, if % \texttt{ocg-p.sty} has been loaded before, do not load % \texttt{ocg.sty}} \changes{v0.95a}{2013/08/05}{Fix for TeXlive % 2013} % % \GetFileInfo{ocgtools.dtx} % % \DoNotIndex{\newcommand,\newenvironment,\def} % % \title{The \textsf{ocgtools} package\thanks{This document % corresponds to \textsf{ocgtools}~\fileversion, dated \filedate.} % \thanks{Supported by grant 131/2010 of Higher % Education Development Fund (FRV\v S) }} \author{Robert Ma\v r\'\i k \\ % \texttt{marik@mendelu.cz}} % % \maketitle % % \section{Introduction} % % The package |ocgtools| is designed to insert OCG (Optional Content % Group) into PDF presentations. From the user's point of view, the % package allows to insert in an comfortable way any \TeX{} material % into separate layer in PDF document and insert links which toggle % this layer on/off. Hence parts of PDF document like formatted text, % tables, math formulas or graphics can be turned to visible or % invisible state by clicking active links or buttons. % % Similar packages are |cooltooltips|, |pdfcomment|, |AcroTeX| and % |fancytooltips|. In contrast to |cooltooltips| and |pdfcomment|, we % can work with any \TeX{} material, not only plain text. In contrast % to |fancytooltips|, no external file is necessary and more % minilayers (see below) can be opened simultaneously on one page. % However, |fancytooltips| and |ocgtools| can be combined in the same % document, even on the same page\footnote{remember to load % fancytooltips as the first package}. |AcroTeX| has far more % possibilities than |ocgtools|, but has three disadvantages: (1) % limited support for |pdftex| (no layers with |pdftex| driver) (2) % PDF file needs post-processing (3) for the post-processing the % non-free Adobe Acrobat Professional is necessary. However, the user % of |ocgtools| must have |AcroTeX| installed, since we use its % capability to insert buttons and JavaScripts into document (|eforms| % and |insdljs| packages). % % Two types of OCG objects can be inserted % \begin{itemize} % \item \textit{layers}: OCG's which span across the whole size of paper % (scaled if necessary) % \item \textit{minilayers}: OCG's which have their natural size and % are placed somewhere close to the link which toggles them on/off. % \end{itemize} % % The user should use viewer which allows to hide/reveal layers by % JavaScript. This includes especially Adobe Reader. Some limited % functionality is also in Foxit Reader (see the option |nobutton| % below). In some other viewers (like |xpdf|) users see red warning on % the first page (see |\ocgtools@msg|), all layers are visible and % cannot be hidden. % % \marginpar{\texttt{Important comment!}}\textbf{\color{red} Big % warning:} Unfortunately, with this package you may make your PDF % files \textbf{less portable} even if you use Adobe Reader! Till now, % we observed the following problems (for known problems not related % to portability se the end of this manual): % \begin{itemize} % \item jpg pictures may look darker when using \texttt{transparent} % option and \textbf{Linux} version of Adobe Reader -- Adobe Reader % switches to different rendering method which seems to be system % dependent. Hope, Adobe fixes this problem soon. You can also try % to use |fixcolor| option to solve this problem. % \item The layer with initial message on the first page which should % be hidden to the users of Adobe Reader is sometimes still visible, % if the PDF file is opened in Internet browser. From this reason, % layer \texttt{ocgtools0} is switched on and then off when % initializing PDF document. Hope, this workaround solves the % problem. If not, report the problem with a minimal example, please. % \end{itemize} % % \section{Examples} Several examples are distributed with the % package. We have one minimal example, one example which shows % cooperation with |preview.sty| and mainly -- examples which show % cooperation with three most popular packages to build % presentations. This includes |web.sty|, |pdfscreen.sty| and % |beamer.cls|. We have three demo files for each -- with no panel, % with panel on the right and with panel on the left. All examples can % be recompiled by running |ocgtools-test.bat| on Windows and % |ocgtools-test.sh| on Linux. % % \section{Usage} % % \subsection{Compilation} % All the packages we use are on CTAN or in \TeX live2009. The file % |ocg.sty| is a part of |asymptote| package\footnote{Do not % interchange with the |ocg.sty| provided by \"Osterreichische % Computer Geselshafft. The correct file |ocg.sty| is at % \url{http://www.tug.org/svn/texlive/trunk/Master/texmf/tex/latex/asymptote/ocg.sty}}. % |AcroTeX| is quite old on CTAN but the version on CTAN works well. % New version of |AcroTeX| is at |www.acrotex.net|, if necessary. % % \bigskip \textbf{Prerequisites}: Only |pdflatex| is tested. The % route via |dvips| or |dvipdfm| is not (yet?) supported (this % restriction follows from |transparent.sty| package). To work with % the package load |color.sty| and |hyperref.sty| packages. (This is % usually done automatically by most packages which are used to build % PDF presentations. If not, these packages are loaded by |ocgtools| % automatically as soon as |\definecolor| and |\href| remain % undefined, respectively.) You may use also |xcolor.sty|, but this % package is not compatible with |transparent| option. \bigskip % % You have to compile your |.tex| file \textit{three times} (!). If % you change your document and create new layer, you have to compile % three times again. After most changes (which include change in % position of but not the number of layers) you have to compile twice % to put layers on correct position. If you change the content of text % layers or minilayers, one compilation is sufficient. % % If \texttt{ocg-p.sty} has been loaded before the % \texttt{ocgtools.sty}, we use \texttt{ocg-p.sty} to insert % layers. Othewise we use \texttt{ocg.sty}. % % % \subsection{Package options} % Load package |ocgtools.sty| as usual: % \cs{usepackage}\oarg{options}|{ocgtools}|. Options include: % \begin{description} % \item[\texttt{transparent}] Layers produced by |\ocgtext| and % |\ocgpicture| in fact do not span over the whole page, but the % material of layer is scaled to some reasonable size (we keep % aspect ratio and the width and height are not bigger than % \DescribeMacro{\ocgtools@maxheight}|\ocgtools@maxheight| and % \DescribeMacro{\ocgtools@maxwidth} |\ocgtools@maxwidth|). If the % layer is activated, the page is covered by a uniform color |ocgbg| % and the layer is placed on the top. The options |transparent| % makes the color |ocgbg| transparent. Looks cool, but it could be % slow and could change some colors of bitmap pictures (and this % behavior seems to be system dependent -- looks differently on % Linux and differently on Windows). The transparency is achieved by % putting the command |\ocgtools@transparent| on appropriate place. % The default transparency is 0.5. Use something like % |\usepackage[transparent=0.8]{ocgtools}| to override. % \item[\texttt{nobutton}] The pages with active layers have a % transparent button which can be used to hide this layer. The user % simply clicks anywhere and the layers become hidden. In some % viewers (like Foxit Reader) the button is not 100\% transparent. % This option allows not to include the big button to hide layers. % The layers can be closed by clicking the red cross % below. % \item[\texttt{insertvisible}] In some rare cases problems with OCG's % occur on Windows installation of \TeX. Temporary (I hope) % workaround is to use this option, which inserts OCG's as visible. % The visibility is turned off when the PDF is opened on the first % page. % \item[\texttt{mouseover}] Layers can be opened by MouseOver action. % The corresponding active area is an invisible square with side 8pt % placed on the right bottom corner of the text or picture which % opens the layer. More details: MouseOver opens the layer and % MouseExit hides this layer again. If mouse button is clicked, the % layer remains opened after exiting the button and can be closed by % hovering and exiting minibutton, clicking the active area outside % the minibutton or clicking the red cross. The field with red cross % gets focus after opening the layer and hence pressing Enter key % also hides the layer or minilayer. % \item[\texttt{minimouseover}] As mouseover, but restricted to % minilayers. % \item[\texttt{noprogressmsg}] Opening PDF on the first page show the % message related to initial processing layers. This option turns % the message off. % \item[\texttt{nopageclose}] By default, all layers become off and % all buttons become hidden if the page is changed. The option % \texttt{nopageclose} suppresses this behavior. % \item[\texttt{inactive}] This option makes the package inactive. % \item[\texttt{noocg}] The same as \texttt{inactive}. % \item[\texttt{active}] This option forces the package active even if % |inactive| option is loaded. % \item[\texttt{fixcolor}] Use if you have \texttt{fancytooltips} % package installed. This option tries to resolve the problems with % transparency and color management on linux machines. % \end{description} % % \subsection{Text layer which extends to papersize} % The macro |\ocgtext[width=|\meta{width}, |bg=|\meta{color1}, % |fg=|\meta{color2}|]|\marg{text1}\marg{text2} % \DescribeMacro{\ocgtext} is used to create layer which contains any % \LaTeX{} material. \meta{text1} is a text which is written in an % ``usual'' way (in blue color which indicates that this text can be % used to hide/unhide another object) and this text is used to % hide/unhide layer with \meta{text2} (which could be text divided % into more than one paragraph, figure created by |mfpic| or any % \LaTeX{} material). \meta{text2} is either placed into |\hbox| (if % \meta{width} is 0\,pt, which is default) or wrapped by |\vbox| with % |\hsize| equal to \meta{width} (in the opposite case). The color % \meta{color1} is used to set the background for this box and the % color \meta{color2} is used as text color. The default value for % \meta{color1} is stored in macro |\defaultocgpapercolor| and the % default vaue for this macro is \DescribeMacro{ocgpaper} |ocgpaper|. % The color |ocgpaper| is yellow by default, more precisely, it is % declared with |\definecolor{ocgpaper}{rgb}{1,1,0.2}|. The default % value for \meta{color2} is stored in macro |\defaultocgfontcolor| % and the default vaue for this macro is % \DescribeMacro{ocgfontcolor}|ocgfontcolor|. The color |ocgfontcolor| % is declared as black by default. You can use also key words % |background| instead of |bg| and |color| instead of |fg|. The % keyword |width| can be omitted, provided \meta{width} comes as first % argument. Thus |\ocgtext[1cm,background=black,color=white]{text}| % puts the white text on black background in the box of width 1cm. For % more details about color management see paragraph \ref{summary}. % % \subsection{Layer with image which extends to papersize} % \DescribeMacro{\ocgpicture} The macro % |\ocgpicture|\oarg{params}\marg{picture} is used to insert a picture % which is used as a link to layer with bigger version of this % picture. The optional parameter \meta{params} is used by % |\includegraphics| command to draw picture in text. The layer % contains scaled version of the picture (aspect ratio is preserved). % % \subsection{Layer with text (or whatever) in its natural size} % \DescribeMacro{\ocgminitext} The macro % |\ocgminitext[width=|\meta{width}, |bg=|\meta{color1}, % |fg=|\meta{color2}|]|\marg{text1}\marg{text2} is used to create layer % containing \meta{text2} which is placed near the right top corner of % \meta{text1}. \meta{text2} is placed into |\hbox| or |\vbox| with % given |\hsize| according to the value of \meta{width} and other % optional parameters, as has been explained at |\ocgtext| % macro. Macros |\ocgminitextrb|, |\ocgminitextlt| and % |\ocgminitextlb| can be used to place the minilayer to the right % bottom, left to and left bottom corner. % % Starting from version 0.9 you can use keywords % |jsopen=|\meta{openaction} and |jsclose=|\meta{closeaction} to % define JavaScript action which is performed when the layer is opened % and closed, respectively. % % \subsection{Fine-tuning, customizing} % \DescribeMacro{\ocgtextstart}\DescribeMacro{\ocgtextend} Macros % |\ocgtextstart| and |\ocgtextend| are used to denote the start and % the end of hyperlink which is used to hide/reveal layers. Default % setting is |\def\ocgtextstart{\color{blue}}| and |\def\ocgtextend{}| % and hence, the links are blue and there is no mark at the end of the % link. % % \DescribeMacro{ocgbg} The color |ocgbg| is used to set the color % which are used to hide page when using |\ocgtext| and |\ocgpicture| % commands. The default setting is |\definecolor{ocgbg}{rgb}{0,0,0}|. % You may want to redefine this color, but you have to do this before % |\begin{document}|. % % \DescribeMacro{\layerHshift} \DescribeMacro{\layerVshift} The % dimensions |\layerHshift| and |\layerVshift| are used to place % layers exactly on the top of the page. Should be set automatically % in the second pass, when reading aux file. If not (the big layers % do not cover the PDF page and minitext layers are shifted), you % may adjust them as required after |\begin{document}|. In this % case, \textit{report the problem} to the author of the package, % please. % % Commands |\ocgtools@shipoutstart@hook| and % |\ocgtools@shipoutend@hook| are introduced to insert some material % at the begin and at the end of the box with the page contents. Can % be used for example to put background to the presentation. Both % commands should produce boxes of zero dimensions, i.e. use something % like % \begin{verbatim} % \makeatletter % \def\ocgtools@shipoutstart@hook{\hbox to 0 pt{\kern -1in \Huge % A\hss}} % \makeatother % \end{verbatim} % to insert letter "A" into the left bottom corner. Note that you will % see this letter only if the background of the presentation is % transparent. See also the files |ocgtools-example-web*.tex| and % |ocgtools-example-web*.pdf| for slightly more complicated % background. % % {\sloppy \DescribeMacro{\...envelope} The arguments of commands % |\ocgpicture|, |\ocgtext| and family of |\ocgminitext| etc. are % wrapped by macros |\ocgtools@pict@envelope|, % |\mocgtools@text@envelope| and |\ocgtools@minitext@envelope|, % respectively. You can redefine these macros to suit more to your % need. All macros are |\relax| by default. % % }\DescribeMacro{\ocgclosechar} The |\ocgclosechar| command is used to % print mark which is used to close layers. This mark is a red cross. % On the minitextlayers with red background we switch this color to % black (see the first few lines of the code to see, how we get this % behavior). Note that we used the macro % |\if@ocgtools@insideminilayer| which is true on layers with minitext % and false otherwise. % % \DescribeMacro{\ocgtools@msg} The |\ocgtools@msg| command contains % string for users of viewers which do not support layers (see the % first few lines of the code for default settings). % % \subsection{Summary on customizing colors in text layers}\label{summary} % Note that all colors related to the layers are set (and hence must % be declared before) when reading auxiliary files at % |\begin{document}|. Declaring of redefining colors after % |\begin{document}| has no influence. To summarize, if you want to % change colors, use the following. % \begin{itemize}\sloppy % \item To change the setting in the whole paper, redeclare colors % |ocgpaper| and |ocgfontcolor| before |\begin{document}|. Use the % command |\definecolor| for this purpose. % \item To change the setting from now to the end of document (or % group) redefine macros |\defaultocgpapercolor| and % |\defaultocgfontcolor|. Use for example % |\renewcommand{\defaultocgpapercolor}{green}|. % \item To change the setting for one single layer use |bg| and |fg| % keywords in optional parameter of |\ocgtext| and |\ocgminitext| % macros. % \end{itemize} % % \section{Possible future development and known problems} % The source code is in Mercurial repository at % \url{http://bitbucket.org/robert.marik/ocgtools/}. You can also % report problems and issues in the forum at this site. % \subsection{Known problems} % \begin{enumerate} % \item The package does not work properly if the \textbf{\color{red}PDF has one page} % only. This is probably minor problem, since most presentations are % longer and the problem will be traced later. % \item There could be a \textbf{\color{red}conflict with another package which % deals with} |\pdfpageattr|. This problem is resolved for % fancytooltips package. To make both fancytooltips and ocgtools % work in one document, load \textit{fancytooltips as the first one} % and ocgtools after. % \item In some rare cases the layers may be not inserted properly % when the \textbf{\color{red}\LaTeX{} file is compiled on Windows} % -- see the option \texttt{insertvisible} which solves this % problems in most cases. Since the author has limited access to % \TeX{} installations on Windows and hence reporting of problems % with a minimal example is highly appreciated. % \item The package cannot be used to hide 3D graphics inserted by % |movie15| package. However, you can put this graphics into % floating window or full-screen using capabilities of Acrobat Reader % 9. % \end{enumerate} % \subsection{Ideas for future developement} % These ideas may appear in new versions of the package (and patches % which include the solutions to this or other problems are % welcomed). % \begin{enumerate} % \item Using |preview| package it is possible to extract equations % and figures from the document and redefine |\ref| and |\eqref| % commands in such a way that clicking (or mouseover) opens on the % current page the layer with this equation (figure) and shift % clicking moves the user to the page with this equation (figure). % Or would |fancytooltips| produce better results in this case % (smaller PDF file)? See also the paper by Ross More at % \url{http://www.tug.org/TUGboat/Articles/tb29-3/tb93moore.pdf} and % the demo |examples/fancy-preview| in fancytooltips distribution. % See the |ocgtools-preview.*| files for some initial attempts in % this direction based on ocgtools. % \item Introduce draft mode, which prints all layers at the end of % document with links there and back? % \item If you open and close layer and then use "Back" % (Alt+LeftArrow), the layer opens again, but the button to hide % this layer becomes unavailable. Possible solution is to define % open action and close action for each layer (is it possible in % current PDF specification?). % \end{enumerate} % % \StopEventually{} % % \section{Implementation} % Initial settings % \begin{macrocode} %<*package> \def\ocgtools@msg{If this message does not disappear after a short time, the author either did not compile the \LaTeX{} file three times, or your PDF viewer does not support OCG. Use Adobe Reader!} \def\ocgtextstart{\color{blue}} \def\ocgtextend{} \ifx\definecolor\undefined\RequirePackage{color}\fi \ifx\href\undefined\RequirePackage[pdftex]{hyperref}\fi \definecolor{ocgpaper}{rgb}{1,1,0.2} \definecolor{ocgfontcolor}{rgb}{0,0,0} \def\defaultocgpapercolor{ocgpaper} \def\defaultocgfontcolor{ocgfontcolor} \definecolor{ocgbg}{rgb}{0,0,0} \RequirePackage{graphicx} \RequirePackage{pifont} \@ifpackageloaded{ocg-p}{}{\RequirePackage{ocg}} \RequirePackage{xkeyval} \newif\if@ocgtools@insideminilayer \def\ocgclosechar{{\color{red}\def\temp{red}% \ifx\temp\ocgt@@ls@bg\if@ocgtools@insideminilayer\color{black}\fi\fi \ding{56}}} % \end{macrocode} % Make packages and options known. % \begin{macrocode} \RequirePackage{atbegshi} \RequirePackage[pdftex]{eforms} \newif\if@ocgtools@transparent\@ocgtools@transparentfalse \def\ocgtools@transparent{} \DeclareOptionX{transparent}[0.5]{\@ocgtools@transparenttrue\gdef\ocgtools@transparent{\transparent{#1}}} \newif\if@ocgtools@insertvisible\@ocgtools@insertvisiblefalse \def\ocgtools@initialvisibility{0} \DeclareOptionX{insertvisible}{\@ocgtools@insertvisibletrue \def\ocgtools@initialvisibility{1}} \newif\ifocg@hide@button\ocg@hide@buttontrue \DeclareOptionX{nobutton}{\ocg@hide@buttonfalse} \def\ocgtools@progressmsg{\lower \layerVshift\hbox to 0 pt{ %space \textField[\V{OCGtools: processing OCG's ...}\BG{1 1 1} \textColor{1 0 0} \textSize{10}]% {ocgtoolsmsg}{6cm}{20pt}\hss}}% \DeclareOptionX{noprogressmsg}{\let\ocgtools@progressmsg\relax} \newif\if@ocgtools@minimouseover \@ocgtools@minimouseoverfalse \DeclareOptionX{minimouseover}{\@ocgtools@minimouseovertrue} \newif\if@ocgtools@mouseover \@ocgtools@mouseoverfalse \DeclareOptionX{mouseover}{\@ocgtools@mouseovertrue \@ocgtools@minimouseovertrue} \newif\if@ocgtools@pageclose \@ocgtools@pageclosetrue \DeclareOptionX{nopageclose}{\@ocgtools@pageclosefalse} \newif\if@ocgtools@inactive\@ocgtools@inactivefalse \DeclareOptionX{inactive}{\@ocgtools@inactivetrue} \DeclareOptionX{noocg}{\@ocgtools@inactivetrue} \newif\if@ocgtools@active\@ocgtools@activefalse \DeclareOptionX{active}{\@ocgtools@activetrue} \newif\if@ocgtools@fixcolor\@ocgtools@fixcolorfalse \DeclareOptionX{fixcolor}{\@ocgtools@fixcolortrue} \ProcessOptionsX \if@ocgtools@transparent\else\@ocgtools@fixcolorfalse\fi \if@ocgtools@active\@ocgtools@inactivefalse\fi \newdimen\layerHshift \layerHshift=-1in \newdimen\layerVshift \layerVshift=0pt \if@ocgtools@inactive \newcommand\ocgpicture[2][]{\leavevmode\includegraphics[#1]{#2}} \newcommand\ocgtext[3][0pt]{\leavevmode #2} \newcommand\ocgtoolsplacepicture[4]{} \newcommand\ocgtoolsplacetext[3]{} \newcommand\ocgtoolsplaceminitext[7]{} \newcommand\ocgminitext[3][0pt]{\leavevmode #2}% \let\ocgminitextlt\ocgminitext \let\ocgminitextrt\ocgminitext \let\ocgminitextlb\ocgminitext \let\ocgminitextrb\ocgminitext \PackageWarning{ocgtools}{Ocgtools inactive}% \expandafter\endinput\fi % \end{macrocode} % We use the hack for Adobe Acrobat suggested by DPS and Jorg at % http://www.acrotex.net/forum/showthread.php?tid=78. % \begin{macrocode} \def\ocgtools@JS#1{\JS{DirtyBeforeOCGtools=this.dirty; #1 this.dirty=DirtyBeforeOCGtools;}} % \end{macrocode} % We insert JavaScripts which are evaluated when the file is opened at % the first page. There is a clash with fancytooltips package. To make % things work, load fancytooltips before ocgtools and add the % |\pdfpageattr| from fancytooltips to |\pdfpageattr| inserted by % ocgtools. % \begin{macrocode} \@ifpackageloaded{fancytooltips}{% \let\TooltipPageopencloseJS\relax \ifx\fancytooltips@pdfpageattrJS\undefined \def\@ocgtools@fancytooltips{var DirtyBeforeCloseTooltip=this.dirty; CloseTooltips(); this.dirty=DirtyBeforeCloseTooltip;} \else \let\@ocgtools@fancytooltips\fancytooltips@pdfpageattrJS \fi }{\def\@ocgtools@fancytooltips{}} \edef\ocgtools@pdfpageattr{ /Group <> /AA << /O << /S /JavaScript /JS ( % \end{macrocode} % We close layers, if the page is opened. If the document is opened % and \texttt{ocgtoolsOCGs} is not initialized, we skip to % \texttt{catch} part and initialize. % \begin{macrocode} if (typeof(ocgtoolsOCGs)!="undefined"){ var temp = ocgtoolsOCGs.length; \if@ocgtools@pageclose for(var i=0; ocgtoolsOCGs && i> >> } \expandafter\global\expandafter\pdfpageattr\expandafter{\ocgtools@pdfpageattr} \if@ocgtools@transparent \RequirePackage{transparent} \fi % \end{macrocode} % Internal variables % \begin{macrocode} \newif\ifocg@minitext@left \newif\ifocg@minitext@bottom \newcount\ocgtools@layercount \newskip\ocgtools@left@skip \newskip\ocgtools@bottom@skip \newdimen\ocgtools@maxheight \newdimen\ocgtools@maxwidth % \end{macrocode} % We introduce lengths which can be used to fine-tune position of % layers on the screen. These lengths should be se automatically. % \begin{macrocode} \def\ocgtools@save@position{\pdfsavepos \write\@auxout{\string\global\string\advance\string \layerVshift \the\pdflastypos sp\string\relax}% \write\@auxout{\string\global\string\advance\string \layerHshift \the\pdflastxpos sp\string\relax}% \global\let\ocgtools@save@position\relax } \newtoks\ocgtools@layer@toks \ocgtools@layer@toks{\ocg@place@text{0}{1}{5cm}} \newbox\ocgtools@box@a \newbox\ocgtools@box@b \newif\ifocg@page@contains@layer % \end{macrocode} % We modify |shipout| routine and insert content of layers on the top of % PDF pages. % \begin{macrocode} \def\ocgtools@one{1} \let\ocgtools@shipoutstart@hook\relax \let\ocgtools@shipoutend@hook\relax \AtBeginShipout{% \expandafter\global\expandafter\pdfpageattr\expandafter{\ocgtools@pdfpageattr} \setbox\AtBeginShipoutBox=\hbox{% % \end{macrocode} % Hook which can be used to place background. % \begin{macrocode} \ocgtools@shipoutstart@hook % \end{macrocode} % This command writes the info about the position on the first PDF % page and then is set to relax on next pages. % \begin{macrocode} \ocgtools@save@position % \end{macrocode} % We insert the page first. % \begin{macrocode} \hbox to 0 pt{\box\AtBeginShipoutBox\hss}\kern -1in\kern \layerHshift % \end{macrocode} % We insert the layers. % \begin{macrocode} \ocg@page@contains@layerfalse \lower \layerVshift \hbox{\the\ocgtools@layer@toks}% % \end{macrocode} % If at least one layer has been inserted, we insert button which % can be used to hide layers. % \begin{macrocode} \ifocg@page@contains@layer \vbox to 0 pt{\kern -\paperheight \kern\layerVshift\hbox to 0 pt{\ocgtools@HideBtn\hss}\vss}% \fi % \end{macrocode} % We insert progress field on the first page. % \begin{macrocode} \xdef\ocgtools@currpage{\thepage}% \ifx\ocgtools@currpage\ocgtools@one \ocgtools@progressmsg \fi % \end{macrocode} % We finish the box. % \begin{macrocode} \ocgtools@shipoutend@hook% \kern 1in \kern -\layerHshift% }% } % \end{macrocode} % We create buttons which are used to hide all layers (if we create % buttons, we keep possibility to make them hidden, in contrast to % links). % \begin{macrocode} \ifx\ocgtools@AfterHideBtn\undefined\def\ocgtools@AfterHideBtn{}\fi \def\ocgtools@HideBtn{\pushButton[\W{0}\BG{}\S{S}\BC{}\H{N}\F{\FHidden}\A{\ocgtools@JS{ for(var i=0; ocgtoolsOCGs && i> }#2% \if@ocgtools@mouseover \hbox to 0 pt{\hss\pushButton[\W{0}\S{S}\BG{}\BC{}\H{N}% \A{\ocgtools@JS{ var OpenedByMouseEnter#1=false; \ifocg@hide@button this.getField("OcgtoolsBtn.HideButton.main").hidden = false;\fi this.getField("OcgtoolsBtn.HideButton.corner").hidden = false; this.getField("OcgtoolsBtn.HideButton.corner.#1").setFocus(); }} \AA{\AAMouseEnter{\ocgtools@JS{ for(var i=0; ocgtoolsOCGs && i> }#2% \if@ocgtools@minimouseover \hbox to 0 pt{\hss\pushButton[\W{0}\S{S}\BG{}\BC{}\H{N}% \A{\ocgtools@JS{ var OpenedByMouseEnter#1=false; this.getField("OcgtoolsBtn.HideButton.mini.#1").setFocus(); }} \AA{\AAMouseEnter{\ocgtools@JS{for(var i=0; ocgtoolsOCGs && i| where || is the number of the % layer. Similarly, the content of the minitextlayer is stored in % |\ocgtools@minitextcontent@|. % \begin{macrocode} \newcommand\ocgpicture[2][]{% \global\advance\ocgtools@layercount by 1% \ocgtools@ToggleLayer{\the\ocgtools@layercount}% {\leavevmode\includegraphics[#1]{#2}}% \expandafter\write\expandafter\posHandle\expandafter{% \expandafter\string\expandafter\ocgtoolsplacepicture\expandafter{% \the\ocgtools@layercount}{\thepage}{#2}{#1}}% } \define@key{ocg@key}{width}[0pt]{\def\ocgt@@ls@width{#1}} \define@key{ocg@key}{background}[ocgpaper]{\def\ocgt@@ls@bg{#1}} \define@key{ocg@key}{bg}[ocgpaper]{\def\ocgt@@ls@bg{#1}} \define@key{ocg@key}{color}[ocgfontcolor]{\def\ocgt@@ls@fg{#1}} \define@key{ocg@key}{fg}[ocgfontcolor]{\def\ocgt@@ls@fg{#1}} \define@key{ocg@key}{jsopen}[]{\def\ocgt@@ls@jsopen{#1}} \define@key{ocg@key}{jsclose}[]{\def\ocgt@@ls@jsclose{#1}} \newtoks\ocg@pdflastxpos\ocg@pdflastxpos{\the\pdflastxpos} \newtoks\ocg@pdflastypos\ocg@pdflastypos{\the\pdflastypos} \newtoks\ocg@pagetoks\ocg@pagetoks{\thepage} % \end{macrocode} % The trick with |\setkeys*| allows to write |[2cm,fg=red]| instead of % |[width=2cm,fg=red]|. % \begin{macrocode} \def\ocgtools@setdefault{\def\ocgt@@ls@bg{\defaultocgpapercolor}% \def\ocgt@@ls@fg{\defaultocgfontcolor}% \def\ocgt@@ls@width{0pt}\def\ocgt@@ls@jsopen{}% \def\ocgt@@ls@jsclose{}% } \newcommand\ocgtext[3][0pt]{% \ocgtools@setdefault \setkeys*{ocg@key}{#1}% \ifx\XKV@rm\empty\setkeys{ocg@key}{#1}\else\setkeys{ocg@key}{width=#1}\fi \global\advance\ocgtools@layercount by 1% \ocgtools@ToggleLayer{\the\ocgtools@layercount}% {\leavevmode{\ocgtextstart #2\ocgtextend}}% \edef\ocgtools@act{\write\posHandle{\noexpand\string\noexpand\ocgtoolsplacetext{\the\ocgtools@layercount}{\the\ocg@pagetoks}{width=\ocgt@@ls@width,bg=\ocgt@@ls@bg,fg=\ocgt@@ls@fg}}}% \ocgtools@act \expandafter\global\expandafter\def \csname ocgtools@textcontent@\the\ocgtools@layercount\endcsname{#3}% } \newcommand\ocgminitextlt[3][0pt]{% \ocg@minitext@bottomfalse\ocg@minitext@lefttrue \do@ocg@minitext{#1}{#2}{#3}{lt}}% \newcommand\ocgminitextrt[3][0pt]{% \ocg@minitext@bottomfalse\ocg@minitext@leftfalse \do@ocg@minitext{#1}{#2}{#3}{rt}}% \newcommand\ocgminitextlb[3][0pt]{% \ocg@minitext@bottomtrue\ocg@minitext@lefttrue \do@ocg@minitext{#1}{#2}{#3}{lb}}% \newcommand\ocgminitextrb[3][0pt]{% \ocg@minitext@bottomtrue\ocg@minitext@leftfalse \do@ocg@minitext{#1}{#2}{#3}{rb}}% \let\ocgminitext\ocgminitextrt \long\def\do@ocg@minitext#1#2#3#4{% \ocgtools@setdefault \setkeys*{ocg@key}{#1}% \ifx\XKV@rm\empty\setkeys{ocg@key}{#1}\else\setkeys{ocg@key}{width=#1}\fi \global\advance\ocgtools@layercount by 1\relax% \leavevmode \ifocg@minitext@left \ifocg@minitext@bottom \vbox to 0 pt{\kern 0.7\baselineskip\pdfsavepos\vss}% \else \vbox to 0 pt{\vss\pdfsavepos\kern 0.7\baselineskip}% \fi \fi \ocgtools@ToggleMiniLayer{\the\ocgtools@layercount}% {{\ocgtextstart #2\ocgtextend}}{\ocgt@@ls@jsopen}{\ocgt@@ls@jsclose}% \ifocg@minitext@left\else \ifocg@minitext@bottom \vbox to 0 pt{\kern 0.7\baselineskip\pdfsavepos\vss}% \else \vbox to 0 pt{\vss\pdfsavepos\kern 0.7\baselineskip}% \fi \fi \edef\ocgtools@act{\write\posHandle{\noexpand\string\noexpand\ocgtoolsplaceminitext{\the\ocgtools@layercount}{\the\ocg@pagetoks}{\the\ocg@pdflastxpos}{\the\ocg@pdflastypos}{}{width=\ocgt@@ls@width,bg=\ocgt@@ls@bg,fg=\ocgt@@ls@fg,jsopen={\ocgt@@ls@jsopen},jsclose={\ocgt@@ls@jsclose}}{#4}}}% \ocgtools@act \expandafter\global\expandafter\def \csname ocgtools@minitextcontent@\the\ocgtools@layercount\endcsname{#3}% }% % \end{macrocode} % These commands appear in |pos| file and we read these commands at the % begin of the document. Pictures are stored in token register, texts % for layers and minilayers are stored in commands defined by % |\csname|. % \begin{macrocode} \newcommand\ocgtoolsplacepicture[4]{% \expandafter\global\expandafter\ocgtools@layer@toks\expandafter {\the\ocgtools@layer@toks \ocg@place@picture{#1}{#2}{#3}{#4}}} \newcommand\ocgtoolsplacetext[3]{% \expandafter\global\expandafter\ocgtools@layer@toks\expandafter {\the\ocgtools@layer@toks\ocg@place@text{#1}{#2}{#3}}} \newcommand\ocgtoolsplaceminitext[7]{% \expandafter\global\expandafter\ocgtools@layer@toks\expandafter {\the\ocgtools@layer@toks \ocg@place@minitext{#1}{#2}{#3}{#4}{#5}{#6}{#7}}} % \end{macrocode} % These commands are called in output routine for each layer on each % page. They put the layer on the page, if the layer should be here % (i.e., if the second parameter equals |\thepage|). % \begin{macrocode} \def\ocg@place@picture#1#2#3#4{\def\tempnuma{#2}\edef\tempnumb{\thepage}% \ifx\tempnumb\tempnuma \global\ocg@page@contains@layertrue \vbox to 0 pt{\vss\hbox to 0pt% {\hbox{\begin{ocg}{ocgtools#1}{ocgtools#1}{\ocgtools@initialvisibility}% \ocgtools@drawpicture{#3}{#1}{#4}\end{ocg}}\hss}}% \fi} \def\ocg@place@text#1#2#3{\def\tempnuma{#2}\edef\tempnumb{\thepage}% \ifx\tempnumb\tempnuma \global\ocg@page@contains@layertrue \vbox to 0 pt{\vss\hbox to 0 pt{\hbox{% \begin{ocg}{ocgtools#1}{ocgtools#1}{\ocgtools@initialvisibility}% \ocgtools@drawtext{#3}{\csname ocgtools@textcontent@#1\endcsname}{#1}% \end{ocg}}\hss}}% \fi} \long\def\ocg@place@minitext#1#2#3#4#5#6#7{% \def\tempnuma{#2}\edef\tempnumb{\thepage}% \def\ocg@placement{#7}% \def\ocg@rb{rb}\def\ocg@lb{lb}\def\ocg@rt{rt}\def\ocg@lt{lt}% \ocg@minitext@leftfalse\ocg@minitext@bottomfalse \ifx\ocg@placement\ocg@lb \ocg@minitext@lefttrue\ocg@minitext@bottomtrue \fi \ifx\ocg@placement\ocg@rb \ocg@minitext@leftfalse\ocg@minitext@bottomtrue\fi \ifx\ocg@placement\ocg@lt \ocg@minitext@lefttrue\ocg@minitext@bottomfalse \fi \ifx\tempnumb\tempnuma \ocgtools@left@skip=#3sp minus #3sp% \ocgtools@bottom@skip=#4sp% \setbox\ocgtools@box@a=\hbox{\begin{ocg}{ocgtools#1}{ocgtools#1}{\ocgtools@initialvisibility}% \ocgtools@drawminitext{#6}{\csname ocgtools@minitextcontent@#1\endcsname}{#1} \end{ocg}}% \ifocg@minitext@left \ifdim \ocgtools@left@skip>\wd\ocgtools@box@a \advance \ocgtools@left@skip by -\wd\ocgtools@box@a plus 0 pt minus -\wd\ocgtools@box@a \else \ocgtools@left@skip=0pt\relax \fi \fi \ifocg@minitext@bottom \advance \ocgtools@bottom@skip by -\ht\ocgtools@box@a \fi \hbox to 0 pt{\hbox to \paperwidth{\hskip \ocgtools@left@skip \vbox to 0 pt{\vss \vbox to \paperheight{\vskip 0 pt plus 1 fill \box\ocgtools@box@a\vskip \ocgtools@bottom@skip} }% \hskip 0 pt plus 1 fill}\hss}% \fi } % \end{macrocode} % This code actually gives a graphical representation of the layers. % \begin{macrocode} \let\ocgtools@pict@envelope\relax \def\ocgtools@drawpicture#1#2#3{\vbox to \paperheight{\vbox to 0 pt{{% \ocgtools@transparent\color{ocgbg}% \hrule width \paperwidth height \paperheight}\vss}\vss \hbox to \paperwidth{\hss \setbox\ocgtools@box@a=\hbox{\ocgtools@pict@envelope{% \includegraphics[#3,width=!,height=\ocgtools@maxheight]{#1}}}% \ifdim\wd\ocgtools@box@a>\ocgtools@maxwidth \ocgtools@pict@envelope{\includegraphics[#3,height=!,width=\ocgtools@maxwidth]{#1}}% \else \box\ocgtools@box@a \fi \hss}% \vss \hbox to \paperwidth {\hss\ocgtools@HideLayers{#2}}}} \newdimen\ocg@textdimen \let\ocgtools@text@envelope\relax \long\def\ocgtools@drawtext#1#2#3{% \ocgtools@setdefault \setkeys*{ocg@key}{#1}% \ifx\XKV@rm\empty\setkeys{ocg@key}{#1}\else\setkeys{ocg@key}{width=#1}\fi \vbox to \paperheight{% \vbox to 0 pt{{\ocgtools@transparent\color{ocgbg}% \hrule width \paperwidth height \paperheight}\vss}\vss\hbox to \paperwidth {\hss \ifdim\ocgt@@ls@width=0pt \setbox\ocgtools@box@a=\hbox{\expandafter\colorbox\expandafter{\ocgt@@ls@bg}% {\expandafter\color\expandafter{\ocgt@@ls@fg}\ocgtools@text@envelope{#2}}}% \else \setbox\ocgtools@box@a=\hbox{\expandafter\colorbox{\expandafter\ocgt@@ls@bg}% {\vbox{\hsize=\ocgt@@ls@width\relax\linewidth=\ocgt@@ls@width\relax \rightskip 0 pt plus 1 fil\relax \expandafter\color\expandafter{\ocgt@@ls@fg}\ocgtools@text@envelope{#2}}}}% \fi \setbox\ocgtools@box@b\hbox{\resizebox{!}{\ocgtools@maxheight}{\copy\ocgtools@box@a}}% \ifdim\wd\ocgtools@box@b>\ocgtools@maxwidth \resizebox{\ocgtools@maxwidth}{!}{\box\ocgtools@box@a} \else \box\ocgtools@box@b \fi \hss}% \vss \hbox to \paperwidth {\hss\ocgtools@HideLayers{#3}}% }% } \def\ocg@empty{} \let\ocgtools@minitext@envelope\relax \newcommand\ocgtools@drawminitext[3]{% \@ocgtools@insideminilayertrue \ocgtools@setdefault \setkeys*{ocg@key}{#1}% \ifx\XKV@rm\empty\setkeys{ocg@key}{#1}\else\setkeys{ocg@key}{width=#1}\fi \ifdim\ocgt@@ls@width=0pt \setbox\ocgtools@box@a=\hbox{\colorbox{\ocgt@@ls@bg}{\expandafter\color \expandafter{\ocgt@@ls@fg}\ocgtools@minitext@envelope{#2}\ }}% \else \setbox\ocgtools@box@a=\hbox{\colorbox{\ocgt@@ls@bg}% {\vbox{\hsize=\ocgt@@ls@width\relax\linewidth=\ocgt@@ls@width\relax \rightskip 0 pt plus 1 fil\relax \expandafter\color\expandafter{\ocgt@@ls@fg}\ocgtools@minitext@envelope{#2}}}}% \fi \def\temp{#3}% \ifx\temp\ocg@empty \box\ocgtools@box@a \else \hbox{\copy\ocgtools@box@a\raise\ht\ocgtools@box@a \vbox to 0 pt{\hbox to 0 pt{\hss \ocgtools@HideMiniLayer[\ocgt@@ls@jsclose]{#3}}\vss}}% \fi \@ocgtools@insideminilayerfalse } % % \end{macrocode} % % \Finale \endinput