summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/ocgtools/ocgtools.dtx
blob: 26c285f430de384942c2b8169f36bdf4f72723a2 (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
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
% \iffalse meta-comment
%
% Copyright (C) 2010 by Robert Marik <marik@mendelu.cz>
% -----------------------------------------------------
% 
% 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}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{ocgtools}
%<*package>
    [2013/08/05 v0.95a ocgtools.dtx  file]
%</package>
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{a4wide,url,color}
\EnableCrossrefs         
\CodelineIndex
\RecordChanges

\begin{document}
  \DocInput{ocgtools.dtx}
  \PrintChanges
  \PrintIndex
\end{document}
%</driver>
% \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 <</S /Transparency /I true /CS /DeviceRGB>>
/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<ocgtoolsOCGs.length;i++)
     {
      ocgtoolsOCGs[i].state = false;
     }
   \fi
  }
%    \end{macrocode}
% We initialize document -- we find all layers, put into
% \texttt{ocgtoolsOCGs} field and make them hidden.
%    \begin{macrocode}
  else {
%    \end{macrocode}
% No dotted rectangle for buttons which have focus.
%    \begin{macrocode}
    app.focusRect = false;
    var DirtyBeforeOCGtools=this.dirty;
%    \end{macrocode}
% The OCG objects inserted by ocgtools are stored in variable
% |ocgtoolsOCGs| when the PDF document is opened on the first page.
%    \begin{macrocode}
    var iniocgtoolsOCGs = this.getOCGs();
    var ocgtoolsOCGs = [];
    for(var i=0; iniocgtoolsOCGs && i<iniocgtoolsOCGs.length;i++)
     {
     if(iniocgtoolsOCGs[i].name.substr(0,8) == "ocgtools")
        {
          ocgtoolsOCGs.push(iniocgtoolsOCGs[i]);
          \if@ocgtools@insertvisible
          iniocgtoolsOCGs[i].state=false;
          \fi
        }  
     }
    iniocgtoolsOCGs[0].state=true;
    iniocgtoolsOCGs[0].state=false;
    \ifx\ocgtools@progressmsg\relax\relax\else
    this.getField("ocgtoolsmsg").hidden=true;
    this.dirty=false;
    \fi
    }
    \ifocg@hide@button 
     this.getField("OcgtoolsBtn.HideButton.main").hidden = true; 
     this.dirty=false;
    \fi
    \@ocgtools@fancytooltips
    )
    >> >>
}

\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<ocgtoolsOCGs.length;i++)
         {
         ocgtoolsOCGs[i].state = false;
         }
         \ifocg@hide@button this.getField("OcgtoolsBtn.HideButton").hidden = true; \fi
         \ocgtools@AfterHideBtn
       }}]{OcgtoolsBtn.HideButton.main}{\paperwidth}{\paperheight}}
