通过 JavaScript 隐藏 LaTeX 部分

通过 JavaScript 隐藏 LaTeX 部分

我正在用该hyperref包创建一个交互式 pdf 表单。该表单非常全面,因此当前的目标是仅显示与特定用户相关的部分。例如,用户表明他是男性 --> 仅显示与男性有关的项目。

通常,仅显示文档的某些部分并不困难,例如使用包 ifthen

\documentclass{article}
\usepackage{ifthen}

\begin{document}
    \newboolean{boolvar}
    \setboolean{boolvar}{false}
    \ifthenelse{\boolean{boolvar}}{show if true}{show if false}
\end{document}

但是,当涉及到将这样的变量与表单字段中的用户输入相结合时,我却不知所措。使用 JavaScript 和包insdljs,我已成功隐藏表单字段,但无法隐藏这些表单字段之外的文本:(注意:insdljs不是 TeX Live 的一部分,但可用这里

\documentclass{article}
\usepackage[pdftex]{hyperref}
\usepackage[pdftex]{insdljs}

\begin{insDLJS}{mydljs}{some comment}
    function hide(){
         if(this.getField("somefield").display == display.visible){
             this.getField("somefield").display = display.hidden;
         } else{
             this.getField("somefield").display = display.visible;
         }
    }
\end{insDLJS}

\begin{document}
    \begin{Form}
        \PushButton[onclick={hide();}]{Hide/Show}\\
        \TextField[name=somefield, width=4em]{Any way to hide e.g. this text?}
    \end{Form}
\end{document}

隐藏这样的表单字段非常方便,但我想将其应用于整个表格或部分。有什么想法吗?谢谢!

答案1

我其实不知道,但我做了一些小研究,认为你无法隐藏它,你根本无法对它做任何事情(当然,没有一点技巧)

首先,我创建了一个简单的示例,并在 Adob​​e Acrobat 中打开它。我看到,一个字段和一个标签是独立的。并且没有任何可以更改标签的 TextField 属性。Textfield 是字段,标签是文本。

如果你真的想隐藏标签,你可以这样做:

  1. 你隐藏了字段“test”,而“tf1”可见

  2. 字段“test”可见,“tf1”隐藏

它有效,但我不确定您是否需要它。

为了验证我们无法更改文本,我尝试了按钮。使用Acrobat 的 javascript API 参考我找到了buttonGetCaption一些buttonSetCaption方法来改变标签(看起来像标题),但它并不像我预期的那样有效:

\PushButton[name=testButton1,onclick={
console.show();
console.println('-------------');
console.println('value is: '    +event.target.value);
console.println('caption is: '  +event.target.buttonGetCaption());
console.println('-------------');
event.target.buttonGetCaption()==''?event.target.buttonSetCaption('boom'):event.target.buttonSetCaption('');
}]{\ test\ }
\PushButton[name=testButton2,onclick={
event.target.buttonGetCaption()==''?event.target.buttonSetCaption('boom'):event.target.buttonSetCaption('');
}]{\ \ \ \ \ \ \ }\\[0.2cm] %I didn't find as to change width. Parameter 'width' work only for fields.

点击前: 点击 前 后: 后

所以,我认为隐藏文本是个坏主意,但是您可以轻松隐藏文本字段,让我们这样做吧!

\usepackage{hyperref}
\usepackage{calc}
\usepackage[pdftex]{insdljs}

\newlength{\mylen}
\settowidth{\mylen}{Enter name: }


\begin{insDLJS}{mydljs}{ }
    this.getField('testLabel').borderColor=color.transparent;
function hide(){
     if(this.getField("test").display == display.visible){
          this.getField("test").display = display.hidden;
          this.getField("testLabel").display = display.hidden;
     } else{
         this.getField("test").display = display.visible;
         this.getField("testLabel").display = display.visible;
     }
}
\end{insDLJS}
\begin{document}
\begin{Form}
\TextField[name=testLabel,value=Enter name:,width=\mylen,readonly]{} % I don't know why but width=\whidthof and width=\the\whidthof don't work :(
\TextField[name=test]{} \\
\PushButton[onclick={hide();},
]{hide}\\[0.2cm]
\end{Form}
\end{document}

前:

后:

解决该问题的另一种方法是用默认值替换标签,例如:

\TextField[name=test2,default=Enter something,
onfocus={
if(event.target.value==event.target.defaultValue)event.target.value='';
},
onblur={
if(event.target.value=='')event.target.value=event.target.defaultValue;
}
]{}

点击之前:

后:

您可以像以前一样将其隐藏。

相关内容