% \iffalse
%<*copyright>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% forms16be.sty package,                               %%
%% Copyright (C) 2017  D. P. Story                      %%
%%   dpstory@acrotex.net                                %%
%%   storyd@nwfsc.edu                                   %%
%%                                                      %%
%% This program can redistributed and/or modified under %%
%% the terms of the LaTeX Project Public License        %%
%% Distributed from CTAN archives in directory          %%
%% macros/latex/base/lppl.txt; either version 1.2 of the%%
%% License, or (at your option) any later version.      %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%</copyright>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{forms16be}
%<package> [2017/08/28 v1.2 Provides UTF-16BE encoding for text strings (dps)]
%<*driver>
\documentclass{ltxdoc}
\usepackage[colorlinks,hyperindex=false]{hyperref}
\OnlyDescription  % comment out for implementation details
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\InputIfFileExists{aebdocfmt.def}{\PackageInfo{forms16be}{Inputting aebdocfmt.def}}
    {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax
     \PackageInfo{forms16be}{aebdocfmt.def cannot be found}}
\begin{document}
\def\CMD#1{\textbackslash#1}
\let\pkg\textsf
\let\opt\texttt
\let\env\texttt
\let\app\textsf
\def\darg#1{\texttt{\char123\relax#1\char125\relax}}
\def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}}
\def\meta#1{\textsl{\texttt{#1}}}
\GetFileInfo{forms16be.sty}
\title{The \textsf{forms16be} Package}
\author{D. P. Story\\
  Email: \texttt{dpstory@acrotex.net}}
\date{processed \today}
\maketitle
\tableofcontents
\let\Email\texttt
\DocInput{forms16be.dtx}
\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\par\PrintIndex}{\paragraph*{Index} The index goes here.\\Execute
    \texttt{makeindex -s gind.ist -o forms16be.ind forms16be.idx} on the command line and recompile
    \texttt{forms16be.dtx}.}
\IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list of changes goes here.\\Execute
    \texttt{makeindex -s gglo.ist -o forms16be.gls forms16be.glo} on the command line and recompile
    \texttt{forms16be.dtx}.}
\end{document}
%</driver>
% \fi
% \MakeShortVerb{|}
% \InputIfFileExists{aebdonotindex.def}{\PackageInfo{forms16be}{Inputting aebdonotindex.def}}
%    {\PackageInfo{forms16be}{cannot find aebdonotindex.def}}
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%    \section{Introduction}
%
%    The code in this package was extracted from \pkg{aeb\_pro}. The code itself did not depend on
%    PostScript, it is useful, therefore, to remove it from \pkg{aeb\_pro} code base and make it available
%    to {\LaTeX} users with different workflows (\app{pdflatex}, \app{lualatex}, and \app{xelatex}).
%
%    This package provides support for UTF-16BE Unicode character encoding for the \emph{text string type}
%    (PDF Reference, version 1.7, beginning on page 158). Text strings are used in ``text annotations, bookmark names,
%    article threads, document information, and so forth'' (to partially quote page~158). The particular application
%    is in setting the property values of form fields, at least those properties that take the text strings as its value.
%    The package contains support for Basic Latin plus the ability to enter any unicode character using the
%    notation \cs{uXXXX}.
%
%    The code was originally designed to be used with the \pkg{eforms} package, but can be used with
%    the form fields generated by \pkg{hyperref}, but requires some custom modification of the form field
%    commands of \pkg{hyperref}.
%    \section{Code for the \textsf{forms16be} package}
%    We begin the definitions for this package with some utility commands, followed by some of
%    the main support command, then followed by the two major commands of this package \cs{unicodeStr}
%    and \cs{defUniStr}. The unicode lookup tables are listed last.
%    \subsection{Utility commands}
%    \begin{macrocode}
\def\U@csarg#1#2{\expandafter#1\csname#2\endcsname}
\providecommand\aeb@exiii{\expandafter\expandafter\expandafter}
%    \end{macrocode}
%    Sanitize selected characters
%    \changes{v1.2}{2017/08/28}{Sanitize selected characters}
%    \begin{macrocode}
\def\fbe@sanitize{\@makeother\"\@makeother\#\@makeother\$%
  \@makeother\%\@makeother~%
  \@for\x:=ABCDEFabcdef()\do{\@makeother\x}}
