% 文字コードは UTF-8
% uplatex で組版する
\documentclass[uplatex,a4paper]{jsarticle}
\renewcommand{\headfont}{\gtfamily\romanseries{sbc}\sffamily}
\usepackage{shortvrb}
\MakeShortVerb{\|}
\usepackage{bxtexlogo}
\bxtexlogoimport{*}
\newcommand{\PkgVersion}{0.9a}
\newcommand{\PkgDate}{2021/05/11}
\newcommand{\Pkg}[1]{\textsf{#1}}
\newcommand{\Meta}[1]{$\langle$\mbox{}#1\mbox{}$\rangle$}
\newcommand{\Note}{\par\noindent ※}
\newcommand{\Means}{：\quad}
\providecommand{\Strong}[1]{\textsf{#1}}
%-----------------------------------------------------------
\begin{document}
\title{\Pkg{pxjahyper} パッケージ}
\author{八登崇之\ （Takayuki YATO; aka.~``ZR''）}
\date{v\PkgVersion\quad[\PkgDate]}
\maketitle

%===========================================================
\section{概要}

(u){\pLaTeX} + hyperref + dvipdfmxの組み合わせで
日本語を含む「しおり」をもつPDF文書を作成する
場合に必要となる機能を提供する。
\begin{itemize}
\item dvipdfmx用の「tounicode special」について、
  内部漢字コードに応じて適切なものを出力する。
\item PDF文字列の中でLICR（|\"a| や |\textsection| 等の
  文字出力の命令）が正しく機能するようにする。
  ただし、エンジンが {\pTeX} の場合は、out2uni/convbkmk を利用
  する場合を除き、JIS~X~0208にない文字は出力できない
  （hyperrefの警告が出る）。
\item {\TeX} の版面拡大機能が使われている
  （|\mag| が1000でない；典型的には\Pkg{jsclasses}の
  文書クラスで基底フォントサイズが10\,pt以外である）
  場合に、\Pkg{hyperref}が出力するpapersize specialの
  紙面サイズの値が不正になるが、この場合に |\mag| 値を
  考慮して求めた正しいサイズによるpapersize specialを
  改めて出力する。
\end{itemize}

%===========================================================
\section{パッケージの読込}

|\usepackage| で読み込む。
\begin{quote}\small\begin{verbatim}
\usepackage[オプション,...]{pxjahyper}
\end{verbatim}\end{quote}

使用可能なオプションは以下の通り。
\begin{itemize}
\item \Strong{ドライバオプション}\Means
  |dvipdfmx|、|dvips|、および |nodvidriver|%
  （ドライバ依存動作の無効化を明示的に指示、
  現状ではほとんどの動作が無効になる）
  が指定できる。
  \Note 0.5版より、|nodvidriver| の別名の |none| は非推奨の扱いとする。
\item |auto|（既定）\Means
  ドライバオプションを\Pkg{hyperref}のドライバ指定から自動的に判定する。
\item |tounicode|（既定）\Means
  dvipdfmx用の「tounicode special」を発行し、
  それを前提にした出力を行う。
\item |notounicode|\Means
  dvipdfmx用の「tounicode special」を発行しない。
\item |out2uni|\Means
  out2uniフィルタを使うことを前提にした出力を行う。
\item |convbkmk|\Means
  convbkmkフィルタを使うことを前提にした出力を行う。
  \Note ドライバがdvipsの場合は既定で有効になる。
\item |otfutf|（既定）\Means
  \Pkg{japanese-otf}パッケージの |\UTF| 命令をPDF文字列中で
  使えるようにする。
  \Note 詳細は\ref{ssec:otf-package}節を参照。
\item |nootfutf|\Means
  |otfutf| の否定。
\item |otfcid|（既定）\Means
  \Pkg{japanese-otf}パッケージの |\CID| 命令をPDF文字列中で
  “可能な限り”使えるようにする。
  \Note 詳細は\ref{ssec:otf-package}節を参照。
  \Note |otfcid| の利用には、エンジンの{\eTeX}拡張および
  \Pkg{etoolbox}と\Pkg{bxjatoucs}パッケージのインストールが必要。
\item |nootfcid|\Means
  |otfcid| の否定。
\item |disablecmds|（既定）\Means
  「PDF文字列中のテキスト装飾命令の無効化」を有効にする。
  \Note 詳細は\ref{ssec:disablecmds}節を参照。
\item |nodisablecmds|\Means
  |disablecmds| の否定。
\item |otfmacros|（既定）\Means
  \Pkg{japanese-otf}付属の\Pkg{ajmacros}パッケージが提供する
  文字入力命令（|\ajMaru|、|\ajLig| 等）をPDF文字列中で
  “可能な限り”使えるようにする。
  \Note 詳細は\ref{ssec:otf-package}節を参照。
  \Note |otfmacros| を有効にする場合は |otfcid| も有効にする必要がある。
\item |nootfmacros|\Means
  |otfmacros| の否定。
  \Note 0.6版より既定を |otfmacros| に変更した。
\item |bigcode|（既定）\Means
  {\upTeX}でのToUnicode CMapとして既定のUTF8-UCSの代わりに\ 
  UTF8-UTF16を用いる。
  （当該のファイルが存在する必要がある。）
\item |nobigcode|\Means
  |bigcode| の否定。
  \Note 0.3a版より既定を |bigcode| に変更した。
\item |papersize|（既定）\Means
  {\upTeX}でのToUnicode CMapとして既定のUTF8-UCSの代わりに\ 
  UTF8-UTF16を用いる。
  （当該のファイルが存在する必要がある。）
\item |nopapersize|\Means
  |bigcode| の否定。
  \Note 0.3a版より既定を |bigcode| に変更した。
\end{itemize}

%===========================================================
\section{機能}

「概要」で述べた機能は（オプション設定に応じて）
自動的に実施される。

%-------------------
\subsection{Unicode符号値による入力}
\label{ssec:ux-command}

PDF文字列入力中で、|\Ux| が以下の意味になる。
PDF文字列以外では |\Ux| は以前の定義（または未定義）に戻る。
\footnote{|\Ux| という命令名は\Pkg{bxbase}パッケージの
Unicode符号値入力用の命令が使っているものである。
従って、\Pkg{bxbase}パッケージを読み込んでいれば、
「PDF文字列と版面出力の両方に使われる」ようなテキストにおいて、
|\Ux| でUnicode符号値入力が可能になる。
ただし、Unicode符号値入力用の命令としては
「\Pkg{japanese-otf}パッケージの |\UTF| 命令」
の方が有名であり、\Pkg{pxjahyper}は |\UTF| も正しく扱えるので、
こちらを使う方が無難かもしれない。}

\begin{itemize}
\item |\Ux{|Unicode符号値16進|}|\Means
  その符号値の文字を出力する。
  具体的な動作は以下の通り：
  \begin{itemize}
  \item エンジンが{\upLaTeX}のときは、当該の文字自体を書いたのと
  同等になる。
  \item エンジンが{\pLaTeX}で |out2uni| または |convbkmk| が有効の
  場合は、エスケープ表記（|\0xUUUU|）を出力する。
  \end{itemize}
  \item それ以外の場合は、|\Ux| は定義されない。
\end{itemize}

%-------------------
\subsection{\Pkg{japanese-otf}パッケージの文字入力命令への対応}
\label{ssec:otf-package}

\paragraph{\textbackslash UTF命令}
|\UTF| 命令は、PDF文字列中では
out2uni用の出力を行うように設計されている。
本パッケージで |otfutf| オプションを有効にした場合は、
PDF文字列中の動作が以下のように変更される。

\begin{itemize}
\item |\Ux| 命令（\ref{ssec:ux-command}節参照）が有効の場合は、
  |\Ux| と同じ動作になる。
\item それ以外の場合
  （エンジンが{\pLaTeX}でtounicodeを前提にする場合）は、
  警告を出した上でゲタ記号を出力する。
  \Note {\pLaTeX}ではtounicodeの機能でUnicode文字を出力できないため。
\end{itemize}

\Note |\UTF| 命令の多言語版、
すなわち |\UTFC|・|\UTFK|・|\UTFM|・|\UTFT| 命令も |\UTF|
と同じ扱いになる。

\paragraph{\textbackslash CID命令}
\Pkg{japanese-otf}パッケージの仕様では |\CID| 命令は、PDF文字列中では
サポートされない（未定義動作となる）。
本パッケージで |otfcid| オプションを有効にした場合は、
PDF文字列中で |\CID| が“可能な限り”使えるようにする。
具体的な仕様は以下の通り。

\begin{itemize}
\item 当該のAJ1のグリフに“対応”する\textbf{単独の}Unicode文字が
  あればそれを出力し、なければ
  （警告を出した上で）削除する。
  \footnote{他の同様の場合と合わせてゲタ記号を出力するようにしたい。
    1.0版において仕様を変更する予定。}
\item ただし |\Ux| 命令（\ref{ssec:ux-command}節参照）が
  無効になる場合は、そもそもUnicode文字も出力できないため、
  常に（警告を出した上で）ゲタ記号を出力する。
  結局情報は欠落するが、それでも未定義動作（エラーになりえる）
  よりは好ましいであろう。
\end{itemize}

\Note |otfcid| の利用には、エンジンの{\eTeX}拡張および
\Pkg{etoolbox}と\Pkg{bxjatoucs}パッケージのインストールが必要。
\Note |\CID| 命令の多言語版はサポートされない。

\paragraph{ajmacrosパッケージの命令}
本パッケージで |otfmacros| オプションを有効にした場合は、
\Pkg{japanese-otf}付属の\Pkg{ajmacros}パッケージが提供する
文字入力命令（|\ajMaru|、|\ajLig| 等）をPDF文字列中で
“可能な限り”使えるようにする。
具体的な仕様は以下の通り。

\begin{itemize}
\item 現状では、|\Ux| 命令が有効になる場合のみが
  サポートされる。
  \Note それ以外の場合は |otfmacros| オプションは無効になる。
\item Unicode文字で表現可能であればそれを出力し、
  なければ代替表現を出力する。
\item Unicode文字を出力する場合の仕様は |\CID| と同じ。
  代替表現の場合は文字自体が出力されることもある。
\end{itemize}

\Note |otfmacros| を有効にする場合は |otfcid| も有効にする必要がある。
（従って |otfcid| と同じ前提条件が課される。）
|nootfcid| を指定した場合は |otfmacros| も無効になる。
\Note \Pkg{ajmacros}パッケージの多くの命令は“脆弱（fragile）”である。
そのため、節見出し（|\section| 等の引数）で |\ajMaru| 等の命令を
使いたい場合は、命令の前に |\protect| 付ける必要がある。
\footnote{ちなみに、引数がPDF文字列として解釈される場合には、
  |\protect| は全く結果に影響しない。}

%-------------------
\subsection{PDF文字列用の文字命令のユーザ定義}

以下の命令が提供される。（プリアンブルでのみ使用可能。）

\begin{itemize}
\item |\pxDeclarePdfTextCommand{\制御綴}{|\Meta{JIS符号値}|}{|\Meta
{Unicode符号値}|}|\Means
  PDF文字列中の |\制御綴| の動作として、
  指定した符号値の文字を出力することを指定する。
\item |\pxDeclarePdfTextComposite{\制御綴}{|\Meta{引数}|}{|\Meta
{JIS符号値}|}{|\Meta{Unicode符号値}|}|\Means
  PDF文字列中の |\制御綴|（アクセント命令）+ \Meta{引数}の
  動作として、指定した符号値の文字を出力することを指定する。
\end{itemize}

これらの命令において、符号値は16進数で指定する。
「JIS符号値」は {\upLaTeX} では使われないので省略して
（空にして）もよい
（或いはそもそも JIS~X~0208 にない文字の場合は省略する）。
逆に「Unicode符号値」は {\pLaTeX} の動作でかつ「JIS符号値」が
指定されている場合は省略してよい。

例えば、以下のように定義しておくと、
PDF文字列中で |\textschwa|（schwa記号）や |\d{t}|（\d{t}）が
使えるようになる。
\begin{quote}\small\begin{verbatim}
\pxDeclarePdfTextCommand{\textschwa}{}{0259}
\pxDeclarePdfTextComposite{\d}{t}{}{1E6D}
\end{verbatim}\end{quote}

%-------------------
\subsection{PDF文字列用中のテキスト装飾命令の無効化}
\label{ssec:disablecmds}

PDF文字列は単なるUnicode文字列として扱われるものなので、
|\textit| や |\large| 等のテキスト装飾用の命令は意味をなさず、
またそれらの命令の実装はPDF文字列の解釈中は正常に処理できない。
PDF文字列と版面出力の両方に使われるテキスト（節見出し等）
についてテキスト装飾命令が支障なく使えるように、
\Pkg{hyperref}では基本的なテキスト装飾命令
（多くは{\LaTeX}カーネルが提供するもの）
について、「PDF文字列として扱う場合は自動的に無力化
\footnote{例えば、“|\textit{text}|”や“|{\large text}|”は
  単に“|text|”と書いたものと見なされる。}
する」機構を実装している。
これにより、例えば節見出しのテキストに“|\textit{text}|”が
含まれていたとすると、
版面に出力する場合には“\textit{text}”のように装飾が施され、
一方で、PDF文字列としては“|text|”と解釈されることになる。

0.5版以降の\Pkg{pxjahyper}では、この無効化の対象に
「和文用のテキスト装飾命令（およびそれに準じるもの）」
を追加するようになった。
以下の命令が対象になる。

\begin{itemize}
\item 和文のフォント選択命令\Means
  |\textmc| |\gtfamily| |\kanjifamily| |\useroman| |\userelfont|
  など
\item 次の{\pLaTeX}カーネル命令\Means
  |\<|
\item 次の{\pTeX}プリミティブ\Means
  |\inhibitglue| |\|(|no|)|autospacing| |\|(|no|)|autoxspacing|
\item 次の\Pkg{plext}の命令\Means
  |\bou| |\kasen| |\rensuji|
\item 次の\Pkg{japanese-otf}の命令\Means
  |\textmg| |\mgfamily| |\ltseries| |\ebseries| |\propshape|
\end{itemize}

\end{document}
