The following code (for use with pdfLaTeX) defines the command \zoombox[box line width]{contents}. It creates a click-to-zoom box for fitting the second argument 'contents' into the AdobeReader window. A dotted line is drawn around the box if the optional 'box line width' is >0:
\documentclass{article}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newsavebox\zbox
\newcounter{zoom}
\newcommand{\zoombox}[2][0]{%
\leavevmode%
\sbox\zbox{#2}%
\pdfdest name {zb\thezoom.out} fit
\pdfdest name {zb\thezoom.in} fitr
width \the\wd\zbox\space
height \the\ht\zbox\space
depth \the\dp\zbox\space
\immediate\pdfannot
width \the\wd\zbox\space
height \the\ht\zbox\space
depth \the\dp\zbox\space
{%
/Subtype/Link/H/N
/Border [0 0 #1 [1 2]]
/A <<
/S/JavaScript
/JS (
if(typeof(zoomed\thezoom)=='undefined'){
this.gotoNamedDest('zb\thezoom.out');
var zoomed\thezoom=false;
}
)
/Next <<
/S/GoTo/D (zb\thezoom.in)
/Next <<
/S/JavaScript
/JS(
if(zoomed\thezoom){
this.gotoNamedDest('zb\thezoom.out');
zoomed\thezoom=false;
}else{
zoomed\thezoom=true;
}
)
>>
>>
>>
}%
\usebox{\zbox}%
\stepcounter{zoom}%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\section{Zoom test}
\zoombox[1]{Hello} \zoombox{World}!
\end{document}
Pairs of commands for marking opposing corners (lower left & upper right .OR. upper left & lower right) of a zoom box and for marking text sequences/entire paragraphs are defined in the following example.
\documentclass{article}
\usepackage{hyperref}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\InputIfFileExists{\jobname.zom}{}{}
\newwrite\zoomdat
\immediate\openout\zoomdat=\jobname.zom
\newcommand{\startzoombox}[2][0]{%
\leavevmode%
\pdfsavepos%
\protected@write\zoomdat{}{%
\string\expandafter\string\def\string\csname\space zb#2.ulx\string\endcsname{%
\noexpand\number\pdflastxpos}%
\string\expandafter\string\def\string\csname\space zb#2.uly\string\endcsname{%
\noexpand\number\pdflastypos}%
}%
\pdfdest name {zb#2.out} fit
\ifcsname zb#2.ulx\endcsname\ifcsname zb#2.lrx\endcsname%
\edef\zoomwd{\dimexpr \csname zb#2.lrx\endcsname sp- \csname zb#2.ulx\endcsname sp\relax}%
\edef\zoomdp{\dimexpr \csname zb#2.uly\endcsname sp- \csname zb#2.lry\endcsname sp\relax}%
\pdfdest name {zb#2.in} fitr
width \zoomwd
height 0pt
depth \zoomdp
\immediate\pdfannot
width \zoomwd
height 0pt
depth \zoomdp
{%
/Subtype/Link/H/N
/Border [0 0 1 [1 2]]
/C [\@linkbordercolor]
/A <<
/S/JavaScript
/JS (
if(typeof(zoomed#2)=='undefined'){
this.gotoNamedDest('zb#2.out');
var zoomed#2=false;
}
)
/Next <<
/S/GoTo/D (zb#2.in)
/Next <<
/S/JavaScript
/JS(
if(zoomed#2){
this.gotoNamedDest('zb#2.out');
zoomed#2=false;
}else{
zoomed#2=true;
}
)
>>
>>
>>
}%
\fi\fi%
}
\def\stopzoombox#1{%\leavevmode%
\leavevmode%
\pdfsavepos%
\protected@write\zoomdat{}{%
\string\expandafter\string\def\string\csname\space zb#1.lrx\string\endcsname{%
\noexpand\number\pdflastxpos}%
\string\expandafter\string\def\string\csname\space zb#1.lry\string\endcsname{%
\noexpand\number\pdflastypos}%
}%
}
\def\startzoom{%
\@ifstar\@startzoomstar\@startzoom%
}
\newcommand{\@startzoom}[2][0]{%
\raisebox{\baselineskip}[0pt][0pt]{\startzoombox[#1]{#2}}%
}
\newcommand{\@startzoomstar}[2][0]{%
\makebox[0pt][r]{\raisebox{\baselineskip}[0pt][0pt]{\startzoombox[#1]{#2}}%
\hspace{\parindent}}%
}
\def\stopzoom{%
\@ifstar\@stopzoomstar\@stopzoom%
}
\def\@stopzoom#1{%
\raisebox{-1ex}[0pt][0pt]{\stopzoombox{#1}}%
}
\def\@stopzoomstar#1{%
\hfill\raisebox{-1ex}[0pt][0pt]{\stopzoombox{#1}}%
}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\section{Paragraph zooming}
\startzoom[1]{p1}First paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first \startzoom[1]{detail}Interesting detail\stopzoom{detail} first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph first paragraph.\stopzoom*{p1}
\startzoom*[1]{p2}Second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph second paragraph.\stopzoom*{p2}
\end{document}
The two commands for marking the corners of a zoom area are
\startzoombox[line width]{label}
and
\stopzoombox{label}
For marking text and paragraphs the following commands have been provided:
\startzoom[lwidth]{label}
\startzoom*[lwidth]{label}
\stopzoom{label}
\stopzoom*{label}.
The starred versions insert horizontal space (negative \parindent on first line, \hfill at the end of the paragraph).
Note that associated command pairs must be identified by unique labels and that at least two runs of pdfLaTeX are required. Zoom areas may be nested. However, smaller ones should be placed on top of bigger ones (i.e. to appear later in the code), in order not to be obscured.
EDIT:
A dvipdfmx/XeLaTeX version of the \zoombox macro is given in: How do I include a click-to-zoom thumbnail picture in a non-beamer document?