eforms 的 textField 覆盖了 fancytooltips 的弹出工具提示

eforms 的 textField 覆盖了 fancytooltips 的弹出工具提示

我正在尝试创建一个小型的可填写表格,但我遇到了一个小的 z 排序问题,我无法自行解决。

我创建了一个“工具提示”,并定义了“movetips”选项,因此工具提示将显示在鼠标实际位置附近。这按预期工作,但如果我在它后面添加一个“textField”,那么textField将始终位于弹出窗口上方,这显然不是我想要的。

在此处输入图片描述

代码的相关部分:

\usepackage[filename=tips,mouseover,movetips]{fancytooltips}
\usepackage{eforms}

\begin{document}
...
\tooltip{\textcolor{black}{\textbf{E-mail:}}}{fmail}
\textField[\BC{0 0 1}\BG{0.98 0.92 0.73}\textColor{1 0 0}]{myText}{1.5in}{12bp}

我认为没有简单的方法来实现我想要的功能(软件包没有提供,可能一些 JS hack 可以解决问题)。

答案1

\tooltip来自的替代命令->这里<-,并添加了一个选项来指定x 和 y 偏移提示盒:

\tooltip[<link colour>]{<link text>}[<tip box colour>]{<tip text>}[<x offset>,<y offset>]

此外,可以用鼠标移动提示框。


\documentclass{article}

\usepackage{eforms}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% tooltips with LaTeX
%
% optimized for Adobe Reader (visible on mouse-over)
%     usage: \tooltip[<link colour>]{<link text>}[<tip box colour>]{<tip text>}[<x offset>,<y offset>]
%   non-draggable version:
%     usage: \tooltip*[<link colour>]{<link text>}[<tip box colour>]{<tip text>}[<x offset>,<y offset>]
%
% for Evince (visible on click, not draggable)
%   usage: \tooltip**[<link colour>]{<link text>}[<tip box colour>]{<tip text>}[<x offset>,<y offset>]
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{xparse,pdfbase,ocgbase}
\usepackage{xcolor,calc}
\usepackage{tikzpagenodes}
\usetikzlibrary{calc}

\ExplSyntaxOn
\let\tpPdfLink\pbs_pdflink:nn
\let\tpPdfAnnot\pbs_pdfannot:nnnn\let\tpPdfLastAnn\pbs_pdflastann:
\let\tpAppendToFields\pbs_appendtofields:n
\def\tpPdfXform{\pbs_pdfxform:nnn{1}{1}}
\let\tpPdfLastXform\pbs_pdflastxform:
\let\cListSet\clist_set:Nn\let\cListItem\clist_item:Nn
\ExplSyntaxOff