%    \end{macrocode}
% We create buttons which are attached to the top right corner 
% of each minilayer and can be used to hide the corresponding minilayer.
%    \begin{macrocode}
\ifx\ocgtools@AfterHideMiniLayer\undefined\def\ocgtools@AfterHideMiniLayer{}\fi
\newcommand\ocgtools@HideMiniLayer[2][]
{\setbox\ocgtools@box@a=\hbox{{\ocgclosechar}}%
\hbox to \wd\ocgtools@box@a%
{\hbox{{\ocgclosechar}}\hss%
\hbox{\pushButton[\W{0}\S{S}\BG{}\BC{}\H{N}%
\F{\FHidden}\A{\ocgtools@JS{         
    for(var i=0; ocgtoolsOCGs && i<ocgtoolsOCGs.length;i++)
    {
      if(ocgtoolsOCGs[i].name == "ocgtools#2")
      ocgtoolsOCGs[i].state = false;
    }
    this.getField("OcgtoolsBtn.HideButton.mini.#2").hidden = true; 
    \ocgtools@AfterHideMiniLayer
    #1
  }}]%
{OcgtoolsBtn.HideButton.mini.#2}{\wd\ocgtools@box@a}{\ht\ocgtools@box@a}}}}
%    \end{macrocode}
% We create buttons which are attached to the bottom right corner 
% of the screen and can be used to hide all layers.
%    \begin{macrocode}
\ifx\ocgtools@AfterHideLayers\undefined\def\ocgtools@AfterHideLayers{}\fi
\newcommand\ocgtools@HideLayers[1]{%
\setbox\ocgtools@box@a=\hbox{{\ocgclosechar}}%
\hbox to \wd\ocgtools@box@a%
{\hbox{{\ocgclosechar}}\hss%
\hbox{\pushButton[\W{0}\S{S}\BG{}\BC{}\H{N}%
\F{\FHidden}\A{\ocgtools@JS{         
         for(var i=0; ocgtoolsOCGs && i<ocgtoolsOCGs.length;i++)
         {
         ocgtoolsOCGs[i].state = false;
         }
         \ifocg@hide@button 
         this.getField("OcgtoolsBtn.HideButton.main").hidden = true; 
         \fi
         \ocgtools@AfterHideLayers
       }}]%
     {OcgtoolsBtn.HideButton.corner.#1}{\wd\ocgtools@box@a}{\ht\ocgtools@box@a}}}}
%    \end{macrocode}
% To hide/unhide layers and minilayers we use modified code from
% http://www.texample.net/weblog/2008/nov/02/creating-pdf-layers/
%    \begin{macrocode}
\newcommand{\ocgtools@ToggleLayer}[2]{%
  % #1: layer name,
  % #2: link text
  \leavevmode%
  \pdfstartlink user {
    /Subtype /Link
    /Border [0 0 0]%
    /H /N
    /A <<
      /S/JavaScript
      /JS (
         DirtyBeforeOCGtools=this.dirty;
         for(var i=0; ocgtoolsOCGs && i<ocgtoolsOCGs.length;i++)
         {
         if(ocgtoolsOCGs[i].name == "ocgtools#1")
         ocgtoolsOCGs[i].state = !ocgtoolsOCGs[i].state;
         else
         ocgtoolsOCGs[i].state = 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();
         this.dirty=DirtyBeforeOCGtools;
      )
    >>
  }#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<ocgtoolsOCGs.length;i++)
         {
         var OpenedByMouseEnter#1=true;
         if(ocgtoolsOCGs[i].name == "ocgtools#1")
         ocgtoolsOCGs[i].state = true;
         else
         ocgtoolsOCGs[i].state = false;
         }
         }}
  \AAMouseExit{\ocgtools@JS{ 
        if (OpenedByMouseEnter#1)
         {for(var i=0; ocgtoolsOCGs && i<ocgtoolsOCGs.length;i++)
         {
         if(ocgtoolsOCGs[i].name == "ocgtools#1")
         ocgtoolsOCGs[i].state = false;
         }}
         }}}]
    {OcgtoolsBtn.MaxiButton.#1}{8pt}{8pt}}%
  \fi
  \pdfendlink%
}

\newcommand{\ocgtools@ToggleMiniLayer}[4]{%
  % #1: layer name,
  % #2: link text
  % #3: js action if the layer is opened
  % #4: js action if the layer is closed
  \leavevmode%
  \pdfstartlink user {
    /Subtype /Link
    /Border [0 0 0]%
    /H /N
    /A <<
      /S/JavaScript
      /JS (
         DirtyBeforeOCGtools=this.dirty;
         for(var i=0; ocgtoolsOCGs && i<ocgtoolsOCGs.length;i++)
         {
         if(ocgtoolsOCGs[i].name == "ocgtools#1")
         {
           if (ocgtoolsOCGs[i].state)
           {
             #4
             ocgtoolsOCGs[i].state = false;
           }
           else
           {
             #3
             ocgtoolsOCGs[i].state = true;
           }
         }
         }
         this.getField("OcgtoolsBtn.HideButton.mini.#1").hidden = 
         !this.getField("OcgtoolsBtn.HideButton.mini.#1").hidden; 
         if (!this.getField("OcgtoolsBtn.HideButton.mini.#1").hidden)
           {this.getField("OcgtoolsBtn.HideButton.mini.#1").setFocus();}
         this.dirty=DirtyBeforeOCGtools;
      )
    >>
  }#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<ocgtoolsOCGs.length;i++)
         {
         var OpenedByMouseEnter#1=true;
         if(ocgtoolsOCGs[i].name == "ocgtools#1")
         {#3 ocgtoolsOCGs[i].state = true;}
         }
         this.getField("OcgtoolsBtn.HideButton.mini.#1").hidden = false;
         }}
  \AAMouseExit{\ocgtools@JS{
       if (OpenedByMouseEnter#1)
       {
         for(var i=0; ocgtoolsOCGs && i<ocgtoolsOCGs.length;i++)
         {
         if(ocgtoolsOCGs[i].name == "ocgtools#1")
         {#4 ocgtoolsOCGs[i].state = false; }
         }
         this.getField("OcgtoolsBtn.HideButton.mini.#1").hidden = true;
       }
       }}}]
    {OcgtoolsBtn.MiniButton.#1}{8pt}{8pt}}%
  \fi
  \pdfendlink%
}

%    \end{macrocode}
% Macros dealing with |\savepos| from Vit Zyka's paper in CSTUG
% Bulletin (ISSN 1211-6661, No. 2, 2007)
%    \begin{macrocode}
\newwrite\posHandle
\def\posFile{\jobname.pos}
\def\posOpen{\openout\posHandle=\posFile}
\def\posClose{\closeout\posHandle}
\AtBeginDocument{\InputIfFileExists{\posFile}{}{}%
\ocgtools@maxheight=0.9\paperheight
\ocgtools@maxwidth=0.9\paperwidth
\expandafter\global\expandafter\def\csname ocgtools@textcontent@0\endcsname
{{\color{red}\bfseries\ocgtools@msg}}%
\posOpen}
\AtEndDocument{\posClose}

%    \end{macrocode}
% The following commands create links to hide/unhide layers and
% minilayers and write information on the layer number, page and layer
% content into the |pos| file. The content of textlayer is stored in
% command |\ocgtools@textcontent@<n>| where |<n>| is the number of the
% layer. Similarly, the content of the minitextlayer is stored in
% |\ocgtools@minitextcontent@<n>|.
%    \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
}

%</package>
%    \end{macrocode}
%
% \Finale
\endinput