%    \end{macrocode}
%    \subsection{Main supporting commands}
%    \begin{macro}{\convertChriiUnicode}\hskip-\marginparsep\darg{\ameta{char}}\darg{\ameta{unicode}}
% A simple command for mapping a character to its unicode. This command is used in the character-unicode tables
% below.
%    \begin{macrocode}
\providecommand\convertChriiUnicode[2]{\U@csarg\gdef{uni@#1}{#2}}%
%    \end{macrocode}
%    \end{macro}
%\leavevmode\DescribeMacro{\aref}\hskip-\marginparsep\darg{\ameta{name}} Display the defined character string in UTF-16BE.
%    \begin{macrocode}
\def\aref(#1){\csname aeb@aDescript@#1\endcsname}
%    \end{macrocode}
%\leavevmode\DescribeMacro{\displayUnicode}\hskip-\marginparsep\darg{\ameta{char}}
% Display the Unicode encoding of a character.
%    \begin{macrocode}
\providecommand{\displayUnicode}[1]{\csname uni@#1\endcsname}
%    \end{macrocode}
%\leavevmode\DescribeMacro{\stringiiUnicode} is the command that begins building
% of a big-endian string (UTF-16BE). It sets the unicode marker (\texttt{FEFF}) and passes the flow
% to \cs{@stringiiUnicode}.
%    \begin{macrocode}
\providecommand{\stringiiUnicode}{FEFF\expandafter\@stringiiUnicode}
%    \end{macrocode}
% When \cs{u} is detected \cs{@stringiiUnicode}, the command that converts the string
% to all unicode hex, it calls \cs{getRawUnicode} to get the next four characters, which
% should be XXXX, place them in the stream, followed by \cs{@stringiiUnicode} so as to
% continue the processing of the next character in the description string. I've placed
% an \cs{expandafter} in the definition of \cs{getRawUnicode} to allow the commands below
% to be used. Thus instead of using \cs{u20AC}, which might necessitate the user to
% look up the code, \verb!\u\EURO! can be used instead.  Additional shortcut commands
% like these can be created. Except for \cs{EURO}, these are the ones \TeX{} has trouble
% processing.
%   \begin{macrocode}
\providecommand{\@stringiiUnicode}[1]{\ifx#1\relax\else
  \ifx#1\u\aeb@exiii\getRawUnicode@tp\else
  \displayUnicode{#1}\aeb@exiii\@stringiiUnicode\fi\fi}
%    \end{macrocode}
%    Allow parentheses around the value \cs{u}, this allows us to abut neighboring
%    characters without creating an unwanted space; eg., |\u(\BSLASH)LaTeX|. This is needed
%    in the case of when the hex digits are expanded from a command, such as \cs{EURO},
%    \cs{BSLASH}, \cs{LBRACE}, \cs{RBRACE}, and \cs{DQUOTE}.
%    The \DescribeMacro{\getRawUnicode@tp}\cs{getRawUnicode@tp} tests whether there is
%    a left parenthesis following \cs{u}.
%    \changes{v1.1}{2017/08/28}{Allow parentheses around the value of \string\cs{u}}
%    \begin{macrocode}
\def\getRawUnicode@tp#1{\ifx#1(\aeb@exiii\getRawUnicode@p\else
  \aeb@exiii\@getRawUnicode\fi#1}
%    \end{macrocode}
%     We come into \DescribeMacro{\getRawUnicode@p}\cs{getRawUnicode@p} if there is a left
%     parenthesis following \cs{u}. We extract the left and right parentheses and continue
%     on to \cs{@getRawUnicode}.
%    \begin{macrocode}
\def\getRawUnicode@p(#1){\expandafter\@getRawUnicode#1}
%    \end{macrocode}
%    When the \cs{u} is encountered by \cs{@stringiiUnicode} it is followed four hex digits
%    or by macro (such as \cs{EURO}) that expands to four hex digits. \DescribeMacro{\getRawUnicode}\cs{getRawUnicode}
%    grabs these four hex digits (adding them to the string built by \cs{@stringiiUnicode}). Flow continues
%    to \cs{@stringiiUnicode}.
%   \begin{macrocode}
\providecommand{\@getRawUnicode}[4]{#1#2#3#4\@stringiiUnicode}
%    \end{macrocode}
%    \subsection{The \texorpdfstring{\protect\cs{unicodeStr}}{\CMD{unicodeStr}} command}
%\leavevmode\DescribeMacro{\unicodeStr}\hskip-\marginparsep\texttt{(\ameta{name})}
% This command expands \ameta{name} to its big-endian character string. Its argument
% is delimited with \emph{parentheses}. Do not redefine this command as it is used by
% \pkg{eforms} for automatic detection of a unicode string.
%    \begin{macrocode}
\def\unicodeStr(#1){\expandafter
    \ifx\csname aeb@aDescript@#1\endcsname\relax
%    \end{macrocode}
%    If \ameta{name} is not defined, we assume that \ameta{name} is raw hex digits and
%    we insert them being the marker \texttt{FEFF}; otherwise, we use the string defined by
%    \ameta{name}. We use \cs{stringIIUnicode} to get things going.
%    \begin{macrocode}
  FEFF#1\else\aeb@exiii\stringiiUnicode\aref(#1)\relax\fi}
%    \end{macrocode}
%    \subsection{The \texorpdfstring{\protect\cs{defUniStr}}{\CMD{defUniStr}} command}
% \leavevmode\DescribeMacro{\defUniStr}\hskip-\marginparsep\darg{\ameta{name}}\darg{\ameta{string}}
% The \cs{defUniStr} command is used to define a unicode string. The \ameta{name} should be an
% ASCII character string (used to retrieve the \ameta{string} later); \ameta{string} is a combination
% of Basic Latin characters and unicode literals (\cs{uXXXX}). When the \pkg{aeb\_pro} package is loaded
% with the \opt{linktoattachments} option, \cs{labelName} expanded outside the
% \env{attachmentNames} environment expands \cs{defUniStr}, this is so to support legacy document that
% use \cs{labelName} for the purpose of initializing form fields with unicode.
% \changes{v1.2}{2017/08/28}{Added parentheses to the \string\@for\space loop}
%    \begin{macrocode}
%\@for\x:=ABCDEFabcdef()\do{\@makeother\x}
\def\defUniStr#1{\def\U@uniStrName{#1}\bgroup\fbe@sanitize
  \obeyspaces\getUniDescript}
{\obeyspaces\gdef\getUniDescript#1{\gdef\U@description{#1}%
\U@NameUniStr}}
\def\U@NameUniStr{\global\U@csarg\let
  {aeb@aDescript@\U@uniStrName}\U@description\egroup}
%</package>
%<*encoding>
%    \end{macrocode}
%    \subsection{Unicode for Basic Latin definitions}
%    \begin{macrocode}
\convertChriiUnicode\space{0020}
\convertChriiUnicode{!}{0021}
{\@makeother\"
\convertChriiUnicode{"}{0022}}
\convertChriiUnicode{#}{0023}
\convertChriiUnicode{$}{0024}
{\@makeother\%
\convertChriiUnicode{%}{0025}}
\convertChriiUnicode{&}{0026}
\convertChriiUnicode{'}{0027}
\convertChriiUnicode{(}{0028}
\convertChriiUnicode{)}{0029}
\convertChriiUnicode{*}{002A}
\convertChriiUnicode{+}{002B}
\convertChriiUnicode{,}{002C}
\convertChriiUnicode{-}{002D}
\convertChriiUnicode{.}{002E}
\convertChriiUnicode{/}{002F}
\convertChriiUnicode{0}{0030}
\convertChriiUnicode{1}{0031}
\convertChriiUnicode{2}{0032}
\convertChriiUnicode{3}{0033}
\convertChriiUnicode{4}{0034}
\convertChriiUnicode{5}{0035}
\convertChriiUnicode{6}{0036}
\convertChriiUnicode{7}{0037}
\convertChriiUnicode{8}{0038}
\convertChriiUnicode{9}{0039}
\convertChriiUnicode{:}{003A}
\convertChriiUnicode{;}{003B}
\convertChriiUnicode{<}{003C}
\convertChriiUnicode{=}{003D}
\convertChriiUnicode{>}{003E}
\convertChriiUnicode{?}{003F}
\convertChriiUnicode{@}{0040}
\convertChriiUnicode{A}{0041}
\convertChriiUnicode{B}{0042}
\convertChriiUnicode{C}{0043}
\convertChriiUnicode{D}{0044}
\convertChriiUnicode{E}{0045}
\convertChriiUnicode{F}{0046}
\convertChriiUnicode{G}{0047}
\convertChriiUnicode{H}{0048}
\convertChriiUnicode{I}{0049}
\convertChriiUnicode{J}{004A}
\convertChriiUnicode{K}{004B}
\convertChriiUnicode{L}{004C}
\convertChriiUnicode{M}{004D}
\convertChriiUnicode{N}{004E}
\convertChriiUnicode{O}{004F}
\convertChriiUnicode{P}{0050}
\convertChriiUnicode{Q}{0051}
\convertChriiUnicode{R}{0052}
\convertChriiUnicode{S}{0053}
\convertChriiUnicode{T}{0054}
\convertChriiUnicode{U}{0055}
\convertChriiUnicode{V}{0056}
\convertChriiUnicode{W}{0057}
\convertChriiUnicode{X}{0058}
\convertChriiUnicode{Y}{0059}
\convertChriiUnicode{Z}{005A}
\convertChriiUnicode{[}{005B}
\convertChriiUnicode{]}{005D}
\convertChriiUnicode{^}{005E}
\convertChriiUnicode{_}{005F}
\convertChriiUnicode{`}{0060}
\convertChriiUnicode{a}{0061}
\convertChriiUnicode{b}{0062}
\convertChriiUnicode{c}{0063}
\convertChriiUnicode{d}{0064}
\convertChriiUnicode{e}{0065}
\convertChriiUnicode{f}{0066}
\convertChriiUnicode{g}{0067}
\convertChriiUnicode{h}{0068}
\convertChriiUnicode{i}{0069}
\convertChriiUnicode{j}{006A}
\convertChriiUnicode{k}{006B}
\convertChriiUnicode{l}{006C}
\convertChriiUnicode{m}{006D}
\convertChriiUnicode{n}{006E}
\convertChriiUnicode{o}{006F}
\convertChriiUnicode{p}{0070}
\convertChriiUnicode{q}{0071}
\convertChriiUnicode{r}{0072}
\convertChriiUnicode{s}{0073}
\convertChriiUnicode{t}{0074}
\convertChriiUnicode{u}{0075}
\convertChriiUnicode{v}{0076}
\convertChriiUnicode{w}{0077}
\convertChriiUnicode{x}{0078}
\convertChriiUnicode{y}{0079}
\convertChriiUnicode{z}{007A}
\convertChriiUnicode{|}{007C}
{\@makeother~
\convertChriiUnicode{~}{007E}}
\def\EURO{20AC}
\def\BSLASH{005C}
\def\LBRACE{007B}
\def\RBRACE{007D}
\def\DQUOTE{0022}
\def\ucspace{\u0020}
%</encoding>
%<*package>
\InputIfFileExists{uni4basic-latin.def}{\PackageInfo{forms16be}
  {Inputting uni4basic-latin.def\MessageBreak definitions}}
  {\PackageError{forms16be}
    {Cannot find the file uni4basic-latin.def}{}}
%</package>
%    \end{macrocode}
%  \Finale
\endinput
