Mercurial > hg > Papers > 2020 > tobaru-master
changeset 33:e68c3bd31098
after Master's Thesis Examination
author | tobaru |
---|---|
date | Mon, 10 Feb 2020 18:01:43 +0900 (2020-02-10) |
parents | 4c24694af0b0 |
children | fe7b1222efd8 |
files | paper/abstract.tex paper/fig/Context_ref.png paper/hyperref.sty paper/master_paper.pdf paper/master_paper.synctex.gz paper/master_paper.tex paper/pxjahyper.sty slide/CbCXv6.html slide/CbCXv6.md slide/fig/Context_ref.png slide/fig/interface.graffle slide/fig/interface.pdf slide/fig/interface.png |
diffstat | 13 files changed, 10493 insertions(+), 306 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/abstract.tex Sun Feb 09 22:55:38 2020 +0900 +++ b/paper/abstract.tex Mon Feb 10 18:01:43 2020 +0900 @@ -1,35 +1,56 @@ \chapter*{要旨} -OS を要する機器に依存している現代では、OS のバグは日常生活に支障を来たすことに繋がる。 -OS 自体に信頼性が求められるが、機能が多く短期間のアップデートが必要な OS では、全てのコードに対して何度も検証を行うのは困難である。 +OS 自体に信頼性が求められるが、OS の全てのコードに対して検証を行うのは困難である。 +本研究室で信頼性を保障するのに適したプログラミング言語 CbC を開発してきた。 +CbC を使って OS の開発をすることにより、 +CbC の軽量継続によりOSの動作を +状態遷移を基本としたモデルに落とし込むことができる。 +これにより状態遷移機械の検証手法をOSに対して適用し信頼性を高めることができるようになると考えられる。 +本研究では小型のOSであるx.v6 をCbCで書き換えること +の一部を行う。具体的にはOSのメモリ管理を担当するvm.cをCbCに変換する。 -本研究室で開発したメタレベルの記述ができる CbC という言語を用いて OS の信頼性を保証するために Gears OS を開発中である。 -本研究での Gears OS の実装は、Xv6 というOSを参考に行っている。 -CbC は継続を中心とした言語であるため、状態遷移モデルに落とし込むことができる。 -状態遷移の1つ1つの関数に対して検証を行うことで OS の機能の信頼性を保証することができる。 - +CbCではインターフェースを用いたモジュール化を行う。 +vm.cbcはメモリ管理(特にpaging)を行うインターフェース +と、その実装として記述される。インターフェース内部での + CbCの接続はメタレベルの記述になる。OSで使われる +すべてのコードとデータはcontextと呼ばれるメタデータ +に記述される。contextのデータを書き換えることにより +、x.v6で仮想OSやコンテナを定義できるようになると +考えられる。 -しかし、ノーマルレベルとメタレベルで見え方が異なるデータに対して継続の記述が煩雑になる。 -そこで本研究では、インターフェースを用いたモジュール化を行う。 -インターフェースによって形式化され柔軟に再利用することもできる。 -OSの信頼性の基本であるメモリ管理部分のインターフェースと実装の記述と考察を行う。 - - +本論文では +OSの信頼性の基本であるメモリ管理部分のインターフェースと実装の記述の考察を行う。 % 既存の Gears OS でのメモリ管理では単に Page Table Entry をコピーする Fork を実装しているが、 \chapter*{Abstract} -OS Bugs lead to hinder daily life, In the modern times of relying on devices that require an OS. -OS requires reliability. But It is defficult to verify all the code many times on an OS that has meny functions and requires short-term updates. +Reliability of Operating Systems are important, +but it is difficult to verify the source code of +the Operating System. + +Programming language CbC is developed in our laboratory, +which is designed to support reliability. +Operating System Project has +automaton like descriptions if it is written in CbC. +Using automaton based verification technologies, +the Operating System becomes more dependable. +In this research, we will rewrite x.v6 kernel which +is a small operating system written in C. Actually, +we will rewrite the memory management part vm.c of it using CbC. + +CbC has module system called interfaces. vm.cbc is +implemented as an interface and the implementations. +In the interfaces, all connections and data structures +are written a meta data, which is called Context. +Virtual OS or so called Container can be realized as +a modification of the Context. + +In this paper, we describes rewriting details of +memory management interface. -Our laboratory developing an OS called Gears OS to guarantee reliability. -Gears OS uses a programming language called CbC that can write meta-level. -GearsOS implementation is based on Xv6. -CbC is a language with a focus on continuation, it can be dropped into a state transition model. -The reliability of OS functions can be guaranteed by verifying each function of the state transition. -But, The description of continuation becomes complicated for data that looks defferent between the normal-level and the meta-level. -In this research, mojularization using interfaces. -Interface formalized and can be flexibly reused. -This paper describes and discusses the interface and implementation of the memory management part, which is the basis of OS reliability. + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/hyperref.sty Mon Feb 10 18:01:43 2020 +0900 @@ -0,0 +1,8977 @@ +%% +%% This is file `hyperref.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% hyperref.dtx (with options: `package') +%% +%% File: hyperref.dtx Copyright 1995-2001 Sebastian Rahtz, +%% with portions written by David Carlisle and Heiko Oberdiek, +%% 2001-2012 Heiko Oberdiek. +%% 2016-2019 Oberdiek Package Suport Group +%% 2019 LaTeX3 Project +%% https://github.com/latex3/hyperref/issues +%% +%% This file is part of the `Hyperref Bundle'. +%% ------------------------------------------- +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is the LaTeX3 Project. +%% +%% The list of all files belonging to the `Hyperref Bundle' is +%% given in the file `manifest.txt'. +%% +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesPackage{hyperref} + [2019/11/10 v7.00c % + Hypertext links for LaTeX] +\begingroup + \@makeother\`% + \@makeother\=% + \edef\x{% + \edef\noexpand\x{% + \endgroup + \noexpand\toks@{% + \catcode 96=\noexpand\the\catcode`\noexpand\`\relax + \catcode 61=\noexpand\the\catcode`\noexpand\=\relax + }% + }% + \noexpand\x + }% +\x +\@makeother\` +\@makeother\= +\def\Hy@SetCatcodes{% + \@makeother\`% + \@makeother\=% + \catcode`\$=3 % + \catcode`\&=4 % + \catcode`\^=7 % + \catcode`\_=8 % + \@makeother\|% + \@makeother\:% + \@makeother\(% + \@makeother\)% + \@makeother\[% + \@makeother\]% + \@makeother\/% + \@makeother\!% + \@makeother\<% + \@makeother\>% + \@makeother\.% + \@makeother\;% + \@makeother\+% + \@makeother\-% + \@makeother\"% + \@makeother\'% +} +\begingroup + \def\x#1{\catcode`\noexpand#1=\the\catcode`#1\relax}% + \xdef\Hy@RestoreCatcodes{% + \the\toks@ + \x\$% + \x\&% + \x\^% + \x\_% + \x\|% + \x\:% + \x\(% + \x\)% + \x\[% + \x\]% + \x\/% + \x\!% + \x\<% + \x\>% + \x\.% + \x\;% + \x\+% + \x\-% + \x\"% + \x\'% + }% +\endgroup +\Hy@SetCatcodes +\RequirePackage{ltxcmds}[2010/11/12] +\RequirePackage{iftex}[2019/10/24] +\RequirePackage{pdftexcmds}[2009/04/10] +\@ifpackagelater{pdftexcmds}{2010/11/04}{}{% + \ltx@IfUndefined{pdfdraftmode}{% + \let\pdf@ifdraftmode\ltx@secondoftwo + }{% + \ifpdf + \def\pdf@ifdraftmode{% + \ifnum\pdfdraftmode=\ltx@one + \expandafter\ltx@firstoftwo + \else + \expandafter\ltx@secondoftwo + \fi + }% + \else + \let\pdf@ifdraftmode\ltx@secondoftwo + \fi + }% +} +\RequirePackage{infwarerr}[2010/04/08] +\RequirePackage{keyval}[1997/11/10] +\RequirePackage{kvsetkeys}[2007/09/29] +\RequirePackage{kvdefinekeys}[2011/04/07] +\RequirePackage{pdfescape}[2007/11/11] +\RequirePackage{hycolor} +\RequirePackage{letltxmacro}[2008/06/13] +\RequirePackage{auxhook}[2009/12/14] +\def\Hy@Error{\@PackageError{hyperref}} +\def\Hy@Warning{\@PackageWarning{hyperref}} +\def\Hy@WarningNoLine{\@PackageWarningNoLine{hyperref}} +\def\Hy@Info{\@PackageInfo{hyperref}} +\def\Hy@InfoNoLine{\@PackageInfoNoLine{hyperref}} +\def\Hy@Message#1{% + \GenericWarning{% + (hyperref)\@spaces\@spaces\@spaces\@spaces + }{% + Package hyperref Message: #1\ltx@gobble + }% +} +\chardef\Hy@VersionChecked=0 % +\def\Hy@VersionCheck#1{% + \begingroup + \ltx@IfUndefined{ver@hyperref.sty}{% + \Hy@Error{% + This should not happen!\MessageBreak + Missing hyperref version% + }\@ehd + }{% + \ltx@IfUndefined{ver@#1}{% + \Hy@Error{% + This should not happen!\MessageBreak + Missing version of `#1'% + }\@ehd + }{% + \def\x##1##2##3{% + \expandafter\expandafter\expandafter\Hy@@VersionCheck + \expandafter\expandafter\expandafter##2% + \csname ver@##3\endcsname##1##1\@nil + }% + \x{ }\y{hyperref.sty}% + \x{ }\z{#1}% + \ifx\y\z + \else + \edef\a{#1}% + \edef\b{\HyOpt@CustomDriver.def}% + \ifx\a\b + \Hy@WarningNoLine{% + Version mismatch (custom driver)!\MessageBreak + * \y: hyperref.sty\MessageBreak + * \z: \a + }% + \else + \Hy@Error{% + Version mismatch!\MessageBreak + * \y: hyperref.sty\MessageBreak + * \z: \a + }\@ehd + \fi + \fi + }% + }% + \endgroup + \chardef\Hy@VersionChecked=1 % +} +\def\Hy@@VersionCheck #1#2 #3 #4\@nil{% + \def#1{#2 #3}% +} +\ltx@IfUndefined{pdfmatch}{% + \def\Hy@Match#1#2#3#4#5{}% +}{% + \def\Hy@Match#1#2#3{% + \begingroup + \edef\^{\ltx@backslashchar\string^}% + \edef\.{\ltx@backslashchar.}% + \edef\[{\ltx@backslashchar[}% ]] + \edef\${\ltx@backslashchar$}% + \edef\({\ltx@backslashchar(}% + \edef\){\ltx@backslashchar)}% + \edef\|{\ltx@backslashchar|}% + \edef\*{\ltx@backslashchar*}% + \edef\+{\ltx@backslashchar+}% + \edef\?{\ltx@backslashchar?}% + \edef\{{\ltx@backslashchar\ltx@leftbracechar}% + \edef\}{\ltx@rightbracechar}% + \edef\\{\ltx@backslashchar\ltx@backslashchar}% + \let\ \ltx@space + \ifcase\pdfmatch#2{#3}{#1} % + \endgroup + \expandafter\ltx@secondoftwo + \or + \endgroup + \expandafter\ltx@firstoftwo + \else + \Hy@Warning{% + Internal error: Wrong pattern!\MessageBreak + --> #3 <--\MessageBreak + Pattern check ignored% + }% + \endgroup + \expandafter\ltx@firstoftwo + \fi + }% + \ltx@ifpackagelater{ltxcmds}{2010/09/11}{}{% + \begingroup + \lccode`0=`\{\relax + \lowercase{\endgroup + \def\ltx@leftbracechar{0}% + }% + \begingroup + \lccode`0=`\}\relax + \lowercase{\endgroup + \def\ltx@rightbracechar{0}% + }% + }% +} +\@ifundefined{AfterBeginDocument}{% + \def\AfterBeginDocument{\AtBeginDocument}% +}{}% +\def\Hy@AtBeginDocument{% + \ltx@LocalAppendToMacro\Hy@AtBeginDocumentHook +} +\def\Hy@AtEndOfPackage{% + \ltx@LocalAppendToMacro\Hy@AtEndOfPackageHook +} +\let\Hy@AtBeginDocumentHook\ltx@empty +\let\Hy@AtEndOfPackageHook\ltx@empty +\AtEndOfPackage{% + \Hy@AtEndOfPackageHook + \let\Hy@AtEndOfPackageHook\@undefined + \AfterBeginDocument{% + \Hy@AtBeginDocumentHook{}% + \let\Hy@AtBeginDocumentHook\@undefined + }% +} +\RequirePackage{kvoptions}[2009/07/21] +\newif\ifHy@stoppedearly +\newif\ifHy@typexml +\newif\ifHy@activeanchor +\newif\ifHy@backref +\newif\ifHy@bookmarks +\newif\ifHy@bookmarksnumbered +\newif\ifHy@bookmarksopen +\newif\ifHy@breaklinks +\newif\ifHy@pdfcenterwindow +\newif\ifHy@CJKbookmarks +\newif\ifHy@colorlinks +\newif\ifHy@destlabel +\newif\ifHy@draft +\let\Hy@finaltrue\Hy@draftfalse +\let\Hy@finalfalse\Hy@drafttrue +\newif\ifHy@pdfescapeform +\newif\ifHy@hyperfigures +\newif\ifHy@pdffitwindow +\newif\ifHy@frenchlinks +\newif\ifHy@hyperfootnotes +\newif\ifHy@hyperindex +\newif\ifHy@hypertexnames +\newif\ifHy@implicit +\newif\ifHy@linktocpage +\newif\ifHy@localanchorname +\newif\ifHy@pdfmenubar +\newif\ifHy@naturalnames +\newif\ifHy@nesting +\newif\ifHy@pdfnewwindowset +\newif\ifHy@pdfnewwindow +\newif\ifHy@ocgcolorlinks +\newif\ifHy@pageanchor +\newif\ifHy@pdfpagelabels +\newif\ifHy@pdfpagehidden +\newif\ifHy@pdfstring +\newif\ifHy@plainpages +\newif\ifHy@psize +\newif\ifHy@raiselinks +\newif\ifHy@seminarslides +\newif\ifHy@setpagesize +\newif\ifHy@texht +\newif\ifHy@psdextra +\newif\ifHy@pdftoolbar +\newif\ifHy@unicode +\newif\ifHy@pdfusetitle +\newif\ifHy@verbose +\let\Hy@debugtrue\Hy@verbosetrue +\let\Hy@debugfalse\Hy@verbosefalse +\newif\ifHy@pdfwindowui +\newif\ifHy@pdfdisplaydoctitle +\newif\ifHy@pdfa +\Hy@backreffalse +\Hy@bookmarksnumberedfalse +\Hy@bookmarksopenfalse +\Hy@bookmarkstrue +\Hy@breaklinksfalse +\Hy@pdfcenterwindowfalse +\Hy@CJKbookmarksfalse +\Hy@destlabelfalse +\Hy@pdfescapeformfalse +\Hy@hyperfiguresfalse +\Hy@pdffitwindowfalse +\Hy@hyperfootnotestrue +\Hy@hyperindextrue +\Hy@hypertexnamestrue +\Hy@implicittrue +\Hy@linktocpagefalse +\Hy@localanchornamefalse +\Hy@pdfmenubartrue +\Hy@naturalnamesfalse +\Hy@nestingfalse +\Hy@pdfnewwindowsetfalse +\Hy@pdfnewwindowfalse +\Hy@pageanchortrue +\Hy@pdfpagelabelstrue +\Hy@pdfpagehiddenfalse +\Hy@pdfstringfalse +\Hy@plainpagesfalse +\Hy@raiselinksfalse +\Hy@setpagesizetrue +\Hy@texhtfalse +\Hy@psdextrafalse +\Hy@pdftoolbartrue +\Hy@typexmlfalse +\Hy@unicodefalse +\Hy@pdfusetitlefalse +\Hy@verbosefalse +\Hy@pdfwindowuitrue +\Hy@pdfdisplaydoctitlefalse +\Hy@pdfafalse +\def\Hy@StepCount#1{\advance#1 by 1 }% +\def\Hy@GlobalStepCount#1{\global\advance#1 by 1 }% +\newdimen\@linkdim +\let\Hy@driver\ltx@empty +\let\MaybeStopEarly\relax +\newcount\Hy@linkcounter +\newcount\Hy@pagecounter +\Hy@linkcounter0 +\Hy@pagecounter0 +\let\Hy@ReturnEnd\@empty +\long\def\Hy@ReturnAfterFiFiEnd#1\fi#2\Hy@ReturnEnd{\fi\fi#1} +\long\def\Hy@ReturnAfterElseFiFiEnd#1\else#2\Hy@ReturnEnd{\fi\fi#1} +\def\Hy@safe@activestrue{\csname @safe@activestrue\endcsname} +\def\Hy@safe@activesfalse{\csname @safe@activesfalse\endcsname} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname dimexpr\endcsname\relax + \def\hypercalcbpdef#1#2{% + \begingroup + \toks@{}% + \HyCal@scan#2\hypercalcbp\@nil + \expandafter\endgroup + \expandafter\def\expandafter#1\expandafter{\the\toks@}% + }% + \def\HyCal@scan#1\hypercalcbp#2\@nil{% + \toks@\expandafter{\the\toks@ #1}% + \ifx\\#2\\% + \else + \ltx@ReturnAfterFi{% + \HyCal@do#2\@nil + }% + \fi + }% + \def\HyCal@do#1#2\@nil{% + \@ifpackageloaded{calc}{}{% + \Hy@Warning{% + For calculations \string\hypercalcbp\space needs\MessageBreak + package calc or e-TeX% + }% + }% + \setlength{\dimen@}{#1}% + \setlength{\dimen@}{0.99626401\dimen@}% + \edef\x{% + \toks@{% + \the\toks@ + \strip@pt\dimen@ + }% + }\x + \HyCal@scan#2\@nil + }% +\else + \def\hypercalcbp#1{% + \strip@pt\dimexpr 0.99626401\dimexpr(#1)\relax\relax + }% + \def\hypercalcbpdef{\def}% +\fi +\def\pdfstringdef#1#2{% + \begingroup + \escapechar`\\% + \edef\0{\string\0}% + \edef\1{\string\1}% + \edef\2{\string\2}% + \edef\3{\string\3}% + \ifHy@unicode + \edef\8{\string\8}% + \edef\9{\string\9}% + \fontencoding{PU}% + \HyPsd@UTFviii + \def\ifpdfstringunicode##1##2{##1}% + \else + \fontencoding{PD1}% + \def\ifpdfstringunicode##1##2{##2}% + \fi + \let\utf@viii@undeferr\HyPsd@utf@viii@undeferr + \enc@update + \@inmathwarn\pdfstringdef + \let\@inmathwarn\HyPsd@inmathwarn + \let\add@accent\HyPsd@add@accent + \let\{\textbraceleft + \let\}\textbraceright + \let\\\textbackslash + \let\#\textnumbersign + \let\$\textdollar + \let\%\textpercent + \let\&\textampersand + \let\_\textunderscore + \let\P\textparagraph + \let\ldots\textellipsis + \let\dots\textellipsis + \ltx@IfUndefined{textEncodingNoboundary}% + {}{\let\noboundary\textEncodingNoboundary}% + \def\\{\pdfstringdefWarn\\}% + \def\newline{\pdfstringdefWarn\newline}% + \def\TeX{TeX}% + \def\LaTeX{La\TeX}% + \def\LaTeXe{% + \LaTeX2% + \ifHy@unicode\textepsilon\else e\fi + }% + \def\eTeX{% + \ifHy@unicode\textepsilon\else e\fi + -\TeX% + }% + \def\SliTeX{Sli\TeX}% + \def\MF{Metafont}% + \def\MP{Metapost}% + \let\fontencoding\@gobble + \let\fontfamily\@gobble + \let\fontseries\@gobble + \let\fontshape\@gobble + \let\fontsize\@gobbletwo + \let\selectfont\@empty + \let\usefont\@gobblefour + \let\emph\@firstofone + \let\textnormal\@firstofone + \let\textrm\@firstofone + \let\textsf\@firstofone + \let\texttt\@firstofone + \let\textbf\@firstofone + \let\textmd\@firstofone + \let\textit\@firstofone + \let\textsc\@firstofone + \let\textsl\@firstofone + \let\textup\@firstofone + \let\normalfont\@empty + \let\rmfamily\@empty + \let\sffamily\@empty + \let\ttfamily\@empty + \let\bfseries\@empty + \let\mdseries\@empty + \let\itshape\@empty + \let\scshape\@empty + \let\slshape\@empty + \let\upshape\@empty + \let\em\@empty + \let\rm\@empty + \let\Huge\@empty + \let\LARGE\@empty + \let\Large\@empty + \let\footnotesize\@empty + \let\huge\@empty + \let\large\@empty + \let\normalsize\@empty + \let\scriptsize\@empty + \let\small\@empty + \let\tiny\@empty + \let\mathversion\@gobble + \let\phantom\@gobble + \let\vphantom\@gobble + \let\hphantom\@gobble + \let\ding\HyPsd@ding + \let\Cube\HyPsd@DieFace + \def\begin#1{\csname#1\endcsname}% + \def\end#1{\csname end#1\endcsname}% + \def\textcolor##1##{\@secondoftwo}% + \def\MakeUppercase{\MakeUppercaseUnsupportedInPdfStrings}% + \def\MakeLowercase{\MakeLowercaseUnsupportedInPdfStrings}% + \ifHy@psdextra + \ifHy@unicode + \csname psdmapshortnames\endcsname + \csname psdaliasnames\endcsname + \fi + \fi + \let\foreignlanguage\@secondoftwo + \let\textlatin\@firstofone + \ltx@IfUndefined{language@group}{}{% + \let\bbl@info\@gobble + \csname HyPsd@babel@\language@group\endcsname + }% + \HyPsd@GreekPatch + \HyPsd@SpanishPatch + \HyPsd@RussianPatch + \HyPsd@BabelPatch + \let\@safe@activestrue\relax + \let\@safe@activesfalse\relax + \let\cyr\relax + \let\es@roman\@Roman + \let\glqq\textglqq + \let\grqq\textgrqq + \let\glq\textglq + \let\grq\textgrq + \let\flqq\textflqq + \let\frqq\textfrqq + \let\flq\textflq + \let\frq\textfrq + \let\if@mid@expandable\@firstoftwo + \HyPsd@AMSclassfix + \let\hspace\HyPsd@hspace + \let\label\@gobble + \let\index\@gobble + \let\glossary\@gobble + \let\href\HyPsd@href + \let\@mkboth\@gobbletwo + \let\ref\HyPsd@ref + \let\pageref\HyPsd@pageref + \let\nameref\HyPsd@nameref + \let\autoref\HyPsd@autoref + \let\leavevmode\@empty + \let\mbox\@empty + \def\halign{\pdfstringdefWarn\halign\@gobble}% + \let\ignorespaces\HyPsd@ignorespaces + \let\Hy@SectionAnchorHref\@gobble + \let\ensuremath\@firstofone + \HyPsd@CJKhook + \Hy@pdfstringtrue + \pdfstringdefPreHook + \HyPsd@LetUnexpandableSpace\space + \HyPsd@LetUnexpandableSpace\ % + \HyPsd@LetUnexpandableSpace~% + \HyPsd@LetUnexpandableSpace\nobreakspace + \ltx@IfUndefined{@xspace}{% + \let\xspace\HyPsd@ITALCORR + }{% + \let\xspace\HyPsd@XSPACE + }% + \let\/\HyPsd@ITALCORR + \let\bgroup\/% + \let\egroup\/% + \let\discretionary\@gobbletwo + \def\@ifnextchar{\HyPsd@ifnextchar\@ifnextchar}% + \def\kernel@ifnextchar{\HyPsd@ifnextchar\kernel@ifnextchar}% + \def\new@ifnextchar{\HyPsd@ifnextchar\new@ifnextchar}% + \let\@protected@testopt\HyPsd@protected@testopt + \let\@protected@testopt@xargs\HyPsd@protected@testopt + \begingroup + \let\GenericError\@gobblefour + \let\GenericWarning\@gobbletwo + \let\GenericInfo\@gobbletwo + \ifx\nofrenchguillemets\@undefined + \else + \nofrenchguillemets + \fi + \let\Hy@temp\xdef + \let\def\HyPsd@DefCommand + \let\gdef\HyPsd@DefCommand + \let\edef\HyPsd@DefCommand + \let\xdef\HyPsd@DefCommand + \let\futurelet\HyPsd@LetCommand + \let\let\HyPsd@LetCommand + \Hy@temp#1{#2}% + \endgroup + \ifx#1\@empty + \else + \HyPsd@ProtectSpaces#1% + \let\HyPsd@String\@empty + \expandafter\HyPsd@RemoveBraces\expandafter{#1|}% + \global\let#1\HyPsd@String + \let\HyPsd@SPACEOPTI\relax + {% + \let\HyPsd@String\@empty + \expandafter\HyPsd@CheckCatcodes#1\HyPsd@End + \global\let#1\HyPsd@String + }% + \expandafter\HyPsd@RemoveMask\expandafter + |\expandafter\@empty#1\HyPsd@End#1% + \expandafter + \HyPsd@Subst\expandafter{\HyPsd@GLYPHERR}{\relax}#1% + \let\HyPsd@String\@empty + \expandafter\HyPsd@GlyphProcess#1\relax\@empty + \global\let#1\HyPsd@String + \HyPsd@StringSubst{\\}{\textbackslash}#1% + \ifHy@unicode + \expandafter\HyPsd@StringSubst\csname 80\040\endcsname + \HyPsd@SPACEOPTI#1% + \edef\Hy@temp@A{\HyPsd@SPACEOPTI\HyPsd@SPACEOPTI\80\273}% + \expandafter\HyPsd@Subst\expandafter{\Hy@temp@A}% + {\HyPsd@SPACEOPTI\80\273}#1% + \else + \HyPsd@StringSubst{\040}\HyPsd@SPACEOPTI#1% + \expandafter\HyPsd@Subst\expandafter{% + \expandafter\HyPsd@SPACEOPTI\expandafter\HyPsd@SPACEOPTI + \string\273}{\HyPsd@SPACEOPTI\273}#1% + \fi + \ifHy@unicode + \HyPsd@StringSubst{\)}{\80\051}#1% + \HyPsd@Subst){\80\051}#1% + \let\HyPsd@empty\relax + \expandafter\HyPsd@StringSubst\csname 80\051\endcsname + {\HyPsd@empty\80\051}#1% + \else + \HyPsd@StringSubst{\)}{\051}#1% + \HyPsd@Subst){\051}#1% + \let\HyPsd@empty\relax + \HyPsd@StringSubst{\051}{\HyPsd@empty\string\)}#1% + \fi + \expandafter\HyPsd@Subst\expandafter{\/}\HyPsd@empty#1% + \ltx@IfUndefined{@xspace}{% + }{% + \let\HyPsd@xspace\relax + \expandafter\HyPsd@Subst\expandafter + {\HyPsd@XSPACE}\HyPsd@xspace#1% + \let\HyPsd@xspace\HyPsd@doxspace + }% + \xdef#1{#1\HyPsd@empty}% + \HyPsd@Subst{---}\textemdash#1% + \HyPsd@Subst{--}\textendash#1% + \HyPsd@Subst{!`}\textexclamdown#1% + \HyPsd@Subst{?`}\textquestiondown#1% + \let\HyPsd@empty\@empty + \ifHy@unicode + \HyPsd@StringSubst\(\textparenleft#1% + \HyPsd@Subst(\textparenleft#1% + \else + \HyPsd@StringSubst\({\050}#1% + \HyPsd@Subst({\050}#1% + \HyPsd@StringSubst{\050}{\string\(}#1% + \fi + \ifHy@unicode + \edef\HyPsd@SPACEOPTI{\80\040}% + \else + \let\HyPsd@SPACEOPTI\HyPsd@spaceopti + \fi + \xdef#1{#1\@empty}% + \fi + \endgroup + \begingroup + \ifHy@unicode + \HyPsd@ConvertToUnicode#1% + \ifx\HyPsd@pdfencoding\HyPsd@pdfencoding@auto + \ltx@IfUndefined{StringEncodingConvertTest}{% + }{% + \EdefUnescapeString\HyPsd@temp#1% + \ifxetex + \let\HyPsd@UnescapedString\HyPsd@temp + \StringEncodingConvertTest\HyPsd@temp\HyPsd@temp + {utf16be}{ascii-print}{% + \EdefEscapeString\HyPsd@temp\HyPsd@temp + \global\let#1\HyPsd@temp + \HyPsd@EscapeTeX#1% + \Hy@unicodefalse + }{% + \HyPsd@ToBigChars#1% + \HyPsd@EscapeTeX#1% + }% + \else + \StringEncodingConvertTest\HyPsd@temp\HyPsd@temp + {utf16be}{pdfdoc}{% + \EdefEscapeString\HyPsd@temp\HyPsd@temp + \global\let#1\HyPsd@temp + \HyPsd@EscapeTeX#1% + \Hy@unicodefalse + }{}% + \fi + }% + \fi + \fi + \HyPsd@XeTeXBigCharsfalse + \pdfstringdefPostHook#1% + \endgroup +} +\def\Hy@pdfstringdef#1#2{% + \pdfstringdef\Hy@gtemp{#2}% + \let#1\Hy@gtemp +} +\edef\Hy@temp{\catcode0=\the\catcode0\relax} +\catcode\z@=12 % +\ifxetex + \expandafter\@firstofone +\else + \let\HyPsd@XeTeXBigCharstrue\@empty + \let\HyPsd@XeTeXBigCharsfalse\@empty + \expandafter\@gobble +\fi +{% + \newif\ifHyPsd@XeTeXBigChars + \def\HyPsd@XeTeXBigCharsfalse{% + \global\let\ifHyPsd@XeTeXBigChars\iffalse + }% + \def\HyPsd@XeTeXBigCharstrue{% + \global\let\ifHyPsd@XeTeXBigChars\iftrue + }% + \def\HyPsd@ToBigChars#1{% + \ifHyPsd@XeTeXBigChars + \EdefEscapeHex\HyPsd@UnescapedString{% + \expandafter\@gobbletwo\HyPsd@UnescapedString + }% + \begingroup + \toks@{}% + \escapechar=92\relax + \let\x\HyPsd@ToBigChar + \expandafter\HyPsd@ToBigChar\HyPsd@UnescapedString + \relax\relax\relax\relax\relax\relax\relax + \edef\x{% + \endgroup + \gdef\noexpand#1{\the\toks@}% + }% + \x + \fi + }% + \def\HyPsd@ToBigChar#1#2#3#4{% + \ifx\relax#1\relax + \let\x\relax + \else + \count@="#1#2#3#4\relax + \let\y\@empty + \lccode\z@=\count@ + \ifnum\count@=40 % ( + \let\y\@backslashchar + \else + \ifnum\count@=41 % ) + \let\y\@backslashchar + \else + \ifnum\count@=92 % backslash + \let\y\@backslashchar + \else + \ifnum\count@=10 % newline + \edef\y##1{\string\n}% + \else + \ifnum\count@=13 % carriage return + \edef\y##1{\string\r}% + \fi + \fi + \fi + \fi + \fi + \lowercase{% + \toks@\expandafter{% + \the\expandafter\toks@ + \y + ^^@% + }% + }% + \fi + \x + }% +} +\Hy@temp +\@ifpackageloaded{linguex}{% + \let\HyLinguex@OrgB\b + \let\HyLinguex@OrgC\c + \let\HyLinguex@OrgD\d + \def\HyLinguex@Restore{% + \let\b\HyLinguex@OrgB + \let\c\HyLinguex@OrgC + \let\d\HyLinguex@OrgD + }% + \Hy@AtEndOfPackage{% + \pdfstringdefDisableCommands{% + \ltx@IfUndefined{oldb}{}{\let\b\oldb}% + \ltx@IfUndefined{oldc}{}{\let\c\oldc}% + \ltx@IfUndefined{oldd}{}{\let\d\oldd}% + }% + }% +}{% + \let\HyLinguex@Restore\relax +}% +\def\Hy@SaveCatcodeSettings#1{% + \expandafter\edef\csname Hy@cat@#1\endcsname{% + \endlinechar=\the\endlinechar\relax + \catcode32 \the\catcode32\relax % (space) + \catcode34 \the\catcode34\relax % " + \catcode35 \the\catcode35\relax % # + \catcode37 \the\catcode37\relax % (percent) + \catcode40 \the\catcode40\relax % ( + \catcode41 \the\catcode41\relax % ) + \catcode42 \the\catcode42\relax % * + \catcode46 \the\catcode46\relax % . + \catcode58 \the\catcode58\relax % : + \catcode60 \the\catcode60\relax % < + \catcode61 \the\catcode61\relax % = + \catcode62 \the\catcode62\relax % > + \catcode64 \the\catcode64\relax % @ + \catcode91 \the\catcode91\relax % [ + \catcode92 \the\catcode92\relax % \ + \catcode93 \the\catcode93\relax % ] + \catcode123 \the\catcode123\relax % { + \catcode124 \the\catcode124\relax % | + \catcode125 \the\catcode125\relax % } + }% + \endlinechar=-1 % + \catcode32 10 % (space) + \catcode34 12 % " + \catcode35 6 % # + \catcode37 14 % (percent) + \catcode40 12 % ( + \catcode41 12 % ) + \catcode42 12 % * + \catcode46 12 % . + \catcode58 12 % : + \catcode60 12 % < + \catcode61 12 % = + \catcode62 12 % > + \catcode91 12 % [ + \catcode92 0 % \ + \catcode93 12 % ] + \catcode123 1 % { + \catcode124 12 % | + \catcode125 2 % } + \makeatletter +} +\def\Hy@RestoreCatcodeSettings#1{% + \csname Hy@cat@#1\endcsname + \expandafter\let\csname Hy@cat@#1\endcsname\relax +} +\@ifundefined{T@PD1}{% + \Hy@SaveCatcodeSettings{pd1}% + \input{pd1enc.def}% + \Hy@RestoreCatcodeSettings{pd1}% + \HyLinguex@Restore +}{} +\DeclareFontFamily{PD1}{pdf}{} +\DeclareFontShape{PD1}{pdf}{m}{n}{ <-> cmr10 }{} +\DeclareFontSubstitution{PD1}{pdf}{m}{n} +\def\HyPsd@LoadUnicode{% + \@ifundefined{T@PU}{% + \Hy@SaveCatcodeSettings{pu}% + \input{puenc.def}% + \Hy@RestoreCatcodeSettings{pu}% + \HyLinguex@Restore + }{}% + \DeclareFontFamily{PU}{pdf}{}% + \DeclareFontShape{PU}{pdf}{m}{n}{ <-> cmr10 }{}% + \DeclareFontSubstitution{PU}{pdf}{m}{n}% + \HyPsd@LoadExtra + \let\HyPsd@LoadUnicode\relax +} +\def\HyPsd@LoadExtra{% + \ifHy@psdextra + \ltx@iffileloaded{puenc.def}{% + \Hy@SaveCatcodeSettings{psdextra}% + \input{psdextra.def}% + \Hy@RestoreCatcodeSettings{psdextra}% + \let\HyPsd@LoadExtra\relax + }{}% + \fi +} +\def\texorpdfstring{% + \ifHy@pdfstring + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi +} +\@ifundefined{pdfstringdefPreHook}{% + \let\pdfstringdefPreHook\@empty +}{} +\@ifundefined{pdfstringdefPostHook}{% + \let\pdfstringdefPostHook\@gobble +}{} +\def\pdfstringdefDisableCommands{% + \begingroup + \makeatletter + \HyPsd@DisableCommands +} +\long\def\HyPsd@DisableCommands#1{% + \ltx@GlobalAppendToMacro\pdfstringdefPreHook{#1}% + \endgroup +} +\let\HyPsd@pdfstringdefDisableCommands\pdfstringdefDisableCommands +\AtBeginDocument{% + \@ifundefined{pdfstringdefDisableCommands}{% + \let\pdfstringdefDisableCommands\HyPsd@pdfstringdefDisableCommands + }{}% +} +\def\pdfstringdefWarn#1{% + \expandafter\noexpand\csname<>-\string#1\endcsname +} +\begingroup + \catcode0=12 % + \def\x{\endgroup + \def\HyPsd@ignorespaces{% + \romannumeral\expandafter`\expandafter^^@% + \romannumeral`^^@% + }% + }% +\x +\def\HyPsd@BabelPatch{% + \let\HyOrg@languageshorthands\languageshorthands + \let\languageshorthands\HyPsd@LanguageShorthands +} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname pdf@strcmp\endcsname\relax + \let\HyPsd@langshort@system\@empty + \def\HyPsd@LanguageShorthands#1{% + \expandafter\ifx\csname HyPsd@langshort@#1\endcsname + \HyPsd@langshort@system + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {% + \HyOrg@languageshorthands{#1}% + }% + }% +\else + \def\HyPsd@LanguageShorthands#1{% + \ifnum\pdf@strcmp{#1}{system}=\z@ + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {% + \HyOrg@languageshorthands{#1}% + }% + }% +\fi +\def\Hy@temp{% + \@ifpackageloaded{babel}{% + \@ifpackagelater{babel}{2008/03/16}{% + \let\Hy@temp\@empty + }{% + \def\HyPsd@BabelPatch{% + \let\HyOrg@languageshorthands\languageshorthands + }% + }% + }{}% +} +\Hy@temp +\expandafter\Hy@AtBeginDocument\expandafter{\Hy@temp} +\newif\ifHy@next +\ltx@IfUndefined{danish@sh@"@sel}{}{% + \def\HyPsd@babel@danish{% + \declare@shorthand{danish}{"|}{}% + \declare@shorthand{danish}{"~}{-}% + }% +} +\ltx@IfUndefined{dutch@sh@"@sel}{}{% + \def\HyPsd@babel@dutch{% + \declare@shorthand{dutch}{"|}{}% + \declare@shorthand{dutch}{"~}{-}% + }% +} +\ltx@IfUndefined{finnish@sh@"@sel}{}{% + \def\HyPsd@babel@finnish{% + \declare@shorthand{finnish}{"|}{}% + }% +} +\ltx@IfUndefined{french@sh@:@sel}{}{% + \def\HyPsd@babel@frenchb{% + \def\guill@spacing{ }% + }% +} +\ltx@IfUndefined{german@sh@"@sel}{}{% + \def\HyPsd@babel@german{% + \declare@shorthand{german}{"f}{f}% + \declare@shorthand{german}{"|}{}% + \declare@shorthand{german}{"~}{-}% + }% +} +\ltx@IfUndefined{macedonian@sh@"@sel}{}{% + \def\HyPsd@babel@macedonian{% + \declare@shorthand{macedonian}{"|}{}% + \declare@shorthand{macedonian}{"~}{-}% + }% +}{} +\ltx@IfUndefined{ngerman@sh@"@sel}{}{% + \def\HyPsd@babel@ngerman{% + \declare@shorthand{ngerman}{"|}{}% + \declare@shorthand{ngerman}{"~}{-}% + }% +} +\ltx@IfUndefined{portuges@sh@"@sel}{}{% + \def\HyPsd@babel@portuges{% + \declare@shorthand{portuges}{"|}{}% + }% +} +\ltx@IfUndefined{russian@sh@"@sel}{}{% + \def\HyPsd@babel@russian{% + \declare@shorthand{russian}{"|}{}% + \declare@shorthand{russian}{"~}{-}% + }% +} +\ltx@IfUndefined{slovene@sh@"@sel}{}{% + \def\HyPsd@babel@slovene{% + \declare@shorthand{slovene}{"|}{}% + }% +} +\ltx@IfUndefined{spanish@sh@>@sel}{}{% + \def\HyPsd@babel@spanish{% + \declare@shorthand{spanish}{<<}{\guillemotleft}% + \declare@shorthand{spanish}{>>}{\guillemotright}% + \declare@shorthand{spanish}{"=}{-}% + \declare@shorthand{spanish}{"~}{-}% + \declare@shorthand{spanish}{"!}{\textexclamdown}% + \declare@shorthand{spanish}{"?}{\textquestiondown}% + }% +} +\ltx@IfUndefined{swedish@sh@"@sel}{}{% + \def\HyPsd@babel@swedish{% + \declare@shorthand{swedish}{"|}{}% + \declare@shorthand{swedish}{"~}{-}% + }% +} +\ltx@IfUndefined{ukrainian@sh@"@sel}{}{% + \def\HyPsd@babel@ukrainian{% + \declare@shorthand{ukrainian}{"|}{}% + \declare@shorthand{ukrainian}{"~}{-}% + }% +} +\ltx@IfUndefined{usorbian@sh@"@sel}{}{% + \def\HyPsd@babel@usorbian{% + \declare@shorthand{usorbian}{"f}{f}% + \declare@shorthand{usorbian}{"|}{}% + }% +} +\ltx@IfUndefined{greek@sh@\string~@sel}{% + \let\HyPsd@GreekPatch\@empty +}{% + \def\HyPsd@GreekPatch{% + \let\greeknumeral\HyPsd@greeknumeral + \let\Greeknumeral\HyPsd@Greeknumeral + }% +} +\def\HyPsd@greeknumeral#1{% + \HyPsd@GreekNum\@firstoftwo{#1}% +} +\def\HyPsd@Greeknumeral#1{% + \HyPsd@GreekNum\@secondoftwo{#1}% +} +\def\HyPsd@GreekNum#1#2{% + \ifHy@unicode + \ifnum#2<\@ne + \@arabic{#2}% + \else + \ifnum#2<1000000 % + \HyPsd@@GreekNum#1{#2}% + \else + \@arabic{#2}% + \fi + \fi + \else + \@arabic{#2}% + \fi +} +\def\HyPsd@@GreekNum#1#2{% + \ifnum#2<\@m + \ifnum#2<10 % + \expandafter\HyPsd@GreekNumI + \expandafter\@gobble\expandafter#1\number#2% + \else + \ifnum#2<100 % + \expandafter\HyPsd@GreekNumII + \expandafter\@gobble\expandafter#1\number#2% + \else + \expandafter\HyPsd@GreekNumIII + \expandafter\@gobble\expandafter#1\number#2% + \fi + \fi + \ifnum#2>\z@ + \textnumeralsigngreek + \fi + \else + \ifnum#2<\@M + \expandafter\HyPsd@GreekNumIV\expandafter#1\number#2% + \else + \ifnum#2<100000 % + \expandafter\HyPsd@GreekNumV\expandafter#1\number#2% + \else + \expandafter\HyPsd@GreekNumVI\expandafter#1\number#2% + \fi + \fi + \fi +} +\def\HyPsd@GreekNumI#1#2#3{% + #1{% + \ifnum#3>\z@ + \textnumeralsignlowergreek + \fi + }% + \expandafter#2% + \ifcase#3 % + {}{}% + \or\textalpha\textAlpha + \or\textbeta\textBeta + \or\textgamma\textGamma + \or\textdelta\textDelta + \or\textepsilon\textEpsilon + \or\textstigmagreek\textStigmagreek + \or\textzeta\textZeta + \or\texteta\textEta + \or\texttheta\textTheta + \else + {}{}% + \fi +} +\def\HyPsd@GreekNumII#1#2#3#4{% + #1{% + \ifnum#3>\z@ + \textnumeralsignlowergreek + \fi + }% + \expandafter#2% + \ifcase#3 % + {}{}% + \or\textiota\textIota + \or\textkappa\textKappa + \or\textlambda\textLambda + \or\textmu\textMu + \or\textnu\textNu + \or\textxi\textXi + \or\textomicron\textOmicron + \or\textpi\textPi + \or\textkoppagreek\textKoppagreek + \else + {}{}% + \fi + \HyPsd@GreekNumI#1#2#4% +} +\def\HyPsd@GreekNumIII#1#2#3#4#5{% + #1{% + \ifnum#3>\z@ + \textnumeralsignlowergreek + \fi + }% + \expandafter#2% + \ifcase#3 % + {}{}% + \or\textrho\textRho + \or\textsigma\textSigma + \or\texttau\textTau + \or\textupsilon\textUpsilon + \or\textphi\textPhi + \or\textchi\textChi + \or\textpsi\textPsi + \or\textomega\textOmega + \or\textsampigreek\textSampigreek + \else + {}{}% + \fi + \HyPsd@GreekNumII#1#2#4#5% +} +\def\HyPsd@GreekNumIV#1#2#3#4#5{% + \HyPsd@GreekNumI\@firstofone#1#2% + \HyPsd@@GreekNum#1{#3#4#5}% +} +\def\HyPsd@GreekNumV#1#2#3#4#5#6{% + \HyPsd@GreekNumII\@firstofone#1#2#3% + \HyPsd@@GreekNum#1{#4#5#6}% +} +\def\HyPsd@GreekNumVI#1#2#3#4#5#6#7{% + \HyPsd@GreekNumIII\@firstofone#1#2#3#4% + \HyPsd@@GreekNum#1{#5#6#7}% +} +\def\HyPsd@SpanishPatch{% + \ltx@IfUndefined{es@save@dot}{% + }{% + \let\.\es@save@dot + }% +} +\def\HyPsd@RussianPatch{% + \ltx@IfUndefined{russian@sh@"@-@}{% + }{% + \@namedef{russian@sh@"@-@}{-}% + }% +} +\RequirePackage{intcalc}[2007/09/27] +\def\HyPsd@CJKhook{% + \ltx@ifpackageloaded{CJK}{% + \let\CJK@kern\relax + \let\CJKkern\relax + \let\CJK@CJK\relax + \ifHy@CJKbookmarks + \HyPsd@CJKhook@bookmarks + \fi + \HyPsd@CJKhook@unicode + }{}% +} +\begingroup + \catcode"7F=\active + \toks@{% + \let\CJK@ignorespaces\empty + \def\CJK@char#1{\@gobbletwo}% + \let\CJK@charx\@gobblefour + \let\CJK@punctchar\@gobblefour + \def\CJK@punctcharx#1{\@gobblefour}% + \catcode"7F=\active + \def^^7f#1^^7f#2^^7f{% + \string #1\HyPsd@DecimalToOctal{#2}% + }% + % ... ? + \ifHy@unicode + \def\Hy@cjkpu{\80}% + \else + \let\Hy@cjkpu\@empty + \fi + \HyPsd@CJKActiveChars + }% + \count@=127 % + \@whilenum\count@<255 \do{% + \advance\count@ by 1 % + \lccode`\~=\count@ + \lowercase{% + \toks@\expandafter{\the\toks@ ~}% + }% + }% + \toks@\expandafter{\the\toks@ !}% + \xdef\HyPsd@CJKhook@bookmarks{% + \the\toks@ + }% +\endgroup +\def\HyPsd@CJKActiveChars#1{% + \ifx#1!% + \let\HyPsd@CJKActiveChars\relax + \else + \edef#1{\noexpand\Hy@cjkpu\string#1}% + \fi + \HyPsd@CJKActiveChars +} +\def\HyPsd@DecimalToOctal#1{% + \ifcase #1 % + \000\or \001\or \002\or \003\or \004\or \005\or \006\or \007% + \or \010\or \011\or \012\or \013\or \014\or \015\or \016\or \017% + \or \020\or \021\or \022\or \023\or \024\or \025\or \026\or \027% + \or \030\or \031\or \032\or \033\or \034\or \035\or \036\or \037% + \or \040\or \041\or \042\or \043\or \044\or \045\or \046\or \047% + \or \050\or \051\or \052\or \053\or \054\or \055\or \056\or \057% + \or 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7% + \or 8\or 9\or \072\or \073\or \074\or \075\or \076\or \077% + \or @\or A\or B\or C\or D\or E\or F\or G% + \or H\or I\or J\or K\or L\or M\or N\or O% + \or P\or Q\or R\or S\or T\or U\or V\or W% + \or X\or Y\or Z\or \133\or \134\or \135\or \136\or \137% + \or \140\or a\or b\or c\or d\or e\or f\or g% + \or h\or i\or j\or k\or l\or m\or n\or o% + \or p\or q\or r\or s\or t\or u\or v\or w% + \or x\or y\or z\or \173\or \174\or \175\or \176\or \177% + \or \200\or \201\or \202\or \203\or \204\or \205\or \206\or \207% + \or \210\or \211\or \212\or \213\or \214\or \215\or \216\or \217% + \or \220\or \221\or \222\or \223\or \224\or \225\or \226\or \227% + \or \230\or \231\or \232\or \233\or \234\or \235\or \236\or \237% + \or \240\or \241\or \242\or \243\or \244\or \245\or \246\or \247% + \or \250\or \251\or \252\or \253\or \254\or \255\or \256\or \257% + \or \260\or \261\or \262\or \263\or \264\or \265\or \266\or \267% + \or \270\or \271\or \272\or \273\or \274\or \275\or \276\or \277% + \or \300\or \301\or \302\or \303\or \304\or \305\or \306\or \307% + \or \310\or \311\or \312\or \313\or \314\or \315\or \316\or \317% + \or \320\or \321\or \322\or \323\or \324\or \325\or \326\or \327% + \or \330\or \331\or \332\or \333\or \334\or \335\or \336\or \337% + \or \340\or \341\or \342\or \343\or \344\or \345\or \346\or \347% + \or \350\or \351\or \352\or \353\or \354\or \355\or \356\or \357% + \or \360\or \361\or \362\or \363\or \364\or \365\or \366\or \367% + \or \370\or \371\or \372\or \373\or \374\or \375\or \376\or \377% + \fi +} +\def\HyPsd@CJKhook@unicode{% + \let\Unicode\HyPsd@CJK@Unicode + \let\CJKnumber\HyPsd@CJKnumber + \let\CJKdigits\HyPsd@CJKdigits +} +\def\HyPsd@CJK@Unicode#1#2{% + \ifnum#1<256 % + \HyPsd@DecimalToOctalFirst{#1}% + \HyPsd@DecimalToOctalSecond{#2}% + \else + \933% + \expandafter\expandafter\expandafter\HyPsd@HighA + \intcalcDiv{#1}{4}!% + \933% + \ifcase\intcalcMod{#1}{4} % + 4\or 5\or 6\or 7% + \fi + \HyPsd@DecimalToOctalSecond{#2}% + \fi +} +\def\HyPsd@HighA#1!{% + \expandafter\expandafter\expandafter\HyPsd@HighB + \IntCalcDiv#1!64!!% + \expandafter\expandafter\expandafter\HyPsd@HighD + \IntCalcMod#1!64!!% +} +\def\HyPsd@HighB#1!{% + \expandafter\expandafter\expandafter\HyPsd@HighC + \IntCalcDec#1!!% +} +\def\HyPsd@HighC#1!{% + \IntCalcDiv#1!4!% + \@backslashchar + \IntCalcMod#1!4!% +} +\def\HyPsd@HighD#1!{% + \ifcase\IntCalcDiv#1!8! % + 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7% + \fi + \ifcase\IntCalcMod#1!8! % + 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7% + \fi +} +\def\HyPsd@DecimalToOctalFirst#1{% + \9% + \ifcase#1 % + 000\or 001\or 002\or 003\or 004\or 005\or 006\or 007% + \or 010\or 011\or 012\or 013\or 014\or 015\or 016\or 017% + \or 020\or 021\or 022\or 023\or 024\or 025\or 026\or 027% + \or 030\or 031\or 032\or 033\or 034\or 035\or 036\or 037% + \or 040\or 041\or 042\or 043\or 044\or 045\or 046\or 047% + \or 050\or 051\or 052\or 053\or 054\or 055\or 056\or 057% + \or 060\or 061\or 062\or 063\or 064\or 065\or 066\or 067% + \or 070\or 071\or 072\or 073\or 074\or 075\or 076\or 077% + \or 100\or 101\or 102\or 103\or 104\or 105\or 106\or 107% + \or 120\or 111\or 112\or 113\or 114\or 115\or 116\or 117% + \or 120\or 121\or 122\or 123\or 124\or 125\or 126\or 127% + \or 130\or 131\or 132\or 133\or 134\or 135\or 136\or 137% + \or 140\or 141\or 142\or 143\or 144\or 145\or 146\or 147% + \or 150\or 151\or 152\or 153\or 154\or 155\or 156\or 157% + \or 160\or 161\or 162\or 163\or 164\or 165\or 166\or 167% + \or 170\or 171\or 172\or 173\or 174\or 175\or 176\or 177% + \or 200\or 201\or 202\or 203\or 204\or 205\or 206\or 207% + \or 210\or 211\or 212\or 213\or 214\or 215\or 216\or 217% + \or 220\or 221\or 222\or 223\or 224\or 225\or 226\or 227% + \or 230\or 231\or 232\or 233\or 234\or 235\or 236\or 237% + \or 240\or 241\or 242\or 243\or 244\or 245\or 246\or 247% + \or 250\or 251\or 252\or 253\or 254\or 255\or 256\or 257% + \or 260\or 261\or 262\or 263\or 264\or 265\or 266\or 267% + \or 270\or 271\or 272\or 273\or 274\or 275\or 276\or 277% + \or 300\or 301\or 302\or 303\or 304\or 305\or 306\or 307% + \or 310\or 311\or 312\or 313\or 314\or 315\or 316\or 317% + \or 320\or 321\or 322\or 323\or 324\or 325\or 326\or 327% + \or 330\or 331\or 332\or 333\or 334\or 335\or 336\or 337% + \or 340\or 341\or 342\or 343\or 344\or 345\or 346\or 347% + \or 350\or 351\or 352\or 353\or 354\or 355\or 356\or 357% + \or 360\or 361\or 362\or 363\or 364\or 365\or 366\or 367% + \or 370\or 371\or 372\or 373\or 374\or 375\or 376\or 377% + \fi +} +\def\HyPsd@DecimalToOctalSecond#1{% + \ifcase #1 % + \000\or \001\or \002\or \003\or \004\or \005\or \006\or \007% + \or \010\or \011\or \012\or \013\or \014\or \015\or \016\or \017% + \or \020\or \021\or \022\or \023\or \024\or \025\or \026\or \027% + \or \030\or \031\or \032\or \033\or \034\or \035\or \036\or \037% + \or \040\or \041\or \042\or \043\or \044\or \045\or \046\or \047% + \or \050\or \051\or \052\or \053\or \054\or \055\or \056\or \057% + \or \060\or \061\or \062\or \063\or \064\or \065\or \066\or \067% + \or \070\or \071\or \072\or \073\or \074\or \075\or \076\or \077% + \or \100\or \101\or \102\or \103\or \104\or \105\or \106\or \107% + \or \110\or \111\or \112\or \113\or \114\or \115\or \116\or \117% + \or \120\or \121\or \122\or \123\or \124\or \125\or \126\or \127% + \or \130\or \131\or \132\or \133\or \134\or \135\or \136\or \137% + \or \140\or \141\or \142\or \143\or \144\or \145\or \146\or \147% + \or \150\or \151\or \152\or \153\or \154\or \155\or \156\or \157% + \or \160\or \161\or \162\or \163\or \164\or \165\or \166\or \167% + \or \170\or \171\or \172\or \173\or \174\or \175\or \176\or \177% + \or \200\or \201\or \202\or \203\or \204\or \205\or \206\or \207% + \or \210\or \211\or \212\or \213\or \214\or \215\or \216\or \217% + \or \220\or \221\or \222\or \223\or \224\or \225\or \226\or \227% + \or \230\or \231\or \232\or \233\or \234\or \235\or \236\or \237% + \or \240\or \241\or \242\or \243\or \244\or \245\or \246\or \247% + \or \250\or \251\or \252\or \253\or \254\or \255\or \256\or \257% + \or \260\or \261\or \262\or \263\or \264\or \265\or \266\or \267% + \or \270\or \271\or \272\or \273\or \274\or \275\or \276\or \277% + \or \300\or \301\or \302\or \303\or \304\or \305\or \306\or \307% + \or \310\or \311\or \312\or \313\or \314\or \315\or \316\or \317% + \or \320\or \321\or \322\or \323\or \324\or \325\or \326\or \327% + \or \330\or \331\or \332\or \333\or \334\or \335\or \336\or \337% + \or \340\or \341\or \342\or \343\or \344\or \345\or \346\or \347% + \or \350\or \351\or \352\or \353\or \354\or \355\or \356\or \357% + \or \360\or \361\or \362\or \363\or \364\or \365\or \366\or \367% + \or \370\or \371\or \372\or \373\or \374\or \375\or \376\or \377% + \fi +} +\def\HyPsd@CJKnumber#1{% + \ifnum#1<\z@ + \CJK@minus + \expandafter\HyPsd@@CJKnumber\expandafter{\number-\number#1}% + \else + \expandafter\HyPsd@@CJKnumber\expandafter{\number#1}% + \fi +} +\def\HyPsd@@CJKnumber#1{% + \ifcase#1 % + \CJK@zero\or\CJK@one\or\CJK@two\or\CJK@three\or\CJK@four\or + \CJK@five\or\CJK@six\or\CJK@seven\or\CJK@eight\or\CJK@nine\or + \CJK@ten\or\CJK@ten\CJK@one\or\CJK@ten\CJK@two\or + \CJK@ten\CJK@three\or\CJK@ten\CJK@four\or\CJK@ten\CJK@five\or + \CJK@ten\CJK@six\or\CJK@ten\CJK@seven\or\CJK@ten\CJK@eight\or + \CJK@ten\CJK@nine + \else + \ifnum#1<10000 % + \HyPsd@CJKnumberFour#1!\@empty{20}% + \@empty + \else + \ifnum#1<100000000 % + \expandafter\expandafter\expandafter\HyPsd@CJKnumberFour + \IntCalcDiv#1!10000!% + !{}{20}% + \CJK@tenthousand + \expandafter\expandafter\expandafter\HyPsd@CJKnumberFour + \IntCalcMod#1!10000!% + !\CJK@zero{10}% + \@empty + \else + \expandafter\HyPsd@CJKnumberLarge + \number\IntCalcDiv#1!100000000!\expandafter!% + \number\IntCalcMod#1!100000000!!% + \fi + \fi + \fi +} +\def\HyPsd@CJKnumberLarge#1!#2!{% + \HyPsd@CJKnumberFour#1!{}{20}% + \CJK@hundredmillion + \ifnum#2=\z@ + \else + \expandafter\expandafter\expandafter\HyPsd@CJKnumberFour + \IntCalcDiv#2!10000!% + !\CJK@zero{10}% + \CJK@tenthousand + \expandafter\expandafter\expandafter\HyPsd@CJKnumberFour + \IntCalcMod#2!10000!% + !\CJK@zero{10}% + \@empty + \fi +} +\def\HyPsd@CJKnumberFour#1!#2#3{% + \ifnum#1=\z@ + \expandafter\@gobble + \else + \ifnum#1<1000 % + #2% + \HyPsd@CJKnumberThree#1!{}{#3}% + \else + \HyPsd@@CJKnumber{\IntCalcDiv#1!1000!}% + \CJK@thousand + \expandafter\expandafter\expandafter\HyPsd@CJKnumberThree + \IntCalcMod#1!1000!% + !\CJK@zero{10}% + \fi + \fi +} +\def\HyPsd@CJKnumberThree#1!#2#3{% + \ifnum#1=\z@ + \else + \ifnum#1<100 % + #2% + \HyPsd@CJKnumberTwo#1!{}{#3}% + \else + \HyPsd@@CJKnumber{\IntCalcDiv#1!100!}% + \CJK@hundred + \expandafter\expandafter\expandafter\HyPsd@CJKnumberTwo + \IntCalcMod#1!100!% + !\CJK@zero{10}% + \fi + \fi +} +\def\HyPsd@CJKnumberTwo#1!#2#3{% + \ifnum#1=\z@ + \else + \ifnum#1<#3 % + #2% + \HyPsd@@CJKnumber{#1}% + \else + \HyPsd@@CJKnumber{\IntCalcDiv#1!10!}% + \CJK@ten + \ifnum\IntCalcMod#1!10!=\z@ + \else + \HyPsd@@CJKnumber{\IntCalcMod#1!10!}% + \fi + \fi + \fi +} +\def\HyPsd@CJKdigits#1{% + \ifx*#1\relax + \expandafter\HyPsd@@CJKdigits\expandafter\CJK@zero + \else + \HyPsd@@CJKdigits\CJK@null{#1}% + \fi +} +\def\HyPsd@@CJKdigits#1#2{% + \ifx\\#2\\% + \else + \HyPsd@@@CJKdigits#1#2\@nil + \fi +}% +\def\HyPsd@@@CJKdigits#1#2#3\@nil{% + \HyPsd@CJKdigit#1{#2}% + \ifx\\#3\\% + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {% + \HyPsd@@@CJKdigits#1#3\@nil + }% +} +\def\HyPsd@CJKdigit#1#2{% + \ifcase#2 % + #1\or + \CJK@one\or\CJK@two\or\CJK@three\or\CJK@four\or + \CJK@five\or\CJK@six\or\CJK@seven\or\CJK@eight\or\CJK@nine + \fi +} +\def\HyPsd@inmathwarn#1#2{% + \ifx#2\expandafter + \expandafter\ifx\csname\cf@encoding\string#1\endcsname\relax + \HyPsd@GLYPHERR + \expandafter\@gobble\string#1% + >% + \expandafter\expandafter\expandafter\HyPsd@EndWithElse + \else + \expandafter\expandafter\expandafter\HyPsd@GobbleFiFi + \fi + \else + \expandafter#2% + \fi +} +\def\HyPsd@GobbleFiFi#1\fi#2\fi{} +\def\HyPsd@EndWithElse#1\else{\else} +\def\HyPsd@add@accent#1#2{% + \HyPsd@GLYPHERR\expandafter\@gobble\string#1+\string#2>% + #2% +}% +\def\HyPsd@LetUnexpandableSpace#1{% + \expandafter\futurelet\expandafter#1\expandafter\@gobble\space\relax +} +\HyPsd@LetUnexpandableSpace\HyPsd@UnexpandableSpace +\edef\HyPsd@XSPACE{\string#\string X} +\edef\HyPsd@ITALCORR{\string#\string I} +\edef\HyPsd@GLYPHERR{\string#\string G} +\def\HyPsd@hspace#1{\HyPsd@@hspace#1*\END} +\def\HyPsd@@hspace#1*#2\END{% + \ifx\\#2\\% + \HyPsd@hspacetest{#1}% + \else + \expandafter\HyPsd@hspacetest + \fi +} +\def\HyPsd@hspacetest#1{\ifdim#1>\z@\space\fi} +\ltx@IfUndefined{tocsection}{% + \let\HyPsd@AMSclassfix\relax +}{% + \def\HyPsd@AMSclassfix{% + \let\tocpart\HyPsd@tocsection + \let\tocchapter\HyPsd@tocsection + \let\tocappendix\HyPsd@tocsection + \let\tocsection\HyPsd@tocsection + \let\tocsubsection\HyPsd@tocsection + \let\tocsubsubsection\HyPsd@tocsection + \let\tocparagraph\HyPsd@tocsection + }% + \def\HyPsd@tocsection#1#2#3{% + \if @#2@\else\if @#1@\else#1 \fi#2. \fi + #3% + }% +} +\def\HyPsd@href#1#{\@secondoftwo} +\def\HyPsd@ref#1{\HyPsd@@ref#1*\END}% +\def\HyPsd@@ref#1*#2\END{% + \ifx\\#2\\% + \HyPsd@@@ref{#1}% + \else + \expandafter\HyPsd@@@ref + \fi +}% +\def\HyPsd@@@ref#1{% + \expandafter\ifx\csname r@#1\endcsname\relax + ??% + \else + \expandafter\expandafter\expandafter + \@car\csname r@#1\endcsname\@nil + \fi +} +\def\HyPsd@pageref#1{\HyPsd@@pageref#1*\END} +\def\HyPsd@@pageref#1*#2\END{% + \ifx\\#2\\% + \HyPsd@@@pageref{#1}% + \else + \expandafter\HyPsd@@@pageref + \fi +} +\def\HyPsd@@@pageref#1{% + \expandafter\ifx\csname r@#1\endcsname\relax + ??% + \else + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\@car + \expandafter\expandafter\expandafter\@gobble + \csname r@#1\endcsname{}\@nil + \fi +} +\def\HyPsd@nameref#1{\HyPsd@@nameref#1*\END} +\def\HyPsd@@nameref#1*#2\END{% + \ifx\\#2\\% + \HyPsd@@@nameref{#1}% + \else + \expandafter\HyPsd@@@nameref + \fi +} +\def\HyPsd@@@nameref#1{% + \expandafter\ifx\csname r@#1\endcsname\relax + ??% + \else + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\@car + \expandafter\expandafter\expandafter\@gobbletwo + \csname r@#1\endcsname{}{}\@nil + \fi +} +\def\HyPsd@autoref#1{\HyPsd@@autoref#1*\END} +\def\HyPsd@@autoref#1*#2\END{% + \ifx\\#2\\% + \HyPsd@@@autoref{#1}% + \else + \expandafter\HyPsd@@@autoref + \fi +} +\def\HyPsd@@@autoref#1{% + \expandafter\ifx\csname r@#1\endcsname\relax + ??% + \else + \expandafter\expandafter\expandafter\HyPsd@autorefname + \csname r@#1\endcsname{}{}{}{}\@nil + \expandafter\expandafter\expandafter + \@car\csname r@#1\endcsname\@nil + \fi +} +\def\HyPsd@autorefname#1#2#3#4#5\@nil{% + \ifx\\#4\\% + \else + \HyPsd@@autorefname#4.\@nil + \fi +} +\def\HyPsd@@autorefname#1.#2\@nil{% + \ltx@IfUndefined{#1autorefname}{% + \ltx@IfUndefined{#1name}{% + }{% + \csname#1name\endcsname\space + }% + }{% + \csname#1autorefname\endcsname\space + }% +} +\begingroup + \def\x#1#2{% + \endgroup + \let#1\def + \def\HyPsd@DefCommand##1##2##{% + #1% + \expandafter\noexpand + \csname\expandafter\@gobble\string##1\@empty\endcsname + \@gobble + }% + \let#2\let + \def\HyPsd@@LetCommand##1{% + \expandafter\ifx\csname##1\expandafter\endcsname + \csname iftrue\endcsname + \pdfstringdefWarn\let + \expandafter\@gobble + \else + \expandafter\ifx\csname##1\expandafter\endcsname + \csname iffalse\endcsname + \pdfstringdefWarn\let + \expandafter\expandafter\expandafter\@gobble + \else + #2% + \expandafter\noexpand + \csname##1\expandafter\expandafter\expandafter\endcsname + \fi + \fi + }% + }% +\expandafter\x\csname <def>-command\expandafter\endcsname + \csname <let>-command\endcsname +\def\HyPsd@LetCommand#1{% + \expandafter\expandafter\expandafter\HyPsd@@LetCommand + \expandafter\expandafter\expandafter{% + \expandafter\@gobble\string#1\@empty + }% +} +\def\HyPsd@ifnextchar#1{% + \pdfstringdefWarn#1% + \expandafter\@gobbletwo\@gobble +} +\def\HyPsd@protected@testopt#1{% + \pdfstringdefWarn#1% + \@gobbletwo +} +\def\HyPsd@Warning#1{% + \begingroup + \let\space\ltx@space + \Hy@Warning{#1}% + \endgroup +} +\RequirePackage{etexcmds}[2007/09/09] +\ifetex@unexpanded + \expandafter\@secondoftwo +\else + \expandafter\@firstoftwo +\fi +{% + \def\HyPsd@ProtectSpaces#1{% + \iftrue + \expandafter\HyPsd@@ProtectSpacesFi + \expandafter|\expandafter\@empty#1| \HyPsd@End#1% + \fi + }% + \def\HyPsd@@ProtectSpacesFi#1 #2\HyPsd@End#3\fi{% + \fi + \ifx\scrollmode#2\scrollmode + \HyPsd@RemoveMask#1\HyPsd@End#3% + \else + \gdef#3{#1\HyPsd@UnexpandableSpace#2}% + \expandafter\HyPsd@@ProtectSpacesFi#3\HyPsd@End#3% + \fi + }% + \def\HyPsd@RemoveMask|#1|\HyPsd@End#2{% + \toks@\expandafter{#1}% + \xdef#2{\the\toks@}% + }% +}{% + \let\HyPsd@fi\fi + \def\HyPsd@ProtectSpaces#1{% + \xdef#1{% + \iftrue + \expandafter\HyPsd@@ProtectSpacesFi + \expandafter|\expandafter\@empty#1| % + \HyPsd@fi + }% + \expandafter\HyPsd@RemoveMask#1\HyPsd@End#1% + }% + \def\HyPsd@@ProtectSpacesFi#1 #2\HyPsd@fi{% + \fi + \etex@unexpanded{#1}% + \ifx\scrollmode#2\scrollmode + \else + \HyPsd@@ProtectSpacesFi\HyPsd@UnexpandableSpace#2% + \HyPsd@fi + }% + \def\HyPsd@RemoveMask|#1|\HyPsd@End#2{% + \xdef#2{\etex@unexpanded\expandafter{#1}}% + }% +} +\def\HyPsd@RemoveBraces#1{% + \ifx\scrollmode#1\scrollmode + \else + \HyPsd@@RemoveBracesFi#1\HyPsd@End{#1}% + \fi +} +\def\HyPsd@@RemoveBracesFi#1#2\HyPsd@End#3\fi{% + \fi + \def\Hy@temp@A{#1#2}% + \def\Hy@temp@B{#3}% + \ifx\Hy@temp@A\Hy@temp@B + \expandafter\def\expandafter\HyPsd@String\expandafter{% + \HyPsd@String#1% + }% + \ifx\scrollmode#2\scrollmode + \else + \Hy@ReturnAfterFiFiEnd{% + \HyPsd@RemoveBraces{#2}% + }% + \fi + \else + \def\Hy@temp@A{#1}% + \HyPsd@AppendItalcorr\HyPsd@String + \ifx\Hy@temp@A\@empty + \Hy@ReturnAfterElseFiFiEnd{% + \HyPsd@RemoveBraces{#2}% + }% + \else + \HyPsd@ProtectSpaces\Hy@temp@A + \HyPsd@AppendItalcorr\Hy@temp@A + \Hy@ReturnAfterFiFiEnd{% + \expandafter\HyPsd@RemoveBraces\expandafter + {\Hy@temp@A#2}% + }% + \fi + \fi + \Hy@ReturnEnd +} +\def\HyPsd@AppendItalcorr#1{% + \expandafter\HyPsd@@AppendItalcorr\expandafter{\/}#1% +} +\def\HyPsd@@AppendItalcorr#1#2{% + \expandafter\def\expandafter#2\expandafter{#2#1}% +} +\ltx@IfUndefined{directlua}{% +}{% + \expandafter\ifx\csname\endcsname\relax\fi +} +\begingroup + \catcode`\Q=\active + \let Q\ltx@empty + \gdef\HyPsd@CheckCatcodes#1#2\HyPsd@End{% + \global\let\HyPsd@Rest\relax + \ifcat\relax\noexpand#1\relax + \ifx#1\protect + \else + \ifx#1\penalty + \setbox\z@=\hbox{% + \afterassignment\HyPsd@AfterCountRemove + \count@=#2\HyPsd@End + }% + \else + \ifx#1\kern + \setbox\z@=\hbox{% + \afterassignment\HyPsd@AfterDimenRemove + \dimen@=#2\HyPsd@End + }% + \else + \ifx#1\hskip + \setbox\z@=\hbox{% + \afterassignment\HyPsd@AfterSkipRemove + \skip@=#2\HyPsd@End + }% + \else + \HyPsd@CatcodeWarning{#1}% + \fi + \fi + \fi + \fi + \else + \ifcat\noexpand#1\noexpandQ% active character + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter\HyPsd@String + \expandafter\expandafter\expandafter{% + \expandafter\HyPsd@String\string#1% + }% + \else + \ifcat#1A% letter + \expandafter\def\expandafter\HyPsd@String\expandafter{% + \HyPsd@String#1% + }% + \else + \ifcat#1 % SPACE + \expandafter\def\expandafter\HyPsd@String\expandafter{% + \HyPsd@String\HyPsd@SPACEOPTI + }% + \else + \ifcat$#1% + \HyPsd@CatcodeWarning{math shift}% + \else + \ifcat% + \HyPsd@CatcodeWarning{alignment tab}% + \else + \ifcat^#1% + \HyPsd@CatcodeWarning{superscript}% + \else + \ifcat_#1% + \HyPsd@CatcodeWarning{subscript}% + \else + \expandafter\def\expandafter\HyPsd@String\expandafter{% + \HyPsd@String#1% + }% + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \ifx\HyPsd@Rest\relax + \ifx\scrollmode#2\scrollmode + \else + \Hy@ReturnAfterFiFiEnd{% + \HyPsd@CheckCatcodes#2\HyPsd@End + }% + \fi + \else + \ifx\HyPsd@Rest\@empty + \else + \Hy@ReturnAfterFiFiEnd{% + \expandafter\HyPsd@CheckCatcodes\HyPsd@Rest\HyPsd@End + }% + \fi + \fi + \Hy@ReturnEnd + }% +\endgroup +\def\HyPsd@AfterCountRemove#1\HyPsd@End{% + \gdef\HyPsd@Rest{#1}% +} +\def\HyPsd@AfterDimenRemove#1\HyPsd@End{% + \ifdim\ifx\HyPsd@String\@empty\z@\else\dimen@\fi>1ex % + \HyPsd@ReplaceSpaceWarning{\string\kern\space\the\dimen@}% + \gdef\HyPsd@Rest{\HyPsd@UnexpandableSpace #1}% + \else + \ifdim\dimen@=\z@ + \else + \HyPsd@RemoveSpaceWarning{\string\kern\space\the\dimen@}% + \fi + \gdef\HyPsd@Rest{#1}% + \fi +} +\def\HyPsd@AfterSkipRemove#1\HyPsd@End{% + \ifdim\ifx\HyPsd@String\@empty\z@\else\skip@\fi>1ex % + \HyPsd@ReplaceSpaceWarning{\string\hskip\space\the\skip@}% + \gdef\HyPsd@Rest{\HyPsd@UnexpandableSpace #1}% + \else + \ifdim\skip@=\z@ + \else + \HyPsd@RemoveSpaceWarning{\string\kern\space\the\skip@}% + \fi + \gdef\HyPsd@Rest{#1}% + \fi +} +\def\HyPsd@CatcodeWarning#1{% + \HyPsd@Warning{% + Token not allowed in a PDF string (% + \ifHy@unicode + Unicode% + \else + PDFDocEncoding% + \fi + ):% + \MessageBreak removing `\HyPsd@RemoveCmdPrefix#1'% + }% +} +\begingroup + \catcode`\|=0 % + \catcode`\\=12 % + |gdef|HyPsd@RemoveCmdPrefix#1{% + |expandafter|HyPsd@@RemoveCmdPrefix + |string#1|@empty\<>-|@empty|@empty + }% + |gdef|HyPsd@@RemoveCmdPrefix#1\<>-#2|@empty#3|@empty{#1#2}% +|endgroup +\def\HyPsd@RemoveSpaceWarning#1{% + \HyPsd@Warning{% + Token not allowed in a PDF string (% + \ifHy@unicode + Unicode% + \else + PDFDocEncoding% + \fi + ):% + \MessageBreak #1\MessageBreak + removed% + }% +} +\def\HyPsd@ReplaceSpaceWarning#1{% + \HyPsd@Warning{% + Token not allowed in a PDF string (% + \ifHy@unicode + Unicode% + \else + PDFDocEncoding% + \fi + ):% + \MessageBreak #1\MessageBreak + replaced by space% + }% +} +\def\HyPsd@GlyphProcess#1\relax#2\@empty{% + \expandafter\def\expandafter\HyPsd@String\expandafter{% + \HyPsd@String#1% + }% + \ifx\\#2\\% + \else + \ltx@ReturnAfterFi{% + \HyPsd@GlyphProcessWarning#2\@empty + }% + \fi +} +\def\HyPsd@GlyphProcessWarning#1>#2\@empty{% + \HyPsd@@GlyphProcessWarning#1++>% + \HyPsd@GlyphProcess#2\@empty +} +\def\HyPsd@@GlyphProcessWarning#1+#2+#3>{% + \ifx\\#2\\% + \HyPsd@Warning{% + Glyph not defined in % + P\ifHy@unicode U\else D1\fi\space encoding,\MessageBreak + removing `\@backslashchar#1'% + }% + \else + \HyPsd@Warning{% + Composite letter `\@backslashchar#1+#2'\MessageBreak + not defined in P\ifHy@unicode U\else D1\fi\space encoding,% + \MessageBreak + removing `\@backslashchar#1'% + }% + \fi +} +\def\HyPsd@spaceopti#1{ % first space + \ifx\HyPsd@spaceopti#1% + \040% + \else + #1% + \fi +}% +\def\HyPsd@Subst#1#2#3{% + \def\HyPsd@@ReplaceFi##1#1##2\END\fi{% + \fi + ##1% + \ifx\scrollmode##2\scrollmode + \else + #2% + \HyPsd@@ReplaceFi##2\END + \fi + }% + \xdef#3{% + \iftrue + \expandafter\HyPsd@@ReplaceFi#3#1\END + \fi + }% +} +\def\HyPsd@StringSubst#1{% + \expandafter\HyPsd@Subst\expandafter{\string#1}% +} +\begingroup + \lccode`\!=`\%% + \lccode`\|=`\\% + \lccode`\(=`\{% + \lccode`\)=`\}% + \lccode`0=\ltx@zero + \lccode`1=\ltx@zero + \lccode`3=\ltx@zero + \lccode`4=\ltx@zero + \lccode`5=\ltx@zero + \lccode`7=\ltx@zero +\lowercase{\endgroup + \def\HyPsd@EscapeTeX#1{% + \HyPsd@Subst!{|045}#1% + \HyPsd@Subst({|173}#1% + \HyPsd@Subst){|175}#1% + }% +} +\def\HyPsd@doxspace#1{% + \ifx#1\relax\else + \ifx#1.\else + \ifx#1:\else + \ifx#1,\else + \ifx#1;\else + \ifx#1!\else + \ifx#1?\else + \ifx#1/\else + \ifx#1-\else + \ifx#1'\else + \HyPsd@SPACEOPTI + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \fi + #1% +}% +\begingroup + \catcode`\|=0 % + \catcode`\\=12 % + |gdef|HyPsd@ConvertToUnicode#1{% + |xdef#1{% + |expandafter|HyPsd@DoConvert#1|@empty|@empty|@empty + }% + |ifx#1|@empty + |else + |xdef#1{% + \376\377% + #1% + }% + |fi + }% + |gdef|HyPsd@DoConvert#1{% + |ifx#1|@empty + |else + |ltx@ReturnAfterFi{% + |ifx#1\%% + \%% + |expandafter|HyPsd@DoEscape + |else + |HyPsd@Char{#1}% + |expandafter|HyPsd@DoConvert + |fi + }% + |fi + }% + |gdef|HyPsd@DoEscape#1{% + |ifx#19% + |expandafter|HyPsd@GetTwoBytes + |else + |ltx@ReturnAfterFi{% + |ifx#18% + 00% + |expandafter|HyPsd@GetTwoBytes + |else + #1% + |expandafter|HyPsd@GetOneByte + |fi + }% + |fi + }% + |gdef|HyPsd@GetTwoBytes#1\#2#3#4{% + #1\#2#3#4% + |HyPsd@DoConvert + }% + |gdef|HyPsd@GetOneByte#1#2{% + #1#2% + |HyPsd@DoConvert + }% +|endgroup +\def\HyPsd@GetNextTwoTokens#1#2#3\END#4{% + \xdef#4{#4#1#2}% + \HyPsd@@ConvertToUnicode#3\END#4% +} +\begingroup + \catcode0=9 % + \catcode`\^=7 % + \catcode`\^^^=12 % + \def\x{^^^^0000}% +\expandafter\endgroup +\ifx\x\@empty + \def\HyPsd@Char#1{% + \ifnum`#1<128 % + \@backslashchar 000#1% + \else + \ifnum`#1<65536 % + \expandafter\HyPsd@CharTwoByte\number`#1!% + \else + \expandafter\expandafter\expandafter\HyPsd@CharSurrogate + \intcalcSub{`#1}{65536}!% + \fi + \fi + }% + \def\HyPsd@CharTwoByte#1!{% + \expandafter\expandafter\expandafter\HyPsd@CharOctByte + \IntCalcDiv#1!256!!% + \expandafter\expandafter\expandafter\HyPsd@CharOctByte + \IntCalcMod#1!256!!% + }% + \def\HyPsd@CharOctByte#1!{% + \@backslashchar + \IntCalcDiv#1!64!% + \intcalcDiv{\IntCalcMod#1!64!}{8}% + \IntCalcMod#1!8!% + }% + \def\HyPsd@CharSurrogate#1!{% + \@backslashchar 33% + \IntCalcDiv#1!262144!% + \expandafter\expandafter\expandafter\HyPsd@CharOctByte + \intcalcDiv{\IntCalcMod#1!262144!}{1024}!% + \@backslashchar 33% + \expandafter\expandafter\expandafter\IntCalcAdd + \intcalcDiv{\IntCalcMod#1!1024!}{256}!4!% + \expandafter\expandafter\expandafter\HyPsd@CharOctByte + \IntCalcMod#1!256!!% + }% +\else + \def\HyPsd@Char#1{% + \@backslashchar 000#1% + }% +\fi +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname numexpr\endcsname\relax + \let\HyPsd@UTFviii\relax +\else + \begingroup + \lccode`\~=`^^f4\relax + \lowercase{\endgroup + \def\HyPsd@UTFviii{% + \let\UTFviii@two@octets\HyPsd@UTFviii@two + \let\UTFviii@three@octets\HyPsd@UTFviii@three + \let\UTFviii@four@octets\HyPsd@UTFviii@four + \ifx~\HyPsd@UTFviii@ccxliv@undef + \let~\HyPsd@UTFviii@ccxliv@def + \fi + \let\unichar\HyPsd@unichar + }% + }% + \def\HyPsd@UTFviii@ccxliv@undef{\@inpenc@undefined@{utf8}}% + \edef\HyPsd@UTFviii@ccxliv@def{% + \noexpand\UTFviii@four@octets\string ^^f4% + }% + \def\HyPsd@UTFviii@two#1#2{% + \expandafter\HyPsd@UTFviii@@two + \number\dimexpr.25\dimexpr`#1sp\expandafter\relax\expandafter|% + \number`#1\expandafter|% + \number\dimexpr.125\dimexpr`#2sp\expandafter\relax\expandafter|% + \number`#2 \@nil + }% + \def\HyPsd@UTFviii@@two#1|#2|#3|#4\@nil{% + \expandafter\8% + \number\numexpr #1-48\expandafter\relax + \csname\number\numexpr #2-4*#1\relax\expandafter\endcsname + \number\numexpr #3-8*% + \number\dimexpr.125\dimexpr#3sp\relax\relax\expandafter\relax + \number\numexpr #4-8*#3\relax + }% + \def\HyPsd@UTFviii@three#1#2#3{% + \expandafter\HyPsd@UTFviii@@three + \number\dimexpr.25\dimexpr`#1sp\expandafter\relax\expandafter|% + \number`#1\expandafter|% + \number\ifnum\numexpr`#2-128\relax <32 0\else 1\fi\expandafter|% + \number\dimexpr.25\dimexpr`#2sp\expandafter\relax\expandafter|% + \number`#2\expandafter|% + \number\dimexpr.125\dimexpr`#3sp\expandafter\relax\expandafter|% + \number`#3 \@nil + }% + \def\HyPsd@UTFviii@@three#1|#2|#3|#4|#5|#6|#7\@nil{% + \expandafter\9% + \number\numexpr #1-56\expandafter\relax + \number\numexpr 2*(#2-4*#1)+#3\expandafter\relax + \number\numexpr #4 - 32 -\ifcase#3 0\else 8\fi\expandafter\relax + \csname\number\numexpr #5-4*#4\relax\expandafter\endcsname + \number\numexpr #6-16\expandafter\relax + \number\numexpr #7-8*#6\relax + }% + \def\HyPsd@UTFviii@four#1#2{% + \expandafter\HyPsd@@UTFviii@four\number + \numexpr-1+(`#1-240)*4+\dimexpr.0625\dimexpr`#2sp-128sp% + \expandafter|\number + \numexpr`#2-16*\dimexpr.0625\dimexpr`#2sp|% + }% + \def\HyPsd@@UTFviii@four#1|#2|#3{% + \933\number\dimexpr.25\dimexpr#1sp\relax\relax + \csname\number\numexpr#1-4*\dimexpr.25\dimexpr#1sp\endcsname + \ifodd#2 % + \number\numexpr(#2-1)/2\relax + \else + \number\numexpr#2/2\relax + \fi + \number\numexpr\ifodd#2 4+\fi + \dimexpr.0625\dimexpr`#3sp-128sp\relax\relax\relax + \933% + \expandafter\HyPsd@@@UTFviii@four\number + \numexpr`#3-16*\dimexpr.0625\dimexpr`#3sp|% + }% + \def\HyPsd@@@UTFviii@four#1|#2{% + \number\numexpr4+\dimexpr.25\dimexpr#1sp\relax\relax\relax + \csname\number\numexpr#1-4*\dimexpr.25\dimexpr#1sp\endcsname + \number\dimexpr.125\dimexpr`#2sp-128sp\relax\relax + \number\numexpr`#2-8*\dimexpr.125\dimexpr`#2sp\relax\relax\relax + }% + \def\HyPsd@unichar#1{% + \ifHy@unicode + \ifnum#1>"10FFFF % + \HyPsd@UnicodeReplacementCharacter % illegal + \else + \ifnum#1>"FFFF % + \expandafter\HyPsd@unichar\expandafter{% + \number\numexpr 55296+% + \dimexpr.0009765625\dimexpr\number#1sp-\p@ + \relax\relax\relax + }% + \expandafter\HyPsd@unichar\expandafter{% + \number\numexpr#1-9216% + -1024*\dimexpr.0009765625\dimexpr\number#1sp-\p@ + \relax\relax\relax + }% + \else + \ifnum#1>"7FF % + \9% + \expandafter\HyPsd@unichar@first@byte\expandafter{% + \number + \dimexpr.00390625\dimexpr\number#1sp\relax\relax + }% + \else + \8% + \number\dimexpr.00390625\dimexpr\number#1sp\relax\relax + \fi + \expandafter\HyPsd@unichar@second@byte\expandafter{% + \number + \numexpr#1-256*\number + \dimexpr.00390625\dimexpr\number#1sp\relax\relax\relax + }% + \fi + \fi + \else + .% unsupported (Unicode -> PDF Doc Encoding) + \fi + }% + \def\HyPsd@UnicodeReplacementCharacter{\9377\375}% + \def\HyPsd@unichar@first@byte#1{% + \number\dimexpr.015625\dimexpr#1sp\relax\relax + \expandafter\HyPsd@unichar@octtwo\expandafter{% + \number + \numexpr#1-64*\number\dimexpr.015625\dimexpr#1sp% + \relax\relax\relax + }% + }% + \def\HyPsd@unichar@second@byte#1{% + \csname\number\dimexpr.015625\dimexpr#1sp\relax\relax\endcsname + \expandafter\HyPsd@unichar@octtwo\expandafter{% + \number + \numexpr#1-64*\number\dimexpr.015625\dimexpr#1sp% + \relax\relax\relax + }% + }% + \def\HyPsd@unichar@octtwo#1{% + \number\dimexpr.125\dimexpr#1sp\relax\relax + \number\numexpr#1-8*\number\dimexpr.125\dimexpr#1sp% + \relax\relax\relax + }% +\fi +\def\HyPsd@utf@viii@undeferr#1#2#3#4#5#6{% + \ifx\@gobble#1% + \else + [Please insert \textbackslash PrerenderUnicode% + \textbraceleft#1\textbraceright\space + into preamble]% + \fi +}% +\def\HyPsd@DieFace#1{% + \ifHy@unicode + \ifnum#1<1 % + \HyPsd@UnicodeReplacementCharacter + \else + \ifnum#1>6 % + \9046\205% + \expandafter\expandafter\expandafter + \HyPsd@DieFaceLarge\intcalcSub{#1}{6}!% + \else + \9046\20\intcalcDec{#1}% + \fi + \fi + \else + .% Die faces are not part of PDFDocEncoding + \fi +} +\def\HyPsd@DieFaceLarge#1!{% + \ifnum#1>6 % + \expandafter\ltx@firstoftwo + \else + \expandafter\ltx@secondoftwo + \fi + {% + \9046\205% + \expandafter\expandafter\expandafter + \HyPsd@DieFaceLarge\IntCalcSub#1!6!!% + }{% + \9046\20\IntCalcDec#1!% + }% +} +\def\HyPsd@MoonPha#1{% + \ifcase\intcalcNum{#1} % + \HyPsd@UnicodeReplacementCharacter + \or % 1 + \9330\074\9337\032% + \or % 2 + \HyPsd@UnicodeReplacementCharacter + \or % 3 + \9330\074\9337\035% + \or % 4 + \9330\074\9337\034% + \else + \HyPsd@UnicodeReplacementCharacter + \fi +} +\def\HyPsd@ding#1{% + \ifHy@unicode + \ifnum#1<32 % + \HyPsd@UnicodeReplacementCharacter + \else + \ifnum#1>254 % + \HyPsd@UnicodeReplacementCharacter + \else + \ifnum#1<127 % + \expandafter\expandafter\expandafter + \HyPsd@@ding\intcalcNum{#1}!% + \else + \ifnum#1>160 % + \expandafter\expandafter\expandafter + \HyPsd@@ding\intcalcNum{#1}!% + \else + \HyPsd@UnicodeReplacementCharacter + \fi + \fi + \fi + \fi + \else + .% Dingbats are not part of PDFDocEncoding + \fi +} +\def\HyPsd@@ding#1!{% + \ltx@ifundefined{HyPsd@ding@#1}{% + \ifnum#1<127 % + \9047% + \HyPsd@DecimalToOctalSecond{\IntCalcSub#1!32!}% + \else + \ifnum#1<168 % + \9047\14\IntCalcSub#1!160!% + \else + \ifnum#1>181 % + \9047\HyPsd@DecimalToOctalSecond{\IntCalcSub#1!64!}% + \else + % 172..181 -> U+2460..U+2469 + \9044\HyPsd@DecimalToOctalSecond{\IntCalcSub#1!76!}% + \fi + \fi + \fi + }{% + \csname HyPsd@ding@#1\endcsname + }% +} +\@namedef{HyPsd@ding@32}{\space} +\@namedef{HyPsd@ding@37}{\9046\016}% U+260E +\@namedef{HyPsd@ding@42}{\9046\033}% U+261B +\@namedef{HyPsd@ding@43}{\9046\036}% U+261E +\@namedef{HyPsd@ding@72}{\9046\005}% U+2605 +\@namedef{HyPsd@ding@108}{\9045\317}% U+25CF +\@namedef{HyPsd@ding@110}{\9045\240}% U+25A0 +\@namedef{HyPsd@ding@115}{\9045\262}% U+25B2 +\@namedef{HyPsd@ding@116}{\9045\274}% U+25BC +\@namedef{HyPsd@ding@117}{\9045\306}% U+25C6 +\@namedef{HyPsd@ding@119}{\9045\327}% U+25D7 +\@namedef{HyPsd@ding@168}{\textclubsuitblack}% +\@namedef{HyPsd@ding@169}{\textdiamondsuitblack}% +\@namedef{HyPsd@ding@170}{\textheartsuitblack}% +\@namedef{HyPsd@ding@171}{\textspadesuitblack}% +\@namedef{HyPsd@ding@213}{\textrightarrow}% +\@namedef{HyPsd@ding@214}{\textleftrightarrow}% +\@namedef{HyPsd@ding@215}{\textupdownarrow}% +\@namedef{HyPsd@ding@240}{\HyPsd@UnicodeReplacementCharacter} +\@ifclassloaded{memoir}{% + \Hy@AtEndOfPackage{\RequirePackage{memhfixc}}% +}{} +\@ifpackageloaded{subfigure}{% + \ltx@IfUndefined{sub@label}{% + \Hy@hypertexnamesfalse + }{% + \renewcommand*{\sub@label}[1]{% + \@bsphack + \subfig@oldlabel{#1}% + \if@filesw + \begingroup + \edef\@currentlabstr{% + \expandafter\strip@prefix\meaning\@currentlabelname + }% + \protected@write\@auxout{}{% + \string\newlabel{sub@#1}{% + {\@nameuse{@@thesub\@captype}}% + {\thepage}% + {% + \expandafter\strip@period\@currentlabstr + \relax.\relax\@@@% + }% + {\@currentHref}% + {}% + }% + }% + \endgroup + \fi + \@esphack + }% + \@ifpackagelater{subfigure}{2002/03/26}{}{% + \providecommand*{\toclevel@subfigure}{1}% + \providecommand*{\toclevel@subtable}{1}% + }% + }% +}{} +\ltx@IfUndefined{XR@addURL}{% +}{% + \def\XR@addURL#1{\XR@@dURL#1{}{}{}{}\\}% + \def\XR@@dURL#1#2#3#4#5\\{% + {#1}{#2}% + \if!#4!% + \else + {#3}{#4}{\XR@URL}% + \fi + }% +} +\def\Hy@true{true} +\def\Hy@false{false} +\let\literalps@out\@gobble +\newcommand\pdfbookmark[3][]{} +\def\Acrobatmenu#1#2{\leavevmode#2} +\def\Hy@writebookmark#1#2#3#4#5{}% +\let\HyperRaiseLinkHook\@empty +\def\HyperRaiseLinkDefault{\baselineskip} +\newcount\Hy@SavedSpaceFactor +\def\Hy@SaveSpaceFactor{% + \global\Hy@SavedSpaceFactor=\ifhmode\spacefactor\else\z@\fi +} +\def\Hy@RestoreSpaceFactor{% + \relax + \ifhmode + \ifnum\Hy@SavedSpaceFactor>\z@ + \spacefactor=\Hy@SavedSpaceFactor + \fi + \fi +} +\def\Hy@SaveSavedSpaceFactor{% + \edef\Hy@RestoreSavedSpaceFactor{% + \global\Hy@SavedSpaceFactor=\the\Hy@SavedSpaceFactor\relax + }% +} +\def\Hy@raisedlink#1{% + \ifvmode + #1% + \else + \Hy@SaveSpaceFactor + \penalty\@M + \smash{% + \begingroup + \let\HyperRaiseLinkLength\@tempdima + \setlength\HyperRaiseLinkLength\HyperRaiseLinkDefault + \HyperRaiseLinkHook + \expandafter\endgroup + \expandafter\raise\the\HyperRaiseLinkLength\hbox{% + \Hy@RestoreSpaceFactor + #1% + \Hy@SaveSpaceFactor + }% + }% + \Hy@RestoreSpaceFactor + \fi +} +\def\Hy@SaveLastskip{% + \let\Hy@RestoreLastskip\relax + \ifvmode + \ifdim\lastskip=\z@ + \let\Hy@RestoreLastskip\nobreak + \else + \begingroup + \skip@=-\lastskip + \edef\x{% + \endgroup + \def\noexpand\Hy@RestoreLastskip{% + \noexpand\ifvmode + \noexpand\nobreak + \vskip\the\skip@ + \vskip\the\lastskip\relax + \noexpand\fi + }% + }% + \x + \fi + \else + \ifhmode + \ifdim\lastskip=\z@ + \let\Hy@RestoreLastskip\nobreak + \else + \begingroup + \skip@=-\lastskip + \edef\x{% + \endgroup + \def\noexpand\Hy@RestoreLastskip{% + \noexpand\ifhmode + \noexpand\nobreak + \hskip\the\skip@ + \hskip\the\lastskip\relax + \noexpand\fi + }% + }% + \x + \fi + \fi + \fi +}% +\SetupKeyvalOptions{% + family=Hyp,% + prefix=HyOpt% +} +\def\IfHyperBooleanExists#1{% + \ltx@ifundefined{Hy@#1false}\ltx@secondoftwo{% + \ltx@ifundefined{KV@Hyp@#1@default}\ltx@secondoftwo\ltx@firstoftwo + }% +} +\@namedef{KV@Hyp@stoppedearly@default}{} +\def\IfHyperBoolean#1{% + \IfHyperBooleanExists{#1}{% + \csname ifHy@#1\endcsname + \expandafter\ltx@firstoftwo + \else + \expandafter\ltx@secondoftwo + \fi + }\ltx@secondoftwo +} +\def\Hy@boolkey#1#2{% + \edef\Hy@tempa{#2}% + \lowercase\expandafter{% + \expandafter\def\expandafter\Hy@tempa\expandafter{\Hy@tempa}% + }% + \ifx\Hy@tempa\@empty + \let\Hy@tempa\Hy@true + \fi + \ifx\Hy@tempa\Hy@true + \else + \ifx\Hy@tempa\Hy@false + \else + \let\Hy@tempa\relax + \fi + \fi + \ifx\Hy@tempa\relax + \Hy@WarnOptionValue{#2}{#1}{`true' or 'false'}% + \else + \Hy@Info{Option `#1' set `\Hy@tempa'}% + \csname Hy@#1\Hy@tempa\endcsname + \fi +} +\def\Hy@WarnOptionValue#1#2#3{% + \Hy@Warning{% + Unexpected value `#1'\MessageBreak + of option `#2' instead of\MessageBreak + #3% + }% +} +\def\Hy@DisableOption#1{% + \ltx@ifundefined{KV@Hyp@#1@default}{% + \define@key{Hyp}{#1}% + }{% + \define@key{Hyp}{#1}[]% + }% + {\Hy@WarnOptionDisabled{#1}}% +} + +\def\Hy@WarnOptionDisabled#1{% + \Hy@Warning{% + Option `#1' has already been used,\MessageBreak + setting the option has no effect% + }% +} +\def\Hy@CheckOptionValue#1#2#3{% + \begingroup + \edef\x{#1}% + \@onelevel@sanitize\x + \let\y=y% + \def\do##1##2{% + \def\z{##1}% + \@onelevel@sanitize\z + \ifx\x\z + \let\y=n% + \let\do\@gobbletwo + \fi + }% + #3% + \ifx\y y% + \def\do##1##2{% + * `##1'% + \ifx\\##2\\\else\space(##2)\fi + \MessageBreak + }% + \Hy@Warning{% + Values of option `#2':\MessageBreak + #3% + * An empty value disables the option.\MessageBreak + Unknown value `\x'% + }% + \fi + \endgroup +} +\def\Hy@DefNameKey#1{% + \expandafter\Hy@@DefNameKey\csname @#1\endcsname{#1}% +} +\def\Hy@@DefNameKey#1#2#3{% + \define@key{Hyp}{#2}{% + \edef#1{##1}% + \ifx#1\@empty + \else + \Hy@CheckOptionValue{##1}{#2}{#3}% + \fi + }% + \let#1\@empty +} +\def\Hy@UseNameKey#1#2{% + \ifx#2\@empty + \else + /#1/#2% + \fi +} +\define@key{Hyp}{implicit}[true]{% + \Hy@boolkey{implicit}{#1}% +} +\define@key{Hyp}{draft}[true]{% + \Hy@boolkey{draft}{#1}% +} +\define@key{Hyp}{final}[true]{% + \Hy@boolkey{final}{#1}% +} +\let\KV@Hyp@nolinks\KV@Hyp@draft +\def\Hy@ObsoletePaperOption#1{% + \Hy@WarningNoLine{% + Option `#1' is no longer used% + }% + \define@key{Hyp}{#1}[true]{}% +} +\def\Hy@temp#1{% + \define@key{Hyp}{#1}[true]{% + \Hy@ObsoletePaperOption{#1}% + }% +} +\Hy@temp{a4paper} +\Hy@temp{a5paper} +\Hy@temp{b5paper} +\Hy@temp{letterpaper} +\Hy@temp{legalpaper} +\Hy@temp{executivepaper} +\define@key{Hyp}{setpagesize}[true]{% + \Hy@boolkey{setpagesize}{#1}% +} +\define@key{Hyp}{debug}[true]{% + \Hy@boolkey{debug}{#1}% +} +\define@key{Hyp}{linktocpage}[true]{% + \Hy@boolkey{linktocpage}{#1}% + \ifHy@linktocpage + \let\Hy@linktoc\Hy@linktoc@page + \else + \let\Hy@linktoc\Hy@linktoc@section + \fi +} +\chardef\Hy@linktoc@none=0 % +\chardef\Hy@linktoc@section=1 % +\chardef\Hy@linktoc@page=2 % +\chardef\Hy@linktoc@all=3 % +\ifHy@linktocpage + \let\Hy@linktoc\Hy@linktoc@page +\else + \let\Hy@linktoc\Hy@linktoc@section +\fi +\define@key{Hyp}{linktoc}{% + \@ifundefined{Hy@linktoc@#1}{% + \Hy@Warning{% + Unexpected value `#1' of\MessageBreak + option `linktoc' instead of `none',\MessageBreak + `section', `page' or `all'% + }% + }{% + \expandafter\let\expandafter\Hy@linktoc + \csname Hy@linktoc@#1\endcsname + }% +} +\define@key{Hyp}{extension}{\def\XR@ext{#1}} +\let\XR@ext\relax +\define@key{Hyp}{verbose}[true]{% + \Hy@boolkey{verbose}{#1}% +} +\define@key{Hyp}{typexml}[true]{% + \Hy@boolkey{typexml}{#1}% +} +\define@key{Hyp}{raiselinks}[true]{% + \Hy@boolkey{raiselinks}{#1}% +} +\def\Hy@setbreaklinks#1{% + \csname breaklinks#1\endcsname +} +\def\Hy@breaklinks@unsupported{% + \ifx\Hy@setbreaklinks\@gobble + \ifHy@breaklinks + \Hy@WarningNoLine{% + You have enabled option `breaklinks'.\MessageBreak + But driver `\Hy@driver.def' does not suppport this.\MessageBreak + Expect trouble with the link areas of broken links% + }% + \fi + \fi +} +\define@key{Hyp}{breaklinks}[true]{% + \Hy@boolkey{breaklinks}{#1}% + \let\Hy@setbreaklinks\@gobble +} +\define@key{Hyp}{localanchorname}[true]{% + \Hy@boolkey{localanchorname}{#1}% +} +\define@key{Hyp}{pageanchor}[true]{% + \Hy@boolkey{pageanchor}{#1}% +} +\define@key{Hyp}{plainpages}[true]{% + \Hy@boolkey{plainpages}{#1}% +} +\define@key{Hyp}{naturalnames}[true]{% + \Hy@boolkey{naturalnames}{#1}% +} +\define@key{Hyp}{hypertexnames}[true]{% + \Hy@boolkey{hypertexnames}{#1}% +} +\define@key{Hyp}{nesting}[true]{% + \Hy@boolkey{nesting}{#1}% +} +\define@key{Hyp}{destlabel}[true]{% + \Hy@boolkey{destlabel}{#1}% +} +\define@key{Hyp}{unicode}[true]{% + \Hy@boolkey{unicode}{#1}% + \ifHy@unicode + \def\HyPsd@pdfencoding{unicode}% + \HyPsd@LoadUnicode + \else + \def\HyPsd@pdfencoding{pdfdoc}% + \fi +} +\Hy@AtBeginDocument{% + \ifx\HyPsd@LoadUnicode\relax + \else + \def\HyPsd@LoadUnicode{% + \Hy@Error{% + Unicode support for bookmarks is not available.\MessageBreak + Activate unicode support by using one of the options\MessageBreak + `unicode', `pdfencoding=unicode', `pdfencoding=auto'\MessageBreak + in the preamble% + }\@ehc + \global\let\HyPsd@LoadUnicode\relax + \global\Hy@unicodefalse + \global\let\Hy@unicodetrue\Hy@unicodefalse + }% + \fi +} +\define@key{Hyp}{pdfencoding}{% + \edef\HyPsd@temp{#1}% + \ifx\HyPsd@temp\HyPsd@pdfencoding@pdfdoc + \let\HyPsd@pdfencoding\HyPsd@temp + \Hy@unicodefalse + \else + \ifcase\ifx\HyPsd@temp\HyPsd@pdfencoding@unicode + \z@ + \else + \ifx\HyPsd@temp\HyPsd@pdfencoding@auto + \z@ + \else + \@ne + \fi + \fi + \let\HyPsd@pdfencoding\HyPsd@temp + \hypersetup{unicode}% + \ifHy@unicode + \def\HyPsd@pdfencoding{#1}% + \ifx\HyPsd@pdfencoding\HyPsd@pdfencoding@auto + \HyPsd@LoadStringEnc + \fi + \else + \Hy@Warning{Cannot switch to unicode bookmarks}% + \let\HyPsd@pdfencoding\HyPsd@pdfencoding@pdfdoc + \fi + \else + \@onelevel@sanitize\HyPsd@temp + \Hy@Warning{% + Values of option `pdfencoding':\MessageBreak + `pdfdoc', `unicode', `auto'.\MessageBreak + Ignoring unknown value `\HyPsd@temp'% + }% + \fi + \fi +} +\def\HyPsd@pdfencoding@auto{auto} +\def\HyPsd@pdfencoding@pdfdoc{pdfdoc} +\def\HyPsd@pdfencoding@unicode{unicode} +\let\HyPsd@pdfencoding\Hy@pdfencoding@pdfdoc +\def\HyPsd@LoadStringEnc{% + \RequirePackage{stringenc}[2009/12/15]% + \let\HyPsd@LoadStringEnc\relax +} +\Hy@AtBeginDocument{% + \@ifpackageloaded{stringenc}{% + \let\HyPsd@LoadStringEnc\relax + }{% + \def\HyPsd@LoadStringEnc{% + \Hy@WarningNoLine{% + Missing package `stringenc'. Use `pdfencoding=auto'\MessageBreak + in the preamble or load the package there% + }% + }% + }% +} +\define@key{Hyp}{psdextra}[true]{% + \Hy@boolkey{psdextra}{#1}% + \HyPsd@LoadExtra +} +\def\hypersetup{\kvsetkeys{Hyp}} +\newif\ifHy@setpdfversion +\define@key{Hyp}{pdfversion}{% + \@ifundefined{Hy@pdfversion@#1}{% + \PackageWarning{hyperref}{% + Unsupported PDF version `#1'.\MessageBreak + Valid values: 1.2 until 1.9% + }% + }{% + \Hy@setpdfversiontrue + \edef\Hy@pdfversion{\@nameuse{Hy@pdfversion@#1}}% + }% +} +\@namedef{Hy@pdfversion@1.2}{2}% +\@namedef{Hy@pdfversion@1.3}{3}% +\@namedef{Hy@pdfversion@1.4}{4}% +\@namedef{Hy@pdfversion@1.5}{5}% +\@namedef{Hy@pdfversion@1.6}{6}% +\@namedef{Hy@pdfversion@1.7}{7}% +\@namedef{Hy@pdfversion@1.8}{8}% +\@namedef{Hy@pdfversion@1.9}{9}% +\def\Hy@pdfversion{5} +\newif\ifHy@DviMode +\let\Hy@DviErrMsg\ltx@empty +\ifpdf + \def\Hy@DviErrMsg{pdfTeX or LuaTeX is running in PDF mode}% +\else + \ifxetex + \def\Hy@DviErrMsg{XeTeX is running}% + \else + \ifvtex + \ifnum\OpMode=\z@ + \Hy@DviModetrue + \else + \def\Hy@DviErrMsg{VTeX is running, but not in DVI mode}% + \fi + \else + \Hy@DviModetrue + \fi + \fi +\fi +\def\HyOpt@CheckDvi#1{% + \ifHy@DviMode + \expandafter\ltx@firstofone + \else + \Hy@Error{% + Wrong DVI mode driver option `#1',\MessageBreak + because \Hy@DviErrMsg + }\@ehc + \expandafter\ltx@gobble + \fi +} +\DeclareVoidOption{tex4ht}{% + \Hy@texhttrue + \kvsetkeys{Hyp}{colorlinks=true}% + \def\BeforeTeXIVht{\RequirePackage{color}}% + \def\Hy@driver{htex4ht}% + \def\MaybeStopEarly{% + \Hy@Message{Stopped early}% + \Hy@AtBeginDocument{% + \PDF@FinishDoc + \gdef\PDF@FinishDoc{}% + }% + \endinput + }% +} +\DeclareVoidOption{pdftex}{% + \ifpdf + \def\Hy@driver{hpdftex}% + \PassOptionsToPackage{pdftex}{color}% + \else + \Hy@Error{% + Wrong driver option `pdftex',\MessageBreak + because pdfTeX in PDF mode is not detected% + }\@ehc + \fi +} +\DeclareVoidOption{luatex}{% + \ifpdf + \ifx\pdfextension\@undefined + \def\Hy@driver{hpdftex}% + \PassOptionsToPackage{pdftex}{color}% + \else + \def\Hy@driver{hluatex}% + \PassOptionsToPackage{luatex}{color}% + \fi + \else + \Hy@Error{% + Wrong driver option `luatex',\MessageBreak + because luaTeX in PDF mode is not detected% + }\@ehc + \fi +} +\DeclareVoidOption{nativepdf}{% + \HyOpt@CheckDvi{nativepdf}{% + \def\Hy@driver{hdvips}% + \PassOptionsToPackage{dvips}{color}% + }% +} +\DeclareVoidOption{dvipdfm}{% + \HyOpt@CheckDvi{dvipdfm}{% + \def\Hy@driver{hdvipdfm}% + }% +} +\DeclareVoidOption{dvipdfmx}{% + \HyOpt@CheckDvi{dvipdfmx}{% + \def\Hy@driver{hdvipdfm}% + \PassOptionsToPackage{dvipdfmx}{color}% + }% +} +\define@key{Hyp}{dvipdfmx-outline-open}[true]{% + \expandafter\ifx\csname if#1\expandafter\endcsname + \csname iftrue\endcsname + \chardef\SpecialDvipdfmxOutlineOpen\@ne + \else + \chardef\SpecialDvipdfmxOutlineOpen\z@ + \fi +} +\DeclareVoidOption{xetex}{% + \ifxetex + \def\Hy@driver{hxetex}% + \else + \Hy@Error{% + Wrong driver option `xetex',\MessageBreak + because XeTeX is not detected% + }\@ehc + \fi +} +\DeclareVoidOption{pdfmark}{% + \HyOpt@CheckDvi{pdfmark}{% + \def\Hy@driver{hdvips}% + }% +} +\DeclareVoidOption{dvips}{% + \HyOpt@CheckDvi{dvips}{% + \def\Hy@driver{hdvips}% + \PassOptionsToPackage{dvips}{color}% + }% +} +\DeclareVoidOption{hypertex}{% + \HyOpt@CheckDvi{hypertex}{% + \def\Hy@driver{hypertex}% + }% +} +\let\Hy@MaybeStopNow\relax +\DeclareVoidOption{vtex}{% + \ifvtex + \ifnum 0\ifnum\OpMode<1 1\fi \ifnum\OpMode>3 1\fi =0 % + \def\Hy@driver{hvtex}% + \else + \ifnum\OpMode=10\relax + \def\Hy@driver{hvtexhtm}% + \def\MaybeStopEarly{% + \Hy@Message{Stopped early}% + \Hy@AtBeginDocument{% + \PDF@FinishDoc + \gdef\PDF@FinishDoc{}% + }% + \endinput + }% + \else + \Hy@Error{% + Wrong driver option `vtex',\MessageBreak + because of wrong OpMode (\the\OpMode)% + }\@ehc + \fi + \fi + \else + \Hy@Error{% + Wrong driver option `vtex',\MessageBreak + because VTeX is not running% + }\@ehc + \fi +} +\DeclareVoidOption{vtexpdfmark}{% + \ifvtex + \ifnum 0\ifnum\OpMode<1 1\fi \ifnum\OpMode>3 1\fi =0 % + \def\Hy@driver{hvtexmrk}% + \else + \Hy@Error{% + Wrong driver option `vtexpdfmark',\MessageBreak + because of wrong OpMode (\the\OpMode)% + }\@ehc + \fi + \else + \Hy@Error{% + Wrong driver option `vtexpdfmark,\MessageBreak + because VTeX is not running% + }\@ehc + \fi +} +\DeclareVoidOption{dviwindo}{% + \HyOpt@CheckDvi{dviwindo}{% + \def\Hy@driver{hdviwind}% + \kvsetkeys{Hyp}{colorlinks}% + \PassOptionsToPackage{dviwindo}{color}% + }% +} +\DeclareVoidOption{dvipsone}{% + \HyOpt@CheckDvi{dvipsone}{% + \def\Hy@driver{hdvipson}% + \PassOptionsToPackage{dvipsone}{color}% + }% +} +\DeclareVoidOption{textures}{% + \HyOpt@CheckDvi{textures}{% + \def\Hy@driver{htexture}% + }% +} +\DeclareVoidOption{latex2html}{% + \HyOpt@CheckDvi{latex2html}{% + \Hy@AtBeginDocument{\@@latextohtmlX}% + }% +} +\DeclareVoidOption{ps2pdf}{% + \HyOpt@CheckDvi{ps2pdf}{% + \def\Hy@driver{hdvips}% + \PassOptionsToPackage{dvips}{color}% + }% +} +\let\HyOpt@DriverFallback\ltx@empty +\define@key{Hyp}{driverfallback}{% + \ifHy@DviMode + \def\HyOpt@DriverFallback{#1}% + \Hy@Match\HyOpt@DriverFallback{}{% + ^(|dvipdfm|dvipdfmx|dvips|dvipsone|dviwindo|hypertex|ps2pdf|% + latex2html|tex4ht)$% + }{}{% + \Hy@Warning{% + Invalid driver `#1' for option\MessageBreak + `driverfallback'% + }% + \let\HyOpt@DriverFallback\ltx@empty + }% + \fi +} +\let\HyOpt@CustomDriver\ltx@empty +\define@key{Hyp}{customdriver}{% + \IfFileExists{#1.def}{% + \def\HyOpt@CustomDriver{#1}% + }{% + \Hy@Warning{% + Missing driver file `#1.def',\MessageBreak + ignoring custom driver% + }% + }% +} +\define@key{Hyp}{hyperfigures}[true]{% + \Hy@boolkey{hyperfigures}{#1}% +} +\define@key{Hyp}{hyperfootnotes}[true]{% + \Hy@boolkey{hyperfootnotes}{#1}% +} +\def\back@none{none} +\def\back@section{section} +\def\back@page{page} +\def\back@slide{slide} +\define@key{Hyp}{backref}[section]{% + \lowercase{\def\Hy@tempa{#1}}% + \ifx\Hy@tempa\@empty + \let\Hy@tempa\back@section + \fi + \ifx\Hy@tempa\Hy@false + \let\Hy@tempa\back@none + \fi + \ifx\Hy@tempa\back@slide + \let\Hy@tempa\back@section + \fi + \ifx\Hy@tempa\back@page + \PassOptionsToPackage{hyperpageref}{backref}% + \Hy@backreftrue + \else + \ifx\Hy@tempa\back@section + \PassOptionsToPackage{hyperref}{backref}% + \Hy@backreftrue + \else + \ifx\Hy@tempa\back@none + \Hy@backreffalse + \else + \Hy@WarnOptionValue{#1}{backref}{% + `section', `slide', `page', `none',\MessageBreak + or `false'}% + \fi + \fi + \fi +} +\define@key{Hyp}{pagebackref}[true]{% + \edef\Hy@tempa{#1}% + \lowercase\expandafter{% + \expandafter\def\expandafter\Hy@tempa\expandafter{\Hy@tempa}% + }% + \ifx\Hy@tempa\@empty + \let\Hy@tempa\Hy@true + \fi + \ifx\Hy@tempa\Hy@true + \PassOptionsToPackage{hyperpageref}{backref}% + \Hy@backreftrue + \else + \ifx\Hy@tempa\Hy@false + \Hy@backreffalse + \else + \Hy@WarnOptionValue{#1}{pagebackref}{`true' or `false'}% + \fi + \fi +} +\define@key{Hyp}{hyperindex}[true]{% + \Hy@boolkey{hyperindex}{#1}% +} +\define@key{Hyp}{encap}[\|]{% + \def\HyInd@EncapChar{#1}% +} +\def\HyLang@afrikaans{% + \def\equationautorefname{Vergelyking}% + \def\footnoteautorefname{Voetnota}% + \def\itemautorefname{Item}% + \def\figureautorefname{Figuur}% + \def\tableautorefname{Tabel}% + \def\partautorefname{Deel}% + \def\appendixautorefname{Bylae}% + \def\chapterautorefname{Hoofstuk}% + \def\sectionautorefname{Afdeling}% + \def\subsectionautorefname{Subafdeling}% + \def\subsubsectionautorefname{Subsubafdeling}% + \def\paragraphautorefname{Paragraaf}% + \def\subparagraphautorefname{Subparagraaf}% + \def\FancyVerbLineautorefname{Lyn}% + \def\theoremautorefname{Teorema}% + \def\pageautorefname{Bladsy}% +} +\def\HyLang@english{% + \def\equationautorefname{Equation}% + \def\footnoteautorefname{footnote}% + \def\itemautorefname{item}% + \def\figureautorefname{Figure}% + \def\tableautorefname{Table}% + \def\partautorefname{Part}% + \def\appendixautorefname{Appendix}% + \def\chapterautorefname{chapter}% + \def\sectionautorefname{section}% + \def\subsectionautorefname{subsection}% + \def\subsubsectionautorefname{subsubsection}% + \def\paragraphautorefname{paragraph}% + \def\subparagraphautorefname{subparagraph}% + \def\FancyVerbLineautorefname{line}% + \def\theoremautorefname{Theorem}% + \def\pageautorefname{page}% +} +\def\HyLang@french{% + \def\equationautorefname{\'Equation}% + \def\footnoteautorefname{note}% + \def\itemautorefname{item}% + \def\figureautorefname{Figure}% + \def\tableautorefname{Tableau}% + \def\partautorefname{Partie}% + \def\appendixautorefname{Appendice}% + \def\chapterautorefname{chapitre}% + \def\sectionautorefname{section}% + \def\subsectionautorefname{sous-section}% + \def\subsubsectionautorefname{sous-sous-section}% + \def\paragraphautorefname{paragraphe}% + \def\subparagraphautorefname{sous-paragraphe}% + \def\FancyVerbLineautorefname{ligne}% + \def\theoremautorefname{Th\'eor\`eme}% + \def\pageautorefname{page}% +} +\def\HyLang@german{% + \def\equationautorefname{Gleichung}% + \def\footnoteautorefname{Fu\ss note}% + \def\itemautorefname{Punkt}% + \def\figureautorefname{Abbildung}% + \def\tableautorefname{Tabelle}% + \def\partautorefname{Teil}% + \def\appendixautorefname{Anhang}% + \def\chapterautorefname{Kapitel}% + \def\sectionautorefname{Abschnitt}% + \def\subsectionautorefname{Unterabschnitt}% + \def\subsubsectionautorefname{Unterunterabschnitt}% + \def\paragraphautorefname{Absatz}% + \def\subparagraphautorefname{Unterabsatz}% + \def\FancyVerbLineautorefname{Zeile}% + \def\theoremautorefname{Theorem}% + \def\pageautorefname{Seite}% +} +\def\HyLang@italian{% + \def\equationautorefname{Equazione}% + \def\footnoteautorefname{nota}% + \def\itemautorefname{punto}% + \def\figureautorefname{Figura}% + \def\tableautorefname{Tabella}% + \def\partautorefname{Parte}% + \def\appendixautorefname{Appendice}% + \def\chapterautorefname{Capitolo}% + \def\sectionautorefname{sezione}% + \def\subsectionautorefname{sottosezione}% + \def\subsubsectionautorefname{sottosottosezione}% + \def\paragraphautorefname{paragrafo}% + \def\subparagraphautorefname{sottoparagrafo}% + \def\FancyVerbLineautorefname{linea}% + \def\theoremautorefname{Teorema}% + \def\pageautorefname{Pag.\@}% +} +\def\HyLang@magyar{% + \def\equationautorefname{Egyenlet}% + \def\footnoteautorefname{l\'abjegyzet}% + \def\itemautorefname{Elem}% + \def\figureautorefname{\'Abra}% + \def\tableautorefname{T\'abl\'azat}% + \def\partautorefname{R\'esz}% + \def\appendixautorefname{F\"uggel\'ek}% + \def\chapterautorefname{fejezet}% + \def\sectionautorefname{szakasz}% + \def\subsectionautorefname{alszakasz}% + \def\subsubsectionautorefname{alalszakasz}% + \def\paragraphautorefname{bekezd\'es}% + \def\subparagraphautorefname{albekezd\'es}% + \def\FancyVerbLineautorefname{sor}% + \def\theoremautorefname{T\'etel}% + \def\pageautorefname{oldal}% +} +\def\HyLang@portuges{% + \def\equationautorefname{Equa\c c\~ao}% + \def\footnoteautorefname{Nota de rodap\'e}% + \def\itemautorefname{Item}% + \def\figureautorefname{Figura}% + \def\tableautorefname{Tabela}% + \def\partautorefname{Parte}% + \def\appendixautorefname{Ap\^endice}% + \def\chapterautorefname{Cap\'itulo}% + \def\sectionautorefname{Se\c c\~ao}% + \def\subsectionautorefname{Subse\c c\~ao}% + \def\subsubsectionautorefname{Subsubse\c c\~ao}% + \def\paragraphautorefname{par\'agrafo}% + \def\subparagraphautorefname{subpar\'agrafo}% + \def\FancyVerbLineautorefname{linha}% + \def\theoremautorefname{Teorema}% + \def\pageautorefname{P\'agina}% +} +\def\HyLang@russian{% + \def\equationautorefname{\cyr\cyrv\cyrery\cyrr.}% + \def\footnoteautorefname{% + \cyr\cyrp\cyro\cyrd\cyrs\cyrt\cyrr.\ \cyrp\cyrr\cyri\cyrm.% + }% + \def\itemautorefname{\cyr\cyrp.}% + \def\figureautorefname{\cyr\cyrr\cyri\cyrs.}% + \def\tableautorefname{\cyr\cyrt\cyra\cyrb\cyrl.}% + \def\partautorefname{\cyr\cyrch.}% + \def\chapterautorefname{\cyr\cyrg\cyrl.}% + \def\sectionautorefname{\cyr\cyrr\cyra\cyrz\cyrd.}% + \def\appendixautorefname{\cyr\cyrp\cyrr\cyri\cyrl.}% + \def\subsectionautorefname{\cyr\cyrr\cyra\cyrz\cyrd.}% + \def\subsubsectionautorefname{\cyr\cyrr\cyra\cyrz\cyrd.}% + \def\paragraphautorefname{\cyr\cyrp.}% + \def\subparagraphautorefname{\cyr\cyrp.}% + \def\FancyVerbLineautorefname{\cyr\cyrs\cyrt\cyrr.}% + \def\theoremautorefname{\cyr\cyrt\cyre\cyro\cyrr.}% + \def\pageautorefname{\cyr\cyrs.}% +} +\def\HyLang@spanish{% + \def\equationautorefname{Ecuaci\'on}% + \def\footnoteautorefname{Nota a pie de p\'agina}% + \def\itemautorefname{Elemento}% + \def\figureautorefname{Figura}% + \def\tableautorefname{Tabla}% + \def\partautorefname{Parte}% + \def\appendixautorefname{Ap\'endice}% + \def\chapterautorefname{Cap\'itulo}% + \def\sectionautorefname{Secci\'on}% + \def\subsectionautorefname{Subsecci\'on}% + \def\subsubsectionautorefname{Subsubsecci\'on}% + \def\paragraphautorefname{P\'arrafo}% + \def\subparagraphautorefname{Subp\'arrafo}% + \def\FancyVerbLineautorefname{L\'inea}% + \def\theoremautorefname{Teorema}% + \def\pageautorefname{P\'agina}% +} +\def\HyLang@catalan{% +\def\equationautorefname{Equaci\'o}% +\def\footnoteautorefname{Nota al peu de p\`agina}% +\def\itemautorefname{Element}% +\def\figureautorefname{Figura}% +\def\tableautorefname{Taula}% +\def\partautorefname{Part}% +\def\appendixautorefname{Ap\`endix}% +\def\chapterautorefname{Cap\'itol}% +\def\sectionautorefname{Secci\'o}% +\def\subsectionautorefname{Subsecci\'o}% +\def\subsubsectionautorefname{Subsubsecci\'o}% +\def\paragraphautorefname{Par\`agraf}% +\def\subparagraphautorefname{Subpar\`agraf}% +\def\FancyVerbLineautorefname{L\'inia}% +\def\theoremautorefname{Teorema}% +\def\pageautorefname{P\`agina}% +} +\def\HyLang@vietnamese{% + \def\equationautorefname{Ph\uhorn{}\ohorn{}ng tr\`inh}% + \def\footnoteautorefname{Ch\'u th\'ich}% + \def\itemautorefname{m\d{u}c}% + \def\figureautorefname{H\`inh}% + \def\tableautorefname{B\h{a}ng}% + \def\partautorefname{Ph\`\acircumflex{}n}% + \def\appendixautorefname{Ph\d{u} l\d{u}c}% + \def\chapterautorefname{ch\uhorn{}\ohorn{}ng}% + \def\sectionautorefname{m\d{u}c}% + \def\subsectionautorefname{m\d{u}c}% + \def\subsubsectionautorefname{m\d{u}c}% + \def\paragraphautorefname{\dj{}o\d{a}n}% + \def\subparagraphautorefname{\dj{}o\d{a}n}% + \def\FancyVerbLineautorefname{d\`ong}% + \def\theoremautorefname{\DJ{}\d{i}nh l\'y}% + \def\pageautorefname{Trang}% +} +\def\HyLang@greek{% + \def\equationautorefname{\textEpsilon\textxi\acctonos\textiota\textsigma\textomega\textsigma\texteta}% + \def\footnoteautorefname{\textupsilon\textpi\textomicron\textsigma\texteta\textmu\textepsilon\acctonos\textiota\textomega\textsigma\texteta}% + \def\itemautorefname{\textalpha\textnu\texttau\textiota\textkappa\textepsilon\acctonos\textiota\textmu\textepsilon\textnu\textomicron}% + \def\figureautorefname{\textSigma\textchi\acctonos\texteta\textmu\textalpha}% + \def\tableautorefname{\textPi\acctonos\textiota\textnu\textalpha\textkappa\textalpha}% + \def\partautorefname{\textMu\acctonos\textepsilon\textrho\textomicron\textvarsigma}% + \def\appendixautorefname{\textPi\textalpha\textrho\acctonos\textalpha\textrho\texttau\texteta\textmu\textalpha}% + \def\chapterautorefname{\textkappa\textepsilon\textphi\acctonos\textalpha\textlambda\textalpha\textiota\textomicron}% + \def\sectionautorefname{\textepsilon\textnu\acctonos\textomicron\texttau\texteta\texttau\textalpha}% + \def\subsectionautorefname{\textupsilon\textpi\textomicron\textepsilon\textnu\acctonos\textomicron\texttau\texteta\texttau\textalpha}% + \def\subsubsectionautorefname{\textupsilon\textpi\textomicron-\textupsilon\textpi\textomicron\textepsilon\textnu\acctonos\textomicron\texttau\texteta\texttau\textalpha}% + \def\paragraphautorefname{\textpi\textalpha\textrho\acctonos\textalpha\textgamma\textrho\textalpha\textphi\textomicron\textvarsigma}% + \def\subparagraphautorefname{\textupsilon\textpi\textomicron\textpi\textalpha\textrho\acctonos\textalpha\textgamma\textrho\textalpha\textphi\textomicron\textvarsigma}% + \def\FancyVerbLineautorefname{\textgamma\textrho\textalpha\textmu\textmu\acctonos\texteta}% + \def\theoremautorefname{\textTheta\textepsilon\acctonos\textomega\textrho\texteta\textmu\textalpha}% + \def\pageautorefname{\textsigma\textepsilon\textlambda\acctonos\textiota\textdelta\textalpha}% +} +\def\HyLang@dutch{% + \def\equationautorefname{Vergelijking}% + \def\footnoteautorefname{voetnoot}% + \def\itemautorefname{punt}% + \def\figureautorefname{Figuur}% + \def\tableautorefname{Tabel}% + \def\partautorefname{Deel}% + \def\appendixautorefname{Bijlage}% + \def\chapterautorefname{hoofdstuk}% + \def\sectionautorefname{paragraaf}% + \def\subsectionautorefname{deelparagraaf}% + \def\subsubsectionautorefname{deel-deelparagraaf}% + \def\paragraphautorefname{alinea}% + \def\subparagraphautorefname{deelalinea}% + \def\FancyVerbLineautorefname{regel}% + \def\theoremautorefname{Stelling}% + \def\pageautorefname{pagina}% +} +\def\HyLang@addto#1#2{% + #2% + \@temptokena{#2}% + \ifx#1\relax + \let#1\@empty + \fi + \ifx#1\@undefined + \edef#1{\the\@temptokena}% + \else + \toks@\expandafter{#1}% + \edef#1{\the\toks@\the\@temptokena}% + \fi + \@temptokena{}\toks@\@temptokena +} +\def\HyLang@DeclareLang#1#2#3{% + \@ifpackagewith{babel}{#1}{% + \expandafter\HyLang@addto + \csname extras#1\expandafter\endcsname + \csname HyLang@#2\endcsname + \begingroup + \edef\x{\endgroup + #3% + }% + \x + \@namedef{HyLang@#1@done}{}% + }{}% + \begingroup + \edef\x##1##2{% + \noexpand\ifx##2\relax + \errmessage{No definitions for language #2' found!}% + \noexpand\fi + \endgroup + \noexpand\define@key{Hyp}{#1}[]{% + \noexpand\@ifundefined{HyLang@#1@done}{% + \noexpand\HyLang@addto{\noexpand##1}{\noexpand##2}% + #3% + \noexpand\@namedef{HyLang@#1@done}{}% + }{}% + }% + }% + \expandafter\x\csname extras#1\expandafter\endcsname + \csname HyLang@#2\endcsname +} +\HyLang@DeclareLang{english}{english}{} +\HyLang@DeclareLang{UKenglish}{english}{} +\HyLang@DeclareLang{british}{english}{} +\HyLang@DeclareLang{USenglish}{english}{} +\HyLang@DeclareLang{american}{english}{} +\HyLang@DeclareLang{german}{german}{} +\HyLang@DeclareLang{austrian}{german}{} +\HyLang@DeclareLang{ngerman}{german}{} +\HyLang@DeclareLang{naustrian}{german}{} +\HyLang@DeclareLang{russian}{russian}{\noexpand\hypersetup{unicode}} +\HyLang@DeclareLang{brazil}{portuges}{} +\HyLang@DeclareLang{brazilian}{portuges}{} +\HyLang@DeclareLang{portuguese}{portuges}{} +\HyLang@DeclareLang{spanish}{spanish}{} +\HyLang@DeclareLang{catalan}{catalan}{} +\HyLang@DeclareLang{afrikaans}{afrikaans}{} +\HyLang@DeclareLang{french}{french}{} +\HyLang@DeclareLang{frenchb}{french}{} +\HyLang@DeclareLang{francais}{french}{} +\HyLang@DeclareLang{acadian}{french}{} +\HyLang@DeclareLang{canadien}{french}{} +\HyLang@DeclareLang{italian}{italian}{} +\HyLang@DeclareLang{magyar}{magyar}{} +\HyLang@DeclareLang{hungarian}{magyar}{} +\HyLang@DeclareLang{greek}{greek}{} +\HyLang@DeclareLang{dutch}{dutch}{} +\DeclareVoidOption{vietnamese}{% + \HyLang@addto\extrasvietnamese\HyLang@vietnamese + \Hy@AtEndOfPackage{% + \@ifundefined{T@PU}{}{% + \input{puvnenc.def}% + }% + }% +} +\DeclareVoidOption{vietnam}{% + \HyLang@addto\extrasvietnam\HyLang@vietnamese + \Hy@AtEndOfPackage{% + \@ifundefined{T@PU}{}{% + \input{puvnenc.def}% + }% + }% +} +\DeclareVoidOption{arabic}{% + \Hy@AtEndOfPackage{% + \@ifundefined{T@PU}{}{% + \input{puarenc.def}% + }% + }% +} +\define@key{Hyp}{colorlinks}[true]{% + \Hy@boolkey{colorlinks}{#1}% +} +\DeclareVoidOption{hidelinks}{% + \Hy@colorlinksfalse + \Hy@ocgcolorlinksfalse + \Hy@frenchlinksfalse + \def\Hy@colorlink##1{\begingroup}% + \def\Hy@endcolorlink{\endgroup}% + \def\@pdfborder{0 0 0}% + \let\@pdfborderstyle\ltx@empty +} +\define@key{Hyp}{ocgcolorlinks}[true]{% + \Hy@boolkey{ocgcolorlinks}{#1}% +} +\Hy@AtBeginDocument{% + \begingroup + \@ifundefined{OBJ@OCG@view}{% + \ifHy@ocgcolorlinks + \Hy@Warning{% + Driver does not support `ocgcolorlinks',\MessageBreak + using `colorlinks' instead% + }% + \fi + }{}% + \endgroup +} +\define@key{Hyp}{frenchlinks}[true]{% + \Hy@boolkey{frenchlinks}{#1}% +} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname chapter\endcsname\relax + \def\toclevel@part{0}% +\else + \def\toclevel@part{-1}% +\fi +\def\toclevel@chapter{0} +\def\toclevel@section{1} +\def\toclevel@subsection{2} +\def\toclevel@subsubsection{3} +\def\toclevel@paragraph{4} +\def\toclevel@subparagraph{5} +\def\toclevel@figure{0} +\def\toclevel@table{0} +\@ifpackageloaded{listings}{% + \providecommand*\theHlstlisting{\thelstlisting}% + \providecommand*\toclevel@lstlisting{0}% +}{} +\@ifpackageloaded{listing}{% + \providecommand*\theHlisting{\thelisting}% + \providecommand*\toclevel@listing{0}% +}{} +\define@key{Hyp}{bookmarks}[true]{% + \Hy@boolkey{bookmarks}{#1}% +} +\define@key{Hyp}{bookmarksopen}[true]{% + \Hy@boolkey{bookmarksopen}{#1}% +} +\let\Hy@bookmarksdepth\c@tocdepth +\define@key{Hyp}{bookmarksdepth}[]{% + \begingroup + \edef\x{#1}% + \ifx\x\empty + \global\let\Hy@bookmarksdepth\c@tocdepth + \else + \@ifundefined{toclevel@\x}{% + \@onelevel@sanitize\x + \edef\y{\expandafter\@car\x\@nil}% + \ifcase 0\expandafter\ifx\y-1\fi + \expandafter\ifnum\expandafter`\y>47 % + \expandafter\ifnum\expandafter`\y<58 1\fi\fi\relax + \Hy@Warning{Unknown document division name (\x)}% + \else + \setbox\z@=\hbox{% + \count@=\x + \xdef\Hy@bookmarksdepth{\the\count@}% + }% + \fi + }{% + \setbox\z@=\hbox{% + \count@=\csname toclevel@\x\endcsname + \xdef\Hy@bookmarksdepth{\the\count@}% + }% + }% + \fi + \endgroup +} +\define@key{Hyp}{bookmarksopenlevel}{% + \def\@bookmarksopenlevel{#1}% +} +\def\@bookmarksopenlevel{\maxdimen} +\define@key{Hyp}{bookmarkstype}{% + \def\Hy@bookmarkstype{#1}% +} +\def\Hy@bookmarkstype{toc} +\define@key{Hyp}{bookmarksnumbered}[true]{% + \Hy@boolkey{bookmarksnumbered}{#1}% +} +\define@key{Hyp}{CJKbookmarks}[true]{% + \Hy@boolkey{CJKbookmarks}{#1}% +} +\def\Hy@temp#1{% + \expandafter\Hy@@temp\csname @#1color\endcsname{#1}% +} +\def\Hy@@temp#1#2#3{% + \define@key{Hyp}{#2color}{% + \HyColor@HyperrefColor{##1}#1% + }% + \def#1{#3}% +} +\Hy@temp{link}{red} +\Hy@temp{anchor}{black} +\Hy@temp{cite}{green} +\Hy@temp{file}{cyan} +\Hy@temp{url}{magenta} +\Hy@temp{menu}{red} +\Hy@temp{run}{\@filecolor} +\define@key{Hyp}{pagecolor}{% + \Hy@WarningPageColor +} +\def\Hy@WarningPageColor{% + \Hy@WarningNoLine{Option `pagecolor' is not available anymore}% + \global\let\Hy@WarningPageColor\relax +} +\define@key{Hyp}{allcolors}{% + \HyColor@HyperrefColor{#1}\@linkcolor + \HyColor@HyperrefColor{#1}\@anchorcolor + \HyColor@HyperrefColor{#1}\@citecolor + \HyColor@HyperrefColor{#1}\@filecolor + \HyColor@HyperrefColor{#1}\@urlcolor + \HyColor@HyperrefColor{#1}\@menucolor + \HyColor@HyperrefColor{#1}\@runcolor +} +\def\hyperbaseurl#1{\def\@baseurl{#1}} +\define@key{Hyp}{baseurl}{\hyperbaseurl{#1}} +\let\@baseurl\@empty +\def\hyperlinkfileprefix#1{\def\Hy@linkfileprefix{#1}} +\define@key{Hyp}{linkfileprefix}{\hyperlinkfileprefix{#1}} +\hyperlinkfileprefix{file:} +\let\@pdfpagetransition\relax +\define@key{Hyp}{pdfpagetransition}{% + \def\@pdfpagetransition{#1}% +} +\let\@pdfpageduration\relax +\define@key{Hyp}{pdfpageduration}{% + \def\@pdfpageduration{#1}% + \Hy@Match\@pdfpageduration{}{% + ^(|[0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+)$% + }{}{% + \Hy@Warning{% + Invalid value `\@pdfpageduration'\MessageBreak + of option `pdfpageduration'\MessageBreak + is replaced by an empty value% + }% + \let\@pdfpageduration\ltx@empty + }% +} +\newif\ifHy@useHidKey +\Hy@useHidKeyfalse +\define@key{Hyp}{pdfpagehidden}[true]{% + \Hy@boolkey{pdfpagehidden}{#1}% + \ifHy@pdfpagehidden + \global\Hy@useHidKeytrue + \fi +} +\def\Hy@ColorList{cite,file,link,menu,run,url} +\@for\Hy@temp:=\Hy@ColorList\do{% + \edef\Hy@temp{% + \noexpand\define@key{Hyp}{\Hy@temp bordercolor}{% + \noexpand\HyColor@HyperrefBorderColor + {##1}% + \expandafter\noexpand\csname @\Hy@temp bordercolor\endcsname + {hyperref}% + {\Hy@temp bordercolor}% + }% + }% + \Hy@temp +} +\define@key{Hyp}{pagebordercolor}{% + \Hy@WarningPageBorderColor +} +\def\Hy@WarningPageBorderColor{% + \Hy@WarningNoLine{Option `pagebordercolor' is not available anymore}% + \global\let\Hy@WarningPageBorderColor\relax +} +\define@key{Hyp}{allbordercolors}{% + \def\Hy@temp##1##2{% + \HyColor@HyperrefBorderColor{#1}##1{hyperref}{##2bordercolor}% + }% + \Hy@temp\@citebordercolor{cite}% + \Hy@temp\@filebordercolor{file}% + \Hy@temp\@linkbordercolor{link}% + \Hy@temp\@menubordercolor{menu}% + \Hy@temp\@runbordercolor{run}% + \Hy@temp\@urlbordercolor{url}% +} +\define@key{Hyp}{pdfhighlight}{\def\@pdfhighlight{#1}} +\Hy@DefNameKey{pdfhighlight}{% + \do{/I}{Invert}% + \do{/N}{None}% + \do{/O}{Outline}% + \do{/P}{Push}% +} +\def\Hy@setpdfhighlight{% + \ifx\@pdfhighlight\@empty + \else + /H\@pdfhighlight + \fi +} +\define@key{Hyp}{pdfborder}{% + \let\Hy@temp\@pdfborder + \def\@pdfborder{#1}% + \Hy@Match\@pdfborder{}{% + ^\HyPat@NonNegativeReal/ % + \HyPat@NonNegativeReal/ % + \HyPat@NonNegativeReal/% + ( ?\[\HyPat@NonNegativeReal/( \HyPat@NonNegativeReal/)*])?$% + }{}{% + \Hy@Warning{% + Invalid value `\@pdfborder'\MessageBreak + for option `pdfborder'.\MessageBreak + Option setting is ignored% + }% + \let\@pdfborder\Hy@temp + }% +} +\define@key{Hyp}{pdfborderstyle}{% + \let\Hy@temp\@pdfborderstyle + \def\@pdfborderstyle{#1}% + \Hy@Match\@pdfborderstyle{}{% + ^% + ( */Type */Border% + | */W +\HyPat@NonNegativeReal/% + | */S */[SDBIU]% + | */D *\[ *(\HyPat@NonNegativeReal/( \HyPat@NonNegativeReal/)?)?]% + )* *$% + }{}{% + \Hy@Warning{% + Invalid value `\@pdfborderstyle'\MessageBreak + for option `pdfborderstyle'.\MessageBreak + Option setting is ignored% + }% + \let\@pdfborderstyle\Hy@temp + }% +} +\def\Hy@setpdfborder{% + \ifx\@pdfborder\@empty + \else + /Border[\@pdfborder]% + \fi + \ifx\@pdfborderstyle\@empty + \else + /BS<<\@pdfborderstyle>>% + \fi +} +\Hy@DefNameKey{pdfpagemode}{% + \do{UseNone}{}% + \do{UseOutlines}{}% + \do{UseThumbs}{}% + \do{FullScreen}{}% + \do{UseOC}{PDF 1.5}% + \do{UseAttachments}{PDF 1.6}% +} +\Hy@DefNameKey{pdfnonfullscreenpagemode}{% + \do{UseNone}{}% + \do{UseOutlines}{}% + \do{UseThumbs}{}% + \do{FullScreen}{}% + \do{UseOC}{PDF 1.5}% + \do{UseAttachments}{PDF 1.6}% +} +\Hy@DefNameKey{pdfdirection}{% + \do{L2R}{Left to right}% + \do{R2L}{Right to left}% +} +\Hy@DefNameKey{pdfviewarea}{% + \do{MediaBox}{}% + \do{CropBox}{}% + \do{BleedBox}{}% + \do{TrimBox}{}% + \do{ArtBox}{}% +} +\Hy@DefNameKey{pdfviewclip}{% + \do{MediaBox}{}% + \do{CropBox}{}% + \do{BleedBox}{}% + \do{TrimBox}{}% + \do{ArtBox}{}% +} +\Hy@DefNameKey{pdfprintarea}{% + \do{MediaBox}{}% + \do{CropBox}{}% + \do{BleedBox}{}% + \do{TrimBox}{}% + \do{ArtBox}{}% +} +\Hy@DefNameKey{pdfprintclip}{% + \do{MediaBox}{}% + \do{CropBox}{}% + \do{BleedBox}{}% + \do{TrimBox}{}% + \do{ArtBox}{}% +} +\Hy@DefNameKey{pdfprintscaling}{% + \do{AppDefault}{}% + \do{None}{}% +} +\Hy@DefNameKey{pdfduplex}{% + \do{Simplex}{}% + \do{DuplexFlipShortEdge}{}% + \do{DuplexFlipLongEdge}{}% +} +\Hy@DefNameKey{pdfpicktraybypdfsize}{% + \do{true}{}% + \do{false}{}% +} +\define@key{Hyp}{pdfprintpagerange}{% + \def\@pdfprintpagerange{#1}% +} +\Hy@DefNameKey{pdfnumcopies}{% + \do{2}{two copies}% + \do{3}{three copies}% + \do{4}{four copies}% + \do{5}{five copies}% +} +\define@key{Hyp}{pdfusetitle}[true]{% + \Hy@boolkey{pdfusetitle}{#1}% +} +\def\HyXeTeX@CheckUnicode{% + \ifxetex + \ifHy@unicode + \else + \Hy@WarningNoLine{% + XeTeX driver only supports unicode.\MessageBreak + Enabling option `unicode'% + }% + \kvsetkeys{Hyp}{unicode}% + \fi + \else + \let\HyXeTeX@CheckUnicode\relax + \fi +} +\def\HyPsd@PrerenderUnicode#1{% + \begingroup + \expandafter\ifx\csname PrerenderUnicode\endcsname\relax + \else + \sbox0{% + \let\GenericInfo\@gobbletwo + \let\GenericWarning\@gobbletwo + \let\GenericError\@gobblefour + \PrerenderUnicode{#1}% + }% + \fi + \endgroup +} +\define@key{Hyp}{pdftitle}{% + \HyXeTeX@CheckUnicode + \HyPsd@XeTeXBigCharstrue + \HyPsd@PrerenderUnicode{#1}% + \pdfstringdef\@pdftitle{#1}% +} +\define@key{Hyp}{pdfauthor}{% + \HyXeTeX@CheckUnicode + \HyPsd@XeTeXBigCharstrue + \HyPsd@PrerenderUnicode{#1}% + \pdfstringdef\@pdfauthor{#1}% +} +\define@key{Hyp}{pdfproducer}{% + \HyXeTeX@CheckUnicode + \HyPsd@XeTeXBigCharstrue + \HyPsd@PrerenderUnicode{#1}% + \pdfstringdef\@pdfproducer{#1}% +} +\define@key{Hyp}{pdfcreator}{% + \HyXeTeX@CheckUnicode + \HyPsd@XeTeXBigCharstrue + \HyPsd@PrerenderUnicode{#1}% + \pdfstringdef\@pdfcreator{#1}% +} +\define@key{Hyp}{addtopdfcreator}{% + \HyXeTeX@CheckUnicode + \HyPsd@XeTeXBigCharstrue + \HyPsd@PrerenderUnicode{#1}% + \pdfstringdef\@pdfcreator{\@pdfcreator, #1}% +} +\define@key{Hyp}{pdfcreationdate}{% + \begingroup + \Hy@unicodefalse + \pdfstringdef\@pdfcreationdate{#1}% + \endgroup +} +\define@key{Hyp}{pdfmoddate}{% + \begingroup + \Hy@unicodefalse + \pdfstringdef\@pdfmoddate{#1}% + \endgroup +} +\define@key{Hyp}{pdfsubject}{% + \HyXeTeX@CheckUnicode + \HyPsd@XeTeXBigCharstrue + \HyPsd@PrerenderUnicode{#1}% + \pdfstringdef\@pdfsubject{#1}% +} +\define@key{Hyp}{pdfkeywords}{% + \HyXeTeX@CheckUnicode + \HyPsd@XeTeXBigCharstrue + \HyPsd@PrerenderUnicode{#1}% + \pdfstringdef\@pdfkeywords{#1}% +} +\define@key{Hyp}{pdftrapped}{% + \lowercase{\edef\Hy@temp{#1}}% + \ifx\Hy@temp\HyInfo@trapped@true + \def\@pdftrapped{True}% + \else + \ifx\Hy@temp\HyInfo@trapped@false + \def\@pdftrapped{False}% + \else + \ifx\Hy@temp\HyInfo@trapped@unknown + \def\@pdftrapped{Unknown}% + \else + \ifx\Hy@temp\@empty + \else + \Hy@Warning{% + Unsupported value `#1'\MessageBreak + for option `pdftrapped'% + }% + \fi + \def\@pdftrapped{}% + \fi + \fi + \fi +} +\def\HyInfo@trapped@true{true} +\def\HyInfo@trapped@false{false} +\def\HyInfo@trapped@unknown{unknown} +\def\HyInfo@TrappedUnsupported{% + \ifx\@pdftrapped\@empty + \else + \Hy@WarningNoLine{`pdftrapped' is not supported by this driver}% + \gdef\HyInfo@TrappedUnsupported{}% + \fi +} +\define@key{Hyp}{pdfinfo}{% + \kvsetkeys{pdfinfo}{#1}% +} +\def\Hy@temp#1{% + \lowercase{\Hy@temp@A{#1}}{#1}% +} +\def\Hy@temp@A#1#2{% + \define@key{pdfinfo}{#2}{% + \hypersetup{pdf#1={##1}}% + }% +} +\Hy@temp{Title} +\Hy@temp{Author} +\Hy@temp{Keywords} +\Hy@temp{Subject} +\Hy@temp{Creator} +\Hy@temp{Producer} +\Hy@temp{CreationDate} +\Hy@temp{ModDate} +\Hy@temp{Trapped} +\newif\ifHyInfo@AddonUnsupported +\kv@set@family@handler{pdfinfo}{% + \HyInfo@AddonHandler{#1}{#2}% +} +\let\HyInfo@do\relax +\def\HyInfo@AddonHandler#1#2{% + \ifx\kv@value\relax + \Hy@Warning{% + Option `pdfinfo': ignoring key `\kv@key' without value% + }% + \else + \EdefEscapeName\HyInfo@KeyEscaped{\kv@key}% + \EdefUnescapeName\HyInfo@Key{\HyInfo@KeyEscaped}% + \expandafter\ifx\csname KV@pdfinfo@\HyInfo@Key\endcsname\relax + \ifHyInfo@AddonUnsupported + \Hy@Warning{% + This driver does not support additional\MessageBreak + information entries, therefore\MessageBreak + `\kv@key' is ignored% + }% + \else + \def\HyInfo@tmp##1{% + \kv@define@key{pdfinfo}{##1}{% + \HyXeTeX@CheckUnicode + \HyPsd@XeTeXBigCharstrue + \HyPsd@PrerenderUnicode{####1}% + \pdfstringdef\HyInfo@Value{####1}% + \global\expandafter + \let\csname HyInfo@Value@##1\endcsname + \HyInfo@Value + }% + }% + \expandafter\HyInfo@tmp\expandafter{\HyInfo@Key}% + \global\expandafter + \let\csname KV@pdfinfo@\HyInfo@Key\expandafter\endcsname + \csname KV@pdfinfo@\HyInfo@Key\endcsname + \xdef\HyInfo@AddonList{% + \HyInfo@AddonList + \HyInfo@do{\HyInfo@Key}% + }% + \kv@parse@normalized{% + \HyInfo@Key={#2}% + }{% + \kv@processor@default{pdfinfo}% + }% + \fi + \else + \kv@parse@normalized{% + \HyInfo@Key={#2}% + }{% + \kv@processor@default{pdfinfo}% + }% + \fi + \fi +} +\def\HyInfo@GenerateAddons{% + \ifHyInfo@AddonUnsupported + \def\HyInfo@Addons{}% + \else + \begingroup + \toks@{}% + \def\HyInfo@do##1{% + \EdefEscapeName\HyInfo@Key{##1}% + \edef\x{% + \toks@{% + \the\toks@ + /\HyInfo@Key(\csname HyInfo@Value@##1\endcsname)% + }% + }% + \x + }% + \HyInfo@AddonList + \edef\x{\endgroup + \def\noexpand\HyInfo@Addons{\the\toks@}% + }% + \x + \fi +} +\global\let\HyInfo@AddonList\ltx@empty +\define@key{Hyp}{pdfview}{\calculate@pdfview#1 \\} +\define@key{Hyp}{pdflinkmargin}{\setpdflinkmargin{#1}} +\let\setpdflinkmargin\@gobble +\def\calculate@pdfview#1 #2\\{% + \def\@pdfview{#1}% + \ifx\\#2\\% + \def\@pdfviewparams{ -32768}% + \else + \def\@pdfviewparams{ #2}% + \fi +} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname numexpr\endcsname\relax + \def\Hy@number#1{% + \expandafter\@firstofone\expandafter{\number#1}% + }% +\else + \def\Hy@number#1{% + \the\numexpr#1\relax + }% +\fi +\define@key{Hyp}{pdfstartpage}{% + \ifx\\#1\\% + \let\@pdfstartpage\ltx@empty + \else + \edef\@pdfstartpage{\Hy@number{#1}}% + \fi +}% +\define@key{Hyp}{pdfstartview}{% + \ifx\\#1\\% + \let\@pdfstartview\ltx@empty + \else + \hypercalcbpdef\@pdfstartview{/#1}% + \fi +} +\def\HyPat@NonNegativeReal/{% + \ *([0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+) *% +} +\define@key{Hyp}{pdfremotestartview}{% + \ifx\\#1\\% + \def\@pdfremotestartview{/Fit}% + \else + \hypercalcbpdef\@pdfremotestartview{#1}% + \edef\@pdfremotestartview{\@pdfremotestartview}% + \Hy@Match\@pdfremotestartview{}{% + ^(XYZ(% + ()| % + (null|-?\HyPat@NonNegativeReal/) % + (null|-?\HyPat@NonNegativeReal/) % + (null|\HyPat@NonNegativeReal/)% + )|% end of "XYZ" + Fit(% + ()|% + B|% + (H|V|BH|BV)(% + ()| % + (null|\HyPat@NonNegativeReal/)% + )|% + R % + \HyPat@NonNegativeReal/ % + \HyPat@NonNegativeReal/ % + \HyPat@NonNegativeReal/ % + \HyPat@NonNegativeReal/% + )% end of "Fit" + )$% + }{}{% + \Hy@Warning{% + Invalid value `\@pdfremotestartview'\MessageBreak + of `pdfremotestartview'\MessageBreak + is replaced by `Fit'% + }% + \let\@pdfremotestartview\@empty + }% + \ifx\@pdfremotestartview\@empty + \def\@pdfremotestartview{/Fit}% + \else + \edef\@pdfremotestartview{/\@pdfremotestartview}% + \fi + \fi +} +\define@key{Hyp}{pdfpagescrop}{\edef\@pdfpagescrop{#1}} +\define@key{Hyp}{pdftoolbar}[true]{% + \Hy@boolkey{pdftoolbar}{#1}% +} +\define@key{Hyp}{pdfmenubar}[true]{% + \Hy@boolkey{pdfmenubar}{#1}% +} +\define@key{Hyp}{pdfwindowui}[true]{% + \Hy@boolkey{pdfwindowui}{#1}% +} +\define@key{Hyp}{pdffitwindow}[true]{% + \Hy@boolkey{pdffitwindow}{#1}% +} +\define@key{Hyp}{pdfcenterwindow}[true]{% + \Hy@boolkey{pdfcenterwindow}{#1}% +} +\define@key{Hyp}{pdfdisplaydoctitle}[true]{% + \Hy@boolkey{pdfdisplaydoctitle}{#1}% +} +\define@key{Hyp}{pdfa}[true]{% + \Hy@boolkey{pdfa}{#1}% +} +\define@key{Hyp}{pdfnewwindow}[true]{% + \def\Hy@temp{#1}% + \ifx\Hy@temp\@empty + \Hy@pdfnewwindowsetfalse + \else + \Hy@pdfnewwindowsettrue + \Hy@boolkey{pdfnewwindow}{#1}% + \fi +} +\def\Hy@SetNewWindow{% + \ifHy@pdfnewwindowset + /NewWindow % + \ifHy@pdfnewwindow true\else false\fi + \fi +} +\Hy@DefNameKey{pdfpagelayout}{% + \do{SinglePage}{}% + \do{OneColumn}{}% + \do{TwoColumnLeft}{}% + \do{TwoColumnRight}{}% + \do{TwoPageLeft}{PDF 1.5}% + \do{TwoPageRight}{PDF 1.5}% +} +\define@key{Hyp}{pdflang}{% + \edef\@pdflang{#1}% + \def\Hy@temp{\relax}% + \ifx\@pdflang\Hy@temp + \let\@pdflang\relax + \fi + \ifx\@pdflang\relax + \else + \ifx\@pdflang\ltx@empty + \else + \Hy@Match\@pdflang{icase}{% + ^% + [a-z]{1,8}% + (-[a-z0-9]{1,8})*% + $% + }{% + \Hy@Match\@pdflang{icase}{% + ^% + (% + % langtag + (% language + [a-z]{2,3}% + ([a-z]{3}(-[a-z]{3}){0,2})?% extlang + |[a-z]{4}% reserved for future use + |[a-z]{5,8}% registered language subtag + )% + (-[a-z]{4})?% script + (-([a-z]{2}|[0-9]{3}))?% region + (-([a-z]{5,8}|[0-9][a-z0-9]{3}))*% variant + (-[0-9a-wyz](-[a-z0-9]{2,8})+)*% extension + (-x(-[a-z0-9]{1,8})+)?% privateuse + % privateuse + |x-([a-z0-9]{1,8})+% + % grandfathered/irregular + |en-GB-oed% + |i-(ami|bnn|default|enochian|hak|klingon|lux|% + mingo|navajo|pwn|tao|tay|tsu)% + |sgn-(BE-FR|BE-NL|CH-DE)% + % grandfathered/regular + |art-lojban% + |cel-gaulish% + |no-(bok|nyn)% + |zh-(guoyu|hakka|min|min-nan|xiang)% + )% + $% + }{% + \Hy@Match{-\@pdflang}{icase}{-[a-wyz0-9]-}{% + \Hy@Match\@pdflang{icase}{^x-}{}{% + % remove privateuse + \edef\Hy@temp{-\@pdflang}% + \Hy@Match\Hy@temp{icase}{% + ^% + (% + (-[a-wyz0-9]|-[a-z0-9]{2,8})*% + )% + -x-% + }{% + \edef\Hy@temp{% + \expandafter\strip@prefix\pdflastmatch1% + }% + }{}% + \Hy@Match\Hy@temp{icase}{% + (-[a-wyz0-9]-).*\ltx@backslashchar1% + }{% + \Hy@Warning{% + Invalid language identifier `#1'\MessageBreak + for option `pdflang', because it violates\MessageBreak + well-formedness defined in RFC 4646\MessageBreak + by duplicate singleton subtags% + }% + \let\@pdflang\relax + }{}% + }% + }{}% + \ifx\@pdflang\relax + \else + \Hy@Match\@pdflang{icase}{% + ^% + [a-zA-Z]{2}-% + (% + aa|AA|% + [qQ][m-zM-Z]|% + [xX][a-zA-Z]|% + zz|ZZ% + )% + (-|$)% + }{% + \Hy@Warning{% + Invalid language identifier `#1'\MessageBreak + for option `pdflang' because of invalid country code% + \MessageBreak + in second subtag (RFC 3066)% + }% + \let\@pdflang\relax + }{}% + \fi + }{% + \Hy@Warning{% + Invalid language identifier `#1'\MessageBreak + for option `pdflang', because it violates\MessageBreak + well-formedness defined in RFC 5646% + }% + \let\@pdflang\relax + }% + }{% + \Hy@Warning{% + Invalid language identifier `#1'\MessageBreak + for option `pdflang' (RFC 3066)% + }% + \let\@pdflang\relax + }% + \fi + \fi +} +\define@key{Hyp}{pdfpagelabels}[true]{% + \Hy@boolkey{pdfpagelabels}{#1}% +} +\define@key{Hyp}{pdfescapeform}[true]{% + \Hy@boolkey{pdfescapeform}{#1}% +} +\def\@linkbordercolor{1 0 0} +\def\@urlbordercolor{0 1 1} +\def\@menubordercolor{1 0 0} +\def\@filebordercolor{0 .5 .5} +\def\@runbordercolor{0 .7 .7} +\def\@citebordercolor{0 1 0} +\def\@pdfhighlight{/I} +\let\@pdftitle\ltx@empty +\let\@pdfauthor\ltx@empty +\let\@pdfproducer\relax +\def\@pdfcreator{LaTeX with hyperref} +\let\@pdfcreationdate\ltx@empty +\let\@pdfmoddate\ltx@empty +\let\@pdfsubject\ltx@empty +\let\@pdfkeywords\ltx@empty +\let\@pdftrapped\ltx@empty +\let\@pdfpagescrop\ltx@empty +\def\@pdfstartview{/Fit} +\def\@pdfremotestartview{/Fit} +\def\@pdfstartpage{1} +\let\@pdfprintpagerange\ltx@empty +\let\@pdflang\relax +\let\PDF@SetupDoc\@empty +\let\PDF@FinishDoc\@empty +\let\phantomsection\@empty +\let\special@paper\@empty +\def\HyperDestNameFilter#1{#1} +\Hy@AtBeginDocument{% + \begingroup + \edef\x{\@ifundefined{stockheight}\paperheight\stockheight}% + \dimen@=\x\relax + \ifdim\dimen@>\z@ + \else + \dimen@=11in\relax + \Hy@WarningNoLine{% + Height of page (\expandafter\string\x) % + is invalid (\the\x),\MessageBreak + using 11in% + }% + \fi + \dimen@=0.99626401\dimen@ + \xdef\Hy@pageheight{\strip@pt\dimen@}% + \endgroup +} +\def\HyInd@EncapChar{\|} +\let\hyper@normalise\ExecuteOptions +\let\ExecuteOptions\hypersetup +\Hy@RestoreCatcodes +\InputIfFileExists{hyperref.cfg}{}{} +\Hy@SetCatcodes +\let\ExecuteOptions\hyper@normalise +\ifx\Hy@MaybeStopNow\relax +\else + \Hy@stoppedearlytrue + \expandafter\Hy@MaybeStopNow +\fi +\Hy@stoppedearlyfalse +\SetupKeyvalOptions{family=Hyp} +\DeclareLocalOptions{% + a4paper,a5paper,b5paper,letterpaper,legalpaper,executivepaper% +} +\@ifpackagewith{hyperref}{tex4ht}{% +}{% + \@ifpackageloaded{tex4ht}{% + \PassOptionsToPackage{tex4ht}{hyperref}% + }{% + \ltx@IfUndefined{HCode}{% + }{% + \begingroup + \def\Hy@pkg{tex4ht}% + \def\Hy@temp@A#1\RequirePackage[#2]#3#4\Hy@NIL{% + \def\Hy@param{#2#3}% + \ifx\Hy@param\ltx@empty + \expandafter\ltx@gobble + \else + \def\Hy@param{#3}% + \ifx\Hy@param\Hy@pkg + \PassOptionsToPackage{#2}{tex4ht}% + \expandafter\expandafter\expandafter\@gobble + \else + \expandafter\expandafter\expandafter\ltx@firstofone + \fi + \fi + {\Hy@temp@A#4\Hy@NIL}% + }% + \expandafter + \Hy@temp@A\@documentclasshook\RequirePackage[]{}\Hy@NIL + \endgroup + \PassOptionsToPackage{tex4ht}{hyperref}% + }% + }% +} +\let\ReadBookmarks\relax +\ProcessKeyvalOptions{Hyp} +\def\Hy@xspace@end{} +\ltx@IfUndefined{xspaceaddexceptions}{% + \Hy@AtBeginDocument{% + \ltx@IfUndefined{xspaceaddexceptions}{% + }{% + \def\Hy@xspace@end{% + \ltx@gobble{end for xspace}% + }% + \xspaceaddexceptions{% + \Hy@xspace@end,\hyper@linkend,\hyper@anchorend + }% + }% + }% +}{% + \def\Hy@xspace@end{% + \ltx@gobble{end for xspace}% + }% + \xspaceaddexceptions{\Hy@xspace@end,\hyper@linkend,\hyper@anchorend}% +} +\Hy@AtBeginDocument{% + \ifHy@draft + \let\hyper@@anchor\@gobble + \gdef\hyper@link#1#2#3{#3\Hy@xspace@end}% + \def\hyper@anchorstart#1#2{#2\Hy@xspace@end}% + \def\hyper@anchorend{\Hy@xspace@end}% + \let\hyper@linkstart\@gobbletwo + \def\hyper@linkend{\Hy@xspace@end}% + \def\hyper@linkurl#1#2{#1\Hy@xspace@end}% + \def\hyper@linkfile#1#2#3{#1\Hy@xspace@end}% + \def\hyper@link@[#1]#2#3#4{#4\Hy@xspace@end}% + \def\Acrobatmenu#1#2{\leavevmode#2\Hy@xspace@end}% + \let\PDF@SetupDoc\@empty + \let\PDF@FinishDoc\@empty + \let\@fifthoffive\@secondoftwo + \let\@secondoffive\@secondoftwo + \let\ReadBookmarks\relax + \let\WriteBookmarks\relax + \Hy@WarningNoLine{Draft mode on}% + \fi + \Hy@DisableOption{draft}% + \Hy@DisableOption{nolinks}% + \Hy@DisableOption{final}% +} +\Hy@DisableOption{pdfa} +\ifHy@pdfa + \ifnum \Hy@pdfversion < 4 + \kvsetkeys{Hyp}{pdfversion=1.4}% + \fi + \Hy@DisableOption{pdfversion}% + \def\Hy@Acrobatmenu#1#2{% + \leavevmode + \begingroup + \edef\x{#1}% + \@onelevel@sanitize\x + \ifx\x\Hy@NextPage + \let\y=Y% + \else + \ifx\x\Hy@PrevPage + \let\y=Y% + \else + \ifx\x\Hy@FirstPage + \let\y=Y% + \else + \ifx\x\Hy@LastPage + \let\y=Y% + \else + \let\y=N% + \fi + \fi + \fi + \fi + \expandafter\endgroup + \ifx\y Y% + \else + \Hy@Error{% + PDF/A: Named action `#1' is not permitted% + }\@ehc + {#2}% + \expandafter\@gobble + \fi + }% + \def\Hy@temp#1{% + \expandafter\def\csname Hy@#1\endcsname{#1}% + \expandafter\@onelevel@sanitize\csname Hy@#1\endcsname + }% + \Hy@temp{NextPage}% + \Hy@temp{PrevPage}% + \Hy@temp{FirstPage}% + \Hy@temp{LastPage}% +\else + \def\Hy@Acrobatmenu#1#2{\leavevmode}% +\fi +\Hy@nextfalse +\ltx@IfUndefined{spanish@sh@"@sel}{}{\Hy@nexttrue} +\ltx@IfUndefined{galician@sh@"@sel}{}{\Hy@nexttrue} +\ltx@IfUndefined{estonian@sh@"@sel}{}{\Hy@nexttrue} +\ifHy@next + \let\texttilde\~% +\fi +\def\Hy@wrapper@babel#1#2{% + \begingroup + \Hy@safe@activestrue + \set@display@protect + \edef\x{#2}% + \@onelevel@sanitize\x + \toks@{#1}% + \edef\x{\endgroup\the\toks@{\x}}% + \x +} +\def\Hy@WrapperDef#1{% + \begingroup + \escapechar=\m@ne + \xdef\Hy@gtemp{% + \expandafter\noexpand\csname HyWrap@\string#1\endcsname + }% + \endgroup + \edef#1{% + \noexpand\Hy@wrapper@babel + \expandafter\noexpand\Hy@gtemp + }% + \expandafter\def\Hy@gtemp +} +\ifHy@hyperfigures + \Hy@Info{Hyper figures ON}% +\else + \Hy@Info{Hyper figures OFF}% +\fi +\ifHy@nesting + \Hy@Info{Link nesting ON}% +\else + \Hy@Info{Link nesting OFF}% +\fi +\ifHy@hyperindex + \Hy@Info{Hyper index ON}% +\else + \Hy@Info{Hyper index OFF}% +\fi +\ifHy@plainpages + \Hy@Info{Plain pages ON}% +\else + \Hy@Info{Plain pages OFF}% +\fi +\ifHy@backref + \Hy@Info{Backreferencing ON}% +\else + \Hy@Info{Backreferencing OFF}% +\fi +\ifHy@typexml + \Hy@AtEndOfPackage{% + \RequirePackage{color}% + \RequirePackage{nameref}[2012/07/28]% + }% +\fi +\Hy@DisableOption{typexml} +\ifHy@implicit + \Hy@InfoNoLine{Implicit mode ON; LaTeX internals redefined}% +\else + \Hy@InfoNoLine{Implicit mode OFF; no redefinition of LaTeX internals}% + \def\MaybeStopEarly{% + \Hy@Message{Stopped early}% + \Hy@AtBeginDocument{% + \PDF@FinishDoc + \gdef\PDF@FinishDoc{}% + }% + \endinput + }% + \Hy@AtBeginDocument{% + \let\autoref\ref + \let\autopageref\pageref + \ifx\@pdfpagemode\@empty + \gdef\@pdfpagemode{UseNone}% + \fi + \global\Hy@backreffalse + }% + \Hy@AtEndOfPackage{% + \global\let\ReadBookmarks\relax + \global\let\WriteBookmarks\relax + }% +\fi +\Hy@DisableOption{implicit} +\Hy@AtEndOfPackage{% + \@ifpackageloaded{tex4ht}{% + \def\Hy@driver{htex4ht}% + \Hy@texhttrue + }{}% + \ifx\Hy@driver\@empty + \else + \ifx\pdfextension\@undefined + \def\Hy@temp{hpdftex}% + \else + \def\Hy@temp{hluatex}% + \fi + \ifpdf + \ifx\Hy@driver\Hy@temp + \else + \Hy@WarningNoLine{% + Wrong driver `\Hy@driver.def';\MessageBreak + pdfTeX is running in PDF mode.\MessageBreak + Forcing driver `\Hy@temp.def'% + }% + \let\Hy@driver\Hy@temp + \fi + \else + \ifx\Hy@driver\Hy@temp + \Hy@WarningNoLine{% + Wrong driver `\Hy@driver.def';\MessageBreak + pdfTeX is not running in PDF mode.\MessageBreak + Using default driver% + }% + \let\Hy@driver\@empty + \fi + \fi + \fi + \ifHy@texht + \else + \ifx\Hy@driver\@empty + \else + \def\Hy@temp{hxetex}% + \ifxetex + \ifx\Hy@driver\Hy@temp + \else + \Hy@WarningNoLine{% + Wrong driver `\Hy@driver.def';\MessageBreak + XeTeX is running.\MessageBreak + Forcing driver `\Hy@temp.def' for XeTeX% + }% + \let\Hy@driver\Hy@temp + \fi + \fi + \fi + \fi + \ifx\Hy@driver\@empty + \else + \def\Hy@temp{hvtexhtm}% + \ifnum\ifvtex\OpMode\else\m@ne\fi=10 % + \ifx\Hy@driver\Hy@temp + \else + \Hy@WarningNoLine{% + Wrong driver `\Hy@driver.def';\MessageBreak + VTeX is running in HTML mode.\MessageBreak + Forcing driver `\Hy@temp.def'% + }% + \let\Hy@driver\Hy@temp + \fi + \else + \ifx\Hy@driver\Hy@temp + \Hy@WarningNoLine{% + Wrong driver `\Hy@driver.def';\MessageBreak + VTeX is not running in HTML mode.\MessageBreak + Using default driver% + }% + \let\Hy@driver\@empty + \fi + \fi + \fi + \let\HyOpt@DriverType\ltx@empty + \ifx\HyOpt@CustomDriver\ltx@empty + \ifx\Hy@driver\@empty + \def\HyOpt@DriverType{ (autodetected)}% + \providecommand*{\Hy@defaultdriver}{hypertex}% + \ifpdf + \ifx\pdfextension\@undefined + \def\Hy@driver{hpdftex}% + \else + \def\Hy@driver{hluatex}% + \fi + \else + \ifxetex + \def\Hy@driver{hxetex}% + \else + \ifnum\ifvtex\OpMode\else\m@ne\fi=10 % + \def\Hy@driver{hvtexhtm}% + \def\MaybeStopEarly{% + \Hy@Message{Stopped early}% + \Hy@AtBeginDocument{% + \PDF@FinishDoc + \gdef\PDF@FinishDoc{}% + }% + \endinput + }% + \else + \ifnum\ifvtex\OpMode\else\m@ne\fi=\@ne + \def\Hy@driver{hvtex}% + \else + \ifnum\ifvtex\OpMode\else\m@ne\fi=\tw@ + \def\Hy@driver{hvtex}% + \else + \ifx\HyOpt@DriverFallback\ltx@empty + \let\Hy@driver\Hy@defaultdriver + \def\HyOpt@DriverType{ (default)}% + \else + \begingroup + \toks@\expandafter{\HyOpt@DriverFallback}% + \edef\x{\endgroup + \noexpand\kvsetkeys{Hyp}{\the\toks@}% + }% + \x + \ifx\Hy@driver\ltx@empty + \let\Hy@driver\Hy@defaultdriver + \def\HyOpt@DriverType{ (default)}% + \else + \def\HyOpt@DriverType{ (fallback)}% + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \ifx\Hy@driver\Hy@defaultdriver + \def\Hy@temp{hdviwind}% + \ifx\Hy@temp\Hy@driver + \kvsetkeys{Hyp}{colorlinks}% + \PassOptionsToPackage{dviwindo}{color}% + \fi + \fi + \fi + \else + \def\HyOpt@DriverType{ (custom)}% + \let\Hy@driver\HyOpt@CustomDriver + \fi + \Hy@InfoNoLine{Driver\HyOpt@DriverType: \Hy@driver}% + \chardef\Hy@VersionChecked=0 % + \input{\Hy@driver.def}% + \ifcase\Hy@VersionChecked + \Hy@VersionCheck{\Hy@driver.def}% + \fi + \let\@unprocessedoptions\relax + \Hy@RestoreCatcodes + \Hy@DisableOption{tex4ht}% + \Hy@DisableOption{pdftex}% + \Hy@DisableOption{nativepdf}% + \Hy@DisableOption{dvipdfm}% + \Hy@DisableOption{dvipdfmx}% + \Hy@DisableOption{dvipdfmx-outline-open}% + \Hy@DisableOption{pdfmark}% + \Hy@DisableOption{dvips}% + \Hy@DisableOption{hypertex}% + \Hy@DisableOption{vtex}% + \Hy@DisableOption{vtexpdfmark}% + \Hy@DisableOption{dviwindo}% + \Hy@DisableOption{dvipsone}% + \Hy@DisableOption{textures}% + \Hy@DisableOption{latex2html}% + \Hy@DisableOption{ps2pdf}% + \Hy@DisableOption{xetex}% + \Hy@DisableOption{driverfallback}% + \Hy@DisableOption{customdriver}% + \Hy@DisableOption{pdfversion}% +} +\newif\ifHy@DvipdfmxOutlineOpen +\ifxetex + \ifdim\number\XeTeXversion\XeTeXrevision in<0.9995in % + \else + \chardef\SpecialDvipdfmxOutlineOpen\@ne + \Hy@DvipdfmxOutlineOpentrue + \fi +\fi +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname SpecialDvipdfmxOutlineOpen\endcsname\relax +\else + \ifnum\SpecialDvipdfmxOutlineOpen>\z@ + \Hy@DvipdfmxOutlineOpentrue + \fi +\fi +\def\WriteBookmarks{0} +\def\@bookmarkopenstatus#1{% + \ifHy@bookmarksopen + \ifnum#1<\expandafter\@firstofone\expandafter + {\number\@bookmarksopenlevel} % explicit space + \else + -% + \fi + \else + -% + \fi +} +\ifHy@bookmarks + \Hy@Info{Bookmarks ON}% + \ifx\@pdfpagemode\@empty + \def\@pdfpagemode{UseOutlines}% + \fi +\else + \let\@bookmarkopenstatus\ltx@gobble + \Hy@Info{Bookmarks OFF}% + \Hy@AtEndOfPackage{% + \global\let\ReadBookmarks\relax + \global\let\WriteBookmarks\relax + }% + \ifx\@pdfpagemode\@empty + \def\@pdfpagemode{UseNone}% + \fi +\fi +\Hy@DisableOption{bookmarks} +\def\Hy@CatcodeWrapper#1{% + \let\Hy@EndWrap\ltx@empty + \def\TMP@EnsureCode##1##2{% + \edef\Hy@EndWrap{% + \Hy@EndWrap + \catcode##1 \the\catcode##1\relax + }% + \catcode##1 ##2\relax + }% + \TMP@EnsureCode{10}{12}% ^^J + \TMP@EnsureCode{33}{12}% ! + \TMP@EnsureCode{34}{12}% " + \TMP@EnsureCode{36}{3}% $ (math) + \TMP@EnsureCode{38}{4}% & (alignment) + \TMP@EnsureCode{39}{12}% ' + \TMP@EnsureCode{40}{12}% ( + \TMP@EnsureCode{41}{12}% ) + \TMP@EnsureCode{42}{12}% * + \TMP@EnsureCode{43}{12}% + + \TMP@EnsureCode{44}{12}% , + \TMP@EnsureCode{45}{12}% - + \TMP@EnsureCode{46}{12}% . + \TMP@EnsureCode{47}{12}% / + \TMP@EnsureCode{58}{12}% : + \TMP@EnsureCode{59}{12}% ; + \TMP@EnsureCode{60}{12}% < + \TMP@EnsureCode{61}{12}% = + \TMP@EnsureCode{62}{12}% > + \TMP@EnsureCode{63}{12}% ? + \TMP@EnsureCode{91}{12}% [ + \TMP@EnsureCode{93}{12}% ] + \TMP@EnsureCode{94}{7}% ^ (superscript) + \TMP@EnsureCode{95}{8}% _ (subscript) + \TMP@EnsureCode{96}{12}% ` + \TMP@EnsureCode{124}{12}% | + \TMP@EnsureCode{126}{13}% ~ (active) + #1\relax + \Hy@EndWrap +} +\Hy@AtBeginDocument{% + \ifHy@ocgcolorlinks + \kvsetkeys{Hyp}{colorlinks}% + \ifHy@pdfa + \Hy@Warning{% + PDF/A: Optional Content Groups are prohibited,\MessageBreak + using `colorlinks' instead of `ocgcolorlinks'% + }% + \Hy@ocgcolorlinksfalse + \fi + \fi + \ifHy@ocgcolorlinks + \else + \Hy@DisableOption{ocgcolorlinks}% + \fi + \ifHy@colorlinks + \def\@pdfborder{0 0 0}% + \let\@pdfborderstyle\@empty + \ifHy@typexml + \else + \Hy@CatcodeWrapper{% + \RequirePackage{color}% + }% + \fi + \def\Hy@colorlink#1{% + \begingroup + \HyColor@UseColor#1% + }% + \def\Hy@endcolorlink{\endgroup}% + \Hy@Info{Link coloring ON}% + \else + \ifHy@frenchlinks + \def\Hy@colorlink#1{\begingroup\fontshape{\scdefault}\selectfont}% + \def\Hy@endcolorlink{\endgroup}% + \Hy@Info{French linking ON}% + \else + \def\Hy@colorlink#1{\begingroup}% + \def\Hy@endcolorlink{\endgroup}% + \Hy@Info{Link coloring OFF}% + \fi + \fi + \Hy@DisableOption{colorlinks}% + \Hy@DisableOption{frenchlinks}% + \ifHy@texht + \long\def\@firstoffive#1#2#3#4#5{#1}% + \long\def\@secondoffive#1#2#3#4#5{#2}% + \long\def\@thirdoffive#1#2#3#4#5{#3}% + \long\def\@fourthoffive#1#2#3#4#5{#4}% + \long\def\@fifthoffive#1#2#3#4#5{#5}% + \providecommand*\@safe@activestrue{}% + \providecommand*\@safe@activesfalse{}% + \def\T@ref#1{% + \Hy@safe@activestrue + \expandafter\@setref\csname r@#1\endcsname\@firstoffive{#1}% + \Hy@safe@activesfalse + }% + \def\T@pageref#1{% + \Hy@safe@activestrue + \expandafter\@setref\csname r@#1\endcsname\@secondoffive{#1}% + \Hy@safe@activesfalse + }% + \else + \ifHy@typexml + \else + \Hy@CatcodeWrapper{% + \RequirePackage{nameref}[2012/07/28]% + }% + \fi + \fi + \DeclareRobustCommand\ref{% + \@ifstar\@refstar\T@ref + }% + \DeclareRobustCommand\pageref{% + \@ifstar\@pagerefstar\T@pageref + }% + \DeclareRobustCommand*{\nameref}{% + \@ifstar\@namerefstar\T@nameref + }% + \ifHy@implicit + \else + \let \@pagerefstar\T@pageref + \let \@refstar\T@ref + \let \@namerefstar\T@nameref + \fi +} +\Hy@AtBeginDocument{% + \ifHy@texht + \else + \Hy@CatcodeWrapper\ReadBookmarks + \fi +} +\ifHy@backref + \RequirePackage{backref}% +\else + \let\Hy@backout\@gobble +\fi +\Hy@DisableOption{backref} +\Hy@DisableOption{pagebackref} +\Hy@activeanchorfalse +\begingroup + \endlinechar=-1 % + \catcode`\^^A=14 % + \catcode`\^^M\active + \catcode`\%\active + \catcode`\#\active + \catcode`\_\active + \catcode`\$\active + \catcode`\&\active + \gdef\hyper@normalise{^^A + \begingroup + \catcode`\^^M\active + \def^^M{ }^^A + \catcode`\%\active + \let%\@percentchar + \let\%\@percentchar + \catcode`\#\active + \def#{\hyper@hash}^^A + \def\#{\hyper@hash}^^A + \@makeother\&^^A + \edef&{\string&}^^A + \edef\&{\string&}^^A + \edef\textunderscore{\string_}^^A + \let\_\textunderscore + \catcode`\_\active + \let_\textunderscore + \let~\hyper@tilde + \let\~\hyper@tilde + \let\textasciitilde\hyper@tilde + \let\\\@backslashchar + \edef${\string$}^^A + \Hy@safe@activestrue + \hyper@n@rmalise + }^^A + \catcode`\#=6 ^^A + \gdef\Hy@ActiveCarriageReturn{^^M}^^A + \gdef\hyper@n@rmalise#1#2{^^A + \def\Hy@tempa{#2}^^A + \ifx\Hy@tempa\Hy@ActiveCarriageReturn + \ltx@ReturnAfterElseFi{^^A + \hyper@@normalise{#1}^^A + }^^A + \else + \ltx@ReturnAfterFi{^^A + \hyper@@normalise{#1}{#2}^^A + }^^A + \fi + }^^A + \gdef\hyper@@normalise#1#2{^^A + \edef\Hy@tempa{^^A + \endgroup + \noexpand#1{\Hy@RemovePercentCr#2%^^M\@nil}^^A + }^^A + \Hy@tempa + }^^A + \gdef\Hy@RemovePercentCr#1%^^M#2\@nil{^^A + #1^^A + \ifx\limits#2\limits + \else + \ltx@ReturnAfterFi{^^A + \Hy@RemovePercentCr #2\@nil + }^^A + \fi + }^^A +\endgroup +\providecommand*\hyper@chars{% + \let\#\hyper@hash + \let\%\@percentchar + \Hy@safe@activestrue +} +\def\hyperlink#1#2{% + \hyper@@link{}{#1}{#2}% +} +\def\Hy@VerboseLinkStart#1#2{% + \ifHy@verbose + \begingroup + \Hy@safe@activestrue + \xdef\Hy@VerboseGlobalTemp{(#1) `#2'}% + \Hy@Info{Reference \Hy@VerboseGlobalTemp}% + \xdef\Hy@VerboseGlobalTemp{% + \Hy@VerboseGlobalTemp, % + line \the\inputlineno + }% + \endgroup + \let\Hy@VerboseLinkInfo\Hy@VerboseGlobalTemp + \@onelevel@sanitize\Hy@VerboseLinkInfo + \fi +} +\def\Hy@VerboseLinkInfo{<VerboseLinkInfo>} +\def\Hy@VerboseLinkStop{% + \ifHy@verbose + \begingroup + \edef\x{\endgroup + \write\m@ne{% + Package `hyperref' Info: % + End of reference \Hy@VerboseLinkInfo.% + }% + }% + \x + \fi +} +\def\Hy@VerboseAnchor#1{% + \ifHy@verbose + \begingroup + \Hy@safe@activestrue + \Hy@Info{Anchor `\HyperDestNameFilter{#1}'}% + \endgroup + \fi +} +\def\Hy@AllowHyphens{% + \relax + \ifhmode + \penalty\@M + \hskip\z@skip + \fi +} +\DeclareRobustCommand*{\href}[1][]{% + \begingroup + \setkeys{href}{#1}% + \@ifnextchar\bgroup\Hy@href{\hyper@normalise\href@}% +} +\def\Hy@href#{% + \hyper@normalise\href@ +} +\begingroup + \catcode`\$=6 % + \catcode`\#=12 % + \gdef\href@$1{\expandafter\href@split$1##\\}% + \gdef\href@split$1#$2#$3\\$4{% + \hyper@@link{$1}{$2}{$4}% + \endgroup + }% +\endgroup +\define@key{href}{page}{% + \def\Hy@href@page{#1}% +} +\let\Hy@href@page\@empty +\newcount\c@Hy@tempcnt +\def\theHy@tempcnt{\the\c@Hy@tempcnt} +\def\Hy@MakeRemoteAction{% + \ifx\Hy@href@page\@empty + \def\Hy@href@page{0}% + \else + \setcounter{Hy@tempcnt}{\Hy@href@page}% + \ifnum\c@Hy@tempcnt<\@ne + \Hy@Warning{% + Invalid page number (\theHy@tempcnt)\MessageBreak + for remote PDF file.\MessageBreak + Using page 1% + }% + \def\Hy@href@page{0}% + \else + \global\advance\c@Hy@tempcnt\m@ne + \edef\Hy@href@page{\theHy@tempcnt}% + \fi + \fi + \ifx\Hy@href@nextactionraw\@empty + \else + \Hy@pdfnewwindowsettrue + \Hy@pdfnewwindowtrue + \fi +} +\define@key{href}{pdfremotestartview}{% + \setkeys{Hyp}{pdfremotestartview={#1}}% +} +\let\KV@href@pdfnewwindow\KV@Hyp@pdfnewwindow +\let\KV@href@pdfnewwindow@default\KV@Hyp@pdfnewwindow@default +\newif\ifHy@href@ismap +\define@key{href}{ismap}[true]{% + \ltx@IfUndefined{Hy@href@ismap#1}{% + \Hy@Error{% + Invalid value (#1) for key `ismap'.\MessageBreak + Permitted values are `true' or `false'.\MessageBreak + Ignoring `ismap'% + }\@ehc + }{% + \csname Hy@href@ismap#1\endcsname + }% +} +\let\Hy@href@nextactionraw\@empty +\define@key{href}{nextactionraw}{% + \edef\Hy@href@nextactionraw{#1}% + \ifx\Hy@href@nextactionraw\@empty + \else + \Hy@Match\Hy@href@nextactionraw{}{% + ^(\HyPat@ObjRef/|<<.*/S[ /].+>>|% + \[( ?\HyPat@ObjRef/|<<.*/S[ /].+>>)+ ?])$% + }{}{% + \Hy@Warning{Invalid value for `nextactionraw':\MessageBreak + \Hy@href@nextactionraw\MessageBreak + The action is discarded% + }% + }% + \ifx\Hy@href@nextactionraw\@empty + \else + \edef\Hy@href@nextactionraw{/Next \Hy@href@nextactionraw}% + \fi + \fi +} +\def\HyPat@ObjRef/{.+} +\RequirePackage{url} +\let\HyOrg@url\url +\def\Hurl{\begingroup \Url} +\DeclareRobustCommand*{\nolinkurl}{\hyper@normalise\nolinkurl@} +\def\nolinkurl@#1{\Hurl{#1}} +\DeclareRobustCommand*{\url}{\hyper@normalise\url@} +\def\url@#1{\hyper@linkurl{\Hurl{#1}}{#1}} +\DeclareRobustCommand*{\hyperimage}{\hyper@normalise\hyper@image} +\providecommand\hyper@image[2]{#2} +\def\hypertarget#1#2{% + \ifHy@nesting + \hyper@@anchor{#1}{#2}% + \else + \hyper@@anchor{#1}{\relax}#2% + \fi +} +\DeclareRobustCommand*{\hyperref}{% + \@ifnextchar[{\Hy@babelnormalise\label@hyperref}\@hyperref +} +\def\Hy@babelnormalise#1[#2]{% + \begingroup + \Hy@safe@activestrue + \edef\Hy@tempa{% + \endgroup + \noexpand#1[{#2}]% + }% + \Hy@tempa +} +\def\@hyperref{\hyper@normalise\@@hyperref} +\def\@@hyperref#1#2#3{% + \edef\ref@one{\ifx\\#2\\\else#2.\fi#3}% + \expandafter\tryhyper@link\ref@one\\{#1}% +} +\def\tryhyper@link#1\\#2{% + \hyper@@link{#2}{#1}% +} +\def\hyperdef{\@ifnextchar[{\label@hyperdef}{\@hyperdef}} +\def\@hyperdef#1#2#3{%, category, name, text + \ifx\\#1\\% + \def\Hy@AnchorName{#2}% + \else + \def\Hy@AnchorName{#1.#2}% + \fi + \ifHy@nesting + \expandafter\hyper@@anchor\expandafter{\Hy@AnchorName}{#3}% + \else + \expandafter\hyper@@anchor\expandafter{\Hy@AnchorName}{\relax}#3% + \fi +} +\let\hyperrefundefinedlink\@firstofone +\def\label@hyperref[#1]{% + \expandafter\label@@hyperref\csname r@#1\endcsname{#1}% +}% +\def\label@@hyperref#1#2#3{% + \ifx#1\relax + \protect\G@refundefinedtrue + \@latex@warning{% + Hyper reference `#2' on page \thepage \space undefined% + }% + \begingroup + \hyperrefundefinedlink{#3}% + \endgroup + \else + \hyper@@link{\expandafter\@fifthoffive#1}% + {\expandafter\@fourthoffive#1\@empty\@empty}{#3}% + \fi +} +\def\label@hyperdef[#1]#2#3#4{% label name, category, name, + % anchor text + \@bsphack + \ifx\\#2\\% + \def\Hy@AnchorName{#3}% + \else + \def\Hy@AnchorName{#2.#3}% + \fi + \if@filesw + \protected@write\@auxout{}{% + \string\newlabel{#1}{{}{}{}{\Hy@AnchorName}{}}% + }% + \fi + \@esphack + \ifHy@nesting + \expandafter\hyper@@anchor\expandafter{\Hy@AnchorName}{#4}% + \else + \expandafter\hyper@@anchor\expandafter{\Hy@AnchorName}{\relax}#4% + \fi +} +\newdimen\XeTeXLinkMargin +\setlength{\XeTeXLinkMargin}{2pt} +\ifxetex + \font\XeTeXLink@font=pzdr at 1sp\relax + \newcommand*{\XeTeXLink@space}{% + \begingroup + \XeTeXLink@font + \@xxxii + \endgroup + }% + \newcommand{\XeTeXLinkBox}[1]{% + \begingroup + \leavevmode + \sbox\z@{#1}% + \begingroup + \dimen@=\dp\z@ + \advance\dimen@\XeTeXLinkMargin + \setbox\tw@=\llap{% + \hb@xt@\XeTeXLinkMargin{% + \lower\dimen@\hbox{\XeTeXLink@space}% + \hss + }% + }% + \dp\tw@=\dp\z@ + \ht\tw@=\ht\z@ + \copy\tw@ + \endgroup + \copy\z@ + \dimen@=\ht\z@ + \advance\dimen@\XeTeXLinkMargin + \setbox\tw@=\rlap{% + \hb@xt@\XeTeXLinkMargin{% + \hss + \raise\dimen@\hbox{\XeTeXLink@space}% + }% + }% + \dp\tw@=\dp\z@ + \ht\tw@=\ht\z@ + \copy\tw@ + \endgroup + }% +\else + \newcommand*{\XeTeXLinkBox}[1]{% + \begingroup + \leavevmode + \sbox\z@{#1}% + \copy\z@ + \endgroup + }% +\fi +\def\hyper@@link{\let\Hy@reserved@a\relax + \@ifnextchar[{\hyper@link@}{\hyper@link@[link]}% +} +\def\hyper@link@[#1]#2#3#4{% + \ltx@ifempty{#4}{% link text + \Hy@Warning{Suppressing empty link}% + }{% + \begingroup + \protected@edef\Hy@tempa{#2}% + \edef\Hy@tempb{#3}% + \ifx\Hy@tempa\ltx@empty + \ifx\Hy@tempb\ltx@empty + \Hy@Warning{Suppressing link with empty target}% + \toks@{% + \endgroup + \ltx@secondoftwo + }% + \else + \toks@{% + \endgroup + \hyper@link{#1}% + }% + \fi + \else + \toks@{% + \endgroup + \expandafter\hyper@readexternallink#2\\{#1}% + }% + \fi + \Hy@safe@activesfalse + \toks@\expandafter{% + \the\expandafter\toks@ + \expandafter{\Hy@tempb}{#4}% + }% + \the\toks@ + }% +} +\def\hyper@readexternallink#1\\#2#3#4{% + \begingroup + \let\\\relax + \expandafter\endgroup + \expandafter\@@hyper@@readexternallink#1\\{#2}{#3}{#4}% +} +\def\@@hyper@@readexternallink#1\\#2#3#4{% + \@hyper@readexternallink{#2}{#3}{#4}#1::\\{#1}% +} +\def\@pdftempwordfile{file}% +\def\@pdftempwordrun{run}% +\def\@hyper@readexternallink#1#2#3#4:#5:#6\\#7{% + \ifx\\#6\\% + \@hyper@linkfile file:#7\\{#3}{#2}{#7}% + \else + \ifx\\#4\\% + \@hyper@linkfile file:#7\\{#3}{#2}{#7}% + \else + \def\@pdftempa{#4}% + \ifx\@pdftempa\@pdftempwordfile + \@hyper@linkfile#7\\{#3}{#2}{#7}% + \else + \ifx\@pdftempa\@pdftempwordrun + \ifHy@pdfa + \Hy@Error{% + PDF/A: Launch action is prohibited% + }\@ehc + \begingroup + \leavevmode + #2% + \endgroup + \else + \@hyper@launch#7\\{#3}{#2}% + \fi + \else + \hyper@linkurl{#3}{#7\ifx\\#2\\\else\hyper@hash#2\fi}% + \fi + \fi + \fi + \fi +} +\def\@hyper@launch run:#1\\#2#3{% filename, anchor text, linkname + \hyper@linkurl{#2}{% + \Hy@linkfileprefix + #1% + \ifx\\#3\\% + \else + \hyper@hash + #3% + \fi + }% +} +\def\@hyper@linkfile file:#1\\#2#3#4{% + %file url,link string, name, original uri + \filename@parse{#1}% + \ifx\filename@ext\relax + \edef\filename@ext{\XR@ext}% + \fi + \def\use@file{\filename@area\filename@base.\filename@ext}% + \Hy@IfStringEndsWith\filename@ext\XR@ext{% + \hyper@linkfile{#2}{\use@file}{#3}% + }{% + \ifx\@baseurl\@empty + \hyper@linkurl{#2}{% + #4\ifx\\#3\\\else\hyper@hash#3\fi + }% + \else + \hyper@linkurl{#2}{\use@file\ifx\\#3\\\else\hyper@hash#3\fi}% + \fi + }% +} +\def\Hy@IfStringEndsWith#1#2{% + \begingroup + \edef\x{#1}% + \@onelevel@sanitize\x + \edef\x{.\x$}% + \edef\y{#2}% + \@onelevel@sanitize\y + \edef\y{.\y$}% + \expandafter\def\expandafter\z\expandafter##\expandafter1\y##2\@nil{% + \endgroup + \ifx\relax##2\relax + \expandafter\ltx@secondoftwo + \else + \expandafter\ltx@firstoftwo + \fi + }% + \expandafter\expandafter\expandafter\z\expandafter\x\y\@nil +} +\def\Hy@StringLocalhost{localhost} +\@onelevel@sanitize\Hy@StringLocalhost +\def\Hy@CleanupFile#1{% + \edef#1{#1}% + \expandafter\Hy@@CleanupFile#1\hbox///\hbox\@nil{#1}% +} +\def\Hy@@CleanupFile#1//#2/#3\hbox#4\@nil#5{% + \begingroup + \toks@{\endgroup}% + \def\x{#1}% + \ifx\x\@empty + \def\x{#2}% + \ifx\x\@empty + \toks@{\endgroup\def#5{/#3}}% + \else + \@onelevel@sanitize\x + \ifx\x\Hy@StringLocalhost + \toks@{\endgroup\def#5{/#3}}% + \fi + \fi + \fi + \the\toks@ +} +\long\def\hyper@@anchor#1#2{\@hyper@@anchor#1\relax#2\relax} +\long\def\@hyper@@anchor#1\relax#2#3\relax{% + \ifx\\#1\\% + #2\Hy@Warning{Ignoring empty anchor}% + \else + \def\anchor@spot{#2#3}% + \let\put@me@back\@empty + \ifx\relax#2\relax + \else + \ifHy@nesting + \else + \ifcat a\noexpand#2\relax + \else + \ifcat 0\noexpand#2 \relax + \else + \let\anchor@spot\@empty + \def\put@me@back{#2#3}% + \fi + \fi + \fi + \fi + \ifHy@activeanchor + \anchor@spot + \else + \hyper@anchor{#1}% + \fi + \expandafter\put@me@back + \fi + \let\anchor@spot\@empty +} +\let\anchor@spot\ltx@empty +\ifHy@destlabel + \def\hyper@newdestlabel#1#2{% + \begingroup + \Hy@safe@activestrue + \edef\x{\endgroup + \noexpand\@newl@bel{HyDL}{#1}{#2}% + }% + \x + }% + \providecommand*{\hyper@destlabel@hook}{}% + \newcommand*{\Hy@DestRename}[2]{% + \ltx@IfUndefined{HyDL!#1}{% + \begingroup + \Hy@safe@activestrue + \edef\dest@name{#1}% + \edef\label@name{#2}% + \hyper@destlabel@hook + \Hy@IsNotEmpty{dest@name}{% + \Hy@IsNotEmpty{label@name}{% + \global\expandafter + \let\csname HyDL!#1\endcsname\ltx@empty + \if@filesw + \protected@write\@auxout{}{% + \string\hyper@newdestlabel + {#1}% + {\label@name}% + }% + \fi + }% + }% + \endgroup + }{}% + }% + \newcommand*{\HyperDestRename}[2]{% + \AtBeginDocument{% + \Hy@DestRename{#1}{#2}% + }% + }% + \AtBeginDocument{% + \let\HyperDestRename\Hy@DestRename + }% + \def\Hy@IsNotEmpty#1{% + \ltx@IfUndefined{#1}\ltx@gobble{% + \expandafter\ifx\csname#1\endcsname\ltx@empty + \expandafter\ltx@gobble + \else + \expandafter\ltx@firstofone + \fi + }% + }% + \ltx@GlobalAppendToMacro\label@hook{% + \HyperDestRename\@currentHref\label@name + }% + \def\HyperDestLabelReplace#1{% + \ltx@ifundefined{HyDL@#1}{% + #1% + }{% + \csname HyDL@#1\endcsname + }% + }% +\let\HyperDestNameFilter\HyperDestLabelReplace +\else + \let\hyper@newdestlabel\ltx@gobbletwo + \let\HyperDestLabelReplace\ltx@firstofone + \let\HyperDestRename\ltx@gobbletwo +\fi +\Hy@DisableOption{destlabel} +\AddLineBeginAux{% + \string\providecommand\string\hyper@newdestlabel[2]{}% +} +\let\htmladdimg\hyperimage +\def\htmladdnormallink#1#2{\href{#2}{#1}} +\def\htmladdnormallinkfoot#1#2{\href{#2}{#1}\footnote{#2}} +\def\htmlref#1#2{% anchor text, label + \label@hyperref[{#2}]{#1}% +} +\def\@@latextohtmlX{% + \let\hhyperref\hyperref + \def\hyperref##1##2##3##4{% anchor text for HTML + % text to print before label in print + % label + % post-label text in print + ##2\ref{##4}##3% + }% +} +\RequirePackage{bitset} +\def\HyField@NewFlag#1#2{% + \lowercase{\HyField@NewOption{#2}}% + \lowercase{\HyField@NewBitsetFlag{#2}}{#2}{#1}% +} +\def\HyField@NewFlagOnly#1#2{% + \lowercase{\HyField@NewBitsetFlag{#2}}{#2}{#1}% +} +\def\HyField@NewOption#1{% + \expandafter\newif\csname ifFld@#1\endcsname + \define@key{Field}{#1}[true]{% + \lowercase{\Field@boolkey{##1}}{#1}% + }% +} +\def\HyField@NewBitsetFlag#1#2#3#4{% + \begingroup + \count@=#4\relax + \advance\count@\m@ne + \def\x##1{% + \endgroup + \expandafter\def\csname HyField@#3@#1\endcsname{##1}% + \expandafter\ifx\csname HyField@#3@##1\endcsname\relax + \expandafter\edef\csname HyField@#3@##1\endcsname{% + (\number#4) #2% + }% + \else + \expandafter\edef\csname HyField@#3@##1\endcsname{% + \csname HyField@#3@##1\endcsname + /#2% + }% + \fi + }% + \expandafter\x\expandafter{\the\count@}% +} +\def\HyField@UseFlag#1#2{% + \lowercase{\HyField@@UseFlag{#2}}{#1}% +} +\def\HyField@@UseFlag#1#2{% + \bitsetSetValue{HyField@#2}{% + \csname HyField@#2@#1\endcsname + }{% + \csname ifFld@#1\endcsname 1\else 0\fi + }% +} +\def\HyField@SetFlag#1#2{% + \lowercase{\HyField@@SetFlag{#2}}{#1}% +} +\def\HyField@@SetFlag#1#2{% + \bitsetSetValue{HyField@#2}{% + \csname HyField@#2@#1\endcsname + }{1}% +} +\def\HyField@PrintFlags#1#2{% + \ifHy@verbose + \begingroup + \let\Hy@temp\@empty + \let\MessageBreak\relax + \expandafter\@for\expandafter\x\expandafter:\expandafter=% + \bitsetGetSetBitList{HyField@#1}\do{% + \edef\Hy@temp{% + \Hy@temp + \csname HyField@#1@\x\endcsname\MessageBreak + }% + }% + \edef\x{\endgroup + \noexpand\Hy@Info{% + Field flags: % + \expandafter\ifx\@car#1\@nil S\else/\fi + #1 % + \bitsetGetDec{HyField@#1} % + (0x\bitsetGetHex{HyField@#1}{32})\MessageBreak + \Hy@temp + for #2% + }% + }\x + \fi +} +\HyField@NewFlag{Ff}{ReadOnly}{1} +\HyField@NewFlag{Ff}{Required}{2} +\HyField@NewFlag{Ff}{NoExport}{3} +\HyField@NewFlag{Ff}{NoToggleToOff}{15} +\HyField@NewFlag{Ff}{Radio}{16} +\HyField@NewFlag{Ff}{Pushbutton}{17} +\HyField@NewFlag{Ff}{RadiosInUnison}{26} +\HyField@NewFlag{Ff}{Multiline}{13} +\HyField@NewFlag{Ff}{Password}{14} +\HyField@NewFlag{Ff}{FileSelect}{21}% PDF 1.4 +\HyField@NewFlag{Ff}{DoNotSpellCheck}{23}% PDF 1.4 +\HyField@NewFlag{Ff}{DoNotScroll}{24}% PDF 1.4 +\HyField@NewFlag{Ff}{Comb}{25}% PDF 1.4 +\HyField@NewFlag{Ff}{RichText}{26}% PDF 1.5 +\HyField@NewFlag{Ff}{Combo}{18} +\HyField@NewFlag{Ff}{Edit}{19} +\HyField@NewFlag{Ff}{Sort}{20} +\HyField@NewFlag{Ff}{MultiSelect}{22}% PDF 1.4 +\HyField@NewFlag{Ff}{CommitOnSelChange}{27}% PDF 1.5 +\newif\ifFld@popdown +\define@key{Field}{popdown}[true]{% + \lowercase{\Field@boolkey{#1}}{popdown}% +} +\HyField@NewFlag{F}{Invisible}{1} +\HyField@NewFlag{F}{Hidden}{2}% PDF 1.2 +\HyField@NewFlag{F}{Print}{3}% PDF 1.2 +\HyField@NewFlag{F}{NoZoom}{4}% PDF 1.2 +\HyField@NewFlag{F}{NoRotate}{5}% PDF 1.3 +\HyField@NewFlag{F}{NoView}{6}% PDF 1.3 +\HyField@NewFlag{F}{Locked}{8}% PDF 1.4 +\HyField@NewFlag{F}{ToggleNoView}{9}% PDF 1.5 +\HyField@NewFlag{F}{LockedContents}{10}% PDF 1.7 +\ifHy@pdfa + \def\HyField@PDFAFlagWarning#1#2{% + \Hy@Warning{% + PDF/A: Annotation flag `#1' must\MessageBreak + be set to `#2'% + }% + }% + \Fld@invisiblefalse + \def\Fld@invisibletrue{% + \HyField@PDFAFlagWarning{invisible}{false}% + }% + \Fld@hiddenfalse + \def\Fld@hiddentrue{% + \HyField@PDFAFlagWarning{hidden}{false}% + }% + \Fld@printtrue + \def\Fld@printfalse{% + \HyField@PDFAFlagWarning{print}{true}% + }% + \Fld@nozoomtrue + \def\Fld@nozoomfalse{% + \HyField@PDFAFlagWarning{nozoom}{true}% + }% + \Fld@norotatetrue + \def\Fld@norotatefalse{% + \HyField@PDFAFlagWarning{norotate}{true}% + }% + \Fld@noviewfalse + \def\Fld@noviewtrue{% + \HyField@PDFAFlagWarning{noview}{false}% + }% +\fi +\HyField@NewFlag{Submit}{IncludeNoValueFields}{2} +\HyField@NewFlagOnly{Submit}{ExportFormat}{3} +\HyField@NewFlag{Submit}{GetMethod}{4} +\HyField@NewFlag{Submit}{SubmitCoordinates}{5} +\HyField@NewFlagOnly{Submit}{XFDF}{6} +\HyField@NewFlag{Submit}{IncludeAppendSaves}{7} +\HyField@NewFlag{Submit}{IncludeAnnotations}{8} +\HyField@NewFlagOnly{Submit}{SubmitPDF}{9} +\HyField@NewFlag{Submit}{CanonicalFormat}{10} +\HyField@NewFlag{Submit}{ExclNonUserAnnots}{11} +\HyField@NewFlag{Submit}{ExclFKey}{12} +\HyField@NewFlag{Submit}{EmbedForm}{14} +\define@key{Field}{export}{% + \lowercase{\def\Hy@temp{#1}}% + \@ifundefined{Fld@export@\Hy@temp}{% + \@onelevel@sanitize\Hy@temp + \Hy@Error{% + Unknown export format `\Hy@temp'.\MessageBreak + Known formats are `FDF', `HTML', `XFDF', and `PDF'% + }\@ehc + }{% + \let\Fld@export\Hy@temp + }% +} +\def\Fld@export{fdf} +\@namedef{Fld@export@fdf}{0}% +\@namedef{Fld@export@html}{1}% +\@namedef{Fld@export@xfdf}{2}% +\@namedef{Fld@export@pdf}{3}% +\def\HyField@FlagsSubmit{% + \bitsetReset{HyField@Submit}% + \ifcase\@nameuse{Fld@export@\Fld@export} % + % FDF + \HyField@UseFlag{Submit}{IncludeNoValueFields}% + \HyField@UseFlag{Submit}{SubmitCoordinates}% + \HyField@UseFlag{Submit}{IncludeAppendSaves}% + \HyField@UseFlag{Submit}{IncludeAnnotations}% + \HyField@UseFlag{Submit}{CanonicalFormat}% + \HyField@UseFlag{Submit}{ExclNonUserAnnots}% + \HyField@UseFlag{Submit}{ExclFKey}% + \HyField@UseFlag{Submit}{EmbedForm}% + \or % HTML + \HyField@SetFlag{Submit}{ExportFormat}% + \HyField@UseFlag{Submit}{IncludeNoValueFields}% + \HyField@UseFlag{Submit}{GetMethod}% + \HyField@UseFlag{Submit}{SubmitCoordinates}% + \HyField@UseFlag{Submit}{CanonicalFormat}% + \or % XFDF + \HyField@SetFlag{Submit}{XFDF}% + \HyField@UseFlag{Submit}{IncludeNoValueFields}% + \HyField@UseFlag{Submit}{SubmitCoordinates}% + \HyField@UseFlag{Submit}{CanonicalFormat}% + \or % PDF + \HyField@SetFlag{Submit}{SubmitPDF}% + \HyField@UseFlag{Submit}{GetMethod}% + \fi + \HyField@PrintFlags{Submit}{submit button field}% + \bitsetIsEmpty{HyField@Submit}{% + \let\Fld@submitflags\ltx@empty + }{% + \edef\Fld@submitflags{/Flags \bitsetGetDec{HyField@Submit}}% + }% +} +\def\HyField@FlagsAnnot#1{% + \bitsetReset{HyField@F}% + \HyField@UseFlag{F}{Invisible}% + \HyField@UseFlag{F}{Hidden}% + \HyField@UseFlag{F}{Print}% + \HyField@UseFlag{F}{NoZoom}% + \HyField@UseFlag{F}{NoRotate}% + \HyField@UseFlag{F}{NoView}% + \HyField@UseFlag{F}{Locked}% + \HyField@UseFlag{F}{ToggleNoView}% + \HyField@UseFlag{F}{LockedContents}% + \HyField@PrintFlags{F}{#1}% + \bitsetIsEmpty{HyField@F}{% + \let\Fld@annotflags\ltx@empty + }{% + \edef\Fld@annotflags{/F \bitsetGetDec{HyField@F}}% + }% +} +\def\HyField@FlagsPushButton{% + \HyField@FlagsAnnot{push button field}% + \bitsetReset{HyField@Ff}% + \HyField@UseFlag{Ff}{ReadOnly}% + \HyField@UseFlag{Ff}{Required}% + \HyField@UseFlag{Ff}{NoExport}% + \HyField@SetFlag{Ff}{Pushbutton}% + \HyField@PrintFlags{Ff}{push button field}% + \bitsetIsEmpty{HyField@Ff}{% + \let\Fld@flags\ltx@empty + }{% + \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}% + }% +} +\def\HyField@FlagsCheckBox{% + \HyField@FlagsAnnot{check box field}% + \bitsetReset{HyField@Ff}% + \HyField@UseFlag{Ff}{ReadOnly}% + \HyField@UseFlag{Ff}{Required}% + \HyField@UseFlag{Ff}{NoExport}% + \HyField@PrintFlags{Ff}{check box field}% + \bitsetIsEmpty{HyField@Ff}{% + \let\Fld@flags\ltx@empty + }{% + \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}% + }% +} +\def\HyField@FlagsRadioButton{% + \HyField@FlagsAnnot{radio button field}% + \bitsetReset{HyField@Ff}% + \HyField@UseFlag{Ff}{ReadOnly}% + \HyField@UseFlag{Ff}{Required}% + \HyField@UseFlag{Ff}{NoExport}% + \HyField@UseFlag{Ff}{NoToggleToOff}% + \HyField@SetFlag{Ff}{Radio}% + \HyField@UseFlag{Ff}{RadiosInUnison}% + \HyField@PrintFlags{Ff}{radio button field}% + \bitsetIsEmpty{HyField@Ff}{% + \let\Fld@flags\ltx@empty + }{% + \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}% + }% +} +\def\HyField@FlagsText{% + \HyField@FlagsAnnot{text field}% + \bitsetReset{HyField@Ff}% + \HyField@UseFlag{Ff}{ReadOnly}% + \HyField@UseFlag{Ff}{Required}% + \HyField@UseFlag{Ff}{NoExport}% + \HyField@UseFlag{Ff}{Multiline}% + \HyField@UseFlag{Ff}{Password}% + \HyField@UseFlag{Ff}{FileSelect}% + \HyField@UseFlag{Ff}{DoNotSpellCheck}% + \HyField@UseFlag{Ff}{DoNotScroll}% + \ifFld@comb + \ifcase0\ifFld@multiline + \else\ifFld@password + \else\ifFld@fileselect + \else 1\fi\fi\fi\relax + \Hy@Error{% + Field option `comb' cannot used together with\MessageBreak + `multiline', `password', or `fileselect'% + }\@ehc + \else + \HyField@UseFlag{Ff}{Comb}% + \fi + \fi + \HyField@UseFlag{Ff}{RichText}% + \HyField@PrintFlags{Ff}{text field}% + \bitsetIsEmpty{HyField@Ff}{% + \let\Fld@flags\ltx@empty + }{% + \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}% + }% +} +\def\HyField@FlagsChoice{% + \HyField@FlagsAnnot{choice field}% + \bitsetReset{HyField@Ff}% + \HyField@UseFlag{Ff}{ReadOnly}% + \HyField@UseFlag{Ff}{Required}% + \HyField@UseFlag{Ff}{NoExport}% + \HyField@UseFlag{Ff}{Combo}% + \ifFld@combo + \HyField@UseFlag{Ff}{Edit}% + \fi + \HyField@UseFlag{Ff}{Sort}% + \HyField@UseFlag{Ff}{MultiSelect}% + \ifFld@combo + \ifFld@edit + \HyField@UseFlag{Ff}{DoNotSpellCheck}% + \fi + \fi + \HyField@UseFlag{Ff}{CommitOnSelChange}% + \HyField@PrintFlags{Ff}{choice field}% + \bitsetIsEmpty{HyField@Ff}{% + \let\Fld@flags\ltx@empty + }{% + \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}% + }% +} +\def\HyField@PDFChoices#1{% + \begingroup + \global\let\Fld@choices\ltx@empty + \let\HyTmp@optlist\ltx@empty + \let\HyTmp@optitem\relax + \count@=0 % + \kv@parse{#1}{% + \Hy@pdfstringdef\kv@key\kv@key + \ifx\kv@value\relax + \ifnum\Hy@pdfversion<3 % implementation note 122, PDF spec 1.7 + \xdef\Fld@choices{\Fld@choices[(\kv@key)(\kv@key)]}% + \else + \xdef\Fld@choices{\Fld@choices(\kv@key)}% + \fi + \else + \Hy@pdfstringdef\kv@value\kv@value + \xdef\Fld@choices{\Fld@choices[(\kv@value)(\kv@key)]}% + \fi + \edef\HyTmp@optlist{% + \HyTmp@optlist + \HyTmp@optitem{\the\count@}{\kv@key}0% + }% + \advance\count@ by 1 % + \@gobbletwo + }% + \xdef\Fld@choices{/Opt[\Fld@choices]}% + \ifFld@multiselect + \HyField@@PDFChoices{DV}\Fld@default + \HyField@@PDFChoices{V}\Fld@value + \else + \ifx\Fld@default\relax + \else + \pdfstringdef\Hy@gtemp\Fld@default + \xdef\Fld@choices{\Fld@choices/DV(\Hy@gtemp)}% + \fi + \ifx\Fld@value\relax + \else + \pdfstringdef\Hy@gtemp\Fld@value + \xdef\Fld@choices{\Fld@choices/V(\Hy@gtemp)}% + \fi + \fi + \endgroup +} +\def\HyField@@PDFChoices#1#2{% + \ifx#2\relax + \else + \count@=0 % + \def\HyTmp@optitem##1##2##3{% + \def\HyTmp@key{##2}% + \ifx\HyTmp@key\Hy@gtemp + \expandafter\def\expandafter\HyTmp@optlist\expandafter{% + \HyTmp@optlist + \HyTmp@optitem{##1}{##2}1% + }% + \let\HyTmp@found=Y% + \else + \expandafter\def\expandafter\HyTmp@optlist\expandafter{% + \HyTmp@optlist + \HyTmp@optitem{##1}{##2}##3% + }% + \fi + }% + \expandafter\comma@parse\expandafter{#2}{% + \pdfstringdef\Hy@gtemp\comma@entry + \let\HyTmp@found=N % + \expandafter\let\expandafter\HyTmp@optlist\expandafter\@empty + \HyTmp@optlist + \ifx\HyTmp@found Y% + \advance\count@ by 1 % + \else + \@onelevel@sanitize\comma@entry + \PackageWarning{hyperref}{% + \string\ChoiceBox: Ignoring value `\comma@entry',% + \MessageBreak + it cannot be found in the choices% + }% + \fi + \@gobble + }% + \def\HyTmp@optitem##1##2##3{% + \ifnum##3=1 % + (##2)% + \fi + }% + \ifcase\count@ + \or + \xdef\Fld@choices{\Fld@choices/#1\HyTmp@optlist}% + \else + \xdef\Fld@choices{\Fld@choices/#1[\HyTmp@optlist]}% + \ifx#1V% + \def\HyTmp@optitem##1##2##3{% + \ifnum##3=1 % + \@firstofone{ ##1}% + \fi + }% + \edef\HyTmp@optlist{\HyTmp@optlist}% + \xdef\Fld@choices{% + \Fld@choices + /I[\expandafter\@firstofone\HyTmp@optlist]% + }% + \fi + \fi + \fi +} +\def\HyField@SetKeys{% + \kvsetkeys{Field}% +} +\newif\ifFld@checked +\newif\ifFld@disabled +\Fld@checkedfalse +\Fld@disabledfalse +\newcount\Fld@menulength +\newdimen\Field@Width +\newdimen\Fld@charsize +\Fld@charsize=10\p@ +\def\Fld@maxlen{0} +\def\Fld@align{0} +\def\Fld@color{0 0 0 rg} +\def\Fld@bcolor{1 1 1} +\def\Fld@bordercolor{1 0 0} +\def\Fld@bordersep{1\p@} +\def\Fld@borderwidth{1} +\def\Fld@borderstyle{S} +\def\Fld@cbsymbol{4} +\def\Fld@radiosymbol{H} +\def\Fld@rotation{0} +\def\Form{\@ifnextchar[{\@Form}{\@Form[]}} +\def\endForm{\@endForm} +\newif\ifForm@html +\Form@htmlfalse +\def\Form@boolkey#1#2{% + \csname Form@#2\ifx\relax#1\relax true\else#1\fi\endcsname +} +\define@key{Form}{action}{% + \hyper@normalise\Hy@DefFormAction{#1}% +} +\def\Hy@DefFormAction{\def\Form@action} +\def\enc@@html{html} +\define@key{Form}{encoding}{% + \def\Hy@tempa{#1}% + \ifx\Hy@tempa\enc@@html + \Form@htmltrue + \def\Fld@export{html}% + \else + \Hy@Warning{% + Form `encoding' key with \MessageBreak + unknown value `#1'% + }% + \Form@htmlfalse + \fi +} +\define@key{Form}{method}{% + \lowercase{\def\Hy@temp{#1}}% + \@ifundefined{Form@method@\Hy@temp}{% + \@onelevel@sanitize\Hy@temp + \Hy@Error{% + Unknown method `\Hy@temp'.\MessageBreak + Known values are `post' and `get'% + }\@ehc + }{% + \let\Form@method\Hy@temp + \ifcase\@nameuse{Form@method@\Hy@temp} % + \Fld@getmethodfalse + \else + \Fld@getmethodtrue + \fi + }% +} +\def\Form@method{} +\@namedef{Form@method@post}{0} +\@namedef{Form@method@get}{1} +\newif\ifHyField@NeedAppearances +\def\HyField@NeedAppearancesfalse{% + \global\let\ifHyField@NeedAppearances\iffalse +} +\def\HyField@NeedAppearancestrue{% + \global\let\ifHyField@NeedAppearances\iftrue +} +\HyField@NeedAppearancestrue +\define@key{Form}{NeedAppearances}[true]{% + \edef\Hy@tempa{#1}% + \ifx\Hy@tempa\Hy@true + \HyField@NeedAppearancestrue + \else + \ifx\Hy@tempa\Hy@false + \HyField@NeedAppearancesfalse + \else + \Hy@Error{% + Unexpected value `\Hy@tempa'\MessageBreak + of option `NeedAppearances' instead of\MessageBreak + `true' or `false'% + }\@ehc + \fi + \fi +} +\def\Field@boolkey#1#2{% + \csname Fld@#2\ifx\relax#1\relax true\else#1\fi\endcsname +} +\ifHy@texht + \newtoks\Field@toks + \Field@toks={ }% + \def\Field@addtoks#1#2{% + \edef\@processme{\Field@toks{\the\Field@toks\space #1="#2"}}% + \@processme + }% +\else + \def\Hy@WarnHTMLFieldOption#1{% + \Hy@Warning{% + HTML field option `#1'\MessageBreak + is ignored% + }% + }% +\fi +\def\Fld@checkequals#1=#2=#3\\{% + \def\@currDisplay{#1}% + \ifx\\#2\\% + \def\@currValue{#1}% + \else + \def\@currValue{#2}% + \fi + \expandafter\Hy@pdfstringdef\expandafter\@currValue\expandafter{\@currValue}% +} +\define@key{Field}{loc}{% + \def\Fld@loc{#1}% +} +\define@key{Field}{checked}[true]{% + \lowercase{\Field@boolkey{#1}}{checked}% +} +\define@key{Field}{disabled}[true]{% + \lowercase{\Field@boolkey{#1}}{disabled}% +} +\ifHy@texht + \define@key{Field}{accesskey}{% + \Field@addtoks{accesskey}{#1}% + }% + \define@key{Field}{tabkey}{% + \Field@addtoks{tabkey}{#1}% + }% +\else + \define@key{Field}{accesskey}{% + \Hy@WarnHTMLFieldOption{accesskey}% + }% + \define@key{Field}{tabkey}{% + \Hy@WarnHTMLFieldOption{tabkey}% + }% +\fi +\define@key{Field}{name}{% + \def\Fld@name{#1}% +} +\let\Fld@altname\relax +\define@key{Field}{altname}{% + \def\Fld@altname{#1}% +} +\let\Fld@mappingname\relax +\define@key{Field}{mappingname}{% + \def\Fld@mappingname{#1}% +} +\define@key{Field}{width}{% + \def\Fld@width{#1}% + \Field@Width#1\setbox0=\hbox{m}% +} +\define@key{Field}{maxlen}{% + \def\Fld@maxlen{#1}% +} +\define@key{Field}{menulength}{% + \Fld@menulength=#1\relax +} +\define@key{Field}{height}{% + \def\Fld@height{#1}% +} +\define@key{Field}{charsize}{% + \setlength{\Fld@charsize}{#1}% +} +\define@key{Field}{borderwidth}{% + \Hy@defaultbp\Fld@borderwidth{#1}% +} +\def\Hy@defaultbp#1#2{% + \begingroup + \afterassignment\Hy@defaultbpAux + \dimen@=#2bp\relax{#1}{#2}% +} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname dimexpr\endcsname\relax + \def\Hy@defaultbpAux#1\relax#2#3{% + \ifx!#1!% + \endgroup + \def#2{#3}% + \else + \dimen@=.99626\dimen@ + \edef\x{\endgroup + \def\noexpand#2{% + \strip@pt\dimen@ + }% + }\x + \fi + }% +\else + \def\Hy@defaultbpAux#1\relax#2#3{% + \ifx!#1!% + \endgroup + \def#2{#3}% + \else + \edef\x{\endgroup + \def\noexpand#2{% + \strip@pt\dimexpr\dimen@*800/803\relax + }% + }\x + \fi + }% +\fi +\define@key{Field}{borderstyle}{% + \let\Hy@temp\Fld@borderstyle + \def\Fld@borderstyle{#1}% + \Hy@Match\Fld@borderstyle{}{% + ^[SDBIU]$% + }{}{% + \Hy@Warning{% + Invalid value `\@pdfborderstyle'\MessageBreak + for option `pdfborderstyle'. Valid values:\MessageBreak + \space\space S (Solid), D (Dashed), B (Beveled),\MessageBreak + \space\space I (Inset), U (Underline)\MessageBreak + Option setting is ignored% + }% + \let\Fld@borderstyle\Hy@temp + }% +} +\define@key{Field}{bordersep}{% + \def\Fld@bordersep{#1}% +} +\define@key{Field}{default}{% + \Hy@pdfstringdef\Fld@default{#1}% +} +\define@key{Field}{align}{% + \def\Fld@align{#1}% +} +\define@key{Field}{value}{% + \Hy@pdfstringdef\Fld@value{#1}% +} +\define@key{Field}{checkboxsymbol}{% + \Fld@DingDef\Fld@cbsymbol{#1}% +} +\define@key{Field}{radiosymbol}{% + \Fld@DingDef\Fld@radiosymbol{#1}% +} +\def\Fld@DingDef#1#2{% + \let\Fld@temp\ltx@empty + \Fld@@DingDef#2\ding{}\@nil + \let#1\Fld@temp +} +\def\Fld@@DingDef#1\ding#2#3\@nil{% + \expandafter\def\expandafter\Fld@temp\expandafter{% + \Fld@temp + #1% + }% + \ifx\\#3\\% + \expandafter\@gobble + \else + \begingroup + \lccode`0=#2\relax + \lowercase{\endgroup + \expandafter\def\expandafter\Fld@temp\expandafter{% + \Fld@temp + 0% + }% + }% + \expandafter\@firstofone + \fi + {% + \Fld@@DingDef#3\@nil + }% +} +\define@key{Field}{rotation}{% + \def\Fld@rotation{#1}% +} +\define@key{Field}{backgroundcolor}{% + \HyColor@FieldBColor{#1}\Fld@bcolor{hyperref}{backgroundcolor}% +} +\define@key{Field}{bordercolor}{% + \HyColor@FieldBColor{#1}\Fld@bordercolor{hyperref}{bordercolor}% +} +\define@key{Field}{color}{% + \HyColor@FieldColor{#1}\Fld@color{hyperref}{color}% +} +\let\Fld@onclick@code\ltx@empty +\let\Fld@format@code\ltx@empty +\let\Fld@validate@code\ltx@empty +\let\Fld@calculate@code\ltx@empty +\let\Fld@keystroke@code\ltx@empty +\let\Fld@onfocus@code\ltx@empty +\let\Fld@onblur@code\ltx@empty +\let\Fld@onmousedown@code\ltx@empty +\let\Fld@onmouseup@code\ltx@empty +\let\Fld@onenter@code\ltx@empty +\let\Fld@onexit@code\ltx@empty +\def\Hy@temp#1{% + \expandafter\Hy@@temp\csname Fld@#1@code\endcsname{#1}% +} +\def\Hy@@temp#1#2{% + \ifHy@pdfa + \define@key{Field}{#2}{% + \Hy@Error{% + PDF/A: Additional action `#2' is prohibited% + }\@ehc + }% + \else + \define@key{Field}{#2}{% + \def#1{##1}% + }% + \fi +} +\Hy@temp{keystroke} +\Hy@temp{format} +\Hy@temp{validate} +\Hy@temp{calculate} +\Hy@temp{onfocus} +\Hy@temp{onblur} +\Hy@temp{onenter} +\Hy@temp{onexit} +\let\Fld@calculate@sortkey\ltx@empty +\define@key{Field}{calculatesortkey}[1]{% + \def\Fld@calculate@sortkey{#1}% +} +\ifHy@texht + \def\Hy@temp#1{% + \define@key{Field}{#1}{% + \Field@addtoks{#1}{##1}% + }% + }% +\else + \def\Hy@temp#1{% + \define@key{Field}{#1}{% + \Hy@WarnHTMLFieldOption{#1}% + }% + }% +\fi +\Hy@temp{ondblclick} +\Hy@temp{onmousedown} +\Hy@temp{onmouseup} +\Hy@temp{onmouseover} +\Hy@temp{onmousemove} +\Hy@temp{onmouseout} +\Hy@temp{onkeydown} +\Hy@temp{onkeyup} +\Hy@temp{onselect} +\Hy@temp{onchange} +\Hy@temp{onkeypress} +\ifHy@texht + \define@key{Field}{onclick}{% + \Field@addtoks{onclick}{#1}% + }% +\else + \ifHy@pdfa + \define@key{Field}{onclick}{% + \Hy@Error{% + PDF/A: Action `onclick' is prohibited% + }\@ehc + }% + \else + \define@key{Field}{onclick}{% + \def\Fld@onclick@code{#1}% + }% + \fi +\fi +\DeclareRobustCommand\TextField{% + \@ifnextchar[{\@TextField}{\@TextField[]}% +} +\DeclareRobustCommand\ChoiceMenu{% + \@ifnextchar[{\@ChoiceMenu}{\@ChoiceMenu[]}% +} +\DeclareRobustCommand\CheckBox{% + \@ifnextchar[{\@CheckBox}{\@CheckBox[]}% +} +\DeclareRobustCommand\PushButton{% + \@ifnextchar[{\@PushButton}{\@PushButton[]}% +} +\DeclareRobustCommand\Gauge{% + \@ifnextchar[{\@Gauge}{\@Gauge[]}% +} +\DeclareRobustCommand\Submit{% + \@ifnextchar[{\@Submit}{\@Submit[]}% +} +\DeclareRobustCommand\Reset{% + \@ifnextchar[{\@Reset}{\@Reset[]}% +} +\def\LayoutTextField#1#2{% label, field + \def\Hy@temp{#1}% + \ifx\Hy@temp\@empty + #2% + \else + #1 #2% + \fi +} +\def\LayoutChoiceField#1#2{% label, field + \def\Hy@temp{#1}% + \ifx\Hy@temp\@empty + #2% + \else + #1 #2% + \fi +} +\def\LayoutCheckField#1#2{% label, field + \def\Hy@temp{#1}% + \ifx\Hy@temp\@empty + #2% + \else + #1 #2% + \fi +} +\def\LayoutPushButtonField#1{% button + #1% +} +\def\MakeRadioField#1#2{\vbox to #2{\hbox to #1{\hfill}\vfill}} +\def\MakeCheckField#1#2{\vbox to #2{\hbox to #1{\hfill}\vfill}} +\def\MakeTextField#1#2{\vbox to #2{\hbox to #1{\hfill}\vfill}} +\def\MakeChoiceField#1#2{\vbox to #2{\hbox to #1{\hfill}\vfill}} +\def\MakeButtonField#1{% + \sbox0{% + \hskip\Fld@borderwidth bp#1\hskip\Fld@borderwidth bp% + }% + \@tempdima\ht0 % + \advance\@tempdima by \Fld@borderwidth bp % + \advance\@tempdima by \Fld@borderwidth bp % + \ht0\@tempdima + \@tempdima\dp0 % + \advance\@tempdima by \Fld@borderwidth bp % + \advance\@tempdima by \Fld@borderwidth bp % + \dp0\@tempdima + \box0\relax +} +\def\DefaultHeightofSubmit{14pt} +\def\DefaultWidthofSubmit{2cm} +\def\DefaultHeightofReset{14pt} +\def\DefaultWidthofReset{2cm} +\def\DefaultHeightofCheckBox{\normalbaselineskip} +\def\DefaultWidthofCheckBox{\normalbaselineskip} +\def\DefaultHeightofChoiceMenu{\normalbaselineskip} +\def\DefaultWidthofChoiceMenu{\normalbaselineskip} +\def\DefaultHeightofText{\normalbaselineskip} +\def\DefaultHeightofTextMultiline{4\normalbaselineskip} +\def\DefaultWidthofText{3cm} +\def\DefaultOptionsofSubmit{print,name=Submit,noexport} +\def\DefaultOptionsofReset{print,name=Reset,noexport} +\def\DefaultOptionsofPushButton{print} +\def\DefaultOptionsofCheckBox{print} +\def\DefaultOptionsofText{print} +\def\DefaultOptionsofListBox{print} +\def\DefaultOptionsofComboBox{print,edit,sort} +\def\DefaultOptionsofPopdownBox{print} +\def\DefaultOptionsofRadio{print,notoggletooff} +\ifHy@hyperfigures + \Hy@Info{Hyper figures ON}% +\else + \Hy@Info{Hyper figures OFF}% +\fi +\ifHy@nesting + \Hy@Info{Link nesting ON}% +\else + \Hy@Info{Link nesting OFF}% +\fi +\ifHy@hyperindex + \Hy@Info{Hyper index ON}% +\else + \Hy@Info{Hyper index OFF}% +\fi +\ifHy@backref + \Hy@Info{backreferencing ON}% +\else + \Hy@Info{backreferencing OFF}% +\fi +\ifHy@colorlinks + \Hy@Info{Link coloring ON}% +\else + \Hy@Info{Link coloring OFF}% +\fi +\ifHy@ocgcolorlinks + \Hy@Info{Link coloring with OCG ON}% +\else + \Hy@Info{Link coloring with OCG OFF}% +\fi +\ifHy@pdfa + \Hy@Info{PDF/A mode ON}% +\else + \Hy@Info{PDF/A mode OFF}% +\fi +\edef\hyper@hash{\string#} +\edef\hyper@tilde{\string~} +\edef\hyper@quote{\string"} +\def\@currentHref{Doc-Start} +\let\Hy@footnote@currentHref\@empty +\Hy@AtBeginDocument{% + \Hy@pdfstringtrue + \PDF@SetupDoc + \let\PDF@SetupDoc\@empty + \Hy@DisableOption{pdfpagescrop}% + \Hy@DisableOption{pdfpagemode}% + \Hy@DisableOption{pdfnonfullscreenpagemode}% + \Hy@DisableOption{pdfdirection}% + \Hy@DisableOption{pdfviewarea}% + \Hy@DisableOption{pdfviewclip}% + \Hy@DisableOption{pdfprintarea}% + \Hy@DisableOption{pdfprintclip}% + \Hy@DisableOption{pdfprintscaling}% + \Hy@DisableOption{pdfduplex}% + \Hy@DisableOption{pdfpicktraybypdfsize}% + \Hy@DisableOption{pdfprintpagerange}% + \Hy@DisableOption{pdfnumcopies}% + \Hy@DisableOption{pdfstartview}% + \Hy@DisableOption{pdfstartpage}% + \Hy@DisableOption{pdftoolbar}% + \Hy@DisableOption{pdfmenubar}% + \Hy@DisableOption{pdfwindowui}% + \Hy@DisableOption{pdffitwindow}% + \Hy@DisableOption{pdfcenterwindow}% + \Hy@DisableOption{pdfdisplaydoctitle}% + \Hy@DisableOption{pdfpagelayout}% + \Hy@DisableOption{pdflang}% + \Hy@DisableOption{baseurl}% + \ifHy@texht\else\hyper@anchorstart{Doc-Start}\hyper@anchorend\fi + \Hy@pdfstringfalse +} + +\LetLtxMacro\NoHy@OrgRef\ref +\DeclareRobustCommand*{\ref}{% + \@ifstar\NoHy@OrgRef\NoHy@OrgRef +} +\LetLtxMacro\NoHy@OrgPageRef\pageref +\DeclareRobustCommand*{\pageref}{% + \@ifstar\NoHy@OrgPageRef\NoHy@OrgPageRef +} +\def\NoHyper{% + \def\hyper@link@[##1]##2##3##4{##4\Hy@xspace@end}% + \def\hyper@@anchor##1##2{##2\Hy@xspace@end}% + \global\let\hyper@livelink\hyper@link + \gdef\hyper@link##1##2##3{##3\Hy@xspace@end}% + \let\hyper@anchor\ltx@gobble + \let\hyper@anchorstart\ltx@gobble + \def\hyper@anchorend{\Hy@xspace@end}% + \let\hyper@linkstart\ltx@gobbletwo + \def\hyper@linkend{\Hy@xspace@end}% + \def\hyper@linkurl##1##2{##1\Hy@xspace@end}% + \def\hyper@linkfile##1##2##3{##1\Hy@xspace@end}% + \let\Hy@backout\@gobble +} +\def\stop@hyper{% + \def\hyper@link@[##1]##2##3##4{##4\Hy@xspace@end}% + \let\Hy@backout\@gobble + \let\hyper@@anchor\ltx@gobble + \def\hyper@link##1##2##3{##3\Hy@xspace@end}% + \let\hyper@anchor\ltx@gobble + \let\hyper@anchorstart\ltx@gobble + \def\hyper@anchorend{\Hy@xspace@end}% + \let\hyper@linkstart\ltx@gobbletwo + \def\hyper@linkend{\Hy@xspace@end}% + \def\hyper@linkurl##1##2{##1\Hy@xspace@end}% + \def\hyper@linkfile##1##2##3{##1\Hy@xspace@end}% +} +\def\endNoHyper{% + \global\let\hyper@link\hyper@livelink +} +\Hy@AtBeginDocument{% + \if@filesw + \ifHy@typexml + \immediate\closeout\@mainaux + \immediate\openout\@mainaux\jobname.aux\relax + \immediate\write\@auxout{<relaxxml>\relax}% + \fi + \immediate\write\@auxout{% + \string\providecommand\string\HyperFirstAtBeginDocument{% + \string\AtBeginDocument}^^J% + \string\HyperFirstAtBeginDocument{% + \string\ifx\string\hyper@anchor\string\@undefined^^J% + \string\global\string\let\string\oldcontentsline\string\contentsline^^J% + \string\gdef\string\contentsline% + \string#1\string#2\string#3\string#4{% + \string\oldcontentsline% + {\string#1}{\string#2}{\string#3}}^^J% + \string\global\string\let\string\oldnewlabel\string\newlabel^^J% + \string\gdef\string\newlabel\string#1\string#2{% + \string\newlabelxx{\string#1}\string#2}^^J% + \string\gdef\string\newlabelxx% + \string#1\string#2\string#3\string#4\string#5\string#6{% + \string\oldnewlabel{\string#1}{{\string#2}{\string#3}}}^^J% + \string\AtEndDocument{% + \string\ifx\string\hyper@anchor\string\@undefined^^J% + \string\let\string\contentsline\string\oldcontentsline^^J% + \string\let\string\newlabel\string\oldnewlabel^^J% + \string\fi% + }^^J% + \string\fi% + }^^J% + \string\global\string\let\string\hyper@last\relax^^J% + \string\gdef\string\HyperFirstAtBeginDocument\string#1{\string#1}% + }% + \fi + \let\HyperFirstAtBeginDocument\ltx@firstofone + \ifx\hyper@last\@undefined + \def\@starttoc#1{% + \begingroup + \makeatletter + \ltx@ifpackageloaded{parskip}{\parskip\z@}{}% + \IfFileExists{\jobname.#1}{% + \Hy@WarningNoLine{% + old #1 file detected, not used; run LaTeX again% + }% + }{}% + \if@filesw + \expandafter\newwrite\csname tf@#1\endcsname + \immediate\openout\csname tf@#1\endcsname \jobname.#1\relax + \fi + \@nobreakfalse + \endgroup + }% + \def\newlabel#1#2{\@newl@bel r{#1}{#2{}{}{}{}}}% + \fi +} +\ifHy@pdfusetitle + \let\HyOrg@title\title + \let\HyOrg@author\author + \def\title{\@ifnextchar[{\Hy@scanopttitle}{\Hy@scantitle}}% + \def\Hy@scanopttitle[#1]{% + \gdef\Hy@title{#1}% + \HyOrg@title[{#1}]% + }% + \def\Hy@scantitle#1{% + \gdef\Hy@title{#1}% + \HyOrg@title{#1}% + }% + \def\author{\@ifnextchar[{\Hy@scanoptauthor}{\Hy@scanauthor}}% + \def\Hy@scanoptauthor[#1]{% + \gdef\Hy@author{#1}% + \HyOrg@author[{#1}]% + }% + \def\Hy@scanauthor#1{% + \gdef\Hy@author{#1}% + \HyOrg@author{#1}% + }% + \begingroup + \def\process@me#1\@nil#2{% + \expandafter\let\expandafter\x\csname @#2\endcsname + \edef\y{\expandafter\strip@prefix\meaning\x}% + \def\c##1#1##2\@nil{% + \ifx\\##1\\% + \else + \expandafter\gdef\csname Hy@#2\expandafter\endcsname + \expandafter{\x}% + \fi + }% + \expandafter\c\y\relax#1\@nil + }% + \expandafter\process@me\string\@latex@\@nil{title}% + \expandafter\process@me\string\@latex@\@nil{author}% + \endgroup +\fi +\Hy@DisableOption{pdfusetitle} +\def\Hy@UseMaketitleString#1{% + \ltx@IfUndefined{Hy@#1}{}{% + \begingroup + \let\Hy@saved@hook\pdfstringdefPreHook + \pdfstringdefDisableCommands{% + \expandafter\let\expandafter\\\csname Hy@newline@#1\endcsname + \let\newline\\% + \def\and{; }% + \let\thanks\@gobble% + }% + \expandafter\ifx\csname @pdf#1\endcsname\@empty + \expandafter\pdfstringdef\csname @pdf#1\endcsname{% + \csname Hy@#1\endcsname\@empty + }% + \fi + \global\let\pdfstringdefPreHook\Hy@saved@hook + \endgroup + }% +} +\def\Hy@newline@title#1{ #1} +\def\Hy@newline@author#1{, #1} +\def\Hy@UseMaketitleInfos{% + \Hy@UseMaketitleString{title}% + \Hy@UseMaketitleString{author}% +} +\RequirePackage{atbegshi}[2007/09/09] +\let\Hy@EveryPageHook\ltx@empty +\let\Hy@EveryPageBoxHook\ltx@empty +\let\Hy@FirstPageHook\ltx@empty +\AtBeginShipout{% + \Hy@EveryPageHook + \ifx\Hy@EveryPageBoxHook\ltx@empty + \else + \setbox\AtBeginShipoutBox=\vbox{% + \offinterlineskip + \Hy@EveryPageBoxHook + \box\AtBeginShipoutBox + }% + \fi +} +\ltx@iffileloaded{hpdftex.def}{% + \AtBeginShipout{% + \Hy@FirstPageHook + \global\let\Hy@FirstPageHook\ltx@empty + }% +}{% + \AtBeginShipoutFirst{% + \Hy@FirstPageHook + }% +} +\g@addto@macro\Hy@FirstPageHook{% + \PDF@FinishDoc + \global\let\PDF@FinishDoc\ltx@empty +} +\ifHy@pdfpagelabels + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname thepage\endcsname\relax + \Hy@pdfpagelabelsfalse + \Hy@WarningNoLine{% + Option `pdfpagelabels' is turned off\MessageBreak + because \string\thepage\space is undefined% + }% + \csname fi\endcsname + \csname iffalse\expandafter\endcsname + \fi + \def\thispdfpagelabel#1{% + \gdef\HyPL@thisLabel{#1}% + }% + \global\let\HyPL@thisLabel\relax + \let\HyPL@Labels\ltx@empty + \newcount\Hy@abspage + \Hy@abspage=0 % + \def\HyPL@LastType{init}% + \def\HyPL@LastNumber{0}% + \let\HyPL@LastPrefix\ltx@empty + \def\HyPL@arabic{D}% + \def\HyPL@Roman{R}% + \def\HyPL@roman{r}% + \def\HyPL@Alph{A}% + \def\HyPL@alph{a}% + \let\HyPL@SlidesSetPage\ltx@empty + \ltx@ifclassloaded{slides}{% + \def\HyPL@SlidesSetPage{% + \advance\c@page\ltx@one + \ifnum\value{page}>\ltx@one + \protected@edef\HyPL@SlidesOptionalPage{% + \Hy@SlidesFormatOptionalPage{\thepage}% + }% + \else + \let\HyPL@SlidesOptionalPage\ltx@empty + \fi + \advance\c@page-\ltx@one + \def\HyPL@page{% + \csname the\Hy@SlidesPage\endcsname + \HyPL@SlidesOptionalPage + }% + }% + }{}% + \def\HyPL@EveryPage{% + \begingroup + \ifx\HyPL@thisLabel\relax + \let\HyPL@page\thepage + \HyPL@SlidesSetPage + \else + \let\HyPL@page\HyPL@thisLabel + \global\let\HyPL@thisLabel\relax + \fi + \let\HyPL@Type\relax + \ifnum\c@page>0 % + \ifx\HyPL@SlidesSetPage\ltx@empty + \expandafter\HyPL@CheckThePage\HyPL@page\@nil + \fi + \fi + \let\Hy@temp Y% + \ifx\HyPL@Type\HyPL@LastType + \else + \let\Hy@temp N% + \fi + \ifx\HyPL@Type\relax + \pdfstringdef\HyPL@Prefix{\HyPL@page}% + \else + \pdfstringdef\HyPL@Prefix\HyPL@Prefix + \fi + \ifx\HyPL@Prefix\HyPL@LastPrefix + \else + \let\Hy@temp N% + \fi + \if Y\Hy@temp + \advance\c@page by -1 % + \ifnum\HyPL@LastNumber=\the\c@page\relax + \else + \let\Hy@temp N% + \fi + \Hy@StepCount\c@page + \fi + \if N\Hy@temp + \ifx\HyPL@Type\relax + \HyPL@StorePageLabel{/P(\HyPL@Prefix)}% + \else + \HyPL@StorePageLabel{% + \ifx\HyPL@Prefix\@empty + \else + /P(\HyPL@Prefix)% + \fi + /S/\csname HyPL\HyPL@Type\endcsname + \ifnum\the\c@page=1 % + \else + \space/St \the\c@page + \fi + }% + \fi + \fi + \xdef\HyPL@LastNumber{\the\c@page}% + \global\let\HyPL@LastType\HyPL@Type + \global\let\HyPL@LastPrefix\HyPL@Prefix + \endgroup + \Hy@GlobalStepCount\Hy@abspage + }% + \def\HyPL@CheckThePage#1\@nil{% + \HyPL@@CheckThePage{#1}#1\csname\endcsname\c@page\@nil + }% + \def\HyPL@@CheckThePage#1#2\csname#3\endcsname\c@page#4\@nil{% + \def\Hy@tempa{#4}% + \def\Hy@tempb{\csname\endcsname\c@page}% + \ifx\Hy@tempa\Hy@tempb + \expandafter\ifx\csname HyPL#3\endcsname\relax + \else + \def\HyPL@Type{#3}% + \def\HyPL@Prefix{#2}% + \fi + \else + \begingroup + \let\Hy@next\endgroup + \let\HyPL@found\@undefined + \def\arabic{\HyPL@Format{arabic}}% + \def\Roman{\HyPL@Format{Roman}}% + \def\roman{\HyPL@Format{roman}}% + \def\Alph{\HyPL@Format{Alph}}% + \def\alph{\HyPL@Format{alph}}% + \protected@edef\Hy@temp{#1}% + \ifx\HyPL@found\relax + \toks@\expandafter{\Hy@temp}% + \edef\Hy@next{\endgroup + \noexpand\HyPL@@@CheckThePage\the\toks@ + \noexpand\HyPL@found\relax\noexpand\@nil + }% + \fi + \Hy@next + \fi + }% + \def\HyPL@Format#1#2{% + \ifx\HyPL@found\@undefined + \expandafter\ifx\csname c@#2\endcsname\c@page + \expandafter\noexpand\csname HyPL@found\endcsname{#1}% + \else + \expandafter\noexpand\csname#1\endcsname{#2}% + \fi + \else + \expandafter\noexpand\csname#1\endcsname{#2}% + \fi + }% + \def\HyPL@@@CheckThePage#1\HyPL@found#2#3\@nil{% + \def\Hy@tempa{#3}% + \def\Hy@tempb{\HyPL@found\relax}% + \ifx\Hy@tempa\Hy@tempb + \def\HyPL@Type{@#2}% + \def\HyPL@Prefix{#1}% + \fi + }% + \providecommand*{\HyPL@StorePageLabel}[1]{}% + \def\HyPL@Useless{0<</S/D>>}% + \@onelevel@sanitize\HyPL@Useless + \def\HyPL@SetPageLabels{% + \@onelevel@sanitize\HyPL@Labels + \ifx\HyPL@Labels\@empty + \else + \ifx\HyPL@Labels\HyPL@Useless + \else + \Hy@PutCatalog{/PageLabels<</Nums[\HyPL@Labels]>>}% + \fi + \fi + }% + \g@addto@macro\Hy@EveryPageHook{\HyPL@EveryPage}% +\fi +\Hy@DisableOption{pdfpagelabels} +\ifx\MaybeStopEarly\relax +\else + \Hy@stoppedearlytrue + \expandafter\MaybeStopEarly +\fi +\Hy@stoppedearlyfalse +\def\Hy@CounterExists#1{% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname c@#1\endcsname\relax + \expandafter\@gobble + \else + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname the#1\endcsname\relax + \expandafter\expandafter\expandafter\@gobble + \else + \expandafter\expandafter\expandafter\@firstofone + \fi + \fi +} +\Hy@CounterExists{section}{% + \providecommand\theHequation{\theHsection.\arabic{equation}}% +} +\Hy@CounterExists{part}{% + \providecommand\theHpart{\arabic{part}}% +} +\ltx@IfUndefined{thechapter}{% + \providecommand\theHsection {\arabic{section}}% + \providecommand\theHfigure {\arabic{figure}}% + \providecommand\theHtable {\arabic{table}}% +}{% + \providecommand\theHchapter {\arabic{chapter}}% + \providecommand\theHfigure {\theHchapter.\arabic{figure}}% + \providecommand\theHtable {\theHchapter.\arabic{table}}% + \providecommand\theHsection {\theHchapter.\arabic{section}}% +} +\providecommand\theHsubsection {\theHsection.\arabic{subsection}} +\providecommand\theHsubsubsection{\theHsubsection.\arabic{subsubsection}} +\providecommand\theHparagraph {\theHsubsubsection.\arabic{paragraph}} +\providecommand\theHsubparagraph {\theHparagraph.\arabic{subparagraph}} +\providecommand\theHtheorem {\theHsection.\arabic{theorem}} +\providecommand\theHthm {\theHsection.\arabic{thm}} +\let\H@item\item +\newcounter{Item} +\def\theHItem{\arabic{Item}} +\def\item{% + \@hyper@itemfalse + \if@nmbrlist\@hyper@itemtrue\fi + \H@item +} +\providecommand\theHenumi {\theHItem} +\providecommand\theHenumii {\theHItem} +\providecommand\theHenumiii {\theHItem} +\providecommand\theHenumiv {\theHItem} +\providecommand\theHHfootnote {\arabic{Hfootnote}} +\providecommand\theHmpfootnote{\arabic{mpfootnote}} +\@ifundefined{theHHmpfootnote}{% + \let\theHHmpfootnote\theHHfootnote +}{} +\let\H@refstepcounter\refstepcounter +\edef\name@of@eq{equation}% +\edef\name@of@slide{slide}% +\newif\if@hyper@item +\newif\if@skiphyperref +\@hyper@itemfalse +\@skiphyperreffalse +\def\refstepcounter#1{% + \ifHy@pdfstring + \else + \H@refstepcounter{#1}% + \edef\This@name{#1}% + \ifx\This@name\name@of@slide + \else + \if@skiphyperref + \else + \if@hyper@item + \stepcounter{Item}% + \hyper@refstepcounter{Item}% + \@hyper@itemfalse + \else + \hyper@refstepcounter{#1}% + \fi + \fi + \fi + \fi +} +\let\Hy@saved@refstepcounter\refstepcounter +\@ifpackageloaded{amsmath}{}{\newif\ifmeasuring@\measuring@false} +\def\hyper@refstepcounter#1{% + \edef\This@name{#1}% + \ifx\This@name\name@of@eq + \@ifundefined{theHequation}{% + \make@stripped@name{\theequation}% + \let\theHequation\newname + }{}% + \fi + \HyCnt@ProvideTheHCounter{#1}% + \hyper@makecurrent{#1}% + \ifmeasuring@ + \else + \Hy@raisedlink{% + \hyper@anchorstart{\@currentHref}\hyper@anchorend + }% + \fi +} +\def\HyCnt@ProvideTheHCounter#1{% + \@ifundefined{theH#1}{% + \expandafter\def\csname theH#1\endcsname{}% + \def\Hy@temp{\@elt{#1}}% + \ltx@onelevel@sanitize\Hy@temp + \let\HyOrg@elt\@elt + \edef\@elt{% + \noexpand\HyCnt@LookForParentCounter + \expandafter\noexpand\csname theH#1\endcsname + }% + \cl@@ckpt + \let\@elt\HyOrg@elt + \expandafter + \ltx@LocalAppendToMacro\csname theH#1\expandafter\endcsname + \expandafter{% + \expandafter\@arabic\csname c@#1\endcsname + }% + }{}% +} +\def\HyCnt@LookForParentCounter#1#2{% + \expandafter\let\expandafter\Hy@temp@A\csname cl@#2\endcsname + \ltx@IfUndefined{cl@#2}{% + }{% + \ltx@onelevel@sanitize\Hy@temp@A + \edef\Hy@temp@A{% + \noexpand\in@{\Hy@temp}{\Hy@temp@A}% + }\Hy@temp@A + \ifin@ + \ltx@IfUndefined{theH#2}{% + \expandafter\ltx@LocalAppendToMacro\expandafter#1% + \expandafter{% + \expandafter\@arabic\csname c@#2\endcsname.% + }% + }{% + \expandafter\ltx@LocalAppendToMacro\expandafter#1% + \expandafter{% + \csname theH#2\endcsname.% + }% + }% + \fi + }% +} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname chapter\endcsname\relax + \def\Hy@chapterstring{section}% +\else + \def\Hy@chapterstring{chapter}% +\fi +\def\Hy@appendixstring{appendix} +\def\Hy@chapapp{\Hy@chapterstring} +\ltx@IfUndefined{appendix}{% +}{% + \let\HyOrg@appendix\appendix + \def\Hy@AlphNoErr#1{% + \ifnum\value{#1}>26 % + Alph\number\value{#1}% + \else + \ifnum\value{#1}<1 % + Alph\number\value{#1}% + \else + \Alph{#1}% + \fi + \fi + }% + \def\appendix{% + \ltx@IfUndefined{chapter}{% + \gdef\theHsection{\Hy@AlphNoErr{section}}% + }{% + \gdef\theHchapter{\Hy@AlphNoErr{chapter}}% + }% + \xdef\Hy@chapapp{\Hy@appendixstring}% + \HyOrg@appendix + }% +} +\def\Hy@Test@alph#1{% + \ifcase#1\or + a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or + k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or + u\or v\or w\or x\or y\or z% + \else + \@ctrerr + \fi +} +\def\Hy@Test@Alph#1{% + \ifcase#1\or + A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or + K\or L\or M\or N\or O\or P\or Q\or R\or S\or T\or + U\or V\or W\or X\or Y\or Z% + \else + \@ctrerr + \fi +} +\def\hyper@makecurrent#1{% + \begingroup + \Hy@safe@activestrue + \edef\Hy@param{#1}% + \ifx\Hy@param\Hy@chapterstring + \let\Hy@param\Hy@chapapp + \fi + \ifHy@hypertexnames + \let\@number\@firstofone + \def\@fnsymbol##1{fnsymbol\number##1}% + \def\@arabic##1{\number##1}% + \ifx\@alph\Hy@Test@alph + \else + \def\@alph{alph\number}% + \fi + \ifx\@Alph\Hy@Test@Alph + \else + \def\@Alph{Alph\number}% + \fi + \ifHy@naturalnames + \let\textlatin\@firstofone + \xdef\HyperGlobalCurrentHref{\csname the#1\endcsname}% + \else + \xdef\HyperGlobalCurrentHref{% + \csname + the% + \expandafter\ifx\csname theH#1\endcsname\relax\else H\fi + #1% + \endcsname + }% + \fi + \xdef\HyperGlobalCurrentHref{% + \Hy@param.\expandafter\strip@prefix\meaning\HyperGlobalCurrentHref + }% + \else + \Hy@GlobalStepCount\Hy@linkcounter + \xdef\HyperGlobalCurrentHref{\Hy@param.\the\Hy@linkcounter}% + \fi + \endgroup + \let\HyperLocalCurrentHref\HyperGlobalCurrentHref + \ifHy@localanchorname + \let\@currentHref\HyperLocalCurrentHref + \else + \global\let\@currentHref\HyperGlobalCurrentHref + \fi +} +\def\Hy@MakeCurrentHref#1{% + \edef\HyperLocalCurrentHref{#1}% + \@onelevel@sanitize\HyperLocalCurrentHref + \global\let\HyperGlobalCurrentHref\HyperLocalCurrentHref + \let\HyperLocalCurrentHref\HyperGlobalCurrentHref + \ifHy@localanchorname + \let\@currentHref\HyperLocalCurrentHref + \else + \global\let\@currentHref\HyperGlobalCurrentHref + \fi +} +\def\Hy@MakeCurrentHrefAuto#1{% + \Hy@GlobalStepCount\Hy@linkcounter + \Hy@MakeCurrentHref{#1.\the\Hy@linkcounter}% +} +\def\@currentHlabel{\@currentHref} +\@ifpackageloaded{fancyvrb}{% + \@ifpackagelater{fancyvrb}{1998/05/20}{}{% + \def\FV@StepLineNo{% + \FV@SetLineNo + \def\FV@StepLineNo{\H@refstepcounter{FancyVerbLine}}% + \FV@StepLineNo + }% + }% +}{} +\Hy@AtBeginDocument{% + \@ifclassloaded{revtex4}{% + \@namedef{ver@lastpage.sty}{1994/06/25}% + }{}% + \@ifpackageloaded{lastpage}{% + \ifHy@pageanchor + \else + \Hy@WarningNoLine{% + The \string\pageref{LastPage} link doesn't work\MessageBreak + with disabled option `pageanchor'% + }% + \fi + \def\lastpage@putlabel{% + \addtocounter{page}{-1}% + \if@filesw + \begingroup + \let\@number\@firstofone + \ifHy@pageanchor + \ifHy@hypertexnames + \ifHy@plainpages + \def\Hy@temp{\arabic{page}}% + \else + \Hy@unicodefalse + \pdfstringdef\Hy@temp{\thepage}% + \fi + \else + \def\Hy@temp{\the\Hy@pagecounter}% + \fi + \fi + \immediate\write\@auxout{% + \string\newlabel + {LastPage}{{}{\thepage}{}{% + \ifHy@pageanchor page.\Hy@temp\fi}{}}% + }% + \endgroup + \fi + \addtocounter{page}{1}% + }% + \@ifclassloaded{revtex4}{% + \begingroup + \toks@\expandafter{\lastpage@putlabel}% + \edef\x{\endgroup + \def\noexpand\lastpage@putlabel{% + \noexpand\stepcounter{page}% + \the\toks@ + \noexpand\addtocounter{page}\noexpand\m@ne + }% + }% + \x + }{}% + }{}% +} +\def\hypergetref#1{\getrefbykeydefault{#1}{}{??}} +\def\hypergetpageref#1{\getrefbykeydefault{#1}{page}{0}} +\@ifpackageloaded{titlesec}{% + \def\ttl@Hy@steplink#1{% + \Hy@MakeCurrentHrefAuto{#1*}% + \edef\ttl@Hy@saveanchor{% + \noexpand\Hy@raisedlink{% + \noexpand\hyper@anchorstart{\@currentHref}% + \noexpand\hyper@anchorend + \def\noexpand\ttl@Hy@SavedCurrentHref{\@currentHref}% + \noexpand\ttl@Hy@PatchSaveWrite + }% + }% + }% + \def\ttl@Hy@PatchSaveWrite{% + \begingroup + \toks@\expandafter{\ttl@savewrite}% + \edef\x{\endgroup + \def\noexpand\ttl@savewrite{% + \let\noexpand\@currentHref + \noexpand\ttl@Hy@SavedCurrentHref + \the\toks@ + }% + }% + \x + }% + \def\ttl@Hy@refstepcounter#1{% + \let\ttl@b\Hy@raisedlink + \def\Hy@raisedlink##1{% + \def\ttl@Hy@saveanchor{\Hy@raisedlink{##1}}% + }% + \refstepcounter{#1}% + \let\Hy@raisedlink\ttl@b + }% +}{} +\@ifpackageloaded{titletoc}{% + \def\ttl@gobblecontents#1#2#3#4{\ignorespaces}% +}{} +\AtBeginDocument{% +\def\Hy@varioref@undefined{{??}{??}{}{}{}} +\@ifpackageloaded{varioref}{% + \def\vref@pagenum#1#2{% + \@ifundefined{r@#2}{% + \expandafter\let\csname r@#2\endcsname\Hy@varioref@undefined + }{}% + \edef#1{\getpagerefnumber{#2}}% + }% +}{} +\def\Hy@varioref@refstepcounter#1{% + \stepcounter{#1}% + \protected@edef\@currentlabel{% + \csname p@#1\expandafter\endcsname\csname the#1\endcsname + }% +} + \ifx\refstepcounter\Hy@varioref@refstepcounter + \let\H@refstepcounter\refstepcounter + \let\refstepcounter\Hy@saved@refstepcounter + \fi +} +\@ifpackageloaded{longtable}{% + \begingroup + \def\y{\LT@array}% + \@ifundefined{scr@LT@array}{% + \@ifundefined{adl@LT@array}{}{\def\y{\adl@LT@array}}% + }{\def\y{\scr@LT@array}}% + \long\def\x\refstepcounter#1#2\@sharp#3#4\@nil{% + \expandafter\endgroup + \expandafter\def\y[##1]##2{% + \H@refstepcounter{#1}% + \hyper@makecurrent{table}% + \let\Hy@LT@currentHref\@currentHref + #2\@sharp#####4% + }% + }% + \expandafter\expandafter\expandafter\x\y[{#1}]{#2}\@nil + \begingroup + \def\x#1\ifvoid\LT@foot#2\fi#3\@nil{% + \endgroup + \def\LT@start{% + #1% + \ifvoid\LT@foot#2\fi + \let\@currentHref\Hy@LT@currentHref + \Hy@raisedlink{% + \hyper@anchorstart{\@currentHref}\hyper@anchorend + }% + #3% + }% + }% + \expandafter\x\LT@start\@nil +}{} +\let\new@refstepcounter\refstepcounter +\let\H@equation\equation +\let\H@endequation\endequation +\@ifpackageloaded{amsmath}{% + \long\def\Hy@temp{% + \incr@eqnum + \mathdisplay@push + \st@rredfalse \global\@eqnswtrue + \mathdisplay{equation}% + }% + \ifx\Hy@temp\equation + \expandafter\ifx\csname if@fleqn\expandafter\endcsname + \csname iftrue\endcsname + \else + \long\def\equation{% + \mathdisplay@push + \st@rredfalse \global\@eqnswtrue + \mathdisplay{equation}% + \incr@eqnum + }% + \fi + \fi +}{% + \def\equation{% + \let\refstepcounter\H@refstepcounter + \H@equation + \@ifundefined{theHequation}{% + \make@stripped@name{\theequation}% + \let\theHequation\newname + }{}% + \hyper@makecurrent{equation}% + \mathopen{% + \Hy@raisedlink{\hyper@anchorstart{\@currentHref}}% + }% + \let\refstepcounter\new@refstepcounter + }% + \def\endequation{% + \ifx\Hy@raisedlink\ltx@empty + \hyper@anchorend + \else + \mathclose{\Hy@raisedlink{\hyper@anchorend}}% + \fi + \H@endequation + }% +} +\newif\if@eqnstar +\@eqnstarfalse +\let\H@eqnarray\eqnarray +\let\H@endeqnarray\endeqnarray +\def\eqnarray{% + \let\Hy@reserved@a\relax + \def\@currentHref{}% + \H@eqnarray + \if@eqnstar + \else + \ifx\\\@currentHref\\% + \else + \@ifundefined{theHequation}{% + \make@stripped@name{\theequation}% + \let\theHequation\newname + }{}% + \hyper@makecurrent{equation}% + \mathopen{% + \Hy@raisedlink{% + \hyper@anchorstart{\@currentHref}\hyper@anchorend + }% + }% + \fi + \fi +} +\def\endeqnarray{% + \H@endeqnarray +} +\@namedef{eqnarray*}{% + \def\@eqncr{\nonumber\@seqncr}\@eqnstartrue\eqnarray +} +\@namedef{endeqnarray*}{% + \nonumber\endeqnarray\@eqnstarfalse +} +\ltx@IfUndefined{subeqnarray}{}{% + \let\H@subeqnarray\subeqnarray + \let\H@endsubeqnarray\endsubeqnarray + \def\subeqnarray{% + \let\Hy@reserved@a\relax + \H@subeqnarray + \@ifundefined{theHequation}{% + \make@stripped@name{\theequation}% + \let\theHequation\newname + }{}% + \hyper@makecurrent{equation}% + \hyper@anchorstart{\@currentHref}{}\hyper@anchorend + }% + \def\endsubeqnarray{% + \H@endsubeqnarray + }% + \providecommand\theHsubequation{\theHequation\alph{subequation}}% +} +\def\make@stripped@name#1{% + \begingroup + \escapechar\m@ne + \global\let\newname\@empty + \protected@edef\Hy@tempa{#1}% + \edef\@tempb{% + \noexpand\@tfor\noexpand\Hy@tempa:=% + \expandafter\strip@prefix\meaning\Hy@tempa + }% + \@tempb\do{% + \if{\Hy@tempa\else + \if}\Hy@tempa\else + \xdef\newname{\newname\Hy@tempa}% + \fi + \fi + }% + \endgroup +} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname subequations\endcsname\relax +\else + \let\HyOrg@subequations\subequations + \def\subequations{% + \stepcounter{equation}% + \protected@edef\theHparentequation{% + \@ifundefined{theHequation}\theequation\theHequation + }% + \addtocounter{equation}{-1}% + \HyOrg@subequations + \def\theHequation{\theHparentequation\alph{equation}}% + \ignorespaces + }% +\fi +\Hy@AtBeginDocument{% +\@ifpackageloaded{cleveref}{% +\let\Hy@savedthm\@thm +\def\@thm{\ifhmode\unskip\fi\Hy@savedthm}% +}{% +\@ifpackageloaded{amsthm}{% + \def\Hy@temp#1#2#3{% + \ifhmode\unskip\unskip\par\fi + \normalfont + \trivlist + \let\thmheadnl\relax + \let\thm@swap\@gobble + \let\thm@indent\indent % indent + \thm@headfont{\scshape}% heading font small caps + \thm@notefont{\fontseries\mddefault\upshape}% + \thm@headpunct{.}% add period after heading + \thm@headsep 5\p@ plus\p@ minus\p@\relax + \thm@space@setup + #1% style overrides + \@topsep \thm@preskip % used by thm head + \@topsepadd \thm@postskip % used by \@endparenv + \def\@tempa{#2}\ifx\@empty\@tempa + \def\@tempa{\@oparg{\@begintheorem{#3}{}}[]}% + \else + \refstepcounter{#2}% + \def\@tempa{% + \@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]% + }% + \fi + \@tempa + }% + \ifx\Hy@temp\@thm + \def\@thm#1#2#3{% + \ifhmode + \unskip\unskip\par + \fi + \normalfont + \trivlist + \let\thmheadnl\relax + \let\thm@swap\@gobble + \let\thm@indent\indent % indent + \thm@headfont{\scshape}% heading font small caps + \thm@notefont{\fontseries\mddefault\upshape}% + \thm@headpunct{.}% add period after heading + \thm@headsep 5\p@ plus\p@ minus\p@\relax + \thm@space@setup + #1% style overrides + \@topsep \thm@preskip % used by thm head + \@topsepadd \thm@postskip % used by \@endparenv + \def\dth@counter{#2}% + \ifx\@empty\dth@counter + \def\@tempa{% + \@oparg{\@begintheorem{#3}{}}[]% + }% + \else + \H@refstepcounter{#2}% + \hyper@makecurrent{#2}% + \let\Hy@dth@currentHref\@currentHref + \def\@tempa{% + \@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]% + }% + \fi + \@tempa + }% + \else + \def\@thm#1#2#3{% + \ifhmode + \unskip\unskip\par + \fi + \normalfont + \trivlist + \let\thmheadnl\relax + \let\thm@swap\@gobble + \thm@notefont{\fontseries\mddefault\upshape}% + \thm@headpunct{.}% add period after heading + \thm@headsep 5\p@ plus\p@ minus\p@\relax + \thm@space@setup + #1% style overrides + \@topsep \thm@preskip % used by thm head + \@topsepadd \thm@postskip % used by \@endparenv + \def\dth@counter{#2}% + \ifx\@empty\dth@counter + \def\@tempa{% + \@oparg{\@begintheorem{#3}{}}[]% + }% + \else + \H@refstepcounter{#2}% + \hyper@makecurrent{#2}% + \let\Hy@dth@currentHref\@currentHref + \def\@tempa{% + \@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]% + }% + \fi + \@tempa + }% + \fi + \dth@everypar={% + \@minipagefalse + \global\@newlistfalse + \@noparitemfalse + \if@inlabel + \global\@inlabelfalse + \begingroup + \setbox\z@\lastbox + \ifvoid\z@ + \kern-\itemindent + \fi + \endgroup + \ifx\@empty\dth@counter + \else + \Hy@raisedlink{% + \hyper@anchorstart{% + \ltx@ifundefined{Hy@dth@currentHref}% + \@currentHref\Hy@dth@currentHref + }\hyper@anchorend + }% + \fi + \unhbox\@labels + \fi + \if@nobreak + \@nobreakfalse \clubpenalty\@M + \else + \clubpenalty\@clubpenalty \everypar{}% + \fi + }% +}% +{% +\let\Hy@savedthm\@thm +\def\@thm{\ifhmode\unskip\fi\Hy@savedthm}% +}% +}% +} +\ifHy@hyperfootnotes + \newcounter{Hfootnote}% + \let\H@@footnotetext\@footnotetext + \let\H@@footnotemark\@footnotemark + \def\@xfootnotenext[#1]{% + \begingroup + \csname c@\@mpfn\endcsname #1\relax + \unrestored@protected@xdef\@thefnmark{\thempfn}% + \endgroup + \ifx\@footnotetext\@mpfootnotetext + \expandafter\H@@mpfootnotetext + \else + \expandafter\H@@footnotetext + \fi + }% + \def\@xfootnotemark[#1]{% + \begingroup + \c@footnote #1\relax + \unrestored@protected@xdef\@thefnmark{\thefootnote}% + \endgroup + \H@@footnotemark + }% + \let\H@@mpfootnotetext\@mpfootnotetext + \long\def\@mpfootnotetext#1{% + \H@@mpfootnotetext{% + \ifHy@nesting + \expandafter\ltx@firstoftwo + \else + \expandafter\ltx@secondoftwo + \fi + {% + \expandafter\hyper@@anchor\expandafter{% + \Hy@footnote@currentHref + }{\ignorespaces #1}% + }{% + \Hy@raisedlink{% + \expandafter\hyper@@anchor\expandafter{% + \Hy@footnote@currentHref + }{\relax}% + }\ignorespaces #1% + }% + }% + }% + \long\def\@footnotetext#1{% + \H@@footnotetext{% + \ifHy@nesting + \expandafter\ltx@firstoftwo + \else + \expandafter\ltx@secondoftwo + \fi + {% + \expandafter\hyper@@anchor\expandafter{% + \Hy@footnote@currentHref + }{\ignorespaces #1}% + }{% + \Hy@raisedlink{% + \expandafter\hyper@@anchor\expandafter{% + \Hy@footnote@currentHref + }{\relax}% + }% + \let\@currentHref\Hy@footnote@currentHref + \let\@currentlabelname\@empty + \ignorespaces #1% + }% + }% + }% + \def\@footnotemark{% + \leavevmode + \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi + \stepcounter{Hfootnote}% + \global\let\Hy@saved@currentHref\@currentHref + \hyper@makecurrent{Hfootnote}% + \global\let\Hy@footnote@currentHref\@currentHref + \global\let\@currentHref\Hy@saved@currentHref + \hyper@linkstart{link}{\Hy@footnote@currentHref}% + \@makefnmark + \hyper@linkend + \ifhmode\spacefactor\@x@sf\fi + \relax + }% + \@ifpackageloaded{tabularx}{% + \let\HyOrg@TX@endtabularx\TX@endtabularx + \def\Hy@tabularx@hook{% + \let\@footnotetext\H@@footnotetext + \let\@footnotemark\H@@footnotemark + \let\@mpfootnotetext\H@@mpfootnotetext + }% + \begingroup + \toks@\expandafter{\TX@endtabularx}% + \xdef\Hy@gtemp{% + \noexpand\Hy@tabularx@hook + \the\toks@ + }% + \endgroup + \let\TX@endtabularx\Hy@gtemp + }{}% + \@ifpackageloaded{longtable}{% + \CheckCommand*{\LT@p@ftntext}[1]{% + \edef\@tempa{% + \the\LT@p@ftn + \noexpand\footnotetext[\the\c@footnote]% + }% + \global\LT@p@ftn\expandafter{\@tempa{#1}}% + }% + \long\def\LT@p@ftntext#1{% + \edef\@tempa{% + \the\LT@p@ftn + \begingroup + \noexpand\c@footnote=\the\c@footnote\relax + \noexpand\protected@xdef\noexpand\@thefnmark{% + \noexpand\thempfn + }% + \noexpand\Hy@LT@footnotetext{% + \Hy@footnote@currentHref + }% + }% + \global\LT@p@ftn\expandafter{% + \@tempa{#1}% + \endgroup + }% + }% + \long\def\Hy@LT@footnotetext#1#2{% + \H@@footnotetext{% + \ifHy@nesting + \hyper@@anchor{#1}{#2}% + \else + \Hy@raisedlink{% + \hyper@@anchor{#1}{\relax}% + }% + \def\@currentHref{#1}% + \let\@currentlabelname\@empty + #2% + \fi + }% + }% + }{}% + \@ifpackageloaded{fancyvrb}{% + \def\V@@footnotetext{% + \insert\footins\bgroup + \csname reset@font\endcsname + \footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth\dp\strutbox + \floatingpenalty \@MM + \hsize\columnwidth + \@parboxrestore + \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}% + \@makefntext{}% + \rule{\z@}{\footnotesep}% + \bgroup + \aftergroup\V@@@footnotetext + \Hy@raisedlink{% + \expandafter\hyper@@anchor\expandafter{% + \Hy@footnote@currentHref + }{\relax}% + }% + \let\@currentHref\Hy@footnote@currentHref + \let\@currentlabelname\@empty + \ignorespaces + }% + }{}% + \def\Hy@temp#1{% + \begingroup + \unrestored@protected@xdef\@thefnmark{\ref{#1}}% + \endgroup + \@footnotemark + }% + \ifx\Hy@temp\footref + \def\footref#1{% + \begingroup + \unrestored@protected@xdef\@thefnmark{\ref{#1}}% + \endgroup + \H@@footnotemark + }% + \fi + \let\HyOrg@maketitle\maketitle + \def\maketitle{% + \let\Hy@saved@footnotemark\@footnotemark + \let\Hy@saved@footnotetext\@footnotetext + \let\@footnotemark\H@@footnotemark + \let\@footnotetext\H@@footnotetext + \@ifnextchar[\Hy@maketitle@optarg{% ] + \HyOrg@maketitle + \Hy@maketitle@end + }% + }% + \def\Hy@maketitle@optarg[#1]{% + \HyOrg@maketitle[{#1}]% + \Hy@maketitle@end + }% + \def\Hy@maketitle@end{% + \ifx\@footnotemark\H@@footnotemark + \let\@footnotemark\Hy@saved@footnotemark + \fi + \ifx\@footnotetext\H@@footnotetext + \let\@footnotetext\Hy@saved@footnotetext + \fi + }% + \def\realfootnote{% + \@ifnextchar[\@xfootnote{% + \stepcounter{\@mpfn}% + \protected@xdef\@thefnmark{\thempfn}% + \H@@footnotemark\H@@footnotetext + }% + }% +\fi +\Hy@DisableOption{hyperfootnotes} +\def\caption{% + \ifx\@captype\@undefined + \@latex@error{\noexpand\caption outside float}\@ehd + \expandafter\@gobble + \else + \H@refstepcounter\@captype + \let\Hy@tempa\@caption + \@ifundefined{float@caption}{% + }{% + \expandafter\ifx\csname @float@c@\@captype\endcsname + \float@caption + \let\Hy@tempa\Hy@float@caption + \fi + }% + \expandafter\@firstofone + \fi + {\@dblarg{\Hy@tempa\@captype}}% +} +\long\def\@caption#1[#2]#3{% + \expandafter\ifx\csname if@capstart\expandafter\endcsname + \csname iftrue\endcsname + \global\let\@currentHref\hc@currentHref + \else + \hyper@makecurrent{\@captype}% + \fi + \@ifundefined{NR@gettitle}{% + \def\@currentlabelname{#2}% + }{% + \NR@gettitle{#2}% + }% + \par\addcontentsline{\csname ext@#1\endcsname}{#1}{% + \protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}% + }% + \begingroup + \@parboxrestore + \if@minipage + \@setminipage + \fi + \normalsize + \expandafter\ifx\csname if@capstart\expandafter\endcsname + \csname iftrue\endcsname + \global\@capstartfalse + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces#3}% + \else + \@makecaption{\csname fnum@#1\endcsname}{% + \ignorespaces + \ifHy@nesting + \expandafter\hyper@@anchor\expandafter{\@currentHref}{#3}% + \else + \Hy@raisedlink{% + \expandafter\hyper@@anchor\expandafter{% + \@currentHref + }{\relax}% + }% + #3% + \fi + }% + \fi + \par + \endgroup +} +\let\Hy@float@caption\@caption +\newcommand{\HyNew@float@makebox}[1]{% + \HyOrg@float@makebox{% + #1\relax + \ifx\Hy@float@currentHref\@undefined + \else + \expandafter\hyper@@anchor\expandafter{% + \Hy@float@currentHref + }{\relax}% + \global\let\Hy@float@currentHref\@undefined + \fi + }% +}% +\@ifpackageloaded{float}{% + \def\Hy@float@caption{% + \ifx\Hy@float@currentHref\@undefined + \hyper@makecurrent{\@captype}% + \global\let\Hy@float@currentHref\@currentHref + \else + \let\@currentHref\Hy@float@currentHref + \fi + \float@caption + }% + \let\HyOrg@float@makebox\float@makebox + \let\float@makebox\HyNew@float@makebox +}{} +\def\hyper@natlinkstart#1{% + \Hy@backout{#1}% + \hyper@linkstart{cite}{cite.#1}% + \def\hyper@nat@current{#1}% +} +\def\hyper@natlinkend{% + \hyper@linkend +} +\def\hyper@natlinkbreak#1#2{% + \hyper@linkend#1\hyper@linkstart{cite}{cite.#2}% +} +\def\hyper@natanchorstart#1{% + \Hy@raisedlink{\hyper@anchorstart{cite.#1}}% +} +\def\hyper@natanchorend{\hyper@anchorend} +\ltx@IfUndefined{NAT@parse}{% + \providecommand*\@extra@binfo{}% + \providecommand*\@extra@b@citeb{}% + \def\bibcite#1#2{% + \@newl@bel{b}{#1\@extra@binfo}{% + \hyper@@link[cite]{}{cite.#1\@extra@b@citeb}{#2}% + }% + }% + \gdef\@extra@binfo{}% + \let\Hy@bibcite\bibcite + \begingroup + \@ifundefined{bbl@cite@choice}{}{% + \g@addto@macro\bbl@cite@choice{% + \let\bibcite\Hy@bibcite + }% + }% + \endgroup + \providecommand*{\@BIBLABEL}{\@biblabel}% + \def\@lbibitem[#1]#2{% + \@skiphyperreftrue + \H@item[% + \ifx\Hy@raisedlink\@empty + \hyper@anchorstart{cite.#2\@extra@b@citeb}% + \@BIBLABEL{#1}% + \hyper@anchorend + \else + \Hy@raisedlink{% + \hyper@anchorstart{cite.#2\@extra@b@citeb}\hyper@anchorend + }% + \@BIBLABEL{#1}% + \fi + \hfill + ]% + \@skiphyperreffalse + \if@filesw + \begingroup + \let\protect\noexpand + \immediate\write\@auxout{% + \string\bibcite{#2}{#1}% + }% + \endgroup + \fi + \ignorespaces + }% + \def\@bibitem#1{% + \@skiphyperreftrue\H@item\@skiphyperreffalse + \Hy@raisedlink{% + \hyper@anchorstart{cite.#1\@extra@b@citeb}\relax\hyper@anchorend + }% + \if@filesw + \begingroup + \let\protect\noexpand + \immediate\write\@auxout{% + \string\bibcite{#1}{\the\value{\@listctr}}% + }% + \endgroup + \fi + \ignorespaces + }% +}{} +\@ifclassloaded{revtex}{% + \Hy@Info{*** compatibility with revtex **** }% + \def\revtex@checking#1#2{% + \expandafter\let\expandafter\T@temp\csname b@#1\endcsname + \expandafter\def\csname b@#1\endcsname{#2}% + \@SetMaxRnhefLabel{#1}% + \expandafter\let\csname b@#1\endcsname\T@temp + }% + \@ifundefined{@CITE}{\def\@CITE{\@cite}}{}% + \providecommand*{\@extra@b@citeb}{}% + \def\@CITEX[#1]#2{% + \let\@citea\@empty + \leavevmode + \unskip + $^{% + \scriptstyle + \@CITE{% + \@for\@citeb:=#2\do{% + \@citea + \def\@citea{,\penalty\@m\ }% + \edef\@citeb{\expandafter\@firstofone\@citeb}% + \if@filesw + \immediate\write\@auxout{\string\citation{\@citeb}}% + \fi + \@ifundefined{b@\@citeb\extra@b@citeb}{% + \mbox{\reset@font\bfseries ?}% + \G@refundefinedtrue + \@latex@warning{% + Citation `\@citeb' on page \thepage \space undefined% + }% + }{% + {\csname b@\@citeb\@extra@b@citeb\endcsname}% + }% + }% + }{#1}% + }$% + }% + \def\@citex[#1]#2{% + \let\@citea\@empty + \@cite{% + \@for\@citeb:=#2\do{% + \@citea + \def\@citea{,\penalty\@m\ }% + \edef\@citeb{\expandafter\@firstofone\@citeb}% + \if@filesw + \immediate\write\@auxout{\string\citation{\@citeb}}% + \fi + \@ifundefined{b@\@citeb\@extra@b@citeb}{% + \mbox{\reset@font\bfseries ?}% + \G@refundefinedtrue + \@latex@warning{% + Citation `\@citeb' on page \thepage \space undefined% + }% + }{% + \hbox{\csname b@\@citeb\@extra@b@citeb\endcsname}% + }% + }% + }{#1}% + }% +}{} +\@ifpackageloaded{harvard}{% + \Hy@AtBeginDocument{% + \Hy@Info{*** compatibility with harvard **** }% + \Hy@raiselinksfalse + \def\harvardcite#1#2#3#4{% + \global\@namedef{HAR@fn@#1}{\hyper@@link[cite]{}{cite.#1}{#2}}% + \global\@namedef{HAR@an@#1}{\hyper@@link[cite]{}{cite.#1}{#3}}% + \global\@namedef{HAR@yr@#1}{\hyper@@link[cite]{}{cite.#1}{#4}}% + \global\@namedef{HAR@df@#1}{\csname HAR@fn@#1\endcsname}% + }% + \def\HAR@citetoaux#1{% + \if@filesw\immediate\write\@auxout{\string\citation{#1}}\fi% + \ifHy@backref + \ifx\@empty\@currentlabel + \else + \@bsphack + \if@filesw + \protected@write\@auxout{}{% + \string\@writefile{brf}{% + \string\backcite{#1}{% + {\thepage}{\@currentlabel}{\@currentHref}% + }% + }% + }% + \fi + \@esphack + \fi + \fi + }% + \def\harvarditem{% + \@ifnextchar[{\@harvarditem}{\@harvarditem[\null]}% + }% + \def\@harvarditem[#1]#2#3#4#5\par{% + \item[]% + \hyper@anchorstart{cite.#4}\relax\hyper@anchorend + \if@filesw + \begingroup + \def\protect##1{\string ##1\space}% + \ifthenelse{\equal{#1}{\null}}% + {\def\next{{#4}{#2}{#2}{#3}}}% + {\def\next{{#4}{#2}{#1}{#3}}}% + \immediate\write\@auxout{\string\harvardcite\codeof\next}% + \endgroup + \fi + \protect\hspace*{-\labelwidth}% + \protect\hspace*{-\labelsep}% + \ignorespaces + #5% + \ifHy@backref + \newblock + \backref{\csname br@#4\endcsname}% + \fi + \par + }% + \long\def\HAR@checkcitations#1#2#3#4{% + \def\HAR@tempa{\hyper@@link[cite]{}{cite.#1}{#2}}% + \expandafter\ifx\csname HAR@fn@#1\endcsname\HAR@tempa + \def\HAR@tempa{\hyper@@link[cite]{}{cite.#1}{#3}}% + \expandafter\ifx\csname HAR@an@#1\endcsname\HAR@tempa + \def\HAR@tempa{\hyper@@link[cite]{}{cite.#1}{#4}}% + \expandafter\ifx\csname HAR@yr@#1\endcsname\HAR@tempa + \else + \@tempswatrue + \fi + \else + \@tempswatrue + \fi + \else + \@tempswatrue + \fi + }% + }% +}{} +\@ifpackageloaded{chicago}{% + \def\citeN{% + \def\@citeseppen{-1000}% + \def\@cite##1##2{##1}% + \def\citeauthoryear##1##2##3{##1 (##3\@cite@opt)}% + \@citedata@opt + }% + \def\shortciteN{% + \def\@citeseppen{-1000}% + \def\@cite##1##2{##1}% + \def\citeauthoryear##1##2##3{##2 (##3\@cite@opt)}% + \@citedata@opt + }% + \def\@citedata@opt{% + \let\@cite@opt\@empty + \@ifnextchar [{% + \@tempswatrue + \@citedatax@opt + }{% + \@tempswafalse + \@citedatax[]% + }% + }% + \def\@citedatax@opt[#1]{% + \def\@cite@opt{, #1}% + \@citedatax[{#1}]% + }% +}{} +\ltx@ifclassloaded{slides}{% + \def\Hy@SlidesFormatOptionalPage#1{(#1)}% + \def\Hy@PageAnchorSlidesPlain{% + \advance\c@page\ltx@one + \edef\Hy@TempPageAnchor{% + \noexpand\hyper@@anchor{% + page.\the\c@slide.\the\c@overlay.\the\c@note% + \ifnum\c@page=\ltx@one + \else + .\the\c@page + \fi + }% + }% + \advance\c@page-\ltx@one + }% + \def\Hy@PageAnchorSlide{% + \advance\c@page\ltx@one + \ifnum\c@page>\ltx@one + \ltx@IfUndefined{theHpage}{% + \protected@edef\Hy@TheSlideOptionalPage{% + \Hy@SlidesFormatOptionalPage{\thepage}% + }% + }{% + \protected@edef\Hy@TheSlideOptionalPage{% + \Hy@SlidesFormatOptionalPage{\theHpage}% + }% + }% + \else + \def\Hy@TheSlideOptionalPage{}% + \fi + \advance\c@page-\ltx@one + \pdfstringdef\@the@H@page{% + \csname + the% + \ltx@ifundefined{theH\Hy@SlidesPage}{}{H}% + \Hy@SlidesPage + \endcsname + \Hy@TheSlideOptionalPage + }% + \ltx@gobblethree + }% + \def\Hy@SlidesPage{slide}% + \g@addto@macro\slide{% + \def\Hy@SlidesPage{slide}% + }% + \g@addto@macro\overlay{% + \def\Hy@SlidesPage{overlay}% + }% + \g@addto@macro\note{% + \def\Hy@SlidesPage{note}% + }% +}{% + \def\Hy@PageAnchorSlidesPlain{}% + \def\Hy@PageAnchorSlide{}% +} +\def\Hy@EveryPageAnchor{% + \Hy@DistillerDestFix + \ifHy@pageanchor + \ifHy@hypertexnames + \ifHy@plainpages + \def\Hy@TempPageAnchor{\hyper@@anchor{page.\the\c@page}}% + \Hy@PageAnchorSlidesPlain + \else + \begingroup + \let\@number\@firstofone + \Hy@unicodefalse + \Hy@PageAnchorSlide + \pdfstringdef\@the@H@page{\thepage}% + \endgroup + \EdefUnescapeString\@the@H@page{\@the@H@page}% + \def\Hy@TempPageAnchor{\hyper@@anchor{page.\@the@H@page}}% + \fi + \else + \Hy@GlobalStepCount\Hy@pagecounter + \def\Hy@TempPageAnchor{% + \hyper@@anchor{page.\the\Hy@pagecounter}% + }% + \fi + \vbox to 0pt{% + \kern\voffset + \kern\topmargin + \kern-1bp\relax + \hbox to 0pt{% + \kern\hoffset + \kern\ifodd\value{page}% + \oddsidemargin + \else + \evensidemargin + \fi + \kern-1bp\relax + \Hy@TempPageAnchor\relax + \hss + }% + \vss + }% + \fi +} +\g@addto@macro\Hy@EveryPageBoxHook{% + \Hy@EveryPageAnchor +} +\providecommand\protected@file@percent{} +\def\addcontentsline#1#2#3{% toc extension, type, tag + \begingroup + \let\label\@gobble + \ifx\@currentHref\@empty + \Hy@Warning{% + No destination for bookmark of \string\addcontentsline,% + \MessageBreak destination is added% + }% + \phantomsection + \fi + \expandafter\ifx\csname toclevel@#2\endcsname\relax + \begingroup + \def\Hy@tempa{#1}% + \ifx\Hy@tempa\Hy@bookmarkstype + \Hy@WarningNoLine{% + bookmark level for unknown #2 defaults to 0% + }% + \else + \Hy@Info{bookmark level for unknown #2 defaults to 0}% + \fi + \endgroup + \expandafter\gdef\csname toclevel@#2\endcsname{0}% + \fi + \edef\Hy@toclevel{\csname toclevel@#2\endcsname}% + \Hy@writebookmark{\csname the#2\endcsname}% + {#3}% + {\@currentHref}% + {\Hy@toclevel}% + {#1}% + \ifHy@verbose + \begingroup + \def\Hy@tempa{#3}% + \@onelevel@sanitize\Hy@tempa + \let\temp@online\on@line + \let\on@line\@empty + \Hy@Info{% + bookmark\temp@online:\MessageBreak + thecounter {\csname the#2\endcsname}\MessageBreak + text {\Hy@tempa}\MessageBreak + reference {\@currentHref}\MessageBreak + toclevel {\Hy@toclevel}\MessageBreak + type {#1}% + }% + \endgroup + \fi + \addtocontents{#1}{% + \protect\contentsline{#2}{#3}{\thepage}{\@currentHref}\protected@file@percent + }% + \endgroup +} +\def\contentsline#1#2#3#4{% + \begingroup + \Hy@safe@activestrue + \edef\x{\endgroup + \def\noexpand\Hy@tocdestname{#4}% + }\x + \ifx\Hy@tocdestname\ltx@empty + \csname l@#1\endcsname{#2}{#3}% + \else + \ifcase\Hy@linktoc % none + \csname l@#1\endcsname{#2}{#3}% + \or % section + \csname l@#1\endcsname{% + \hyper@linkstart{link}{\Hy@tocdestname}{#2}\hyper@linkend + }{#3}% + \or % page + \def\Hy@temp{#3}% + \ifx\Hy@temp\ltx@empty + \csname l@#1\endcsname{#2}{#3}% + \else + \csname l@#1\endcsname{{#2}}{% + \hyper@linkstart{link}{\Hy@tocdestname}{#3}\hyper@linkend + }% + \fi + \else % all + \def\Hy@temp{#3}% + \ifx\Hy@temp\ltx@empty + \csname l@#1\endcsname{% + \hyper@linkstart{link}{\Hy@tocdestname}{#2}\hyper@linkend + }{}% + \else + \csname l@#1\endcsname{% + \hyper@linkstart{link}{\Hy@tocdestname}{#2}\hyper@linkend + }{% + \hyper@linkstart{link}{\Hy@tocdestname}{#3}\hyper@linkend + }% + \fi + \fi + \fi +} +\let\H@definecounter\@definecounter +\def\@definecounter#1{% + \H@definecounter{#1}% + \expandafter\gdef\csname theH#1\endcsname{\arabic{#1}}% +} +\let\H@newctr\@newctr +\def\@newctr#1[#2]{% + \H@newctr#1[{#2}]% + \expandafter\gdef\csname theH#1\endcsname{% + \csname the\@ifundefined{theH#2}{}{H}#2\endcsname.\arabic{#1}% + }% +} +\@ifpackageloaded{amsmath}{% + \def\Hy@make@anchor{% + \Hy@MakeCurrentHrefAuto{AMS}% + \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}% + }% + \def\Hy@make@df@tag@@#1{% + \gdef\df@tag{% + \maketag@@@{\Hy@make@anchor#1}% + \def\@currentlabel{#1}% + }% + }% + \def\Hy@make@df@tag@@@#1{% + \gdef\df@tag{% + \tagform@{\Hy@make@anchor#1}% + \toks@\@xp{\p@equation{#1}}% + \edef\@currentlabel{\the\toks@}% + }% + }% + \let\HyOrg@make@df@tag@@\make@df@tag@@ + \let\HyOrg@make@df@tag@@@\make@df@tag@@@ + \let\make@df@tag@@\Hy@make@df@tag@@ + \let\make@df@tag@@@\Hy@make@df@tag@@@ +}{} +\@ifpackagewith{hyperref}{pdftex}{% + \let\H@seteqlabel\@seteqlabel + \def\@seteqlabel#1{% + \H@seteqlabel{#1}% + \xdef\@currentHref{AMS.\the\Hy@linkcounter}% + \Hy@raisedlink{% + \hyper@anchorstart{\@currentHref}\hyper@anchorend + }% + }% +}{} +\let\HyOrg@addtoreset\@addtoreset +\def\@addtoreset#1#2{% + \HyOrg@addtoreset{#1}{#2}% + \expandafter\xdef\csname theH#1\endcsname{% + \expandafter\noexpand + \csname the\@ifundefined{theH#2}{}H#2\endcsname + .\noexpand\the\noexpand\value{#1}% + }% +} +\@ifpackageloaded{amsmath}{% + \@ifpackagelater{amsmath}{1999/12/14}{% + \renewcommand*{\numberwithin}[3][\arabic]{% + \@ifundefined{c@#2}{\@nocounterr{#2}}{% + \@ifundefined{c@#3}{\@nocnterr{#3}}{% + \HyOrg@addtoreset{#2}{#3}% + \@xp\xdef\csname the#2\endcsname{% + \@xp\@nx\csname the#3\endcsname .\@nx#1{#2}% + }% + \@xp\xdef\csname theH#2\endcsname{% + \@xp\@nx + \csname the\@ifundefined{theH#3}{}H#3\endcsname + .\@nx#1{#2}% + }% + }% + }% + }% + }{% + \Hy@WarningNoLine{% + \string\numberwithin\space of package `amsmath' % + only fixed\MessageBreak + for version 2000/06/06 v2.12 or newer% + }% + }% +}{} +\ifHy@hyperfigures + \let\Hy@Gin@setfile\Gin@setfile + \def\Gin@setfile#1#2#3{% + \hyperimage{#3}{\Hy@Gin@setfile{#1}{#2}{#3}}% + }% +\fi +\Hy@DisableOption{hyperfigures} +\ifHy@hyperindex + \def\HyInd@ParenLeft{(}% + \def\HyInd@ParenRight{)}% + \def\hyperindexformat#1#2{% + \let\HyOrg@hyperpage\hyperpage + \let\hyperpage\@firstofone + #1{\HyOrg@hyperpage{#2}}% + \let\hyperpage\HyOrg@hyperpage + }% + \Hy@nextfalse + \@ifpackageloaded{multind}{\Hy@nexttrue}{}% + \@ifpackageloaded{index}{\Hy@nexttrue}{}% + \@ifpackageloaded{amsmidx}{\Hy@nexttrue}{}% + \begingroup + \lccode`\|=\expandafter`\HyInd@EncapChar\relax + \lccode`\/=`\\\relax + \lowercase{\endgroup + \ifHy@next + \let\HyInd@org@wrindex\@wrindex + \def\@wrindex#1#2{\HyInd@@wrindex{#1}#2||\\}% + \def\HyInd@@wrindex#1#2|#3|#4\\{% + \ifx\\#3\\% + \HyInd@org@wrindex{#1}{#2|hyperpage}% + \else + \HyInd@@@wrindex{#1}{#2}#3\\% + \fi + }% + \def\HyInd@@@wrindex#1#2#3#4\\{% + \def\Hy@temp@A{#3}% + \ifcase0\ifx\Hy@temp@A\HyInd@ParenLeft 1\fi + \ifx\Hy@temp@A\HyInd@ParenRight 1\fi + \relax + \HyInd@org@wrindex{#1}{% + #2|hyperindexformat{/#3#4}% + }% + \else + \ifx\\#4\\% + \ifx\Hy@temp@A\HyInd@ParenRight + \HyInd@org@wrindex{#1}{#2|#3}% + \else + \HyInd@org@wrindex{#1}{#2|#3hyperpage}% + \fi + \else + \HyInd@org@wrindex{#1}{% + #2|#3hyperindexformat{/#4}% + }% + \fi + \fi + }% + \else + \def\@wrindex#1{\@@wrindex#1||\\}% + \def\@@wrindex#1|#2|#3\\{% + \if@filesw + \ifx\\#2\\% + \protected@write\@indexfile{}{% + \string\indexentry{#1|hyperpage}{\thepage}% + }% + \else + \HyInd@@@wrindex{#1}#2\\% + \fi + \fi + \endgroup + \@esphack + }% + \def\HyInd@@@wrindex#1#2#3\\{% + \def\Hy@temp@A{#2}% + \ifcase0\ifx\Hy@temp@A\HyInd@ParenLeft 1\fi + \ifx\Hy@temp@A\HyInd@ParenRight 1\fi + \relax + \protected@write\@indexfile{}{% + \string\indexentry{% + #1|hyperindexformat{/#2#3}% + }{\thepage}% + }% + \else + \ifx\\#3\\% + \ifx\Hy@temp@A\HyInd@ParenRight + \HyInd@DefKey{#1}% + \ltx@IfUndefined{HyInd@(\HyInd@key)}{% + \let\Hy@temp\ltx@empty + }{% + \expandafter\let\expandafter\Hy@temp + \csname HyInd@(\HyInd@key)\endcsname + }% + \protected@write\@indexfile{}{% + \string\indexentry{#1|#2\Hy@temp}{\thepage}% + }% + \else + \protected@write\@indexfile{}{% + \string\indexentry{#1|#2hyperpage}{\thepage}% + }% + \HyInd@DefKey{#1}% + \expandafter + \gdef\csname HyInd@(\HyInd@key)\endcsname{% + hyperpage% + }% + \fi + \else + \protected@write\@indexfile{}{% + \string\indexentry{% + #1|#2hyperindexformat{/#3}% + }{\thepage}% + }% + \ifx\Hy@temp@A\HyInd@ParenLeft + \HyInd@DefKey{#1}% + \expandafter + \gdef\csname HyInd@(\HyInd@key)\endcsname{% + hyperindexformat{/#3}% + }% + \fi + \fi + \fi + }% + \def\HyInd@DefKey#1{% + \begingroup + \let\protect\@unexpandable@protect + \edef\Hy@temp{#1}% + \ltx@onelevel@sanitize\Hy@temp + \global\let\HyInd@key\Hy@temp + \endgroup + }% + \fi + }% +\fi +\Hy@DisableOption{hyperindex} +\Hy@DisableOption{encap} +\def\nohyperpage#1{#1} +\def\hyperpage#1{% + \HyInd@hyperpage#1\nohyperpage{}\@nil +} +\def\HyInd@hyperpage#1\nohyperpage#2#3\@nil{% + \HyInd@@hyperpage{#1}% + #2% + \def\Hy@temp{#3}% + \ifx\Hy@temp\@empty + \else + \ltx@ReturnAfterFi{% + \HyInd@hyperpage#3\@nil + }% + \fi +} +\def\HyInd@@hyperpage#1{\@hyperpage#1----\\} +\def\@hyperpage#1--#2--#3\\{% + \ifx\\#2\\% + \@commahyperpage{#1}% + \else + \HyInd@pagelink{#1}--\HyInd@pagelink{#2}% + \fi +} +\def\@commahyperpage#1{\@@commahyperpage#1, ,\\} +\def\@@commahyperpage#1, #2,#3\\{% + \ifx\\#2\\% + \HyInd@pagelink{#1}% + \else + \HyInd@pagelink{#1}, \HyInd@pagelink{#2}% + \fi +} +\def\HyInd@pagelink#1{% + \begingroup + \toks@={}% + \HyInd@removespaces#1 \@nil + \endgroup +} +\def\HyInd@removespaces#1 #2\@nil{% + \toks@=\expandafter{\the\toks@#1}% + \ifx\\#2\\% + \edef\x{\the\toks@}% + \ifx\x\@empty + \else + \hyperlink{page.\the\toks@}{\the\toks@}% + \fi + \else + \ltx@ReturnAfterFi{% + \HyInd@removespaces#2\@nil + }% + \fi +} +\@ifclassloaded{foils}{% + \providecommand*\ext@table{lot}% + \providecommand*\ext@figure{lof}% +}{} +\@ifclassloaded{seminar}{% + \Hy@seminarslidestrue + \providecommand\theHslide{\arabic{slide}}% +}{% + \Hy@seminarslidesfalse +} +\@ifpackageloaded{slidesec}{% + \providecommand\theHslidesection {\arabic{slidesection}}% + \providecommand\theHslidesubsection{% + \theHslidesection.\arabic{slidesubsection}% + }% + \def\slide@heading[#1]#2{% + \H@refstepcounter{slidesection}% + \@addtoreset{slidesubsection}{slidesection}% + \addtocontents{los}{% + \protect\l@slide{\the\c@slidesection}{\ignorespaces#1}% + {\@SCTR}{slideheading.\theslidesection}% + }% + \def\Hy@tempa{#2}% + \ifx\Hy@tempa\@empty + \else + {% + \edef\@currentlabel{% + \csname p@slidesection\endcsname\theslidesection + }% + \makeslideheading{#2}% + }% + \fi + \gdef\theslideheading{#1}% + \gdef\theslidesubheading{}% + \ifHy@bookmarksnumbered + \def\Hy@slidetitle{\theslidesection\space #1}% + \else + \def\Hy@slidetitle{#1}% + \fi + \ifHy@hypertexnames + \ifHy@naturalnames + \hyper@@anchor{slideheading.\theslidesection}{\relax}% + \Hy@writebookmark + {\theslidesection}% + {\Hy@slidetitle}% + {slideheading.\theslidesection}% + {1}% + {toc}% + \else + \hyper@@anchor{slideheading.\theHslidesection}{\relax}% + \Hy@writebookmark + {\theslidesection}% + {\Hy@slidetitle}% + {slideheading.\theHslidesection}% + {1}% + {toc}% + \fi + \else + \Hy@GlobalStepCount\Hy@linkcounter + \hyper@@anchor{slideheading.\the\Hy@linkcounter}{\relax}% + \Hy@writebookmark + {\theslidesection}% + {\Hy@slidetitle}% + {slideheading.\the\Hy@linkcounter}% + {1}% + {toc}% + \fi + }% + \def\slide@subheading[#1]#2{% + \H@refstepcounter{slidesubsection}% + \addtocontents{los}{% + \protect\l@subslide{\the\c@slidesubsection}{\ignorespaces#1}% + {\@SCTR}{slideheading.\theslidesubsection}% + }% + \def\Hy@tempa{#2}% + \ifx\Hy@tempa\@empty + \else + {% + \edef\@currentlabel{% + \csname p@slidesubsection\endcsname\theslidesubsection + }% + \makeslidesubheading{#2}% + }% + \fi + \gdef\theslidesubheading{#1}% + \ifHy@bookmarksnumbered + \def\Hy@slidetitle{\theslidesubsection\space #1}% + \else + \def\Hy@slidetitle{#1}% + \fi + \ifHy@hypertexnames + \ifHy@naturalnames + \hyper@@anchor{slideheading.\theslidesubsection}{\relax}% + \Hy@writebookmark + {\theslidesubsection}% + {\Hy@slidetitle}% + {slideheading.\theslidesubsection}% + {2}% + {toc}% + \else + \hyper@@anchor{slideheading.\theHslidesubsection}{\relax}% + \Hy@writebookmark + {\theslidesubsection}% + {\Hy@slidetitle}% + {slideheading.\theHslidesubsection}% + {2}% + {toc}% + \fi + \else + \Hy@GlobalStepCount\Hy@linkcounter + \hyper@@anchor{slideheading.\the\Hy@linkcounter}{\relax}% + \Hy@writebookmark + {\theslidesubsection}% + {\Hy@slidetitle}% + {slideheading.\the\Hy@linkcounter}% + {1}% + {toc}% + \fi + }% + \providecommand*{\listslidename}{List of Slides}% + \def\listofslides{% + \section*{% + \listslidename + \@mkboth{% + \expandafter\MakeUppercase\listslidename + }{% + \expandafter\MakeUppercase\listslidename + }% + }% + \def\l@slide##1##2##3##4{% + \slide@undottedcline{% + \slidenumberline{##3}{\hyperlink{##4}{##2}}% + }{}% + }% + \let\l@subslide\l@slide + \@startlos + }% + \def\slide@contents{% + \def\l@slide##1##2##3##4{% + \slide@cline{\slidenumberline{##3}{\hyperlink{##4}{##2}}}{##3}% + }% + \let\l@subslide\@gobblefour + \@startlos + }% + \def\Slide@contents{% + \def\l@slide##1##2##3##4{% + \ifcase\lslide@flag + \message{##1 ** \the\c@slidesection}% + \ifnum##1>\c@slidesection + \def\lslide@flag{1}% + {% + \large + \slide@cline{% + \slidenumberline{$\Rightarrow\bullet$}% + {\hyperlink{##4}{##2}}% + }{##3}% + }% + \else + {% + \large + \slide@cline{% + \slidenumberline{$\surd\;\bullet$}% + {\hyperlink{##4}{##2}}% + }{##3}% + }% + \fi + \or + \def\lslide@flag{2}% + {% + \large + \slide@cline{% + \slidenumberline{$\bullet$}% + {\hyperlink{##4}{##2}}% + }{##3}% + }% + \or + {% + \large + \slide@cline{% + \slidenumberline{$\bullet$}% + {\hyperlink{##4}{##2}}% + }{##3}% + }% + \fi + }% + \def\l@subslide##1##2##3##4{% + \ifnum\lslide@flag=1 % + \@undottedtocline{2}{3.8em}{3.2em}{\hyperlink{##4}{##2}}{}% + \fi + }% + \def\lslide@flag{0}% + \@startlos + }% +}{} +\ifHy@texht + \expandafter\endinput +\fi +\let\real@setref\@setref +\def\@setref#1#2#3{% csname, extract group, refname + \ifx#1\relax + \protect\G@refundefinedtrue + \nfss@text{\reset@font\bfseries ??}% + \@latex@warning{% + Reference `#3' on page \thepage \space undefined% + }% + \else + \expandafter\Hy@setref@link#1\@empty\@empty\@nil{#2}% + \fi +} +\def\Hy@setref@link#1#2#3#4#5#6\@nil#7{% + \begingroup + \toks0={\hyper@@link{#5}{#4}}% + \toks1=\expandafter{#7{#1}{#2}{#3}{#4}{#5}}% + \edef\x{\endgroup + \the\toks0 {\the\toks1 }% + }% + \x +} +\def\@pagesetref#1#2#3{% csname, extract macro, ref + \ifx#1\relax + \protect\G@refundefinedtrue + \nfss@text{\reset@font\bfseries ??}% + \@latex@warning{% + Reference `#3' on page \thepage \space undefined% + }% + \else + \protect\hyper@@link + {\expandafter\@fifthoffive#1}% + {page.\expandafter\@secondoffive#1}% + {\expandafter\@secondoffive#1}% + \fi +} +\def\HyRef@StarSetRef#1{% + \begingroup + \Hy@safe@activestrue + \edef\x{#1}% + \@onelevel@sanitize\x + \edef\x{\endgroup + \noexpand\HyRef@@StarSetRef + \expandafter\noexpand\csname r@\x\endcsname{\x}% + }% + \x +} +\def\HyRef@@StarSetRef#1#2#3{% + \ifx#1\@undefined + \let#1\relax + \fi + \real@setref#1#3{#2}% +} +\def\@refstar#1{% + \HyRef@StarSetRef{#1}\@firstoffive +} +\def\@pagerefstar#1{% + \HyRef@StarSetRef{#1}\@secondoffive +} +\def\@namerefstar#1{% + \HyRef@StarSetRef{#1}\@thirdoffive +} + +\Hy@AtBeginDocument{% + \@ifpackageloaded{varioref}{% + \def\@Refstar#1{% + \HyRef@StarSetRef{#1}\HyRef@MakeUppercaseFirstOfFive + }% + \def\HyRef@MakeUppercaseFirstOfFive#1#2#3#4#5{% + \MakeUppercase#1% + }% + \DeclareRobustCommand*{\Ref}{% + \@ifstar\@Refstar\HyRef@Ref + }% + \def\HyRef@Ref#1{% + \hyperref[{#1}]{\Ref*{#1}}% + }% + \ifdefined\vp@gerefstar + \renewcommand\Vref@star[2][]{% + \begingroup + \let\T@pageref\@pagerefstar + \Ref*{#2} + \vpageref[#1]{#2}% + \endgroup + }% + \renewcommand\Vr@f[2][]{% + \begingroup + \let\T@pageref\@pagerefstar + \hyperref[{#2}]{% + \Ref*{#2} + \vpageref[#1]{#2}% + }% + \endgroup + }% + \renewcommand\vr@f[2][]{% + \begingroup + \let\T@pageref\@pagerefstar + \hyperref[{#2}]{% + \ref*{#2} + \vpageref[#1]{#2}% + }% + \endgroup + }% + \renewcommand\vref@star[2][]{% + \begingroup + \let\T@pageref\@pagerefstar + \ref*{#2} + \vpageref[#1]{#2}% + \endgroup + }% + \else + \def\Vr@f#1{% + \leavevmode\unskip\vref@space + \hyperref[{#1}]{% + \Ref*{#1}% + \let\vref@space\nobreakspace + \@vpageref[\unskip]{#1}% + }% + }% + \def\vr@f#1{% + \leavevmode\unskip\vref@space + \begingroup + \let\T@pageref\@pagerefstar + \hyperref[{#1}]{% + \ref*{#1}% + \vpageref[\unskip]{#1}% + }% + \endgroup + }% + \fi + }{}% +} + +\DeclareRobustCommand*{\autopageref}{% + \@ifstar{% + \HyRef@autopagerefname\pageref*% + }\HyRef@autopageref +} +\def\HyRef@autopageref#1{% + \hyperref[{#1}]{\HyRef@autopagerefname\pageref*{#1}}% +} +\def\HyRef@autopagerefname{% + \ltx@IfUndefined{pageautorefname}{% + \ltx@IfUndefined{pagename}{% + \Hy@Warning{No autoref name for `page'}% + }{% + \pagename\nobreakspace + }% + }{% + \pageautorefname\nobreakspace + }% +} +\DeclareRobustCommand*{\autoref}{% + \leavevmode + \@ifstar{\HyRef@autoref\@gobbletwo}{\HyRef@autoref\hyper@@link}% +} +\def\HyRef@autoref#1#2{% + \begingroup + \Hy@safe@activestrue + \expandafter\HyRef@autosetref\csname r@#2\endcsname{#2}{#1}% + \endgroup +} +\def\HyRef@autosetref#1#2#3{% link command, csname, refname + \HyRef@ShowKeysRef{#2}% + \ifcase 0\ifx#1\relax 1\fi\ifx#1\Hy@varioref@undefined 1\fi\relax + \edef\HyRef@thisref{% + \expandafter\@fourthoffive#1\@empty\@empty\@empty + }% + \expandafter\HyRef@testreftype\HyRef@thisref.\\% + \Hy@safe@activesfalse + #3{% + \expandafter\@fifthoffive#1\@empty\@empty\@empty + }{% + \expandafter\@fourthoffive#1\@empty\@empty\@empty + }{% + \HyRef@currentHtag + \expandafter\@firstoffive#1\@empty\@empty\@empty + \null + }% + \else + \protect\G@refundefinedtrue + \nfss@text{\reset@font\bfseries ??}% + \@latex@warning{% + Reference `#2' on page \thepage\space undefined% + }% + \fi +} +\def\HyRef@testreftype#1.#2\\{% + \ltx@IfUndefined{#1autorefname}{% + \ltx@IfUndefined{#1name}{% + \HyRef@StripStar#1\\*\\\@nil{#1}% + \ltx@IfUndefined{\HyRef@name autorefname}{% + \ltx@IfUndefined{\HyRef@name name}{% + \def\HyRef@currentHtag{}% + \Hy@Warning{No autoref name for `#1'}% + }{% + \edef\HyRef@currentHtag{% + \expandafter\noexpand\csname\HyRef@name name\endcsname + \noexpand~% + }% + }% + }{% + \edef\HyRef@currentHtag{% + \expandafter\noexpand + \csname\HyRef@name autorefname\endcsname + \noexpand~% + }% + }% + }{% + \edef\HyRef@currentHtag{% + \expandafter\noexpand\csname#1name\endcsname + \noexpand~% + }% + }% + }{% + \edef\HyRef@currentHtag{% + \expandafter\noexpand\csname#1autorefname\endcsname + \noexpand~% + }% + }% +} +\def\HyRef@StripStar#1*\\#2\@nil#3{% + \def\HyRef@name{#2}% + \ifx\HyRef@name\HyRef@CaseStar + \def\HyRef@name{#1}% + \else + \def\HyRef@name{#3}% + \fi +} +\def\HyRef@CaseStar{*\\} +\def\HyRef@currentHtag{} +\let\HyRef@ShowKeysRef\@gobble +\def\HyRef@ShowKeysInit{% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname SK@@label\endcsname\relax + \else + \ifx\SK@ref\@empty + \else + \def\HyRef@ShowKeysRef{% + \SK@\SK@@ref + }% + \fi + \fi +} +\@ifpackageloaded{showkeys}{% + \HyRef@ShowKeysInit +}{% + \Hy@AtBeginDocument{% + \@ifpackageloaded{showkeys}{% + \HyRef@ShowKeysInit + }{}% + }% +} +\providecommand*\AMSautorefname{\equationautorefname} +\providecommand*\Hfootnoteautorefname{\footnoteautorefname} +\providecommand*\Itemautorefname{\itemautorefname} +\providecommand*\itemautorefname{item} +\providecommand*\equationautorefname{Equation} +\providecommand*\footnoteautorefname{footnote} +\providecommand*\itemautorefname{item} +\providecommand*\figureautorefname{Figure} +\providecommand*\tableautorefname{Table} +\providecommand*\partautorefname{Part} +\providecommand*\appendixautorefname{Appendix} +\providecommand*\chapterautorefname{chapter} +\providecommand*\sectionautorefname{section} +\providecommand*\subsectionautorefname{subsection} +\providecommand*\subsubsectionautorefname{subsubsection} +\providecommand*\paragraphautorefname{paragraph} +\providecommand*\subparagraphautorefname{subparagraph} +\providecommand*\FancyVerbLineautorefname{line} +\providecommand*\theoremautorefname{Theorem} +\providecommand*\pageautorefname{page} +\providecommand*{\Hy@DistillerDestFix}{} +\def\phantomsection{% + \Hy@MakeCurrentHrefAuto{section*}% + \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}% +} +\endinput +%% +%% End of file `hyperref.sty'.
--- a/paper/master_paper.tex Sun Feb 09 22:55:38 2020 +0900 +++ b/paper/master_paper.tex Mon Feb 10 18:01:43 2020 +0900 @@ -124,3 +124,6 @@ \appendix \input{sources.tex} \end{document} + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/pxjahyper.sty Mon Feb 10 18:01:43 2020 +0900 @@ -0,0 +1,1117 @@ +%% +%% This is file 'pxjahyper.sty'. +%% +%% Copyright (c) 2019 Takayuki YATO (aka. "ZR") +%% GitHub: https://github.com/zr-tex8r +%% Twitter: @zr_tex8r +%% +%% This package is distributed under the MIT License. +%% + +%% package declaration +\NeedsTeXFormat{pLaTeX2e} +\ProvidesPackage{pxjahyper}[2019/11/23 v0.4a] + +%% error messages +\def\pxhy@pkgname{pxjahyper} +\def\pxhy@warn{\PackageWarningNoLine\pxhy@pkgname} +\def\pxhy@error{\PackageError\pxhy@pkgname} +\@onlypreamble\pxhy@fatal +\def\pxhy@fatal#1#2{% + \PackageError\pxhy@pkgname + {#1}% + {#2Package loading is aborted right now.}% +} +\providecommand{\bxDebug}[1]{} + +%% packages +\RequirePackage{atbegshi} + +%% globals +\newif\ifpxhy@ptex +\newif\ifpxhy@uptex +\newif\ifpxhy@etex +\let\pxhy@jcode\@undefined +\newif\ifpxhy@tounicode +\newif\ifpxhy@zerox +\newif\ifpxhy@bigcode +\let\pxhy@bigcode\relax +\chardef\pxhy@driver@none=0 +\chardef\pxhy@driver@dvipdfmx=1 +\let\pxhy@driver\@undefined +\newif\ifpxhy@hy@unicode +\newif\ifpxhy@jacommentline +\newif\ifpxhy@otfcid +\newif\ifpxhy@otfmacros + +%--------------------------------------- Package options + +\DeclareOption{dvipdfmx}{% + \let\pxhy@driver\pxhy@driver@dvipdfmx +} +\DeclareOption{dvipdfm}{% + \let\pxhy@driver\pxhy@driver@dvipdfmx +} +\DeclareOption{nodvidriver}{% + \let\pxhy@driver\pxhy@driver@none +} +\DeclareOption{none}{% + \let\pxhy@driver\pxhy@driver@none +} +\DeclareOption{auto}{% + \let\pxhy@driver\@undefined +} +\DeclareOption{tounicode}{% + \pxhy@tounicodetrue +} +\DeclareOption{notounicode}{% + \pxhy@tounicodefalse +} +\DeclareOption{out2uni}{% + \pxhy@zeroxtrue +} +\DeclareOption{noout2uni}{% + \pxhy@zeroxfalse +} +\DeclareOption{bigcode}{% + \let\pxhy@bigcode=t% +} +\DeclareOption{nobigcode}{% + \let\pxhy@bigcode=f% +} +\DeclareOption{jacommentline}{% + \pxhy@jacommentlinetrue +} +\DeclareOption{nojacommentline}{% + \pxhy@jacommentlinefalse +} +\pxhy@otfcidtrue +\DeclareOption{otfcid}{% + \pxhy@otfcidtrue + \let\pxhy@otfcid@given=t +} +\DeclareOption{nootfcid}{% + \pxhy@otfcidfalse +} +\DeclareOption{otfmacros}{% + \pxhy@otfmacrostrue + \let\pxhy@otfcid@given=t +} +\DeclareOption{nootfmacros}{% + \pxhy@otfmacrosfalse +} +\ExecuteOptions{% + auto,tounicode,noout2uni,jacommentline% +} +\ProcessOptions* + +%--------------------------------------- Environment check + +%% The hyperref package must be loaded in advance. +\@ifpackageloaded{hyperref}{}{%else + \pxhy@fatal{'hyperref' not yet loaded}{}% + \endinput +} + +%% Check for the hyperref option 'unicode'. +\expandafter\ifx\csname ifHy@unicode\expandafter\endcsname + \csname iftrue\endcsname + \pxhy@hy@unicodetrue +\fi +\AtBeginDocument{% + \@tempswafalse + \expandafter\ifx\csname ifHy@unicode\expandafter\endcsname + \csname iftrue\endcsname + \@tempswatrue + \fi + \ifnum0\ifpxhy@hy@unicode1\fi\if@tempswa1\fi=1 + \PackageError\pxhy@pkgname + {You must not change the encoding setting (e.g.\MessageBreak + 'unicode) of hyperref after pxjahyper is loaded}% + {\@ehc}% + \fi +} + +%% Check hyperref driver. +\ifx\pxhy@driver\@undefined + \def\pxhy@tmpa{hdvipdfm} + \ifx\Hy@driver\pxhy@tmpa + \let\pxhy@driver\pxhy@driver@dvipdfmx + \else + \let\pxhy@driver\pxhy@driver@none + \fi +\fi + +%% Check the engine. +\@onlypreamble\pxhy@check +\def\pxhy@check#1#2{% + \edef\pxhy@tmpa{\string#1}% + \edef\pxhy@tmpb{\meaning#1}% + \ifx\pxhy@tmpa\pxhy@tmpb #2\fi +} +\pxhy@check\eTeXversion{% + \IfFileExists{etoolbox.sty}{\pxhy@etextrue}{}} +\pxhy@check\kanjiskip{\pxhy@ptextrue} +\pxhy@check\forcecjktoken{\pxhy@uptextrue} +\ifpxhy@ptex\else + \pxhy@fatal{Unknown engine used!!!}{} + \expandafter\endinput +\fi + +%% Check the internal jcode. +\ifnum \jis"2121="8140 + \let\pxhy@jcode=s\relax +\else\ifnum\jis"2121="A1A1 + \let\pxhy@jcode=e\relax +\else\ifnum\jis"2121="3000 + \let\pxhy@jcode=u\relax +\fi\fi\fi +\ifx\pxhy@jcode\@undefined + \pxhy@fatal{Unknown internal kanji code!!!}{} + \expandafter\endinput +\fi + +%% adjustment +% upTeX not in unicode is not seen as upTeX. +\if u\pxhy@jcode\else + \pxhy@uptexfalse +\fi +% out2uni cannot be used with upTeX. +\ifpxhy@uptex \ifpxhy@zerox + \pxhy@warn{out2uni is invalid in upTeX} + \pxhy@zeroxfalse +\fi\fi +% bigcode cannot be used without upTeX. +\if t\pxhy@bigcode + \ifpxhy@uptex + \pxhy@bigcodetrue + \else + \pxhy@warn{bigcode is invalid without upTeX} + \fi +\else\if f\pxhy@bigcode +\else + \ifpxhy@uptex + \pxhy@bigcodetrue + \fi +\fi\fi +% out2uni disables tounicode. +\ifpxhy@zerox + \pxhy@tounicodefalse +\fi +% hyperref 'unicode' is allowed only on upLaTeX. +\ifnum0\ifpxhy@hy@unicode\ifpxhy@uptex\else1\fi\fi>\z@ + \pxhy@fatal{hyperref 'unicode' mode is not supported}{}% + \expandafter\endinput +\fi +% otfcid requires upTeX or out2uni. +\ifpxhy@uptex\else\ifpxhy@zerox\else + \pxhy@otfcidfalse + \ifx t\pxhy@otfcid@given + \PackageWarningNoLine\pxhy@pkgname + {Option 'otfcid' is invalid unless upTeX is used\MessageBreak + or 'out2uni' is specified} + \fi +\fi\fi + +\iffalse +\typeout{% +pxhy@ptex = \ifpxhy@ptex true\else false\fi^^J% +pxhy@uptex = \ifpxhy@uptex true\else false\fi^^J% +pxhy@jcode = \meaning\pxhy@jcode^^J% +pxhy@tounicode = \ifpxhy@tounicode true\else false\fi^^J% +pxhy@zerox = \ifpxhy@zerox true\else false\fi^^J% +pxhy@driver = \the\pxhy@driver^^J% +} +\fi + +%--------------------------------------- Helpers + +%% packages +\ifpxhy@etex + \RequirePackage{etoolbox}[2011/01/03]%v2.1 +\fi + +%% unique tokens +\def\pxhy@end{\pxhy@end@} +\let\pxhy@mk\indent % unexpandable + +%% \pxhy@out@special{<text>} +\def\pxhy@out@special#1{% + \begingroup + \toks\z@{\special{#1}}% + \toks\tw@\expandafter{\AtBegShi@HookFirst}% + \xdef\AtBegShi@HookFirst{\the\toks@\the\toks\tw@}% + \endgroup +} + +%% \pxhy@get@jchar{<num>} +% Let \pxhy@jchar a macro expanding to a single jchar token +% of the char code <num>. +\def\pxhy@get@jchar#1{% + \begingroup + \pxhy@forcecjktoken + \kansujichar\@ne=#1\relax + \xdef\pxhy@jchar{\kansuji\@ne}% + \endgroup +} + +%% \pxhy@forcecjktoken +\ifpxhy@uptex + \let\pxhy@forcecjktoken\forcecjktoken +\else + \let\pxhy@forcecjktoken\relax +\fi + +%--------------------------------------- Output 'tounicode' special +\ifpxhy@tounicode + + \ifnum\pxhy@driver=\pxhy@driver@dvipdfmx %<*dvipdfmx> + %% dvipdfmx + \if e\pxhy@jcode % euc + \pxhy@out@special{pdf:tounicode EUC-UCS2} + \else\if s\pxhy@jcode % sjis + \pxhy@out@special{pdf:tounicode 90ms-RKSJ-UCS2} + \else\ifpxhy@bigcode % ucs, bigcode + \pxhy@out@special{pdf:tounicode UTF8-UTF16} + \else + \pxhy@out@special{pdf:tounicode UTF8-UCS2} + \fi\fi\fi + \fi %</dvipdfmx> + +\fi +%--------------------------------------- Papersize special adjustment + +% When the magnification is in effect (i.e. \mag<>1000), hyperref +% emits a papersize special with wrong value. (dvipdfmx interprets +% the lengths in the special as 'true' length.) So here a papersize +% special with adjusted values will be output. +\ifnum\mag=1000 \else + \expandafter\ifx\csname ifHy@setpagesize\expandafter\endcsname + \csname iftrue\endcsname % hyperref setpagesize is on + \ifnum0<\mag \ifnum32768>\mag % \mag is in valid range + \begingroup + \@ifundefined{stockwidth}{}{%else + \paperwidth=\stockwidth + \paperheight=\stockheight + }% + \@tempcnta=\mag \advance\@tempcnta100000 + \def\pxhy@next1#1#2#3#4#5\relax{% + \def\pxhy@tmpa{#1#2.#3#4#5}% + }% + \expandafter\pxhy@next\the\@tempcnta\relax + \paperwidth=\pxhy@tmpa\paperwidth + \paperheight=\pxhy@tmpa\paperheight + \xdef\pxhy@spec@papersize{% + papersize=\the\paperwidth,\the\paperheight + }% + \AtBeginShipoutFirst{% + \special{\pxhy@spec@papersize}% + } + \endgroup + \fi\fi + \fi +\fi + +%--------------------------------------- Hooks to pdfstringdef + +\def\pxhy@uc@REPL{FFFD} +\def\pxhy@uc@XNAC{FDD1} % not-a-char codepoint used as marker +\let\pxhy@burst\romannumeral +\let\pxhy@nxend\indent + +%% \pxhy@uchex{<hex>} +% The entity of the code-value input function. If the input +% is a valid code value in hex then it passes the value to +% \pxhy@uchex@res in 4-6 digits; otherwise passes FFFD to +% \pxhy@uchex@res. +\def\pxhy@uchex#1{% + \expandafter\pxhy@uchex@a\pxhy@burst-`>#1\pxhy@nxend +} +\edef\pxhy@uchex@err{% + \noexpand\pxhy@uchex@res{\pxhy@uc@REPL}% +} +\def\pxhy@uchex@a#1#2\pxhy@nxend{% + \ifnum2<"1#1 + \expandafter\pxhy@uchex@b\romannumeral-"#1#2\pxhy@nxend{#1#2}% + \else \pxhy@uchex@err + \fi +} +\def\pxhy@uchex@b#1\pxhy@nxend#2{% + \ifx\pxhy@empty#1\pxhy@empty + \ifnum"#2>"10FFFF + \pxhy@uchex@err + \else\ifnum"#2>"FFF + \pxhy@uchex@res{#2}% + \else + \pxhy@uchex@c#2"000\pxhy@end + \fi\fi + \else \pxhy@uchex@err + \fi +} +\def\pxhy@uchex@c#1#2#3#4#5#6\pxhy@end{% + \pxhy@uchex@d#1#2#3#4#5\pxhy@end +} +\def\pxhy@uchex@d#1"#2\pxhy@end{% + \pxhy@uchex@res{#2#1}% +} + +\ifpxhy@uptex %<*upTeX> + + %% \pxhy@marker: a not-a-char U+FDD1 + \pxhy@get@jchar{\ucs"\pxhy@uc@XNAC} + \edef\pxhy@marker{\pxhy@jchar} + + %% Makes \Ux and \UTF be the code input command in PDF strings. + \pdfstringdefDisableCommands{% + \let\Ux\pxhy@uchex + \let\UTF\pxhy@uchex + \let\UTFM\pxhy@uchex + \let\UTFK\pxhy@uchex + \let\UTFC\pxhy@uchex + \let\UTFT\pxhy@uchex + } + + %BEGIN-- in the following block #1 means the marker + \def\pxhy@next#1{% #1=marker + %% \pxhy@uchex@res + % Expands to a tag string which will later be converted to + % a real character in the postprocess. + \def\pxhy@uchex@res##1{#1##1>}% + %% \pxhy@posthook + % The postprocess of this package. It is registered to + % \pdfstringdefPostHook. + \def\pxhy@posthook##1{% + \expandafter\pxhy@posthook@a##1#1\pxhy@end + \pxhy@posthook@b##1% + }% + \def\pxhy@posthook@a##1#1##2\pxhy@end{% + \ifx\pxhy@empty##2\pxhy@empty + \expandafter\@gobbletwo + \fi + }% + \def\pxhy@posthook@b##1{% + \let\pxhy@str\@empty + \expandafter\pxhy@posthook@c##1#1>% + \global\let##1=\pxhy@str + }% + \def\pxhy@posthook@c##1#1##2>{% + \ifx\pxhy@empty##2\pxhy@empty + \edef\pxhy@str{\pxhy@str##1}% + \else + \pxhy@get@jchar{"##2}% + \edef\pxhy@str{\pxhy@str##1\pxhy@jchar}% + \expandafter\pxhy@posthook@c + \fi + }% + } + \expandafter\pxhy@next\pxhy@marker + %END-- + + % Add \pxhy@posthook to \pdfstringdefPostHook. + \begingroup + \toks@\expandafter{\pdfstringdefPostHook{#1}} + \edef\pxhy@next{% + \gdef\noexpand\pdfstringdefPostHook##1{% + \the\toks@ + \noexpand\pxhy@posthook{##1}% + }% + }% + \pxhy@next + \endgroup + +\else\ifpxhy@zerox %<*!upTeX> + + %% \pxhy@uchex@res + % Expands to \0x form. + \def\pxhy@uchex@res#1{% + \0x#1% + } + + %% Makes \Ux be the code input command in PDF strings. + % (If the otf package is loaded, then \UTF already does + % the same thing.) + \pdfstringdefDisableCommands{% + \let\Ux\pxhy@uchex + } + + %Note: if out2uni is off then \Ux remains undefined. +\fi\fi %</upTeX> + +%--------------------------------------- Support for 'otfcid' +\ifpxhy@otfcid + +%% variables +\@onlypreamble\pxhy@otfcid@disabled +\let\pxhy@otfcid@disabled\relax + +%% preparation +\ifpxhy@etex + % check if bxjatoucs is available + \IfFileExists{bxjatoucs.sty}{% + \let\bxjatoucsCheckAvail=t + \RequirePackage{bxjatoucs}[] + \undef\bxjatoucsCheckAvail + }{} + \ifundef\bxjaCidToUcs{% + \def\pxhy@otfcid@disabled{% + package 'bxjatoucs' is unavailable% + }% + }{} +\else + \def\pxhy@otfcid@disabled{% + e-TeX extension (or 'etoolbox') is unavailable% + } +\fi +%% annihilate the ajmacros's own pdfstring process +\ifpxhy@otfmacros\ifx\pxhy@otfcid@disabled\relax + \let\ajRedefine@ajCommands\relax + \AtBeginDocument{\let\ajRedefine@ajCommands\relax} +\fi\fi + +%% \pxhy@CID{<cid>} +\def\pxhy@CID#1{% + \expandafter\expandafter\expandafter\pxhy@cid@aux + \bxjaCidToUcsHex{#1}\pxhy@mk{\detokenize{#1}}% +} +%% \pxhy@fast@CID{<cid>} +\def\pxhy@fast@CID#1{% + \expandafter\expandafter\expandafter\pxhy@cid@aux + \bxjaFastCidToUcsHex{#1}\pxhy@mk{\number#1}% +} +\def\pxhy@cid@aux#1\pxhy@mk#2{% + \ifnum"#1>\z@ + \pxhy@uchex{#1}% + \else + \@nameuse{CID+#2}% + \fi +} + +%% \pxhy@dispatch@otfcid +\@onlypreamble\pxhy@dispatch@otfcid +\def\pxhy@dispatch@otfcid{% + \pdfstringdefDisableCommands{% + \let\CID\pxhy@CID + }% + \ifpxhy@otfmacros + \ifx\ajSnowman\@undefined\else % ajmacros is loaded + \makeatletter + \InputIfFileExists{pxjahyper-ajm.def}{% + \PackageInfo\pxhy@pkgname + {Loaded 'pxjahyper-ajm.def'\@gobble}% + }{% + \PackageWarning\pxhy@pkgname + {File 'pxjahyper-ajm.def' not found\@gobble}% + }% + \makeatother + \fi + \fi +} + +%% begin-document hook +\AtBeginDocument{% + \@ifpackageloaded{otf}{% + \ifx\pxhy@otfcid@disabled\relax % available! + \pxhy@dispatch@otfcid + \else + \PackageWarningNoLine\pxhy@pkgname + {Option 'otfcid' is disabled, because\MessageBreak + \pxhy@otfcid@disabled}% + \pxhy@otfcidfalse + \fi + }{}% +} + +\fi +%--------------------------------------- Redefine text commands for PD1 + +\ifnum\pxhy@driver=\pxhy@driver@dvipdfmx %<*dvipdfmx> + +%%<+> \pxDeclarePdfTextCommand{\CS}{<jis>}{<ucs>} +\@onlypreamble\pxDeclarePdfTextCommand +\newcommand*\pxDeclarePdfTextCommand[3]{% + \pxhy@decl@pdf@tc{#2}{#3}% + {\DeclareTextCommand{#1}{PD1}}% + {\pxhy@revoke@pdf@tc{#1}}% +} + +%%<+> \pxDeclarePdfTextComposite{\CS}{<arg>}{<jis>}{<ucs>} +\@onlypreamble\pxDeclarePdfTextComposite +\newcommand*\pxDeclarePdfTextComposite[4]{% + \pxhy@decl@pdf@tc{#3}{#4}% + {\DeclareTextCompositeCommand{#1}{PD1}{#2}}% + {\pxhy@revoke@pdf@tcc{#1}{#2}}% +} + +\else %<*!dvipdfmx> + +\@onlypreamble\pxDeclarePdfTextCommand +\newcommand*\pxDeclarePdfTextCommand[3]{} +\@onlypreamble\pxDeclarePdfTextComposite +\newcommand*\pxDeclarePdfTextComposite[4]{} + +\fi %</dvipdfmx> + +%% \pxhy@revoke@pdf@tc +\@onlypreamble\pxhy@revoke@pdf@tc +\def\pxhy@revoke@pdf@tc#1{% + \expandafter\let\csname PD1\string#1\endcsname\@undefined + \pxhy@make@txtcmd\pxhy@tmpa{PD1}#1% + \ifx#1\pxhy@tmpa + \pxhy@make@txtcmd#1?#1% + \fi +} +\@onlypreamble\pxhy@make@txtcmd +\def\pxhy@make@txtcmd#1#2#3{% + \expandafter\def\expandafter#1\expandafter{% + \csname#2-cmd\expandafter\endcsname\expandafter#3% + \csname#2\string#3\endcsname + }% +} + +%% \pxhy@revoke@pdf@tcc +\@onlypreamble\pxhy@revoke@pdf@tc +\def\pxhy@revoke@pdf@tcc#1#2{% + \expandafter\let\csname\string\PD1\string#1-\string#2% + \endcsname\@undefined +} + +%% \pxhy@decl@pdf@tc +\@onlypreamble\pxhy@decl@pdf@tc +\def\pxhy@decl@pdf@tc#1#2{% + \pxhy@get@body{#1}{#2}% + \ifx\pxhy@body\@undefined + \let\pxhy@next\@secondoftwo + \else + \def\pxhy@next{% + \expandafter\pxhy@decl@pdf@tc@a\pxhy@body\pxhy@end}% + \fi + \pxhy@next +} +\@onlypreamble\pxhy@decl@pdf@tc@a +\def\pxhy@decl@pdf@tc@a#1\pxhy@end#2#3{% + #2{#1}% +} + +%% \pxhy@get@body{<jis>}{<ucs>} +\@onlypreamble\pxhy@get@body +\ifpxhy@uptex %<*upTeX> + \def\pxhy@get@body#1#2{% + \pxhy@get@jchar{\ucs"#2}% + \let\pxhy@body\pxhy@jchar + }% +\else %<*!upTeX> + \ifpxhy@zerox + \def\pxhy@get@body#1#2{% + \ifx\pxhy@end#1\pxhy@end + \def\pxhy@body{\0x#2}% + \else + \pxhy@get@jchar{\jis"#1}% + \let\pxhy@body\pxhy@jchar + \fi + }% + \else + \def\pxhy@get@body#1#2{% + \ifx\pxhy@end#1\pxhy@end + \let\pxhy@body\@undefined + \else + \pxhy@get@jchar{\jis"#1}% + \let\pxhy@body\pxhy@jchar + \fi + }% + \fi +\fi %</upTeX> + +%%%%%%%%%%%%%%%%%%%% the definitions + +% JIS X 0213 does not distinguish the following pairs: +% - circumflex(U+02C6) and asciicircum(U+005E) +% - tilde(U+02DC) and asciitilde(U+007E) +% Here I use ASCII characters as done in JIS. +\DeclareTextCommand{\textcircumflex}{PD1}{\136} +\DeclareTextCommand{\textasciicircum}{PD1}{\136} +\DeclareTextCommand{\texttilde}{PD1}{\176} +\DeclareTextCommand{\textasciitilde}{PD1}{\176} + +% Some ad-hoc redefinitions. +\DeclareTextCommand{\textfi}{PD1}{fi} +\DeclareTextCommand{\textfl}{PD1}{fl} +\DeclareTextCommand{\IJ}{PD1}{IJ}% needed? +\DeclareTextCommand{\ij}{PD1}{ij}% needed? +\DeclareTextCommand{\textspace}{PD1}{\040} +\DeclareTextCommand{\textquotesingle}{PD1}{\047} + +%% Some adjustments on accents. +\DeclareTextAccent{\H}{PD1}{\texthungarumlaut} +\DeclareTextCompositeCommand{\H}{PD1}{\@empty}{\texthungarumlaut} +\DeclareTextCompositeCommand{\H}{PD1}{\ }{\texthungarumlaut} +\DeclareTextAccent{\u}{PD1}{\textasciibreve} +\DeclareTextCompositeCommand{\u}{PD1}{\@empty}{\textasciibreve} +\DeclareTextCompositeCommand{\u}{PD1}{\ }{\textasciibreve} +\DeclareTextAccent{\k}{PD1}{\textogonek} +\DeclareTextCompositeCommand{\k}{PD1}{\@empty}{\textogonek} +\DeclareTextCompositeCommand{\k}{PD1}{\ }{\textogonek} + +%%[A] The characters in PdfDocEncoding (except ASCII). +\pxDeclarePdfTextCommand{\textasciibreve}{}{02D8} +\pxDeclarePdfTextCommand{\textasciicaron}{}{02C7} +\pxDeclarePdfTextCommand{\textdotaccent}{}{02D9} +\pxDeclarePdfTextCommand{\texthungarumlaut}{}{02DD} +\pxDeclarePdfTextCommand{\textogonek}{}{02DB} +\pxDeclarePdfTextCommand{\textring}{}{02DA} +\pxDeclarePdfTextCommand{\texttilde}{}{02DC} +\pxDeclarePdfTextCommand{\textbullet}{}{2022} +\pxDeclarePdfTextCommand{\textdagger}{2277}{2020} +\pxDeclarePdfTextCommand{\textdaggerdbl}{2278}{2021} +\pxDeclarePdfTextCommand{\textellipsis}{2144}{2026} +\pxDeclarePdfTextCommand{\textemdash}{213D}{2014} +\pxDeclarePdfTextCommand{\textendash}{}{2013} +\pxDeclarePdfTextCommand{\textflorin}{}{0192} +\pxDeclarePdfTextCommand{\textfractionsolidus}{}{2044} +\pxDeclarePdfTextCommand{\guilsinglleft}{}{2039} +\pxDeclarePdfTextCommand{\guilsinglright}{}{203A} +\pxDeclarePdfTextCommand{\textminus}{215D}{2212} +\pxDeclarePdfTextCommand{\textperthousand}{2273}{2030} +\pxDeclarePdfTextCommand{\quotedblbase}{}{201E} +\pxDeclarePdfTextCommand{\textquotedblleft}{2148}{201C} +\pxDeclarePdfTextCommand{\textquotedblright}{2149}{201D} +\pxDeclarePdfTextCommand{\textquoteleft}{2146}{2018} +\pxDeclarePdfTextCommand{\textquoteright}{2147}{2019} +\pxDeclarePdfTextCommand{\quotesinglbase}{}{201A} +\pxDeclarePdfTextCommand{\texttrademark}{}{2122} +\pxDeclarePdfTextCommand{\L}{}{0141} +\pxDeclarePdfTextCommand{\OE}{}{0152} +\pxDeclarePdfTextComposite{\v}{S}{}{0160} +\pxDeclarePdfTextComposite{\"}{Y}{}{0178} +\pxDeclarePdfTextComposite{\v}{Z}{}{017D} +\pxDeclarePdfTextCommand{\i}{}{0131} +\pxDeclarePdfTextCommand{\l}{}{0142} +\pxDeclarePdfTextCommand{\oe}{}{0153} +\pxDeclarePdfTextComposite{\v}{s}{}{0161} +\pxDeclarePdfTextComposite{\v}{z}{}{017E} +\pxDeclarePdfTextCommand{\texteuro}{}{20AC} +\pxDeclarePdfTextCommand{\textexclamdown}{}{00A1} +\pxDeclarePdfTextCommand{\textcent}{2171}{00A2} +\pxDeclarePdfTextCommand{\textsterling}{2172}{00A3} +\pxDeclarePdfTextCommand{\textcurrency}{}{00A4} +\pxDeclarePdfTextCommand{\textyen}{}{00A5} +\pxDeclarePdfTextCommand{\textbrokenbar}{}{00A6} +\pxDeclarePdfTextCommand{\textsection}{2178}{00A7} +\pxDeclarePdfTextCommand{\textasciidieresis}{212F}{00A8} +\pxDeclarePdfTextCommand{\textcopyright}{}{00A9} +\pxDeclarePdfTextCommand{\textordfeminine}{}{00AA} +\pxDeclarePdfTextCommand{\guillemotleft}{}{00AB} +\pxDeclarePdfTextCommand{\textlogicalnot}{224C}{00AC} +\pxDeclarePdfTextCommand{\textlnot}{224C}{00AC} +\pxDeclarePdfTextCommand{\textregistered}{}{00AE} +\pxDeclarePdfTextCommand{\textasciimacron}{}{00AF} +\pxDeclarePdfTextCommand{\textdegree}{216B}{00B0} +\pxDeclarePdfTextCommand{\textplusminus}{215E}{00B1} +\pxDeclarePdfTextCommand{\texttwosuperior}{}{00B2} +\pxDeclarePdfTextCommand{\textthreesuperior}{}{00B3} +\pxDeclarePdfTextCommand{\textacute}{212D}{00B4} +%\pxDeclarePdfTextCommand{\textmu}{}{00B5} +\pxDeclarePdfTextCommand{\textparagraph}{2279}{00B6} +\pxDeclarePdfTextCommand{\textperiodcentered}{}{00B7} +\pxDeclarePdfTextCommand{\textcedilla}{}{00B8} +\pxDeclarePdfTextCommand{\textonesuperior}{}{00B9} +\pxDeclarePdfTextCommand{\textordmasculine}{}{00BA} +\pxDeclarePdfTextCommand{\guillemotright}{}{00BB} +\pxDeclarePdfTextCommand{\textonequarter}{}{00BC} +\pxDeclarePdfTextCommand{\textonehalf}{}{00BD} +\pxDeclarePdfTextCommand{\textthreequarters}{}{00BE} +\pxDeclarePdfTextCommand{\textquestiondown}{}{00BF} +\pxDeclarePdfTextComposite{\`}{A}{}{00C0} +\pxDeclarePdfTextComposite{\'}{A}{}{00C1} +\pxDeclarePdfTextComposite{\^}{A}{}{00C2} +\pxDeclarePdfTextComposite{\~}{A}{}{00C3} +\pxDeclarePdfTextComposite{\"}{A}{}{00C4} +\pxDeclarePdfTextComposite{\r}{A}{}{00C5} +\pxDeclarePdfTextCommand{\AE}{}{00C6} +\pxDeclarePdfTextComposite{\c}{C}{}{00C7} +\pxDeclarePdfTextComposite{\`}{E}{}{00C8} +\pxDeclarePdfTextComposite{\'}{E}{}{00C9} +\pxDeclarePdfTextComposite{\^}{E}{}{00CA} +\pxDeclarePdfTextComposite{\"}{E}{}{00CB} +\pxDeclarePdfTextComposite{\`}{I}{}{00CC} +\pxDeclarePdfTextComposite{\'}{I}{}{00CD} +\pxDeclarePdfTextComposite{\^}{I}{}{00CE} +\pxDeclarePdfTextComposite{\"}{I}{}{00CF} +\pxDeclarePdfTextCommand{\DH}{}{00D0} +\pxDeclarePdfTextCommand{\DJ}{}{00D0} +\pxDeclarePdfTextComposite{\~}{N}{}{00D1} +\pxDeclarePdfTextComposite{\`}{O}{}{00D2} +\pxDeclarePdfTextComposite{\'}{O}{}{00D3} +\pxDeclarePdfTextComposite{\^}{O}{}{00D4} +\pxDeclarePdfTextComposite{\~}{O}{}{00D5} +\pxDeclarePdfTextComposite{\"}{O}{}{00D6} +\pxDeclarePdfTextCommand{\textmultiply}{215F}{00D7} +\pxDeclarePdfTextCommand{\O}{}{00D8} +\pxDeclarePdfTextComposite{\`}{U}{}{00D9} +\pxDeclarePdfTextComposite{\'}{U}{}{00DA} +\pxDeclarePdfTextComposite{\^}{U}{}{00DB} +\pxDeclarePdfTextComposite{\"}{U}{}{00DC} +\pxDeclarePdfTextComposite{\'}{Y}{}{00DD} +\pxDeclarePdfTextCommand{\TH}{}{00DE} +\pxDeclarePdfTextCommand{\ss}{}{00DF} +\pxDeclarePdfTextComposite{\`}{a}{}{00E0} +\pxDeclarePdfTextComposite{\'}{a}{}{00E1} +\pxDeclarePdfTextComposite{\^}{a}{}{00E2} +\pxDeclarePdfTextComposite{\~}{a}{}{00E3} +\pxDeclarePdfTextComposite{\"}{a}{}{00E4} +\pxDeclarePdfTextComposite{\r}{a}{}{00E5} +\pxDeclarePdfTextCommand{\ae}{}{00E6} +\pxDeclarePdfTextComposite{\c}{c}{}{00E7} +\pxDeclarePdfTextComposite{\`}{e}{}{00E8} +\pxDeclarePdfTextComposite{\'}{e}{}{00E9} +\pxDeclarePdfTextComposite{\^}{e}{}{00EA} +\pxDeclarePdfTextComposite{\"}{e}{}{00EB} +\pxDeclarePdfTextComposite{\`}{i}{}{00EC} +\pxDeclarePdfTextComposite{\`}{\i}{}{00EC} +\pxDeclarePdfTextComposite{\'}{i}{}{00ED} +\pxDeclarePdfTextComposite{\'}{\i}{}{00ED} +\pxDeclarePdfTextComposite{\^}{i}{}{00EE} +\pxDeclarePdfTextComposite{\^}{\i}{}{00EE} +\pxDeclarePdfTextComposite{\"}{i}{}{00EF} +\pxDeclarePdfTextComposite{\"}{\i}{}{00EF} +\pxDeclarePdfTextCommand{\dh}{}{00F0} +\pxDeclarePdfTextComposite{\~}{n}{}{00F1} +\pxDeclarePdfTextComposite{\`}{o}{}{00F2} +\pxDeclarePdfTextComposite{\'}{o}{}{00F3} +\pxDeclarePdfTextComposite{\^}{o}{}{00F4} +\pxDeclarePdfTextComposite{\~}{o}{}{00F5} +\pxDeclarePdfTextComposite{\"}{o}{}{00F6} +\pxDeclarePdfTextCommand{\textdivide}{2160}{00F7} +\pxDeclarePdfTextCommand{\o}{}{00F8} +\pxDeclarePdfTextComposite{\`}{u}{}{00F9} +\pxDeclarePdfTextComposite{\'}{u}{}{00FA} +\pxDeclarePdfTextComposite{\^}{u}{}{00FB} +\pxDeclarePdfTextComposite{\"}{u}{}{00FC} +\pxDeclarePdfTextComposite{\'}{y}{}{00FD} +\pxDeclarePdfTextCommand{\th}{}{00FE} +\pxDeclarePdfTextComposite{\"}{y}{}{00FF} +\pxDeclarePdfTextCommand{\textcelsius}{216E}{2103} +%%%%%%%% + +%%[B] Aliases to [A]. +\pxDeclarePdfTextCommand{\copyright}{}{00A9} +\pxDeclarePdfTextCommand{\textflqq}{}{00AB} +\pxDeclarePdfTextCommand{\flqq}{}{00AB} +\pxDeclarePdfTextCommand{\textneg}{224C}{00AC} +\pxDeclarePdfTextCommand{\textpm}{215E}{00B1} +\pxDeclarePdfTextCommand{\textcdot}{}{00B7} +\pxDeclarePdfTextCommand{\textfrqq}{}{00BB} +\pxDeclarePdfTextCommand{\frqq}{}{00BB} +\pxDeclarePdfTextCommand{\texttimes}{215F}{00D7} +\pxDeclarePdfTextCommand{\textdiv}{2160}{00F7} +\pxDeclarePdfTextCommand{\textgrq}{2146}{2018} +\pxDeclarePdfTextCommand{\textglq}{}{201A} +\pxDeclarePdfTextCommand{\textquotesinglbase}{}{201A} +\pxDeclarePdfTextCommand{\textgrqq}{2148}{201C} +\pxDeclarePdfTextCommand{\crqq}{2148}{201C} +\pxDeclarePdfTextCommand{\textglqq}{}{201E} +\pxDeclarePdfTextCommand{\clqq}{}{201E} +\pxDeclarePdfTextCommand{\textquotedblbase}{}{201E} +\pxDeclarePdfTextCommand{\textflq}{}{2039} +\pxDeclarePdfTextCommand{\textfrq}{}{203A} +\pxDeclarePdfTextCommand{\textEuro}{}{20AC} +\pxDeclarePdfTextCommand{\guillemetleft}{}{00AB} +\pxDeclarePdfTextCommand{\guillemetright}{}{00BB} +%% + +%%[C] The characters that are included both in JIS X 0213 +% and some of the TeX encodings. +% Note: The entries marked with (*) involves non-standard mappings. +\pxDeclarePdfTextCommand{\textbardbl}{2142}{2016} +\pxDeclarePdfTextCommand{\textlangle}{2152}{3008}%(*)2329 +\pxDeclarePdfTextCommand{\textrangle}{2153}{3009}%(*)232A +\pxDeclarePdfTextCommand{\textxleq}{2165}{2266}%(*)2264 +\pxDeclarePdfTextCommand{\textxgeq}{2166}{2267}%(*)2265 +\pxDeclarePdfTextCommand{\textinfty}{2167}{221E} +\pxDeclarePdfTextCommand{\textborn}{217A}{2605} +\pxDeclarePdfTextCommand{\textreferencemark}{2228}{203B} +\pxDeclarePdfTextCommand{\textrightarrow}{222A}{2192} +\pxDeclarePdfTextCommand{\textleftarrow}{222B}{2190} +\pxDeclarePdfTextCommand{\textuparrow}{222C}{2191} +\pxDeclarePdfTextCommand{\textdownarrow}{222D}{2193} +\pxDeclarePdfTextCommand{\textsurd}{2265}{221A} +\pxDeclarePdfTextCommand{\textapprox}{}{2245} +\pxDeclarePdfTextCommand{\textmusicalnote}{2276}{266A} +\pxDeclarePdfTextCommand{\textbigcircle}{227E}{25EF} +\pxDeclarePdfTextCommand{\textopenbullet}{}{25E6} +\pxDeclarePdfTextCommand{\textell}{}{2113} +\pxDeclarePdfTextCommand{\textmho}{}{2127} +\pxDeclarePdfTextCommand{\textAlpha}{2621}{0391} +\pxDeclarePdfTextCommand{\textBeta}{2622}{0392} +\pxDeclarePdfTextCommand{\textGamma}{2623}{0393} +\pxDeclarePdfTextCommand{\textDelta}{2624}{0394} +\pxDeclarePdfTextCommand{\textEpsilon}{2625}{0395} +\pxDeclarePdfTextCommand{\textZeta}{2626}{0396} +\pxDeclarePdfTextCommand{\textEta}{2627}{0397} +\pxDeclarePdfTextCommand{\textTheta}{2628}{0398} +\pxDeclarePdfTextCommand{\textIota}{2629}{0399} +\pxDeclarePdfTextCommand{\textKappa}{262A}{039A} +\pxDeclarePdfTextCommand{\textLambda}{262B}{039B} +\pxDeclarePdfTextCommand{\textMu}{262C}{039C} +\pxDeclarePdfTextCommand{\textNu}{262D}{039D} +\pxDeclarePdfTextCommand{\textXi}{262E}{039E} +\pxDeclarePdfTextCommand{\textOmicron}{262F}{039F} +\pxDeclarePdfTextCommand{\textPi}{2630}{03A0} +\pxDeclarePdfTextCommand{\textRho}{2631}{03A1} +\pxDeclarePdfTextCommand{\textSigma}{2632}{03A3} +\pxDeclarePdfTextCommand{\textTau}{2633}{03A4} +\pxDeclarePdfTextCommand{\textUpsilon}{2634}{03A5} +\pxDeclarePdfTextCommand{\textPhi}{2635}{03A6} +\pxDeclarePdfTextCommand{\textChi}{2636}{03A7} +\pxDeclarePdfTextCommand{\textPsi}{2637}{03A8} +\pxDeclarePdfTextCommand{\textOmega}{2638}{03A9} +\pxDeclarePdfTextCommand{\textohm}{2638}{03A9}%(*)2126 +\pxDeclarePdfTextCommand{\textalpha}{2641}{03B1} +\pxDeclarePdfTextCommand{\textbeta}{2642}{03B2} +\pxDeclarePdfTextCommand{\textgamma}{2643}{03B3} +\pxDeclarePdfTextCommand{\textdelta}{2644}{03B4} +\pxDeclarePdfTextCommand{\textepsilon}{2645}{03B5} +\pxDeclarePdfTextCommand{\textzeta}{2646}{03B6} +\pxDeclarePdfTextCommand{\texteta}{2647}{03B7} +\pxDeclarePdfTextCommand{\texttheta}{2648}{03B8} +\pxDeclarePdfTextCommand{\textiota}{2649}{03B9} +\pxDeclarePdfTextCommand{\textkappa}{264A}{03BA} +\pxDeclarePdfTextCommand{\textlambda}{264B}{03BB} +\pxDeclarePdfTextCommand{\textmu}{264C}{03BC} +\pxDeclarePdfTextCommand{\textnu}{264D}{03BD} +\pxDeclarePdfTextCommand{\textxi}{264E}{03BE} +\pxDeclarePdfTextCommand{\textomicron}{264F}{03BF} +\pxDeclarePdfTextCommand{\textpi}{2650}{03C0} +\pxDeclarePdfTextCommand{\textrho}{2651}{03C1} +\pxDeclarePdfTextCommand{\textsigma}{2652}{03C3} +\pxDeclarePdfTextCommand{\texttau}{2653}{03C4} +\pxDeclarePdfTextCommand{\textupsilon}{2654}{03C5} +\pxDeclarePdfTextCommand{\textphi}{2655}{03C6} +\pxDeclarePdfTextCommand{\textchi}{2656}{03C7} +\pxDeclarePdfTextCommand{\textpsi}{2657}{03C8} +\pxDeclarePdfTextCommand{\textomega}{2658}{03C9} +\pxDeclarePdfTextCommand{\textvarsigma}{}{03C2} +\pxDeclarePdfTextCommand{\textfinalsigma}{}{03C2} +\pxDeclarePdfTextCommand{\CYRA}{2721}{0410} +\pxDeclarePdfTextCommand{\CYRB}{2722}{0411} +\pxDeclarePdfTextCommand{\CYRV}{2723}{0412} +\pxDeclarePdfTextCommand{\CYRG}{2724}{0413} +\pxDeclarePdfTextCommand{\CYRD}{2725}{0414} +\pxDeclarePdfTextCommand{\CYRE}{2726}{0415} +\pxDeclarePdfTextCommand{\CYRYO}{2727}{0401} +\pxDeclarePdfTextCommand{\CYRZH}{2728}{0416} +\pxDeclarePdfTextCommand{\CYRZ}{2729}{0417} +\pxDeclarePdfTextCommand{\CYRI}{272A}{0418} +\pxDeclarePdfTextCommand{\CYRISHRT}{272B}{0419} +\pxDeclarePdfTextCommand{\CYRK}{272C}{041A} +\pxDeclarePdfTextCommand{\CYRL}{272D}{041B} +\pxDeclarePdfTextCommand{\CYRM}{272E}{041C} +\pxDeclarePdfTextCommand{\CYRN}{272F}{041D} +\pxDeclarePdfTextCommand{\CYRO}{2730}{041E} +\pxDeclarePdfTextCommand{\CYRP}{2731}{041F} +\pxDeclarePdfTextCommand{\CYRR}{2732}{0420} +\pxDeclarePdfTextCommand{\CYRS}{2733}{0421} +\pxDeclarePdfTextCommand{\CYRT}{2734}{0422} +\pxDeclarePdfTextCommand{\CYRU}{2735}{0423} +\pxDeclarePdfTextCommand{\CYRF}{2736}{0424} +\pxDeclarePdfTextCommand{\CYRH}{2737}{0425} +\pxDeclarePdfTextCommand{\CYRC}{2738}{0426} +\pxDeclarePdfTextCommand{\CYRCH}{2739}{0427} +\pxDeclarePdfTextCommand{\CYRSH}{273A}{0428} +\pxDeclarePdfTextCommand{\CYRSHCH}{273B}{0429} +\pxDeclarePdfTextCommand{\CYRHRDSN}{273C}{042A} +\pxDeclarePdfTextCommand{\CYRERY}{273D}{042B} +\pxDeclarePdfTextCommand{\CYRSFTSN}{273E}{042C} +\pxDeclarePdfTextCommand{\CYREREV}{273F}{042D} +\pxDeclarePdfTextCommand{\CYRYU}{2740}{042E} +\pxDeclarePdfTextCommand{\CYRYA}{2741}{042F} +\pxDeclarePdfTextCommand{\cyra}{2751}{0430} +\pxDeclarePdfTextCommand{\cyrb}{2752}{0431} +\pxDeclarePdfTextCommand{\cyrv}{2753}{0432} +\pxDeclarePdfTextCommand{\cyrg}{2754}{0433} +\pxDeclarePdfTextCommand{\cyrd}{2755}{0434} +\pxDeclarePdfTextCommand{\cyre}{2756}{0435} +\pxDeclarePdfTextCommand{\cyryo}{2757}{0451} +\pxDeclarePdfTextCommand{\cyrzh}{2758}{0436} +\pxDeclarePdfTextCommand{\cyrz}{2759}{0437} +\pxDeclarePdfTextCommand{\cyri}{275A}{0438} +\pxDeclarePdfTextCommand{\cyrishrt}{275B}{0439} +\pxDeclarePdfTextCommand{\cyrk}{275C}{043A} +\pxDeclarePdfTextCommand{\cyrl}{275D}{043B} +\pxDeclarePdfTextCommand{\cyrm}{275E}{043C} +\pxDeclarePdfTextCommand{\cyrn}{275F}{043D} +\pxDeclarePdfTextCommand{\cyro}{2760}{043E} +\pxDeclarePdfTextCommand{\cyrp}{2761}{043F} +\pxDeclarePdfTextCommand{\cyrr}{2762}{0440} +\pxDeclarePdfTextCommand{\cyrs}{2763}{0441} +\pxDeclarePdfTextCommand{\cyrt}{2764}{0442} +\pxDeclarePdfTextCommand{\cyru}{2765}{0443} +\pxDeclarePdfTextCommand{\cyrf}{2766}{0444} +\pxDeclarePdfTextCommand{\cyrh}{2767}{0445} +\pxDeclarePdfTextCommand{\cyrc}{2768}{0446} +\pxDeclarePdfTextCommand{\cyrch}{2769}{0447} +\pxDeclarePdfTextCommand{\cyrsh}{276A}{0448} +\pxDeclarePdfTextCommand{\cyrshch}{276B}{0449} +\pxDeclarePdfTextCommand{\cyrhrdsn}{276C}{044A} +\pxDeclarePdfTextCommand{\cyrery}{276D}{044B} +\pxDeclarePdfTextCommand{\cyrsftsn}{276E}{044C} +\pxDeclarePdfTextCommand{\cyrerev}{276F}{044D} +\pxDeclarePdfTextCommand{\cyryu}{2770}{044E} +\pxDeclarePdfTextCommand{\cyrya}{2771}{044F} +\pxDeclarePdfTextCommand{\textvisiblespace}{}{2423} +\pxDeclarePdfTextComposite{\=}{A}{}{0100} +\pxDeclarePdfTextComposite{\=}{I}{}{012A} +\pxDeclarePdfTextComposite{\=}{U}{}{016A} +\pxDeclarePdfTextComposite{\=}{E}{}{0112} +\pxDeclarePdfTextComposite{\=}{O}{}{014C} +\pxDeclarePdfTextComposite{\=}{a}{}{0101} +\pxDeclarePdfTextComposite{\=}{i}{}{012B} +\pxDeclarePdfTextComposite{\=}{\i}{}{012B} +\pxDeclarePdfTextComposite{\=}{u}{}{016B} +\pxDeclarePdfTextComposite{\=}{e}{}{0113} +\pxDeclarePdfTextComposite{\=}{o}{}{014D} +\pxDeclarePdfTextComposite{\k}{A}{}{0104} +\pxDeclarePdfTextComposite{\v}{L}{}{013D} +\pxDeclarePdfTextComposite{\'}{S}{}{015A} +\pxDeclarePdfTextComposite{\c}{S}{}{015E} +\pxDeclarePdfTextComposite{\v}{T}{}{0164} +\pxDeclarePdfTextComposite{\'}{Z}{}{0179} +\pxDeclarePdfTextComposite{\.}{Z}{}{017B} +\pxDeclarePdfTextComposite{\k}{a}{}{0105} +\pxDeclarePdfTextComposite{\v}{l}{}{013E} +\pxDeclarePdfTextComposite{\'}{s}{}{015B} +\pxDeclarePdfTextComposite{\c}{s}{}{015F} +\pxDeclarePdfTextComposite{\v}{t}{}{0165} +\pxDeclarePdfTextComposite{\'}{z}{}{017A} +\pxDeclarePdfTextComposite{\.}{z}{}{017C} +\pxDeclarePdfTextComposite{\'}{R}{}{0154} +\pxDeclarePdfTextComposite{\u}{A}{}{0102} +\pxDeclarePdfTextComposite{\'}{L}{}{0139} +\pxDeclarePdfTextComposite{\'}{C}{}{0106} +\pxDeclarePdfTextComposite{\v}{C}{}{010C} +\pxDeclarePdfTextComposite{\k}{E}{}{0118} +\pxDeclarePdfTextComposite{\v}{E}{}{011A} +\pxDeclarePdfTextComposite{\v}{D}{}{010E} +\pxDeclarePdfTextComposite{\'}{N}{}{0143} +\pxDeclarePdfTextComposite{\v}{N}{}{0147} +\pxDeclarePdfTextComposite{\H}{O}{}{0150} +\pxDeclarePdfTextComposite{\v}{R}{}{0158} +\pxDeclarePdfTextComposite{\r}{U}{}{016E} +\pxDeclarePdfTextComposite{\H}{U}{}{0170} +\pxDeclarePdfTextComposite{\c}{T}{}{0162} +\pxDeclarePdfTextComposite{\'}{r}{}{0155} +\pxDeclarePdfTextComposite{\u}{a}{}{0103} +\pxDeclarePdfTextComposite{\'}{l}{}{013A} +\pxDeclarePdfTextComposite{\'}{c}{}{0107} +\pxDeclarePdfTextComposite{\v}{c}{}{010D} +\pxDeclarePdfTextComposite{\k}{e}{}{0119} +\pxDeclarePdfTextComposite{\v}{e}{}{011B} +\pxDeclarePdfTextComposite{\v}{d}{}{010F} +\pxDeclarePdfTextCommand{\dj}{}{0111} +\pxDeclarePdfTextComposite{\'}{n}{}{0144} +\pxDeclarePdfTextComposite{\v}{n}{}{0148} +\pxDeclarePdfTextComposite{\H}{o}{}{0151} +\pxDeclarePdfTextComposite{\v}{r}{}{0159} +\pxDeclarePdfTextComposite{\r}{u}{}{016F} +\pxDeclarePdfTextComposite{\H}{u}{}{0171} +\pxDeclarePdfTextComposite{\c}{t}{}{0163} +\pxDeclarePdfTextCommand{\ng}{}{014B} +\pxDeclarePdfTextCommand{\textnumero}{}{2116} +%% + +% Give a substitute definition to characters that appear as +% ligatures, since otherwise hyperref leaves some garbage in +% output pdf-strings when such ligatures appear. +\ifpxhy@uptex\else + \ifpxhy@zerox\else + \DeclareTextCommand{\textendash}{PD1}{--} + \DeclareTextCommand{\textquestiondown}{PD1}{}% empty + \DeclareTextCommand{\textexclamdown}{PD1}{}% empty + \fi +\fi + +%--------------------------------------- Enable hyperref unicode +\ifpxhy@hy@unicode + +\PackageInfo\pxhy@pkgname + {The setup for hyperref 'unicode' is applied.\MessageBreak + (Note that this feature is experimental.)\@gobbletwo} + +%% The following code is taken from hyperref.sty. +%%%%BEGIN + \def\HyPsd@Char#1{% + \ifnum`#1<128 % + \@backslashchar 000#1% + \else + \ifnum`#1<65536 % + \expandafter\HyPsd@CharTwoByte\number`#1!% + \else + \expandafter\expandafter\expandafter\HyPsd@CharSurrogate + \intcalcSub{`#1}{65536}!% + \fi + \fi + }% + \def\HyPsd@CharTwoByte#1!{% + \expandafter\expandafter\expandafter\HyPsd@CharOctByte + \IntCalcDiv#1!256!!% + \expandafter\expandafter\expandafter\HyPsd@CharOctByte + \IntCalcMod#1!256!!% + }% + \def\HyPsd@CharOctByte#1!{% + \@backslashchar + \IntCalcDiv#1!64!% + \intcalcDiv{\IntCalcMod#1!64!}{8}% + \IntCalcMod#1!8!% + }% + \def\HyPsd@CharSurrogate#1!{% + \@backslashchar 33% + \IntCalcDiv#1!262144!% + \expandafter\expandafter\expandafter\HyPsd@CharOctByte + \intcalcDiv{\IntCalcMod#1!262144!}{1024}!% + \@backslashchar 33% + \expandafter\expandafter\expandafter\IntCalcAdd + \intcalcDiv{\IntCalcMod#1!1024!}{256}!4!% + \expandafter\expandafter\expandafter\HyPsd@CharOctByte + \IntCalcMod#1!256!!% + }% +%%%%END + +%% disable the verification of bxjscls +\let\jsCheckHyperrefUnicode\@empty + +\fi +%--------------------------------------- 'jacommentline' +\ifpxhy@jacommentline + +% The 'jacomemntline' feature outputs at the top of the +% hyperref outline file (*.out) a comment line including +% some Japanese characters. + +%% \pxhy@jacomment +\let\pxhy@jacomment\@empty +\begingroup + \@for\pxhy@x:={% + 2433,244E,2555,2521,2524,256B,244F,467C,4B5C,386C,% + 4A38,3B7A,2472,345E,245F,245E,2439% + }\do{% + \kansujichar1=\jis"\pxhy@x\relax + \xdef\pxhy@jacomment{\pxhy@jacomment\kansuji1}% + } +\endgroup + +%% attach a hook +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname ReadBookmarks\endcsname\relax\else + \g@addto@macro\ReadBookmarks{% + \if@filesw + \ifx\@outlinefile\@undefined\else + \immediate\write\@outlinefile{% + \@percentchar\pxhy@jacomment.}% + \fi + \fi + } +\fi + +\fi +%--------------------------------------- All done +\endinput +%% EOF
--- a/slide/CbCXv6.html Sun Feb 09 22:55:38 2020 +0900 +++ b/slide/CbCXv6.html Mon Feb 10 18:01:43 2020 +0900 @@ -34,45 +34,52 @@ </head> <body> - <div id="doc" class="markdown-body container-fluid comment-enabled" data-hard-breaks="true" style="position: relative;"><h1 class="highlight" id="CbCインターフェースによる-CbCXv6-の書き換え" style=""><a class="anchor hidden-xs" href="#CbCインターフェースによる-CbCXv6-の書き換え" title="CbCインターフェースによる-CbCXv6-の書き換え"><span class="octicon octicon-link"></span></a>CbCインターフェースによる CbCXv6 の書き換え</h1><ul> + <div id="doc" class="markdown-body container-fluid comment-enabled" data-hard-breaks="true"><h1 id="CbCインターフェースによる-CbCXv6-の書き換え"><a class="anchor hidden-xs" href="#CbCインターフェースによる-CbCXv6-の書き換え" title="CbCインターフェースによる-CbCXv6-の書き換え"><span class="octicon octicon-link"></span></a>CbCインターフェースによる CbCXv6 の書き換え</h1><ul> <li>並列信頼研</li> <li>桃原 優</li> -</ul><hr><h1 class="highlight" id="概要" style=""><a class="anchor hidden-xs" href="#概要" title="概要"><span class="octicon octicon-link"></span></a>概要</h1><ul> +</ul><hr><h1 id="概要"><a class="anchor hidden-xs" href="#概要" title="概要"><span class="octicon octicon-link"></span></a>概要</h1><ul> <li>OS の信頼性を上げたい</li> -<li>CbCを使って xv6 という OS を書き換える</li> +<li>CbCという言語を使って xv6 という OS を書き換える</li> <li>Paging の書き換えを行った</li> -<li>まだ実装中</li> -<li>将来はコンテナやVMをメタ計算として実装できるはず</li> -</ul><hr><h1 id="OS-の信頼性を上げたい" style=""><a class="anchor hidden-xs" href="#OS-の信頼性を上げたい" title="OS-の信頼性を上げたい"><span class="octicon octicon-link"></span></a>OS の信頼性を上げたい</h1><ul class="highlight"> -<li>仕様を満たすことを証明する</li> +<li>実装中だが、将来はコンテナやVMを実装できるはず</li> +</ul><hr><h1 id="OS-の信頼性を上げたい"><a class="anchor hidden-xs" href="#OS-の信頼性を上げたい" title="OS-の信頼性を上げたい"><span class="octicon octicon-link"></span></a>OS の信頼性を上げたい</h1><ul> +<li>OS自体が複雑で検証が困難。 +<ul> +<li>バグの原因に</li> +</ul> +</li> +<li>OSの仕様を定義してそれを満たすことを証明する</li> <li>証明しやすい形の記述を作る</li> <li>CbCの goto で書く <ul> <li>状態遷移系に近い形で記述できる(証明しやすい)</li> <li>関数型の記述</li> +<li>入力に対しての出力を検証する</li> </ul> </li> -<li>CbCのinterface で書く</li> -<li>記述のモジュール化</li> -</ul><hr><h1 id="メタレベルとノーマルレベル" style=""><a class="anchor hidden-xs" href="#メタレベルとノーマルレベル" title="メタレベルとノーマルレベル"><span class="octicon octicon-link"></span></a>メタレベルとノーマルレベル</h1><ul class="highlight"> +<li>記述のモジュール化 +<ul> +<li>CbCのインターフェースで書く</li> +<li>煩雑な記述の解消</li> +<li>入力の切り替えによる機能の入れ替え</li> +</ul> +</li> +</ul><hr><h1 id="ノーマルレベルとメタレベル"><a class="anchor hidden-xs" href="#ノーマルレベルとメタレベル" title="ノーマルレベルとメタレベル"><span class="octicon octicon-link"></span></a>ノーマルレベルとメタレベル</h1><ul> <li>ノーマルレベル <ul> -<li>CbCで記述される普通のアルゴリズム</li> +<li>CbCで記述される部分</li> </ul> </li> <li>メタレベル <ul> <li>Paging などのメモリやCPU自体の操作</li> -<li>プログラムの正しさの証明</li> +<li>(ノーマルレベルの)プログラムの正しさの証明</li> +<li>cmake で生成している</li> </ul> </li> -<li>Context -<ul> -<li>メタレベルで使用される Meta Data を置く場所</li> -</ul> -</li> -</ul><hr><h1 id="Continuation-based-C" style=""><a class="anchor hidden-xs" href="#Continuation-based-C" title="Continuation-based-C"><span class="octicon octicon-link"></span></a>Continuation based C</h1><ul class="highlight"> -<li>ノーマルレベルとメタレベルの処理を同じ言語で行えるようにした言語(以下CbC)</li> +</ul><hr><h1 id="Continuation-based-C"><a class="anchor hidden-xs" href="#Continuation-based-C" title="Continuation-based-C"><span class="octicon octicon-link"></span></a>Continuation based C</h1><ul> +<li>状態遷移ベースで記述できる言語(以下CbC)</li> +<li>cmake で CbC からメタレベルの記述を生成する</li> <li>Code Gear <ul> <li>基本的な処理の単位</li> @@ -81,33 +88,44 @@ </li> <li>Data Gear <ul> -<li>データの単位</li> +<li>Code Gear からアクセスできるデータの単位</li> +<li>引数など</li> </ul> </li> <li>Meta Code Gear <ul> -<li>goto meta</li> -<li>Code Gear の間に挟める計算</li> +<li>Code Gear の間に挟まれるメタレベルの処理</li> </ul> </li> <li>Meta Data Gear <ul> -<li>Context</li> -<li>Code Gearの間の接続など</li> +<li>Code Gearの間の接続などの情報</li> +<li>Context(後ほど説明)</li> </ul> </li> -</ul><hr><h1 id="goto-による継続" style=""><a class="anchor hidden-xs" href="#goto-による継続" title="goto-による継続"><span class="octicon octicon-link"></span></a>goto による継続</h1><ul> +</ul><hr><h1 id="ノーマルレベル"><a class="anchor hidden-xs" href="#ノーマルレベル" title="ノーマルレベル"><span class="octicon octicon-link"></span></a>ノーマルレベル</h1><hr><h1 id="Code-Gear-による継続"><a class="anchor hidden-xs" href="#Code-Gear-による継続" title="Code-Gear-による継続"><span class="octicon octicon-link"></span></a>Code Gear による継続</h1><ul> <li>Code Gear の処理の間を goto によって遷移していく</li> -</ul><p><img src="https://i.imgur.com/etfQund.png" alt=""></p><hr><h1 id="Data-Gear-の継続" style=""><a class="anchor hidden-xs" href="#Data-Gear-の継続" title="Data-Gear-の継続"><span class="octicon octicon-link"></span></a>Data Gear の継続</h1><ul> -<li>Code Gear で定義されたデータ</li> -<li>goto の際に Data Gear も継続される</li> -</ul><p><img src="https://i.imgur.com/3E0DGWA.png" alt=""></p><hr><h1 id="Meta-Code-Gear" style=""><a class="anchor hidden-xs" href="#Meta-Code-Gear" title="Meta-Code-Gear"><span class="octicon octicon-link"></span></a>Meta Code Gear</h1><ul> -<li>実際にはノーマルレベルの間にメタレベルの処理がある</li> -</ul><p><img src="https://i.imgur.com/vy0NxrG.png" alt=""></p><hr><h1 id="Meta-Data-Gear" style=""><a class="anchor hidden-xs" href="#Meta-Data-Gear" title="Meta-Data-Gear"><span class="octicon octicon-link"></span></a>Meta Data Gear</h1><ul> -<li>CbC では接続可能な Code Gear, Data Gear のリスト</li> +<li>__code CodeGear名 で定義<br> +<img src="https://i.imgur.com/etfQund.png" alt=""></li> +</ul><hr><h1 id="Data-Gear-の継続"><a class="anchor hidden-xs" href="#Data-Gear-の継続" title="Data-Gear-の継続"><span class="octicon octicon-link"></span></a>Data Gear の継続</h1><ul> +<li>Code Gear からアクセスできるデータ</li> +<li>input Data Gear と Output Data Gear で証明する</li> +</ul><p><img src="https://i.imgur.com/3E0DGWA.png" alt=""></p><hr><h1 id="メタレベル"><a class="anchor hidden-xs" href="#メタレベル" title="メタレベル"><span class="octicon octicon-link"></span></a>メタレベル</h1><hr><h1 id="Meta-Code-Gear"><a class="anchor hidden-xs" href="#Meta-Code-Gear" title="Meta-Code-Gear"><span class="octicon octicon-link"></span></a>Meta Code Gear</h1><ul> +<li>メタレベルで見ると Code Gear の間にメタレベルの処理が挟まっている</li> +<li>cmake で __code CodeGear名_stub が生成される<br> +<img src="https://i.imgur.com/vy0NxrG.png" alt=""></li> +</ul><hr><h1 id="Meta-Data-Gear"><a class="anchor hidden-xs" href="#Meta-Data-Gear" title="Meta-Data-Gear"><span class="octicon octicon-link"></span></a>Meta Data Gear</h1><ul> +<li>ノーマルレベルでの書き換えやアクセスを防ぐために存在</li> +<li>CbC の 接続可能な Code Gear, Data Gear のリスト</li> <li>Data Gear を確保するメモリ空間</li> -<li>ノーマルレベルでの書き換えやアクセスを防ぐために存在</li> -</ul><hr><h1 id="Xv6" style=""><a class="anchor hidden-xs" href="#Xv6" title="Xv6"><span class="octicon octicon-link"></span></a>Xv6</h1><ul> +<li>Context</li> +</ul><hr><h1 id="Context"><a class="anchor hidden-xs" href="#Context" title="Context"><span class="octicon octicon-link"></span></a>Context</h1><ul> +<li>Meta Data Gear</li> +<li>Contextには全てのData Gear と Code Gear が登録されている</li> +<li>Xv6ではユーザープロセスに対応して1つのcontextが存在する</li> +<li>将来的なVMやコンテナの実装はContextの切り替えるによる実装を目指している<br> +<img src="https://i.imgur.com/GLIew1x.png" alt=""></li> +</ul><hr><h1 id="Xv6"><a class="anchor hidden-xs" href="#Xv6" title="Xv6"><span class="octicon octicon-link"></span></a>Xv6</h1><ul> <li>MIT の講義用教材として作られたOS <ul> <li>規格化される前のCで書かれたUNIX V6 を書き換えた</li> @@ -116,13 +134,24 @@ </ul> </li> <li>Xv6 をCbCで書き換える</li> -</ul><hr><h1 id="Xv6の構成" style=""><a class="anchor hidden-xs" href="#Xv6の構成" title="Xv6の構成"><span class="octicon octicon-link"></span></a>Xv6の構成</h1><ul class="highlight"> -<li>systemcall</li> -<li>Scheduler</li> -<li>Virtual Memory</li> -<li>file system</li> -<li>tty</li> -</ul><hr><h1 id="カーネル空間" style=""><a class="anchor hidden-xs" href="#カーネル空間" title="カーネル空間"><span class="octicon octicon-link"></span></a>カーネル空間</h1><ul> +</ul><hr><h1 id="Xv6の構成"><a class="anchor hidden-xs" href="#Xv6の構成" title="Xv6の構成"><span class="octicon octicon-link"></span></a>Xv6の構成</h1><ul> +<li>system call +<ul> +<li>カーネル空間の処理の呼び出し</li> +</ul> +</li> +<li>VM(仮想メモリ) +<ul> +<li>Paging</li> +</ul> +</li> +<li>File System +<ul> +<li>I/O, Read, Write</li> +</ul> +</li> +<li>Scheduler など</li> +</ul><hr><h1 id="カーネル空間"><a class="anchor hidden-xs" href="#カーネル空間" title="カーネル空間"><span class="octicon octicon-link"></span></a>カーネル空間</h1><ul> <li>OS の中核となるプログラムで Meta Level に相当する</li> <li>Xv6 ではカーネルとユーザープログラムは分離されている</li> <li>ユーザープログラムはカーネルに直接アクセスできない。 @@ -131,17 +160,12 @@ <li>呼び出す場合は system call</li> </ul> </li> -</ul><hr><h1 id="system-call" style=""><a class="anchor hidden-xs" href="#system-call" title="system-call"><span class="octicon octicon-link"></span></a>system call</h1><ul> -<li>system call 呼び出し</li> -<li>トラップ の発生</li> -<li>ユーザープログラムの中断</li> -<li>処理がカーネルに切り替わる</li> -</ul><hr><h1 id="Paging" style=""><a class="anchor hidden-xs" href="#Paging" title="Paging"><span class="octicon octicon-link"></span></a>Paging</h1><ul> +</ul><hr><h1 id="Paging"><a class="anchor hidden-xs" href="#Paging" title="Paging"><span class="octicon octicon-link"></span></a>Paging</h1><ul> <li>Page と呼ばれる固定長のブロックに分割して、メモリとスワップ領域で Page を入れ替えて管理</li> <li>仮想メモリとして扱うことでフラグメンテーションの解消と空き番地を探す必要がなくなる</li> -</ul><hr><h1 id="Xv6の書き換え方針" style=""><a class="anchor hidden-xs" href="#Xv6の書き換え方針" title="Xv6の書き換え方針"><span class="octicon octicon-link"></span></a>Xv6の書き換え方針</h1><ul> +</ul><hr><h1 id="Xv6の書き換え方針"><a class="anchor hidden-xs" href="#Xv6の書き換え方針" title="Xv6の書き換え方針"><span class="octicon octicon-link"></span></a>Xv6の書き換え方針</h1><ul> <li> -<p>メタレベルとノーマルレベルを記述できるOSを実装したい</p> +<p>メタレベルからノーマルレベルを保証するOSを作りたい</p> </li> <li> <p>段階的に書き換えていきたい</p> @@ -155,32 +179,25 @@ <li> <p>__code で書き直していく</p> </li> -</ul><hr><h1 id="CbCインターフェース0" style=""><a class="anchor hidden-xs" href="#CbCインターフェース0" title="CbCインターフェース0"><span class="octicon octicon-link"></span></a>CbCインターフェース</h1><ul> -<li> -<p>ノーマルレベルからメタレベルの記述が記述が煩雑になるためインターフェースを導入</p> -</li> -<li> -<p>インターフェースによる他のメリット</p> +</ul><hr><h1 id="インターフェースの導入"><a class="anchor hidden-xs" href="#インターフェースの導入" title="インターフェースの導入"><span class="octicon octicon-link"></span></a>インターフェースの導入</h1><ul> +<li>ノーマルレベルからメタレベルの記述が記述が煩雑になるためインターフェースを導入</li> +<li>インターフェースによるメリット <ul> <li>煩雑な記述の解消</li> -<li>実装の入れ替え</li> +<li>入力の切り替えによる実装の入れ替え</li> </ul> </li> -<li> -<p>実装は別で定義し、呼び出す</p> -</li> -<li> -<p>インターフェースによって実装を置き換えることができる</p> +<li>実装は別で定義し、呼び出す +<ul> +<li>後ほど説明</li> +</ul> </li> -</ul><hr><h1 id="CbCインターフェース" style=""><a class="anchor hidden-xs" href="#CbCインターフェース" title="CbCインターフェース"><span class="octicon octicon-link"></span></a>CbCインターフェース</h1><ul> -<li> -<p>Data Gear と Data Gear に対して操作を行う Code Gear の集合を表現する <strong>Meta Data Gear</strong></p> -</li> -<li> -<p>インターフェース実装と定義の図入れる</p> -</li> -</ul><hr><h1 id="インターフェースの定義0" style=""><a class="anchor hidden-xs" href="#インターフェースの定義0" title="インターフェースの定義0"><span class="octicon octicon-link"></span></a>インターフェースの定義</h1><ul> +</ul><hr><h1 id="CbCインターフェース"><a class="anchor hidden-xs" href="#CbCインターフェース" title="CbCインターフェース"><span class="octicon octicon-link"></span></a>CbCインターフェース</h1><ul> +<li>Data Gear と Data Gear に対して操作を行う Code Gear の集合を表現する <strong>Meta Data Gear</strong></li> +<li>インターフェースを定義してそこから呼び出す</li> +</ul><hr><h1 id="インターフェースの定義"><a class="anchor hidden-xs" href="#インターフェースの定義" title="インターフェースの定義"><span class="octicon octicon-link"></span></a>インターフェースの定義</h1><ul> <li>Xv6 の Virtual Memory の API 部分のインターフェース</li> +<li>以下のコードについて説明していく</li> </ul><pre><code class="c hljs"><span class="token keyword">typedef</span> <span class="token keyword">struct</span> vm<span class="token operator"><</span>Type<span class="token punctuation">,</span>Impl<span class="token operator">></span> <span class="token punctuation">{</span> __code <span class="token function">init_vmm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> __code <span class="token function">kpt_freerange</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> uint low<span class="token punctuation">,</span> uint hi<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> @@ -190,11 +207,11 @@ __code <span class="token function">loaduvm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span>pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode<span class="token operator">*</span> ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> __code <span class="token function">allocuvm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> uint oldsz<span class="token punctuation">,</span> uint newsz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> -</code></pre><hr><h1 id="インターフェースの命名" style=""><a class="anchor hidden-xs" href="#インターフェースの命名" title="インターフェースの命名"><span class="octicon octicon-link"></span></a>インターフェースの命名</h1><ul> +</code></pre><hr><h1 id="インターフェースの命名1行目"><a class="anchor hidden-xs" href="#インターフェースの命名1行目" title="インターフェースの命名1行目"><span class="octicon octicon-link"></span></a>インターフェースの命名(1行目)</h1><ul> <li>typedef struct の直後にインターフェース名(vm)を書く</li> -<li>Data Gear にマッピングされる</li> </ul><pre><code class="c hljs"><span class="token keyword">typedef</span> <span class="token keyword">struct</span> vm<span class="token operator"><</span>Type<span class="token punctuation">,</span>Impl<span class="token operator">></span> <span class="token punctuation">{</span> -</code></pre><hr><h1 id="インターフェースの-Code-Gear" style=""><a class="anchor hidden-xs" href="#インターフェースの-Code-Gear" title="インターフェースの-Code-Gear"><span class="octicon octicon-link"></span></a>インターフェースの Code Gear</h1><ul> +</code></pre><hr><h1 id="インターフェースの-Code-Gear2行目"><a class="anchor hidden-xs" href="#インターフェースの-Code-Gear2行目" title="インターフェースの-Code-Gear2行目"><span class="octicon octicon-link"></span></a>インターフェースの Code Gear(2行目~)</h1><ul> +<li>vm で使う Code Gear を登録する</li> <li>Code Gear は __code CodeGear名(引数); で記述する <ul> <li>引数が Data Gear に相当する</li> @@ -210,54 +227,57 @@ __code <span class="token function">loaduvm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span>pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode<span class="token operator">*</span> ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> __code <span class="token function">allocuvm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> uint oldsz<span class="token punctuation">,</span> uint newsz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> -</code></pre><hr><h1 id="next…" style=""><a class="anchor hidden-xs" href="#next…" title="next…"><span class="octicon octicon-link"></span></a>next(…)</h1><ul> +</code></pre><hr><h1 id="next…"><a class="anchor hidden-xs" href="#next…" title="next…"><span class="octicon octicon-link"></span></a>next(…)</h1><ul> <li>__code next(…) は次の Code Gear の継続先</li> <li>それぞれの Code Gear の引数の1つに設定する</li> </ul><pre><code class="c hljs"> __code <span class="token function">kpt_freerange</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> uint low<span class="token punctuation">,</span> uint hi<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//....</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> vm<span class="token punctuation">;</span> -</code></pre><pre><code class="c hljs">__code <span class="token function">exit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> +</code></pre><ul> +<li>例) goto vm->kpt_freerange の引数に exit を設定すると Code Gear である exit に遷移する</li> +</ul><pre><code class="c hljs">__code <span class="token function">exit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">//....</span> <span class="token punctuation">}</span> <span class="token keyword">goto</span> vm<span class="token operator">-></span><span class="token function">kpt_freerange</span><span class="token punctuation">(</span>vm<span class="token punctuation">,</span> low<span class="token punctuation">,</span> hi<span class="token punctuation">,</span> exit<span class="token punctuation">)</span><span class="token punctuation">;</span> -</code></pre><hr><h1 id="Interface-の実装の型" style=""><a class="anchor hidden-xs" href="#Interface-の実装の型" title="Interface-の実装の型"><span class="octicon octicon-link"></span></a>Interface の実装の型</h1><ul> +</code></pre><hr><h1 id="Interface-の実装の型"><a class="anchor hidden-xs" href="#Interface-の実装の型" title="Interface-の実装の型"><span class="octicon octicon-link"></span></a>Interface の実装の型</h1><ul> <li>実装側のヘッダーファイルも vm_impl と同じように用意する</li> </ul><pre><code class="c hljs"><span class="token keyword">typedef</span> <span class="token keyword">struct</span> vm_impl<span class="token operator"><</span>Impl<span class="token punctuation">,</span> Isa<span class="token operator">></span> impl vm<span class="token punctuation">{</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> __code <span class="token function">loaduvm_ptesize_check</span><span class="token punctuation">(</span>Type<span class="token operator">*</span> vm_impl<span class="token punctuation">,</span> uint i<span class="token punctuation">,</span> pte_t<span class="token operator">*</span> pte<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> -</code></pre><hr><h1 id="インターフェースの実装" style=""><a class="anchor hidden-xs" href="#インターフェースの実装" title="インターフェースの実装"><span class="octicon octicon-link"></span></a>インターフェースの実装</h1><ul> +</code></pre><hr><h1 id="インターフェースの実装"><a class="anchor hidden-xs" href="#インターフェースの実装" title="インターフェースの実装"><span class="octicon octicon-link"></span></a>インターフェースの実装</h1><ul> <li>実装は型と実装をそれぞれ別ファイルで定義する(vm_impl.h と vm_impl.cbc)</li> <li>実装するインターフェースは #interface で宣言する</li> </ul><pre><code class="c hljs"><span class="token macro property">#interface "vm.h"</span> -</code></pre><hr><h1 class="highlight" id="vm_impl-のコンストラクタ" style=""><a class="anchor hidden-xs" href="#vm_impl-のコンストラクタ" title="vm_impl-のコンストラクタ"><span class="octicon octicon-link"></span></a>vm_impl のコンストラクタ</h1><ul> -<li> -<p>create_imple の関数内で vm の型を定義し、vm->CodeGear名 で対応させていく</p> -</li> -<li> -<p>実装を Code Gear で記述していく。</p> -</li> -<li> -<p>struct vm* vm = new vm();</p> +</code></pre><hr><h1 id="vmインターフェースの実装の初期化"><a class="anchor hidden-xs" href="#vmインターフェースの実装の初期化" title="vmインターフェースの実装の初期化"><span class="octicon octicon-link"></span></a>vmインターフェースの実装の初期化</h1><ul> +<li>定義が終わったのでインターフェースを使用したい</li> +<li>メモリ上にインターフェースの置き場所と実装を確保 <ul> -<li>インターフェースのメモリ空間を確保</li> +<li>struct vm* vm = new vm();</li> </ul> </li> -<li> -<p>vm->void_ret = C_vm_void_ret;</p> +<li>インターフェースと実装の紐付け +<ul> +<li>vm->void_ret = C_vm_void_ret; <ul> <li>Code Gear の enum の設定</li> <li>インターフェースのAPIと enum の番号を紐付けている</li> </ul> </li> +</ul> +</li> </ul><pre><code class="c hljs">vm<span class="token operator">*</span> <span class="token function">createvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> Context<span class="token operator">*</span> cbc_context<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">struct</span> vm<span class="token operator">*</span> vm <span class="token operator">=</span> new <span class="token function">vm</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + <span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm_impl <span class="token operator">=</span> new <span class="token function">vm_impl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + vm<span class="token operator">-></span>vm <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">union</span> Data<span class="token operator">*</span><span class="token punctuation">)</span>vm_impl<span class="token punctuation">;</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> vm<span class="token operator">-></span>void_ret <span class="token operator">=</span> C_vm_void_ret<span class="token punctuation">;</span> vm<span class="token operator">-></span>init_vmm <span class="token operator">=</span> C_init_vmmvm_impl<span class="token punctuation">;</span> vm<span class="token operator">-></span>kpt_freerange <span class="token operator">=</span> C_kpt_freerangevm_impl<span class="token punctuation">;</span> + vm<span class="token operator">-></span>loaduvm <span class="token operator">=</span> C_loaduvmvm_impl<span class="token punctuation">;</span> + vm<span class="token operator">-></span>kpt_alloc <span class="token operator">=</span> C_kpt_allocvm_impl<span class="token punctuation">;</span> </code></pre><ul> <li>APIの実装の例(init_vmm) @@ -271,7 +291,7 @@ <span class="token keyword">goto</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> -</code></pre><hr><h1 id="インターフェース実装内の-CbC" style=""><a class="anchor hidden-xs" href="#インターフェース実装内の-CbC" title="インターフェース実装内の-CbC"><span class="octicon octicon-link"></span></a>インターフェース実装内の CbC</h1><ul> +</code></pre><hr><h1 id="インターフェース実装内の-CbC"><a class="anchor hidden-xs" href="#インターフェース実装内の-CbC" title="インターフェース実装内の-CbC"><span class="octicon octicon-link"></span></a>インターフェース実装内の CbC</h1><ul> <li>for文やif文がある場合はさらに実装を分ける <ul> <li>状態遷移ベースで記述したい</li> @@ -280,10 +300,10 @@ <li>インターフェースは外から呼び出されるAPI</li> <li>それに対してインターフェースの実装の Code Gearから明示的に呼び出される Code Gearは、Java の private メソッドのように扱われる。</li> <li>実際に vm.c の loaduvm の実装を分けた記述を説明する</li> -</ul><hr><h1 id="実装内の明示的な遷移の処理" style=""><a class="anchor hidden-xs" href="#実装内の明示的な遷移の処理" title="実装内の明示的な遷移の処理"><span class="octicon octicon-link"></span></a>実装内の明示的な遷移の処理</h1><ul> -<li>vm と同じ create_impl 内で vm_impl を定義し、private で実装する Code Gear を定義する</li> +</ul><hr><p><img src="https://i.imgur.com/Cj87Pxu.png" alt=""></p><hr><h1 id="実装内の明示的な遷移の処理"><a class="anchor hidden-xs" href="#実装内の明示的な遷移の処理" title="実装内の明示的な遷移の処理"><span class="octicon octicon-link"></span></a>実装内の明示的な遷移の処理</h1><ul> +<li><strong>vm と同じ create_impl 内で</strong> vm_impl を定義し、private で実装する Code Gear を定義する</li> <li>loaduvmvm_impl で goto によって private に遷移する</li> -</ul><pre class="highlight"><code class="c hljs">__code <span class="token function">loaduvmvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode<span class="token operator">*</span> ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> +</ul><pre><code class="c hljs">__code <span class="token function">loaduvmvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode<span class="token operator">*</span> ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">Gearef</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm_impl<span class="token punctuation">)</span><span class="token operator">-></span>pgdir <span class="token operator">=</span> pgdir<span class="token punctuation">;</span> <span class="token function">Gearef</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm_impl<span class="token punctuation">)</span><span class="token operator">-></span>addr <span class="token operator">=</span> addr<span class="token punctuation">;</span> <span class="token function">Gearef</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm_impl<span class="token punctuation">)</span><span class="token operator">-></span>ip <span class="token operator">=</span> ip<span class="token punctuation">;</span> @@ -293,18 +313,37 @@ <span class="token keyword">goto</span> <span class="token function">loaduvm_ptesize_checkvm_impl</span><span class="token punctuation">(</span>vm<span class="token punctuation">,</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> -</code></pre><pre class="highlight"><code class="c hljs">vm<span class="token operator">*</span> <span class="token function">createvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> Context<span class="token operator">*</span> cbc_context<span class="token punctuation">)</span> <span class="token punctuation">{</span> -<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> +</code></pre><ul> +<li>vm のインターフェースの実装を vm_impl に設定している</li> +<li>vm の実装内で使用する Code Gear も enum の番号で指定する +<ul> +<li>vm_impl->loaduvm_ptesize_check = C_loaduvm_ptesize_checkvm_impl;</li> +</ul> +</li> +</ul><pre><code class="c hljs">vm<span class="token operator">*</span> <span class="token function">createvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> Context<span class="token operator">*</span> cbc_context<span class="token punctuation">)</span> <span class="token punctuation">{</span> + <span class="token keyword">struct</span> vm<span class="token operator">*</span> vm <span class="token operator">=</span> new <span class="token function">vm</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm_impl <span class="token operator">=</span> new <span class="token function">vm_impl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + vm<span class="token operator">-></span>vm <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">union</span> Data<span class="token operator">*</span><span class="token punctuation">)</span>vm_impl<span class="token punctuation">;</span> + <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> vm_impl<span class="token operator">-></span>loaduvm_ptesize_check <span class="token operator">=</span> C_loaduvm_ptesize_checkvm_impl<span class="token punctuation">;</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> vm<span class="token operator">-></span>loaduvm <span class="token operator">=</span> C_loaduvmvm_impl<span class="token punctuation">;</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span> -</code></pre><hr><h1 id="loaduvmの-CbCによる書き換え" style=""><a class="anchor hidden-xs" href="#loaduvmの-CbCによる書き換え" title="loaduvmの-CbCによる書き換え"><span class="octicon octicon-link"></span></a>loaduvmの CbCによる書き換え</h1><ul> -<li>loaduvmは何でなぜ書き換えてるのか</li> -<li>vm.cのloaduvmの処理をCbC で書き換える</li> +</code></pre><hr><h1 id="loaduvmの-CbCによる書き換え"><a class="anchor hidden-xs" href="#loaduvmの-CbCによる書き換え" title="loaduvmの-CbCによる書き換え"><span class="octicon octicon-link"></span></a>loaduvmの CbCによる書き換え</h1><ul> +<li> +<p>loaduvmは</p> +<ul> +<li>swapから呼び出す</li> +<li>kernelの中をloopしてreadiに入る</li> +<li>入った場合は待ちになる</li> +<li>user proc側が待ちになる</li> +</ul> +</li> +<li> +<p>vm.cのloaduvmの処理をCbC で書き換える</p> +</li> </ul><pre><code class="c hljs"><span class="token keyword">int</span> loaduvm <span class="token punctuation">(</span>pde_t <span class="token operator">*</span>pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode <span class="token operator">*</span>ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">)</span> <span class="token punctuation">{</span> uint i<span class="token punctuation">,</span> pa<span class="token punctuation">,</span> n<span class="token punctuation">;</span> @@ -360,6 +399,38 @@ <span class="token keyword">goto</span> <span class="token function">loaduvm_loopvm_impl</span><span class="token punctuation">(</span>vm_impl<span class="token punctuation">,</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre><ul> +<li>vm.c のloaduvm の実装を CbC で書き直す</li> +</ul><pre><code class="c hljs"> +<span class="token keyword">int</span> loaduvm <span class="token punctuation">(</span>pde_t <span class="token operator">*</span>pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode <span class="token operator">*</span>ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">)</span> +<span class="token punctuation">{</span> + uint i<span class="token punctuation">,</span> pa<span class="token punctuation">,</span> n<span class="token punctuation">;</span> + pte_t <span class="token operator">*</span>pte<span class="token punctuation">;</span> + + <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>uint<span class="token punctuation">)</span> addr <span class="token operator">%</span> PTE_SZ <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> + <span class="token function">panic</span><span class="token punctuation">(</span><span class="token string">"loaduvm: addr must be page aligned"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + <span class="token punctuation">}</span> + + <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> sz<span class="token punctuation">;</span> i <span class="token operator">+</span><span class="token operator">=</span> PTE_SZ<span class="token punctuation">)</span> <span class="token punctuation">{</span> + <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>pte <span class="token operator">=</span> <span class="token function">walkpgdir</span><span class="token punctuation">(</span>pgdir<span class="token punctuation">,</span> addr <span class="token operator">+</span> i<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> + <span class="token function">panic</span><span class="token punctuation">(</span><span class="token string">"loaduvm: address should exist"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + <span class="token punctuation">}</span> + + pa <span class="token operator">=</span> <span class="token function">PTE_ADDR</span><span class="token punctuation">(</span><span class="token operator">*</span>pte<span class="token punctuation">)</span><span class="token punctuation">;</span> + + <span class="token keyword">if</span> <span class="token punctuation">(</span>sz <span class="token operator">-</span> i <span class="token operator"><</span> PTE_SZ<span class="token punctuation">)</span> <span class="token punctuation">{</span> + n <span class="token operator">=</span> sz <span class="token operator">-</span> i<span class="token punctuation">;</span> + <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> + n <span class="token operator">=</span> PTE_SZ<span class="token punctuation">;</span> + <span class="token punctuation">}</span> + + <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">readi</span><span class="token punctuation">(</span>ip<span class="token punctuation">,</span> <span class="token function">p2v</span><span class="token punctuation">(</span>pa<span class="token punctuation">)</span><span class="token punctuation">,</span> offset <span class="token operator">+</span> i<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">!=</span> n<span class="token punctuation">)</span> <span class="token punctuation">{</span> + <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> + <span class="token punctuation">}</span> + <span class="token punctuation">}</span> + + <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> +<span class="token punctuation">}</span> +</code></pre><ul> <li>vm.cではここから for だが CbC は if文の中と外にgoto を用意して実装する</li> </ul><p><img src="https://i.imgur.com/ByA7GVJ.png" alt=""></p><pre><code class="c hljs">__code <span class="token function">loaduvm_loopvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm_impl<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> uint i <span class="token operator">=</span> vm_impl<span class="token operator">-></span>i<span class="token punctuation">;</span> @@ -414,45 +485,12 @@ ret <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">goto</span> <span class="token function">next</span><span class="token punctuation">(</span>ret<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> -</code></pre><hr><pre><code class="c hljs"> -<span class="token keyword">int</span> loaduvm <span class="token punctuation">(</span>pde_t <span class="token operator">*</span>pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode <span class="token operator">*</span>ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">)</span> -<span class="token punctuation">{</span> - uint i<span class="token punctuation">,</span> pa<span class="token punctuation">,</span> n<span class="token punctuation">;</span> - pte_t <span class="token operator">*</span>pte<span class="token punctuation">;</span> - - <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>uint<span class="token punctuation">)</span> addr <span class="token operator">%</span> PTE_SZ <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> - <span class="token function">panic</span><span class="token punctuation">(</span><span class="token string">"loaduvm: addr must be page aligned"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> - <span class="token punctuation">}</span> - - <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> sz<span class="token punctuation">;</span> i <span class="token operator">+</span><span class="token operator">=</span> PTE_SZ<span class="token punctuation">)</span> <span class="token punctuation">{</span> - <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>pte <span class="token operator">=</span> <span class="token function">walkpgdir</span><span class="token punctuation">(</span>pgdir<span class="token punctuation">,</span> addr <span class="token operator">+</span> i<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> - <span class="token function">panic</span><span class="token punctuation">(</span><span class="token string">"loaduvm: address should exist"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> - <span class="token punctuation">}</span> - - pa <span class="token operator">=</span> <span class="token function">PTE_ADDR</span><span class="token punctuation">(</span><span class="token operator">*</span>pte<span class="token punctuation">)</span><span class="token punctuation">;</span> - - <span class="token keyword">if</span> <span class="token punctuation">(</span>sz <span class="token operator">-</span> i <span class="token operator"><</span> PTE_SZ<span class="token punctuation">)</span> <span class="token punctuation">{</span> - n <span class="token operator">=</span> sz <span class="token operator">-</span> i<span class="token punctuation">;</span> - <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> - n <span class="token operator">=</span> PTE_SZ<span class="token punctuation">;</span> - <span class="token punctuation">}</span> - - <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">readi</span><span class="token punctuation">(</span>ip<span class="token punctuation">,</span> <span class="token function">p2v</span><span class="token punctuation">(</span>pa<span class="token punctuation">)</span><span class="token punctuation">,</span> offset <span class="token operator">+</span> i<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">!=</span> n<span class="token punctuation">)</span> <span class="token punctuation">{</span> - <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> - <span class="token punctuation">}</span> - <span class="token punctuation">}</span> - - <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> -<span class="token punctuation">}</span> -</code></pre><hr><h1 id="stub" style=""><a class="anchor hidden-xs" href="#stub" title="stub"><span class="octicon octicon-link"></span></a>stub</h1><ul> -<li>goto meta はstub を呼び込んでいる</li> -<li>説明</li> -</ul><hr><h1 id="C-を-CbC-に部分的に書き直す手法" style=""><a class="anchor hidden-xs" href="#C-を-CbC-に部分的に書き直す手法" title="C-を-CbC-に部分的に書き直す手法"><span class="octicon octicon-link"></span></a>C を CbC に部分的に書き直す手法</h1><ul> +</code></pre><hr><h1 id="C-を-CbC-に部分的に書き直す手法"><a class="anchor hidden-xs" href="#C-を-CbC-に部分的に書き直す手法" title="C-を-CbC-に部分的に書き直す手法"><span class="octicon octicon-link"></span></a>C を CbC に部分的に書き直す手法</h1><ul> <li>CbC の場合 goto による 遷移を行うので、関数呼び出しのように goto 以降のコードを実行できない</li> <li>例) goto すると戻ってこれないため それ以降が実行されなくなる。</li> -</ul><hr><h1 id="CbC-から-C-への遷移" style=""><a class="anchor hidden-xs" href="#CbC-から-C-への遷移" title="CbC-から-C-への遷移"><span class="octicon octicon-link"></span></a>CbC から C への遷移</h1><ul class="highlight"> +</ul><hr><h1 id="CbC-から-C-への遷移"><a class="anchor hidden-xs" href="#CbC-から-C-への遷移" title="CbC-から-C-への遷移"><span class="octicon octicon-link"></span></a>CbC から C への遷移</h1><ul> <li>最初の命令は next で戻ってこれるので、dummy の関数を用意してそこで実行する</li> -</ul><pre class="highlight"><code class="c hljs"><span class="token keyword">void</span> <span class="token function">cbc_init_vmm_dummy</span><span class="token punctuation">(</span><span class="token keyword">struct</span> Context<span class="token operator">*</span> cbc_context<span class="token punctuation">,</span> <span class="token keyword">struct</span> proc<span class="token operator">*</span> p<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> init<span class="token punctuation">,</span> uint sz<span class="token punctuation">)</span> +</ul><pre><code class="c hljs"><span class="token keyword">void</span> <span class="token function">cbc_init_vmm_dummy</span><span class="token punctuation">(</span><span class="token keyword">struct</span> Context<span class="token operator">*</span> cbc_context<span class="token punctuation">,</span> <span class="token keyword">struct</span> proc<span class="token operator">*</span> p<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> init<span class="token punctuation">,</span> uint sz<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// inituvm(p->pgdir, _binary_initcode_start, (int)_binary_initcode_size);</span> @@ -482,7 +520,11 @@ <span class="token function">cbc_init_vmm_dummy</span><span class="token punctuation">(</span><span class="token operator">&</span>p<span class="token operator">-></span>cbc_context<span class="token punctuation">,</span> p<span class="token punctuation">,</span> p<span class="token operator">-></span>pgdir<span class="token punctuation">,</span> _binary_initcode_start<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span>_binary_initcode_size<span class="token punctuation">)</span><span class="token punctuation">;</span> -</code></pre><hr><h1 id="まとめ" style=""><a class="anchor hidden-xs" href="#まとめ" title="まとめ"><span class="octicon octicon-link"></span></a>まとめ</h1></div> +</code></pre><hr><h1 id="まとめ"><a class="anchor hidden-xs" href="#まとめ" title="まとめ"><span class="octicon octicon-link"></span></a>まとめ</h1><ul> +<li>OS 内部で CbC インターフェースを扱えるようになった</li> +<li>CbC の書 き換えが完了すれば、継続の入力と出力を検査することで OS の信頼性を保証したり、インターフェースの実装の入れ替えが可能になる。</li> +<li>Context による複数環境の入れ替えや同時実行を可能にすることで CbCXv6 に おいて コンテナと VM を実装ができると予想される。</li> +</ul></div> <div class="ui-toc dropup unselectable hidden-print" style="display:none;"> <div class="pull-right dropdown"> <a id="tocLabel" class="ui-toc-label btn btn-default" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false" title="Table of content"> @@ -491,33 +533,34 @@ <ul id="ui-toc" class="ui-toc-dropdown dropdown-menu" aria-labelledby="tocLabel"> <div class="toc"><ul class="nav"> <li class=""><a href="#CbCインターフェースによる-CbCXv6-の書き換え" title="CbCインターフェースによる CbCXv6 の書き換え">CbCインターフェースによる CbCXv6 の書き換え</a></li> -<li class=""><a href="#概要" title="概要">概要</a></li> -<li class=""><a href="#OS-の信頼性を上げたい" title="OS の信頼性を上げたい">OS の信頼性を上げたい</a></li> -<li class=""><a href="#メタレベルとノーマルレベル" title="メタレベルとノーマルレベル">メタレベルとノーマルレベル</a></li> -<li class=""><a href="#Continuation-based-C" title="Continuation based C">Continuation based C</a></li> -<li class=""><a href="#goto-による継続" title="goto による継続">goto による継続</a></li> -<li class=""><a href="#Data-Gear-の継続" title="Data Gear の継続">Data Gear の継続</a></li> -<li class=""><a href="#Meta-Code-Gear" title="Meta Code Gear">Meta Code Gear</a></li> -<li class=""><a href="#Meta-Data-Gear" title="Meta Data Gear">Meta Data Gear</a></li> -<li class=""><a href="#Xv6" title="Xv6">Xv6</a></li> -<li class=""><a href="#Xv6の構成" title="Xv6の構成">Xv6の構成</a></li> -<li class=""><a href="#カーネル空間" title="カーネル空間">カーネル空間</a></li> -<li class=""><a href="#system-call" title="system call">system call</a></li> -<li class=""><a href="#Paging" title="Paging">Paging</a></li> -<li class=""><a href="#Xv6の書き換え方針" title="Xv6の書き換え方針">Xv6の書き換え方針</a></li> -<li class=""><a href="#CbCインターフェース0" title="CbCインターフェース">CbCインターフェース</a></li> -<li class=""><a href="#CbCインターフェース" title="CbCインターフェース">CbCインターフェース</a></li> -<li class=""><a href="#インターフェースの定義0" title="インターフェースの定義">インターフェースの定義</a></li> -<li><a href="#インターフェースの命名" title="インターフェースの命名">インターフェースの命名</a></li> -<li><a href="#インターフェースの-Code-Gear" title="インターフェースの Code Gear">インターフェースの Code Gear</a></li> +<li><a href="#概要" title="概要">概要</a></li> +<li><a href="#OS-の信頼性を上げたい" title="OS の信頼性を上げたい">OS の信頼性を上げたい</a></li> +<li><a href="#ノーマルレベルとメタレベル" title="ノーマルレベルとメタレベル">ノーマルレベルとメタレベル</a></li> +<li><a href="#Continuation-based-C" title="Continuation based C">Continuation based C</a></li> +<li><a href="#ノーマルレベル" title="ノーマルレベル">ノーマルレベル</a></li> +<li><a href="#Code-Gear-による継続" title="Code Gear による継続">Code Gear による継続</a></li> +<li><a href="#Data-Gear-の継続" title="Data Gear の継続">Data Gear の継続</a></li> +<li><a href="#メタレベル" title="メタレベル">メタレベル</a></li> +<li><a href="#Meta-Code-Gear" title="Meta Code Gear">Meta Code Gear</a></li> +<li><a href="#Meta-Data-Gear" title="Meta Data Gear">Meta Data Gear</a></li> +<li><a href="#Context" title="Context">Context</a></li> +<li><a href="#Xv6" title="Xv6">Xv6</a></li> +<li><a href="#Xv6の構成" title="Xv6の構成">Xv6の構成</a></li> +<li><a href="#カーネル空間" title="カーネル空間">カーネル空間</a></li> +<li><a href="#Paging" title="Paging">Paging</a></li> +<li><a href="#Xv6の書き換え方針" title="Xv6の書き換え方針">Xv6の書き換え方針</a></li> +<li><a href="#インターフェースの導入" title="インターフェースの導入">インターフェースの導入</a></li> +<li><a href="#CbCインターフェース" title="CbCインターフェース">CbCインターフェース</a></li> +<li><a href="#インターフェースの定義" title="インターフェースの定義">インターフェースの定義</a></li> +<li><a href="#インターフェースの命名1行目" title="インターフェースの命名(1行目)">インターフェースの命名(1行目)</a></li> +<li><a href="#インターフェースの-Code-Gear2行目" title="インターフェースの Code Gear(2行目~)">インターフェースの Code Gear(2行目~)</a></li> <li><a href="#next…" title="next(…)">next(…)</a></li> <li><a href="#Interface-の実装の型" title="Interface の実装の型">Interface の実装の型</a></li> <li><a href="#インターフェースの実装" title="インターフェースの実装">インターフェースの実装</a></li> -<li><a href="#vm_impl-のコンストラクタ" title="vm_impl のコンストラクタ">vm_impl のコンストラクタ</a></li> -<li class=""><a href="#インターフェース実装内の-CbC" title="インターフェース実装内の CbC">インターフェース実装内の CbC</a></li> +<li><a href="#vmインターフェースの実装の初期化" title="vmインターフェースの実装の初期化">vmインターフェースの実装の初期化</a></li> +<li><a href="#インターフェース実装内の-CbC" title="インターフェース実装内の CbC">インターフェース実装内の CbC</a></li> <li><a href="#実装内の明示的な遷移の処理" title="実装内の明示的な遷移の処理">実装内の明示的な遷移の処理</a></li> <li><a href="#loaduvmの-CbCによる書き換え" title="loaduvmの CbCによる書き換え">loaduvmの CbCによる書き換え</a></li> -<li><a href="#stub" title="stub">stub</a></li> <li><a href="#C-を-CbC-に部分的に書き直す手法" title="C を CbC に部分的に書き直す手法">C を CbC に部分的に書き直す手法</a></li> <li><a href="#CbC-から-C-への遷移" title="CbC から C への遷移">CbC から C への遷移</a></li> <li><a href="#まとめ" title="まとめ">まとめ</a></li> @@ -529,33 +572,34 @@ <div id="ui-toc-affix" class="ui-affix-toc ui-toc-dropdown unselectable hidden-print" data-spy="affix" style="top:17px;display:none;" null null> <div class="toc"><ul class="nav"> <li class=""><a href="#CbCインターフェースによる-CbCXv6-の書き換え" title="CbCインターフェースによる CbCXv6 の書き換え">CbCインターフェースによる CbCXv6 の書き換え</a></li> -<li class=""><a href="#概要" title="概要">概要</a></li> -<li class=""><a href="#OS-の信頼性を上げたい" title="OS の信頼性を上げたい">OS の信頼性を上げたい</a></li> -<li class=""><a href="#メタレベルとノーマルレベル" title="メタレベルとノーマルレベル">メタレベルとノーマルレベル</a></li> -<li class=""><a href="#Continuation-based-C" title="Continuation based C">Continuation based C</a></li> -<li class=""><a href="#goto-による継続" title="goto による継続">goto による継続</a></li> -<li class=""><a href="#Data-Gear-の継続" title="Data Gear の継続">Data Gear の継続</a></li> -<li class=""><a href="#Meta-Code-Gear" title="Meta Code Gear">Meta Code Gear</a></li> -<li class=""><a href="#Meta-Data-Gear" title="Meta Data Gear">Meta Data Gear</a></li> -<li class=""><a href="#Xv6" title="Xv6">Xv6</a></li> -<li class=""><a href="#Xv6の構成" title="Xv6の構成">Xv6の構成</a></li> -<li class=""><a href="#カーネル空間" title="カーネル空間">カーネル空間</a></li> -<li class=""><a href="#system-call" title="system call">system call</a></li> -<li class=""><a href="#Paging" title="Paging">Paging</a></li> -<li class=""><a href="#Xv6の書き換え方針" title="Xv6の書き換え方針">Xv6の書き換え方針</a></li> -<li class=""><a href="#CbCインターフェース0" title="CbCインターフェース">CbCインターフェース</a></li> -<li class=""><a href="#CbCインターフェース" title="CbCインターフェース">CbCインターフェース</a></li> -<li class=""><a href="#インターフェースの定義0" title="インターフェースの定義">インターフェースの定義</a></li> -<li><a href="#インターフェースの命名" title="インターフェースの命名">インターフェースの命名</a></li> -<li><a href="#インターフェースの-Code-Gear" title="インターフェースの Code Gear">インターフェースの Code Gear</a></li> +<li><a href="#概要" title="概要">概要</a></li> +<li><a href="#OS-の信頼性を上げたい" title="OS の信頼性を上げたい">OS の信頼性を上げたい</a></li> +<li><a href="#ノーマルレベルとメタレベル" title="ノーマルレベルとメタレベル">ノーマルレベルとメタレベル</a></li> +<li><a href="#Continuation-based-C" title="Continuation based C">Continuation based C</a></li> +<li><a href="#ノーマルレベル" title="ノーマルレベル">ノーマルレベル</a></li> +<li><a href="#Code-Gear-による継続" title="Code Gear による継続">Code Gear による継続</a></li> +<li><a href="#Data-Gear-の継続" title="Data Gear の継続">Data Gear の継続</a></li> +<li><a href="#メタレベル" title="メタレベル">メタレベル</a></li> +<li><a href="#Meta-Code-Gear" title="Meta Code Gear">Meta Code Gear</a></li> +<li><a href="#Meta-Data-Gear" title="Meta Data Gear">Meta Data Gear</a></li> +<li><a href="#Context" title="Context">Context</a></li> +<li><a href="#Xv6" title="Xv6">Xv6</a></li> +<li><a href="#Xv6の構成" title="Xv6の構成">Xv6の構成</a></li> +<li><a href="#カーネル空間" title="カーネル空間">カーネル空間</a></li> +<li><a href="#Paging" title="Paging">Paging</a></li> +<li><a href="#Xv6の書き換え方針" title="Xv6の書き換え方針">Xv6の書き換え方針</a></li> +<li><a href="#インターフェースの導入" title="インターフェースの導入">インターフェースの導入</a></li> +<li><a href="#CbCインターフェース" title="CbCインターフェース">CbCインターフェース</a></li> +<li><a href="#インターフェースの定義" title="インターフェースの定義">インターフェースの定義</a></li> +<li><a href="#インターフェースの命名1行目" title="インターフェースの命名(1行目)">インターフェースの命名(1行目)</a></li> +<li><a href="#インターフェースの-Code-Gear2行目" title="インターフェースの Code Gear(2行目~)">インターフェースの Code Gear(2行目~)</a></li> <li><a href="#next…" title="next(…)">next(…)</a></li> <li><a href="#Interface-の実装の型" title="Interface の実装の型">Interface の実装の型</a></li> <li><a href="#インターフェースの実装" title="インターフェースの実装">インターフェースの実装</a></li> -<li><a href="#vm_impl-のコンストラクタ" title="vm_impl のコンストラクタ">vm_impl のコンストラクタ</a></li> -<li class=""><a href="#インターフェース実装内の-CbC" title="インターフェース実装内の CbC">インターフェース実装内の CbC</a></li> +<li><a href="#vmインターフェースの実装の初期化" title="vmインターフェースの実装の初期化">vmインターフェースの実装の初期化</a></li> +<li><a href="#インターフェース実装内の-CbC" title="インターフェース実装内の CbC">インターフェース実装内の CbC</a></li> <li><a href="#実装内の明示的な遷移の処理" title="実装内の明示的な遷移の処理">実装内の明示的な遷移の処理</a></li> <li><a href="#loaduvmの-CbCによる書き換え" title="loaduvmの CbCによる書き換え">loaduvmの CbCによる書き換え</a></li> -<li><a href="#stub" title="stub">stub</a></li> <li><a href="#C-を-CbC-に部分的に書き直す手法" title="C を CbC に部分的に書き直す手法">C を CbC に部分的に書き直す手法</a></li> <li><a href="#CbC-から-C-への遷移" title="CbC から C への遷移">CbC から C への遷移</a></li> <li><a href="#まとめ" title="まとめ">まとめ</a></li>
--- a/slide/CbCXv6.md Sun Feb 09 22:55:38 2020 +0900 +++ b/slide/CbCXv6.md Mon Feb 10 18:01:43 2020 +0900 @@ -6,79 +6,98 @@ # 概要 - OS の信頼性を上げたい -- CbCを使って xv6 という OS を書き換える +- CbCという言語を使って xv6 という OS を書き換える - Paging の書き換えを行った -- まだ実装中 -- 将来はコンテナやVMをメタ計算として実装できるはず +- 実装中だが、将来はコンテナやVMを実装できるはず --- # OS の信頼性を上げたい -- 仕様を満たすことを証明する +- OS自体が複雑で検証が困難。 + - バグの原因に +- OSの仕様を定義してそれを満たすことを証明する - 証明しやすい形の記述を作る - CbCの goto で書く - 状態遷移系に近い形で記述できる(証明しやすい) - 関数型の記述 -- CbCのinterface で書く + - 入力に対しての出力を検証する - 記述のモジュール化 + - CbCのインターフェースで書く + - 煩雑な記述の解消 + - 入力の切り替えによる機能の入れ替え --- -# メタレベルとノーマルレベル +# ノーマルレベルとメタレベル - ノーマルレベル - - CbCで記述される普通のアルゴリズム + - CbCで記述される部分 - メタレベル - Paging などのメモリやCPU自体の操作 - - プログラムの正しさの証明 -- Context - - メタレベルで使用される Meta Data を置く場所 + - (ノーマルレベルの)プログラムの正しさの証明 + - cmake で生成している --- # Continuation based C -- ノーマルレベルとメタレベルの処理を同じ言語で行えるようにした言語(以下CbC) +- 状態遷移ベースで記述できる言語(以下CbC) +- cmake で CbC からメタレベルの記述を生成する - Code Gear - 基本的な処理の単位 - goto 文で遷移する - Data Gear - - データの単位 + - Code Gear からアクセスできるデータの単位 + - 引数など - Meta Code Gear - - goto meta - - Code Gear の間に挟める計算 + - Code Gear の間に挟まれるメタレベルの処理 - Meta Data Gear - - Context - - Code Gearの間の接続など + - Code Gearの間の接続などの情報 + - Context(後ほど説明) --- -# goto による継続 +# ノーマルレベル +--- +# Code Gear による継続 - Code Gear の処理の間を goto によって遷移していく - +- __code CodeGear名 で定義  --- # Data Gear の継続 -- Code Gear で定義されたデータ -- goto の際に Data Gear も継続される +- Code Gear からアクセスできるデータ +- input Data Gear と Output Data Gear で証明する  --- +# メタレベル + +--- # Meta Code Gear -- 実際にはノーマルレベルの間にメタレベルの処理がある - +- メタレベルで見ると Code Gear の間にメタレベルの処理が挟まっている +- cmake で __code CodeGear名_stub が生成される  --- # Meta Data Gear -- CbC では接続可能な Code Gear, Data Gear のリスト +- ノーマルレベルでの書き換えやアクセスを防ぐために存在 +- CbC の 接続可能な Code Gear, Data Gear のリスト - Data Gear を確保するメモリ空間 -- ノーマルレベルでの書き換えやアクセスを防ぐために存在 +- Context + +--- + +# Context +- Meta Data Gear +- Contextには全てのData Gear と Code Gear が登録されている +- Xv6ではユーザープロセスに対応して1つのcontextが存在する +- 将来的なVMやコンテナの実装はContextの切り替えるによる実装を目指している + --- @@ -91,17 +110,17 @@ --- - # Xv6の構成 -- systemcall -- Scheduler -- Virtual Memory -- file system -- tty - - +- system call + - カーネル空間の処理の呼び出し +- VM(仮想メモリ) + - Paging +- File System + - I/O, Read, Write +- Scheduler など --- + # カーネル空間 - OS の中核となるプログラムで Meta Level に相当する - Xv6 ではカーネルとユーザープログラムは分離されている @@ -111,14 +130,6 @@ --- -# system call -- system call 呼び出し -- トラップ の発生 -- ユーザープログラムの中断 -- 処理がカーネルに切り替わる - ---- - # Paging - Page と呼ばれる固定長のブロックに分割して、メモリとスワップ領域で Page を入れ替えて管理 - 仮想メモリとして扱うことでフラグメンテーションの解消と空き番地を探す必要がなくなる @@ -126,7 +137,7 @@ --- # Xv6の書き換え方針 -- メタレベルとノーマルレベルを記述できるOSを実装したい +- メタレベルからノーマルレベルを保証するOSを作りたい - 段階的に書き換えていきたい - Paging を書き換える理由 - OS の信頼性を保証する上で重要なメモリ管理部分 @@ -135,26 +146,25 @@ --- -# CbCインターフェース +# インターフェースの導入 - ノーマルレベルからメタレベルの記述が記述が煩雑になるためインターフェースを導入 -- インターフェースによる他のメリット +- インターフェースによるメリット - 煩雑な記述の解消 - - 実装の入れ替え - + - 入力の切り替えによる実装の入れ替え - 実装は別で定義し、呼び出す -- インターフェースによって実装を置き換えることができる + - 後ほど説明 --- # CbCインターフェース - Data Gear と Data Gear に対して操作を行う Code Gear の集合を表現する **Meta Data Gear** - -- インターフェース実装と定義の図入れる +- インターフェースを定義してそこから呼び出す --- # インターフェースの定義 - Xv6 の Virtual Memory の API 部分のインターフェース +- 以下のコードについて説明していく ``` c typedef struct vm<Type,Impl> { @@ -171,9 +181,8 @@ --- -# インターフェースの命名 +# インターフェースの命名(1行目) - typedef struct の直後にインターフェース名(vm)を書く -- Data Gear にマッピングされる ``` c typedef struct vm<Type,Impl> { @@ -182,7 +191,8 @@ --- -# インターフェースの Code Gear +# インターフェースの Code Gear(2行目~) +- vm で使う Code Gear を登録する - Code Gear は __code CodeGear名(引数); で記述する - 引数が Data Gear に相当する - 第1引数の Impl* vm がインターフェースの実装の型になる @@ -211,6 +221,7 @@ __code next(...); } vm; ``` +- 例) goto vm->kpt_freerange の引数に exit を設定すると Code Gear である exit に遷移する ``` c __code exit(){ //.... @@ -244,23 +255,26 @@ --- -# vm_impl のコンストラクタ -- create_imple の関数内で vm の型を定義し、vm->CodeGear名 で対応させていく -- 実装を Code Gear で記述していく。 - -- struct vm* vm = new vm(); - - インターフェースのメモリ空間を確保 -- vm->void_ret = C_vm_void_ret; - - Code Gear の enum の設定 - - インターフェースのAPIと enum の番号を紐付けている +# vmインターフェースの実装の初期化 +- 定義が終わったのでインターフェースを使用したい +- メモリ上にインターフェースの置き場所と実装を確保 + - struct vm* vm = new vm(); +- インターフェースと実装の紐付け + - vm->void_ret = C_vm_void_ret; + - Code Gear の enum の設定 + - インターフェースのAPIと enum の番号を紐付けている ``` c vm* createvm_impl(struct Context* cbc_context) { struct vm* vm = new vm(); + struct vm_impl* vm_impl = new vm_impl(); + vm->vm = (union Data*)vm_impl; .... vm->void_ret = C_vm_void_ret; vm->init_vmm = C_init_vmmvm_impl; vm->kpt_freerange = C_kpt_freerangevm_impl; + vm->loaduvm = C_loaduvmvm_impl; + vm->kpt_alloc = C_kpt_allocvm_impl; ``` @@ -287,8 +301,11 @@ --- + + +--- # 実装内の明示的な遷移の処理 -- vm と同じ create_impl 内で vm_impl を定義し、private で実装する Code Gear を定義する +- **vm と同じ create_impl 内で** vm_impl を定義し、private で実装する Code Gear を定義する - loaduvmvm_impl で goto によって private に遷移する ``` c @@ -304,10 +321,16 @@ } ``` +- vm のインターフェースの実装を vm_impl に設定している +- vm の実装内で使用する Code Gear も enum の番号で指定する + - vm_impl->loaduvm_ptesize_check = C_loaduvm_ptesize_checkvm_impl; + ``` c vm* createvm_impl(struct Context* cbc_context) { -... + struct vm* vm = new vm(); struct vm_impl* vm_impl = new vm_impl(); + vm->vm = (union Data*)vm_impl; + ... vm_impl->loaduvm_ptesize_check = C_loaduvm_ptesize_checkvm_impl; .... @@ -318,7 +341,12 @@ --- # loaduvmの CbCによる書き換え -- loaduvmは何でなぜ書き換えてるのか +- loaduvmは + - swapから呼び出す + - kernelの中をloopしてreadiに入る + - 入った場合は待ちになる + - user proc側が待ちになる + - vm.cのloaduvmの処理をCbC で書き換える ``` c @@ -385,6 +413,41 @@ ``` +- vm.c のloaduvm の実装を CbC で書き直す +``` c + +int loaduvm (pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz) +{ + uint i, pa, n; + pte_t *pte; + + if ((uint) addr % PTE_SZ != 0) { + panic("loaduvm: addr must be page aligned"); + } + + for (i = 0; i < sz; i += PTE_SZ) { + if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) { + panic("loaduvm: address should exist"); + } + + pa = PTE_ADDR(*pte); + + if (sz - i < PTE_SZ) { + n = sz - i; + } else { + n = PTE_SZ; + } + + if (readi(ip, p2v(pa), offset + i, n) != n) { + return -1; + } + } + + return 0; +} +``` + + - vm.cではここから for だが CbC は if文の中と外にgoto を用意して実装する  @@ -445,46 +508,6 @@ } ``` ---- - -``` c - -int loaduvm (pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz) -{ - uint i, pa, n; - pte_t *pte; - - if ((uint) addr % PTE_SZ != 0) { - panic("loaduvm: addr must be page aligned"); - } - - for (i = 0; i < sz; i += PTE_SZ) { - if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) { - panic("loaduvm: address should exist"); - } - - pa = PTE_ADDR(*pte); - - if (sz - i < PTE_SZ) { - n = sz - i; - } else { - n = PTE_SZ; - } - - if (readi(ip, p2v(pa), offset + i, n) != n) { - return -1; - } - } - - return 0; -} -``` - ---- - -# stub -- goto meta はstub を呼び込んでいる -- 説明 --- @@ -533,4 +556,6 @@ --- # まとめ - +- OS 内部で CbC インターフェースを扱えるようになった +- CbC の書 き換えが完了すれば、継続の入力と出力を検査することで OS の信頼性を保証したり、インターフェースの実装の入れ替えが可能になる。 +- Context による複数環境の入れ替えや同時実行を可能にすることで CbCXv6 に おいて コンテナと VM を実装ができると予想される。