diff options
author | Karl Berry <karl@freefriends.org> | 2008-09-20 23:48:30 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2008-09-20 23:48:30 +0000 |
commit | 5dc173537c1bc9fd033d1c6b3498e847d3a6d38a (patch) | |
tree | 896be0734f25575e9ac83417976c9d268a64b981 /Master/texmf-dist/tex | |
parent | 4b95f16c338118ec28786de9563f1361d9b42989 (diff) |
pax aka pdfannotextractor
git-svn-id: svn://tug.org/texlive/trunk@10666 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/pax/pax.sty | 607 |
1 files changed, 607 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/pax/pax.sty b/Master/texmf-dist/tex/latex/pax/pax.sty new file mode 100644 index 00000000000..7623c87c769 --- /dev/null +++ b/Master/texmf-dist/tex/latex/pax/pax.sty @@ -0,0 +1,607 @@ +%% pax.sty +%% Copyright 2006, 2007 Heiko Oberdiek +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% 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.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Heiko Oberdiek. +% +% This work consists of the file pax.sty. +% See README for more details and documentation. +% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{pax}% + [2007/07/19 v0.1h Annotation support for PDF graphics (HO)]% + +\RequirePackage{ifpdf} +\ifpdf +\else + \PackageError{pax}{Missing pdfTeX in PDF mode}{% + Other drivers are not supported.% + }% + \expandafter\endinput +\fi + +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname pdfstrcmp\endcsname\relax + \PackageError{pax}{pdfTeX is too old}{% + The package uses features of pdfTeX 1.30.% + }% + \expandafter\endinput +\fi + +\RequirePackage{graphicx} +\RequirePackage{kvoptions}[2006/08/17] +\RequirePackage{auxhook} +\RequirePackage{etexcmds} + +% the local variant to LaTeX's \g@addto@macro, +% see also discussion in de.comp.text.tex. +\ifetex@unexpanded + \newcommand{\PAX@l@addto@macro}[2]{% + \edef#1{% + \etex@unexpanded\expandafter{#1#2}% + }% + }% +\else + \newcommand{\PAX@l@addto@macro}[2]{% + \global\let\PAX@g@temp#1% + \g@addto@macro\PAX@g@temp{#2}% + \let#1\PAX@g@temp + }% +\fi + +% Hook into \includegraphics of graphicx with one optional +% star, one optional argument with key value pairs and +% the graphics name +\let\PAX@ORG@includegraphics\includegraphics +\def\includegraphics{% + \@ifstar{% + \@ifnextchar[{% + \begingroup + \def\x{\endgroup + \PAX@includegraphics[clip,% + }% + \expandafter\x\@gobble + }{% + \PAX@includegraphics[clip]% + }% + }{% + \@ifnextchar[{% + \PAX@includegraphics + }{% + \PAX@includegraphics[]% + }% + }% +} +\def\PAX@includegraphics[#1]#2{% + \begingroup + \sbox0{\PAX@ORG@includegraphics[{#1}]{#2}}% + \edef\PAX@inc@width{\the\wd0}% + \edef\PAX@inc@height{\the\dimexpr\dp0+\ht0}% + \leavevmode + \hbox to \wd0{% + \rlap{\copy0}% + \raise-\dp0\hbox{% + \PAX@AddAnnots{#1}{#2}% + }% + \hfill + }% + \endgroup +} + +\SetupKeyvalOptions{family=PAX@Gin,prefix=PAX@Gin@} +\DeclareStringOption[1]{page} +\DeclareStringOption[0]{angle} +\DeclareBoolOption{clip} +\define@key{PAX@Gin}{viewport}{% + \PAX@l@addto@macro\PAX@Gin@box@opts{% + \PAX@viewport#1\\% + }% +} +\define@key{PAX@Gin}{trim}{% + \PAX@l@addto@macro\PAX@Gin@box@opts{% + \PAX@trim#1\\% + }% +} +\let\PAX@Gin@box@opts\@empty + +\def\PAX@viewport#1 #2 #3 #4\\{% + \PAX@defaultbp\PAX@vllx{#1}% + \PAX@defaultbp\PAX@vlly{#2}% + \PAX@defaultbp\PAX@vurx{#3}% + \PAX@defaultbp\PAX@vury{#4}% + \edef\PAX@page@llx{\dimexpr\PAX@page@llx+\PAX@vllx\relax}% + \edef\PAX@page@lly{\dimexpr\PAX@page@lly+\PAX@vlly\relax}% + \edef\PAX@page@urx{\dimexpr\PAX@page@llx+\PAX@vlly\relax}% + \edef\PAX@page@ury{\dimexpr\PAX@page@lly+\PAX@vury\relax}% +} +\def\PAX@trim#1 #2 #3 #4\\{% + \PAX@defaultbp\PAX@tllx{#1}% + \PAX@defaultbp\PAX@tlly{#2}% + \PAX@defaultbp\PAX@turx{#3}% + \PAX@defaultbp\PAX@tury{#4}% + \edef\PAX@page@llx{\dimexpr\PAX@page@llx+\PAX@tllx\relax}% + \edef\PAX@page@lly{\dimexpr\PAX@page@lly+\PAX@tlly\relax}% + \edef\PAX@page@urx{\dimexpr\PAX@page@urx-\PAX@turx\relax}% + \edef\PAX@page@ury{\dimexpr\PAX@page@ury-\PAX@tury\relax}% +} + +\def\PAX@defaultbp#1#2{% + \afterassignment\PAX@def@bp\dimen@#2bp\relax{#1}{#2}% +} +\def\PAX@def@bp#1\relax#2#3{% + \if!#1!% + \edef#2{#3bp}% + \else + \edef#2{#3}% + \fi +} + +\def\PAX@KV@errx#1{} + +\def\PAX@AddAnnots#1#2{% + \let\KV@errx\PAX@KV@errx + \setkeys{PAX@Gin}{#1}% + \Grot@setangle{\PAX@Gin@angle}% + % a little careful, is type of angle int or real? + \loop + \ifdim\PAX@Gin@angle\p@<360\p@ + \else + \edef\PAX@Gin@angle{\the\numexpr-360+\number\PAX@Gin@angle}% + \repeat + \loop + \ifdim\PAX@Gin@angle\p@<\z@ + \edef\PAX@Gin@angle{\strip@pt\dimexpr\PAX@Gin@angle\p@+360\p@}% + \repeat + \ifcase0\ifnum\PAX@Gin@angle=0 1\fi + \ifnum\PAX@Gin@angle=90 1\fi + \ifnum\PAX@Gin@angle=180 1\fi + \ifnum\PAX@Gin@angle=270 1\fi + \PackageWarning{pax}{Unsupported value for option angle}% + \fi + \filename@parse{#2}% + \def\PAX@file{\filename@area\filename@base.pax}% + \let\[\PAX@parser + \def\<{<}% + \def\>{>}% + \endlinechar=-1 % + \InputIfFileExists\PAX@file{% + }{% + \typeout{* Missing: \PAX@file}% + }% +} +\def\PAX@parser#1{\PAX@call{cmd}{#1}{}}% +\def\PAX@call#1#2#3{% + \@ifundefined{PAX@#1@#2}\PAX@skip{#3\csname PAX@#1@#2\endcsname}% +} +\def\PAX@skip#1\\{} +\def\PAX@stop#1\\{} + +\def\PAX@cmd@page#1#2{% + \PAX@filter@page{#1}{% + \PAX@getrect{page}#2\@nil + \PAX@Gin@box@opts + \ifcase0\ifnum\PAX@Gin@angle=90 1\fi + \ifnum\PAX@Gin@angle=270 1\fi + \else + \let\PAX@temp\PAX@inc@width + \let\PAX@inc@width\PAX@inc@height + \let\PAX@inc@height\PAX@temp + \fi + \Gscale@div\PAX@scale@x\PAX@inc@width{% + \dimexpr\PAX@page@urx-\PAX@page@llx\relax + }% + \Gscale@div\PAX@scale@y\PAX@inc@height{% + \dimexpr\PAX@page@ury-\PAX@page@lly\relax + }% + \PAX@skip + }% +} +\def\PAX@filter@page#1{% + \ifnum\PAX@Gin@page=#1 % + \expandafter\@firstofone + \else + \ifnum\PAX@Gin@page<#1 % + \csname fi\endcsname + \csname fi\endcsname + \expandafter\PAX@stop\@gobblefour + \fi + \expandafter\PAX@skip + \fi +} +\def\PAX@getrect#1#2 #3 #4 #5\@nil{% + \@namedef{PAX@#1@llx}{#2bp}% + \@namedef{PAX@#1@lly}{#3bp}% + \@namedef{PAX@#1@urx}{#4bp}% + \@namedef{PAX@#1@ury}{#5bp}% +} + +\def\PAX@cmd@annot#1#2{% + \PAX@filter@page{#1}{% + \PAX@call{annot}{#2}{}% + }% +} +\def\PAX@annot@Link#1#2#3{% + \def\PAX@link@type{#2}% + \PAX@call{link}{#2}{% + \begingroup + \PAX@getrect{annot}#1\@nil + \setkeys{PAX}{#3}% + }% + \PAX@skip +} +\newif\ifPAX@ok +\PAX@oktrue + +\newif\ifPAX@GoTo + +\def\PAX@pdf@annot#1{% + \ifPAX@Gin@clip + \ifdim\PAX@annot@llx<\PAX@page@llx + \let\PAX@annot@llx\PAX@pagellx + \fi + \ifdim\PAX@annot@lly<\PAX@page@lly + \let\PAX@annot@lly\PAX@page@lly + \fi + \ifdim\PAX@annot@urx>\PAX@page@urx + \let\PAX@annot@urx\PAX@page@urx + \fi + \ifdim\PAX@annot@ury>\PAX@page@ury + \let\PAX@annot@ury\PAX@page@ury + \fi + \PAX@okfalse + \ifdim\PAX@annot@llx<\PAX@annot@urx + \ifdim\PAX@annot@lly<\PAX@annot@ury + \PAX@oktrue + \fi + \fi + \else + \PAX@oktrue + \fi + \ifPAX@ok + \ifcase 0\ifnum\PAX@Gin@angle=90 1\fi + \ifnum\PAX@Gin@angle=180 2\fi + \ifnum\PAX@Gin@angle=270 3\fi\space + % angle = 0 + \def\PAX@raise{% + \PAX@scale@y\dimexpr\PAX@annot@lly-\PAX@page@lly\relax + }% + \def\PAX@right{% + \PAX@scale@x\dimexpr\PAX@annot@llx-\PAX@page@llx\relax + }% + \or % angle = 90 + \def\PAX@raise{% + \PAX@scale@x\dimexpr\PAX@annot@llx-\PAX@page@llx\relax + }% + \def\PAX@right{% + \PAX@scale@y\dimexpr\PAX@page@ury-\PAX@annot@ury\relax + }% + \or % angle = 180 + \def\PAX@raise{% + \PAX@scale@y\dimexpr\PAX@page@ury-\PAX@annot@ury\relax + }% + \def\PAX@right{% + \PAX@scale@x\dimexpr\PAX@page@urx-\PAX@annot@urx\relax + }% + \or % angle = 270 + \def\PAX@raise{% + \PAX@scale@x\dimexpr\PAX@page@urx-\PAX@annot@urx\relax + }% + \def\PAX@right{% + \PAX@scale@y\dimexpr\PAX@annot@lly-\PAX@page@lly\relax + }% + \fi + \@namedef{% + PAX@% + \ifcase0\ifnum\PAX@Gin@angle=90 1\fi + \ifnum\PAX@Gin@angle=270 1\fi\space + width% + \else + height% + \fi + }{% + \PAX@scale@x\dimexpr\PAX@annot@urx-\PAX@annot@llx\relax + }% + \@namedef{% + PAX@% + \ifcase0\ifnum\PAX@Gin@angle=90 1\fi + \ifnum\PAX@Gin@angle=270 1\fi\space + height% + \else + width% + \fi + }{% + \PAX@scale@y\dimexpr\PAX@annot@ury-\PAX@annot@lly\relax + }% + \raise\PAX@raise\hb@xt@\z@{% + \kern\PAX@right + \ifPAX@GoTo + \pdfstartlink\@width\PAX@width\@height\PAX@height\@depth\z@ + attr{\PAX@set@attrs}% + goto name{PAX@\PAX@file @\PAX@key@DestLabel}\relax + \pdfendlink + \else + \pdfannot\@width\PAX@width\@height\PAX@height{% + /Subtype/Link% + \PAX@set@attrs + /A<<% + /Type/Action% + /S/\PAX@link@type + #1% + >>% + }% + \fi + \hss + }% + \fi + \endgroup +} + +\def\PAX@set@attrs{% + \PAX@attrs\PAX@link@type{% + \PAX@set@attr{C}\PAX@key@C + \PAX@set@attr{Border}\PAX@key@Border + \PAX@set@attr{BS}\PAX@key@BS + \PAX@set@attr{H}\PAX@key@H + }% +} + +\def\PAX@set@attr#1#2{% + \ifx#2\@empty + \else + /#1 #2% + \fi +} + +\def\PAX@attrs#1{% + \@ifundefined{PAX@attrs@#1}{% + \@ifundefined{hyperref}{% + \@firstofone + }{% + \Hy@setpdfborder + /H\@pdfhighlight + \@ifundefined{PAX@htype@#1}\@firstofone{% + \@ifundefined{@\@nameuse{PAX@htype@#1}bordercolor}\@firstofone{% + /C[\@nameuse{@\@nameuse{PAX@htype@#1}bordercolor}]% + \@gobble + }% + }{% + \PAX@set@attr{C}\PAX@key@C + }% + \@gobble + }% + }{% + \@nameuse{PAX@attrs@#1}% + }% +} +\def\PAX@htype@GoToR{file} +\def\PAX@htype@GoTo{link} +\def\PAX@htype@Named{link} +\def\PAX@htype@URI{url} + +\def\PAX@link@URI{% + \PAX@pdf@annot{% + /URI\PAX@key@URI + }% +} +\def\PAX@link@Named{% + \PAX@pdf@annot{% + /N/\pdfescapename{\PAX@key@Name}% + }% +} +\def\PAX@link@GoToR{% + \PAX@pdf@annot{% + /F\PAX@key@File + /D% + \ifx\PAX@key@DestName\@empty + [\PAX@key@DestPage\space\PAX@key@DestView]% + \else + \PAX@key@DestName + \fi + }% +} + +% GoTo + +\AddLineBeginAux{% + \string\providecommand{\string\PAX@DestReq}[2]{}% +} +\AddLineBeginAux{% + \string\providecommand{\string\PAX@DestProv}[2]{}% +} +\AtBeginDocument{% + \let\PAX@DestReq\@gobbletwo + \let\PAX@DestProv\@gobbletwo +} +\def\PAX@DestReq#1#2{% + \expandafter\gdef\csname PAX@REQ@#1@#2\endcsname{}% +} +\def\PAX@DestProv#1#2{% + \expandafter\gdef\csname PAX@PROV@#1@#2\endcsname{}% +} + +\def\PAX@link@GoTo{% + \ifnum0<0\PAX@key@DestLabel\relax + \expandafter\@firstofone + \else + \endgroup + \expandafter\@gobble + \fi + {% + \if@filesw + \protected@write\@auxout{}{% + \string\PAX@DestReq{\PAX@file}{\PAX@key@DestLabel}% + }% + \fi + % Generate link, if destination exists + \@ifundefined{PAX@PROV@\PAX@file @\PAX@key@DestLabel}{% + \endgroup + }{% + \PAX@GoTotrue + \PAX@pdf@annot{}% + }% + }% +} + +% Read destinations +\def\PAX@cmd@dest#1#2#3#4{% + \PAX@filter@page{#1}{% + \if@filesw + \protected@write\@auxout{}{% + \string\PAX@DestProv{\PAX@file}{#2}% + }% + \fi + \@ifundefined{PAX@REQ@\PAX@file @#2}{% + }{% + \begingroup + \let\PAX@key@DestY\PAX@page@ury + \let\PAX@key@DestX\PAX@page@llx + \setkeys{PAX}{#4}% + \let\PAX@dest@llx\PAX@key@DestX + \let\PAX@dest@urx\PAX@key@DestX + \let\PAX@dest@lly\PAX@key@DestY + \let\PAX@dest@ury\PAX@key@DestY + \ifx\PAX@key@DestRect\@empty + \else + \def\PAX@temp{dest}% + \expandafter\PAX@getrect\expandafter\PAX@temp + \PAX@key@DestRect\@nil + \fi + \ifPAX@Gin@clip + \ifx\PAX@dest@llx<\PAX@page@llx + \let\PAX@dest@llx\PAX@page@llx + \fi + \ifx\PAX@dest@lly<\PAX@page@lly + \let\PAX@dest@lly\PAX@page@lly + \fi + \ifx\PAX@dest@urx>\PAX@page@urx + \let\PAX@dest@urx\PAX@page@urx + \fi + \ifx\PAX@dest@ury>\PAX@page@ury + \let\PAX@dest@ury\PAX@page@ury + \fi + % at least prevent destinations outside the window + \ifx\PAX@dest@llx>\PAX@page@urx + \PAX@dest@llx\PAX@page@urx + \fi + \ifx\PAX@dest@lly>\PAX@page@ury + \PAX@dest@lly\PAX@page@ury + \fi + \ifx\PAX@dest@urx<\PAX@page@llx + \PAX@dest@urx\PAX@page@llx + \fi + \ifx\PAX@dest@ury<\PAX@page@lly + \PAX@dest@ury\PAX@page@lly + \fi + \fi + % I don't know, what is the best idea for rotated stuff, + % perhaps using the corner llx/ury + \ifcase 0\ifnum\PAX@Gin@angle=90 1\fi + \ifnum\PAX@Gin@angle=180 2\fi + \ifnum\PAX@Gin@angle=270 3\fi\space + % angle = 0 + \def\PAX@raise{% + \PAX@scale@y\dimexpr\PAX@dest@lly-\PAX@page@lly\relax + }% + \def\PAX@right{% + \PAX@scale@x\dimexpr\PAX@dest@llx-\PAX@page@llx\relax + }% + \or % angle = 90 + \def\PAX@raise{% + \PAX@scale@x\dimexpr\PAX@dest@llx-\PAX@page@llx\relax + }% + \def\PAX@right{% + \PAX@scale@y\dimexpr\PAX@page@ury-\PAX@dest@ury\relax + }% + \or % angle = 180 + \def\PAX@raise{% + \PAX@scale@y\dimexpr\PAX@page@ury-\PAX@dest@ury\relax + }% + \def\PAX@right{% + \PAX@scale@x\dimexpr\PAX@page@urx-\PAX@dest@urx\relax + }% + \or % angle = 270 + \def\PAX@raise{% + \PAX@scale@x\dimexpr\PAX@page@urx-\PAX@dest@urx\relax + }% + \def\PAX@right{% + \PAX@scale@y\dimexpr\PAX@dest@lly-\PAX@page@lly\relax + }% + \fi + \edef\PAX@name{name{PAX@\PAX@file @#2}}% + \let\PAX@type\@empty + \ifcase\pdfstrcmp{#3}{FITR}\relax + \def\PAX@type{xyz}% too lazy for now + \fi + \ifcase\pdfstrcmp{#3}{XYZ}\relax + \def\PAX@type{xyz}% + \ifx\PAX@key@DestZoom\@empty + \else + \edef\PAX@type{% + \PAX@type + zoom\numexpr1000*\number\dimexpr\PAX@key@DestZoom pt\relax + /\number\p@\relax + }% + \fi + \fi + \ifcase\pdfstrcmp{#3}{FIT}\relax + \def\PAX@type{fit}% + \fi + \ifcase\pdfstrcmp{#3}{FITB}\relax + \def\PAX@type{fitb}% + \fi + \ifcase\pdfstrcmp{#3}{FITH}\relax + \def\PAX@type{fith}% + \fi + \ifcase\pdfstrcmp{#3}{FITBH}\relax + \def\PAX@type{fitbh}% + \fi + \ifcase\pdfstrcmp{#3}{FITV}\relax + \def\PAX@type{fitv}% + \fi + \ifcase\pdfstrcmp{#3}{FITBV}\relax + \def\PAX@type{fitbv}% + \fi + \ifx\PAX@type\@empty + \def\PAX@type{xyz}% + \fi + \raise\PAX@raise\hb@xt@\z@{% + \kern\PAX@right + \pdfdest\PAX@name\PAX@type\relax + \hss + }% + \endgroup + }% + \PAX@skip + }% +} + +\SetupKeyvalOptions{family=PAX,prefix=PAX@key@} +\DeclareStringOption{URI} +\DeclareStringOption{Name} +\DeclareStringOption{DestName} +\DeclareStringOption{DestPage} +\DeclareStringOption{DestView} +\DeclareStringOption{File} +\DeclareStringOption{C} +\DeclareStringOption{Border} +\DeclareStringOption{BS} +\DeclareStringOption{H} +\DeclareStringOption{DestLabel} +\DeclareStringOption{DestRect} +\DeclareStringOption{DestZoom} +\define@key{PAX}{DestX}{% + \PAX@defaultbp\PAX@key@DestX{#1}% +} +\define@key{PAX}{DestY}{% + \PAX@defaultbp\PAX@key@DestY{#1}% +} +\endinput |