如何让这个 Enigma 示例处理用户输入?

如何让这个 Enigma 示例处理用户输入?

就像这个问题

假设您的 LaTeX 文档的某些部分包含一些文本,您只希望有密码的人可以看到。例如,原因可能是带有指导性答案的案例。您希望将案例公开,但答案仅供教师查看。

我希望 PDF 中有一个链接操作,单击该操作时,将在要求输入密码后解密内容,使用Adobe Acrobat Javascript API(受此问题和答案的启发:如何添加特定页面的打印链接动作?

您可以选择任何加密材料源作为测试 ASCII 内容,但下面的代码中有一个最小示例。在问题的答案中加密和解密 LaTeX 源文件中的部分文本,表明加密 ASCII 文件部分的问题实际上是主要任务中比较容易的一部分,可以通过 Emacs 等优秀的编辑器来完成。

下面的代码基于这个答案,该行\password"this.getField("myinput").value;尝试将用户输入转换为整数。这不起作用。我该如何让它工作?

\documentclass{article}
\usepackage{fontspec}

% https://tex.stackexchange.com/a/275434/13173
\newcount\password
\newcount\crycount
\newcount\crycounta
\newcount\crycountb

\def\private#1{%
    \ifx#1\end
        \expandafter\end
    \else
        \crycount`#1
        % ↓↓↓ some math involving \crycount and \password
        \advance\crycount-\password
        \crycounta\crycount\crycountb\crycount\divide\crycounta16\multiply\crycounta16\advance\crycountb-\crycounta\divide\crycounta16
    \xdef\crychara{\ifcase\crycounta0\or1\or2\or3\or4\or5\or6\or7\or8\or9\or a\or b\or c\or d\or e\else f\fi}
    \xdef\crycharb{\ifcase\crycountb0\or1\or2\or3\or4\or5\or6\or7\or8\or9\or a\or b\or c\or d\or e\else f\fi}
        % ↑↑↑ some math involving \crycount and \password
        \xdef\crystring{\crystring\string^\string^\crychara\crycharb}
        \expandafter\private
    \fi
}

% https://tex.stackexchange.com/a/387474/13173
\usepackage{xparse,calc}
\usepackage{eforms

\begin{document}

 \medskip
 \textField[
    \Ff\FfMultiline
    \Ff\FfDoNotSpellCheck
           ]
  {myinput}{\dimexpr\linewidth-10ex}{5\baselineskip}


If key is set to be 2600, you can see the hint below:
\password"2600
\def\crystring{}
\begin{private}
    ♕♳♥☠♭♡♴♨♥♭♡♴♩♣♡♬☠♩♮♤♵♣♴♩♯♮☠♯♮☠☤♜♬♡♭♢♤♡☤☮
\end{private}

\newwrite\cryfile
\immediate\openout\cryfile=\jobname.cry
\immediate\write\cryfile{\crystring}
\immediate\closeout\cryfile
\input{\jobname.cry}

If key is not 2600, you see random characters:
\password"0
\def\crystring{}
\begin{private}
    ♕♳♥☠♭♡♴♨♥♭♡♴♩♣♡♬☠♩♮♤♵♣♴♩♯♮☠♯♮☠☤♜♬♡♭♢♤♡☤☮
\end{private}

\newwrite\cryfile
\immediate\openout\cryfile=\jobname.cry
\immediate\write\cryfile{\crystring}
\immediate\closeout\cryfile
\input{\jobname.cry}

% TODO how to pass the value as integer there?
\AACalculate{event.value=getField("myinput").value;}
If user input is set to be 7777, you can see the hint below:
\password"this.getField("myinput").value;
\def\crystring{}
\begin{private}
    ♕♳♥☠♭♡♴♨♥♭♡♴♩♣♡♬☠♩♮♤♵♣♴♩♯♮☠♯♮☠☤♜♬♡♭♢♤♡☤☮
\end{private}

\newwrite\cryfile
\immediate\openout\cryfile=\jobname.cry
\immediate\write\cryfile{\crystring}
\immediate\closeout\cryfile
\input{\jobname.cry}

\end{document}

图 1 输出

在此处输入图片描述

TeXLive:2017
操作系统:Debian 9.1
PDF 查看器:Adobe Acrobat 9.x(acroread)按说明安装这里
Acrotex 安装:这里

相关内容