\makeatletter
\NewDocumentCommand{\tooltip}{ssO{blue}mO{yellow!20}mO{0pt,0pt}}{{%
  \leavevmode%
  \IfBooleanT{#1}{%
    \ocgbase@new@ocg{tipOCG.\thetcnt}{%
      /Print<</PrintState/OFF>>/Export<</ExportState/OFF>>%
    }{false}%
    \xdef\tpTipOcg{\ocgbase@last@ocg}%
  }%
  \tpPdfLink{%
    \IfBooleanTF{#2}{%
      /Subtype/Link/Border [0 0 0]/A <</S/SetOCGState/State [/Toggle \tpTipOcg]>>
    }{%
      /Subtype/Screen%
      \IfBooleanTF{#1}{%
        /AA<<%
          /E<</S/SetOCGState/State [/ON \tpTipOcg]>>%
          /X<</S/SetOCGState/State [/OFF \tpTipOcg]>>%
        >>%
      }{
        /AA<<%
          /E<</S/JavaScript/JS(%
            var fd=this.getField('tip.\thetcnt');%
            \IfBooleanF{#1}{%
              if(typeof(click\thetcnt)=='undefined'){%
                var click\thetcnt=false;%
                var fdor\thetcnt=fd.rect;var dragging\thetcnt=false;%
              }%
            }%
            if(fd.display==display.hidden){%
              fd.delay=true;fd.display=display.visible;fd.delay=false;%
            }%
           this.dirty=false;%
          )>>%
          /X<</S/JavaScript/JS(%
            if(!click\thetcnt&&!dragging\thetcnt){fd.display=display.hidden;}%
            if(!dragging\thetcnt){click\thetcnt=false;}%
            this.dirty=false;%
          )>>%
          /U<</S/JavaScript/JS(click\thetcnt=true;this.dirty=false;)>>%
          /PC<</S/JavaScript/JS (%
            var fd=this.getField('tip.\thetcnt');%
            try{fd.rect=fdor\thetcnt;}catch(e){}%
            fd.display=display.hidden;this.dirty=false;%
          )>>%
          /PO<</S/JavaScript/JS(this.dirty=false;)>>%
        >>%
      }
    }%
  }{{\color{#3}#4}}%
  \cListSet\tpOffsets{#7}%
  \sbox\tiptext{\fcolorbox{black}{#5}{#6}}%
  \edef\twd{\the\wd\tiptext}%
  \edef\tht{\the\ht\tiptext}%
  \edef\tdp{\the\dp\tiptext}%
  \measureremainder{\whatsleft}\tipshift=0pt%
  \ifdim\whatsleft<\twd\setlength\tipshift{\whatsleft-\twd}%
  \else\addtolength\tipshift{\cListItem\tpOffsets{1}}\fi%
  \tpPdfXform{\tiptext}%
  \raisebox{\heightof{#4}+\tdp+\cListItem\tpOffsets{2}}[0pt][0pt]{\makebox[0pt][l]{\hspace{\tipshift}%
    \tpPdfAnnot{\twd}{\tht}{\tdp}{%
      /Subtype/Widget/FT/Btn/T (tip.\thetcnt)%
      /AP<</N \tpPdfLastXform>>%
      /MK<</TP 1/I \tpPdfLastXform/IF<</S/A/FB true/A [0.0 0.0]>>>>%
      \IfBooleanTF{#1}{%
        /Ff 65537/OC \tpTipOcg%
      }{%
        /Ff 65536/F 3%
        /AA <<%
          /U <<%
            /S/JavaScript/JS(%
              var fd=event.target;%
              var mX=this.mouseX;var mY=this.mouseY;%
              var drag=function(){%
                var nX=this.mouseX;var nY=this.mouseY;%
                var dX=nX-mX;var dY=nY-mY;%
                var fdr=fd.rect;%
                fdr[0]+=dX;fdr[1]+=dY;fdr[2]+=dX;fdr[3]+=dY;%
                fd.rect=fdr;mX=nX;mY=nY;%
              };%
              if(!dragging\thetcnt){%
                dragging\thetcnt=true;Int=app.setInterval("drag()",1);%
              }%
              else{app.clearInterval(Int);dragging\thetcnt=false;}%
              this.dirty=false;%
            )%
          >>%
        >>%
      }%
    }%
    \tpAppendToFields{\tpPdfLastAnn}%
  }}%
  \stepcounter{tcnt}%
}}
\makeatother
\newsavebox\tiptext\newcounter{tcnt}
\newlength{\whatsleft}\newlength{\tipshift}
\newcommand{\measureremainder}[1]{%
  \begin{tikzpicture}[overlay,remember picture]
    \path let \p0 = (0,0), \p1 = (current page.east) in
      [/utils/exec={\pgfmathsetlength#1{\x1-\x0}\global#1=#1}];
  \end{tikzpicture}%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parindent=0pt  %                                        tip offsets -------+---+
                %                                                           |   |                   
\begin{document}%                                                           Y   Y
\tooltip[black]{\textbf{E-mail: }}{e.\,g.: \texttt{[email protected]}}[-6ex,1ex]\textField[\BC{0 0 1}\BG{0.98 0.92 0.73}\textColor{1 0 0}]{myText}{1.5in}{12bp}
\end{document}

答案2

谢谢你的帮助。我设法找到了一种解决方法(开箱即用的解决方案),但仍然对仅使用乳胶的解决方案感兴趣(如果存在的话)。

pdf_reference_1.7 请参阅“8.4 注释”部分

注释的顺序似乎定义了 Widget 类型注释的 z 顺序。因此,最简单的解决方案就是重新排序“.pdf”文件中的注释条目。(使用简单的文本编辑器可以轻松查看/编辑未压缩的 .pdf)。可以编写简单的脚本来自动进行重新排序。

手册具体示例:

原文(内容):

...
/Annots [ 18 0 R 19 0 R 21 0 R 22 0 R 23 0 R 41 0 R 28 0 R 24 0 R 25 0 R ]
...
28 0 obj
<<
/Type /Annot
/Rect [-0.996 -0.996 596.272 842.886]
/Subtype /Widget /F 6 /T (ikona.1) /FT /Btn /Ff 65536 /H /N /BS << /W 1 /S /S >> /MK << /TP 1 /IF <</A[1.0 1.0]/SW /B>> >> 
>>
endobj
...
25 0 obj
<<
/Type /Annot
/Rect [73.517 769.7 183.51 783.693]
/Subtype/Widget /T (myText) /FT/Tx /F 4/BS <</W 1/S/S>> /MK <</BC [0 0 1]/BG [0.98 0.92 0.73]>> /DA (/Helv 9 Tf 1 0 0 rg) /AA <<>>
>>
endobj

“ikona.1” 是弹出式工具提示,我们可以通过其名称“myText”找到我们的文本字段。所以我们需要做的就是将对象 25(“myText”)移动到描述注释的行中的对象 28(“ikona.1”)之前。

调整:

/Annots [ 18 0 R 19 0 R 21 0 R 22 0 R 23 0 R 41 0 R 28 0 R 24 0 R 25 0 R ]

到:

/Annots [ 18 0 R 19 0 R 21 0 R 22 0 R 23 0 R 41 0 R 25 0 R 28 0 R 24 0 R ]

结果: 在此处输入图片描述

相关内容