% ^^A -*- japanese-latex -*-
% \iffalse meta-comment
%
%  BXJS ドキュメントクラス
% (BXJS Document Classes)
%
%  本ソフトウェアは奥村晴彦氏および日本語TeX開発コミュニティによる
%  「pLaTeX2ε新ドキュメントクラス」を
%  「八登 崇之（別名 ZR）」が改変したものである。
% (This software is a modified version of
%  "New Document CLasses for pLaTeX2e"
%  authored by Haruhiko Okumura and the Japanese TeX Development Community,
%  and the modification is by Takayuki YATO (aka."ZR").)
%
%  本ソフトウェアは修正 BSD ライセンスの下で配布される。
% (This software is distributed under the BSD 2-Clause License.)
%
%  以下に原版についての原版著者による情報を示す：
% (Below is shown the information on the original version,
%  provided by the original authors.)
%---------------------------------------
%
%  pLaTeX2ε新ドキュメントクラス（日本語 TeX 開発コミュニティ版）
%  原作者：奥村晴彦 <okumura@okumuralab.org>
%
%---------------------------------------
%
%  Copyright 1993-2022
%  The LaTeX3 Project and any individual authors listed elsewhere
%  in this file.
%
%  Copyright 1995-1999 ASCII Corporation.
%  Copyright 1999-2016 Haruhiko Okumura
%  Copyright 2016-2025 Japanese TeX Development Community
%
%  Copyright 2013-2025 Takayuki YATO (aka. "ZR")
%
% \fi
% \CheckSum{0}
%
% \iffalse
%
%    \begin{macrocode}
%<class|anc>\NeedsTeXFormat{LaTeX2e}
%<article>\ProvidesClass{bxjsarticle}
%<report>\ProvidesClass{bxjsreport}
%<book>\ProvidesClass{bxjsbook}
%<slide>\ProvidesClass{bxjsslide}
%<minimal>\ProvidesFile{bxjsja-minimal.def}
%<standard>\ProvidesFile{bxjsja-standard.def}
%<modern>\ProvidesFile{bxjsja-modern.def}
%<pandoc>\ProvidesFile{bxjsja-pandoc.def}
%<compat>\ProvidesPackage{bxjscompat}
%<cjkcat>\ProvidesPackage{bxjscjkcat}
%<ancpandoc>\ProvidesPackage{bxjspandoc}
%<*driver>
\ProvidesFile{bxjscls.dtx}
%</driver>
  [2025/06/06 v2.9d BXJS document classes]
% based on jsclasses [2025/05/26]
% [2024/07/19 v2.9c BXJS document classes]
% [2024/01/22 v2.9b BXJS document classes]
% [2023/08/02 v2.9a BXJS document classes]
% [2023/07/17 v2.9  BXJS document classes]
% [2023/07/01 v2.8b BXJS document classes]
% [2023/06/20 v2.8a BXJS document classes]
% [2023/06/14 v2.8  BXJS document classes]
% based on jsclasses [2023/02/23]
% [2022/04/10 v2.7a BXJS document classes]
% [2022/03/30 v2.7  BXJS document classes]
% [2022/03/20 v2.6  BXJS document classes]
% [2021/05/18 v2.5a BXJS document classes]
% [2021/02/02 v2.5  BXJS document classes]
% [2021/01/27 v2.4a BXJS document classes]
% [2020/10/16 v2.4  BXJS document classes]
% [2020/10/10 v2.3  BXJS document classes]
% based on jsclasses [2020/10/05]
% [2020/10/04 v2.2c BXJS document classes]
% [2020/09/29 v2.2b BXJS document classes]
% [2020/09/22 v2.2a BXJS document classes]
% [2020/09/04 v2.2  BXJS document classes]
% [2020/05/28 v2.1  BXJS document classes]
% [2020/04/04 v2.0a BXJS document classes]
% [2020/03/25 v2.0  BXJS document classes]
% [2020/02/15 v1.9k BXJS document classes]
% [2020/02/05 v1.9j BXJS document classes]
% based on jsclasses [2020/02/02]
% [2019/11/24 v1.9i BXJS document classes]
% [2019/07/27 v1.9h BXJS document classes]
% based on jsclasses [2019/07/25]
% [2019/06/23 v1.9g BXJS document classes]
% [2019/03/10 v1.9f BXJS document classes]
% [2019/01/13 v1.9e BXJS document classes]
% [2018/10/03 v1.9d BXJS document classes]
% [2018/09/04 v1.9c BXJS document classes]
% [2018/08/20 v1.9b BXJS document classes]
% [2018/07/20 v1.9a BXJS document classes]
% based on jsclasses [2018/06/23]
% [2018/04/19 v1.9  BXJS document classes]
% [2018/04/14 v1.8b BXJS document classes]
% [2018/03/29 v1.8a BXJS document classes]
% based on jsclasses [2018/03/11]
% [2018/03/03 v1.8  BXJS document classes]
% [2018/02/04 v1.7c BXJS document classes]
% [2018/01/28 v1.7b BXJS document classes]
% [2017/12/09 v1.7a BXJS document classes]
% [2017/10/21 v1.7 BXJS document classes]
% [2017/09/28 v1.6b BXJS document classes]
% [2017/09/24 v1.6a BXJS document classes]
% [2017/09/09 v1.6  BXJS document classes]
% based on jsclasses [2017/09/03]
% [2017/07/07 v1.5d BXJS document classes]
% [2017/06/10 v1.5c BXJS document classes]
% [2017/04/01 v1.5b BXJS document classes]
% [2017/03/14 v1.5a BXJS document classes]
% [2017/03/11 v1.5 BXJS document classes]
% based on jsclasses [2017/03/05]
% [2017/02/03 v1.4 BXJS document classes]
% [2017/01/28 v1.3a BXJS document classes]
% based on jsclasses [2017/01/13]
% [2016/11/01 v1.3 BXJS document classes]
% based on jsclasses [2016/10/08]
% [2016/08/16 v1.2a BXJS document classes]
% [2016/08/01 v1.2 BXJS document classes]
% based on jsclasses [2016/07/18]
% [2016/07/16 v1.1f BXJS document classes]
% based on jsclasses [2016/07/15]
% [2016/05/28 v1.1e BXJS document classes]
% [2016/05/21 v1.1d BXJS document classes]
% [2016/05/01 v1.1c BXJS document classes]
% [2016/03/27 v1.1b BXJS document classes]
% [2016/02/20 v1.1a BXJS document classes]
% [2016/02/14 v1.1 BXJS document classes]
% [2015/11/21 v1.0d BXJS document classes]
% [2015/10/18 v1.0c BXJS document classes]
% [2015/09/07 v1.0b BXJS document classes]
% [2015/08/23 v1.0a BXJS document classes]
% [2015/08/05 v1.0 BXJS document classes]
% based on jsclasses [2014/02/07]
% [2013/10/03 v0.9pre BXJS document classes]
% based on jsclasses [2013/05/14]
%<*driver>
\documentclass[a4paper]{ltjsarticle}
%\usepackage[ipaex]{luatexja-preset}
\renewcommand{\headfont}{\romanseries{sbc}\sffamily}
\usepackage{bxtexlogo}
\bxtexlogoimport{*,JTeX}
\usepackage{doc}
\usepackage{color}
\newcommand{\Strong}[1]{\textsf{#1}}
\newcommand{\Pkg}[1]{\textsf{#1}}
\newcommand{\Meta}[1]{$\langle$\mbox{}#1\mbox{}$\rangle$}
\newcommand{\Note}{\par\noindent ※}
\newcommand{\Means}{：\quad}
\newcommand{\TODO}[1][]{\par\noindent
  {\usefont{OT1}{cmss}{sbc}{n}\color{red}TODO:%
   \textsubscript{#1}}\ }
\newcommand{\OR}{$\;|\;$}
\newcommand{\ZRX}{☃}
\newenvironment{ZRnote}
  {\StartZRnote}{\EndZRnote}
\newcommand*{\ZRnoteline}[1]{
  \par\noindent\makebox[0pt][l]{\rule[.5ex]{\linewidth}{.4pt}}%
  \makebox{\hspace{.05\linewidth}\rule[#1ex]{.9\linewidth}{.2pt}}\par}
\newcommand*{\StartZRnote}{\ZRnoteline{.1}}
\newcommand*{\EndZRnote}{\ZRnoteline{.9}}
\newcommand*{\zrWDash}{\symbol{"301C}}% WAVE DASH
\newcommand*{\zrNote}[1]{［#1］}
\makeatletter
\providecommand*\jsTocLine{\leaders\hbox{%
  $\m@th \mkern \@dotsep mu\hbox{.}\mkern \@dotsep mu$}\hfill}
\def\meta@font@select{\rmfamily\itshape}
\makeatother
\addtolength{\textwidth}{-1in}
\addtolength{\evensidemargin}{1in}
\addtolength{\oddsidemargin}{1in}
\addtolength{\marginparwidth}{1in}
\setlength\marginparpush{0pt}
% \OnlyDescription
\DisableCrossrefs
\CodelineNumbered
\setcounter{StandardModuleDepth}{1}
\GetFileInfo{bxjscls.dtx}
\begin{document}
  \DocInput{bxjscls.dtx}
\end{document}
%</driver>
%    \end{macrocode}
%
% \fi
%
%^^A========================================================
% \title{\Pkg{BXjscls} パッケージ\\
%  （BXJS文書クラス集）\\
%  ソースコード説明書}
% \author{八登崇之\ （Takayuki YATO; aka.~``ZR''}
% \date{\fileversion\quad[\filedate]}
% \maketitle
%
% \MakeShortVerb{\|}
%
% \begin{ZRnote}
% この文書はソースコード説明書です。
% 一般の文書作成者向けの解説については、
% ユーザマニュアル |bxjscls-manual.pdf| を参照してください。
% \end{ZRnote}
%
% \tableofcontents
%
% \section{はじめに}
%
% \begin{ZRnote}
% この文書は\Strong{「BXJSドキュメントクラス」}のDocStrip形式の
% ソースである。
% BXJSドキュメントクラス（以降では\Strong{「BXJSクラス」}と
% 略称する）は
% 奥村晴彦氏および日本語{\TeX}開発コミュニティによる
% \Strong{「{\pLaTeXe}新ドキュメントクラス」}（以降では
% \Strong{「JSクラス」}と呼ぶ）
% に改変を加えたものである。
%
% BXJSクラスに関する解説と原版著者による原版に対する解説を
% 区別するために、以下の規則を設ける。
% \begin{itemize}
% \item 見出しに“{\ZRX}”印が付いている節・小節・段落の記述は
% BXJSクラスのものである。
% \item \Strong{この形式の枠}の中の記述はBXJSクラスのものである。
% \end{itemize}
%
% インストール時のモジュール指定は以下のものが用意されている。
% \begin{quote}
%   \begin{tabular}{lll}
%     $\langle$\textsf{article}$\rangle$ & \texttt{bxjsarticle.cls}
%      & 短いレポート（章なし）のクラス \\
%     $\langle$\textsf{report}$\rangle$ & \texttt{bxjsreport.cls}
%      & 長いレポート（章あり）のクラス \\
%     $\langle$\textsf{book}$\rangle$    & \texttt{bxjsbook.cls}
%      & 書籍用のクラス \\
%     $\langle$\textsf{slide}$\rangle$   & \texttt{bxjsslide.cls}
%      & スライド用のクラス \\
%     $\langle$\textsf{minimal}$\rangle$ & \texttt{bxjsja-minimal.def}
%      & minimal和文ドライバ \\
%     $\langle$\textsf{standard}$\rangle$ & \texttt{bxjsja-standard.def}
%      & standard和文ドライバ \\
%     $\langle$\textsf{modern}$\rangle$ & \texttt{bxjsja-modern.def}
%      & modern和文ドライバ（未公開）\\
%     $\langle$\textsf{pandoc}$\rangle$ & \texttt{bxjsja-pandoc.def}
%      & pandoc和文ドライバ \\
%     $\langle$\textsf{compat}$\rangle$ & \texttt{bxjscompat.sty}
%      & 古いやつをどうにかする補助パッケージ \\
%     $\langle$\textsf{cjkcat}$\rangle$ & \texttt{bxjscjkcat.sty}
%      & modernドライバ用の補助パッケージ \\
%     $\langle$\textsf{ancpandoc}$\rangle$ & \texttt{bxjspandoc.sty}
%      & Pandoc用の補助パッケージ \\
%   \end{tabular}
% \end{quote}
%
% \Note このソースには\texttt{jsclasses.dtx}との差分を抑制する
% ために“jspf”・“kiyou”・“minijs”のモジュール指定を残しているが、
% これらの指定が行われることは想定していない。
% \end{ZRnote}
%
% これは\LaTeX3 Projectの \texttt{classes.dtx} と
% 株式会社アスキーの \texttt{jclasses.dtx} に基づいて
% もともと奥村晴彦により作成されたものです。
% 現在は日本語\TeX 開発コミュニティによりGitHubで管理されています。
% \begin{quote}
% |https://github.com/texjporg/jsclasses|
% \end{quote}
%
% [2002-12-19] いろいろなものに収録していただく際にライセンスを明確にする
% 必要が生じてきました。アスキーのものが最近はmodified BSDライセンスになっ
% ていますので，私のものもそれに準じてmodified BSDとすることにします。
%
% [2016-07-13] 日本語\TeX 開発コミュニティによる管理に移行しました。
%
% [2009-02-22] 田中琢爾氏によるup\LaTeX 対応パッチを取り込みました。
%
% ここでは次のドキュメントクラス（スタイルファイル）を作ります。
%
% [2017-02-13] forum:2121の議論を機に，jsreportクラスを新設しました。
% 従来のjsbookの |report| オプションと比べると，|abstract| 環境の使い方
% および挙動がアスキーのjreportに近づきました。
%
% \begin{quote}
%   \begin{tabular}{lll}
%     $\langle$\textsf{article}$\rangle$ & \texttt{jsarticle.cls}  & 論文・レポート用 \\
%     $\langle$\textsf{book}$\rangle$    & \texttt{jsbook.cls}     & 書籍用 \\
%     $\langle$\textsf{report}$\rangle$  & \texttt{jsreport.cls}   & レポート用 \\
%     $\langle$\textsf{jspf}$\rangle$    & \texttt{jspf.cls}       & 某学会誌用 \\
%     $\langle$\textsf{kiyou}$\rangle$   & \texttt{kiyou.cls}      & 某紀要用
%   \end{tabular}
% \end{quote}
%
% \iffalse
%
% \LaTeXe あるいは\pLaTeXe 標準のドキュメントクラスとの違いを説明してお
% きます。
%
% \paragraph{JISフォントメトリックの使用}
%
% ここでは和文TFM（\TeX フォントメトリック）として東京書籍印刷の小林肇さ
% んの作られたJISフォントメトリック \texttt{jis.tfm}，\texttt{jisg.tfm}
% を標準で使います。従来のフォントメトリック \texttt{min10.tfm}，
% \texttt{goth10.tfm} の類を使うには
% \begin{quote}
%   |\documentclass[mingoth]{jsarticle}|
% \end{quote}
% のように \texttt{mingoth} オプションを付けます。
%
% \paragraph{サイズオプションの扱いが違う}
%
% 標準のドキュメントクラスでは本文のポイント数を指定するオプションがあり
% ましたが，ポイント数は10，11，12しかなく，それぞれ別のクラスオプション
% ファイルを読み込むようになっていました。しかも，標準の10ポイント以外で
% は多少フォントのバランスが崩れることがあり，あまり便利ではありませんで
% した。ここでは文字サイズを増すとページを小さくし，\TeX の |\mag| プリ
% ミティブで全体的に拡大するという手を使って，9ポイントや21，25，30，36，
% 43ポイント，12Q，14Qの指定を可能にしています。
% \fi
%
% \StopEventually{}
%
% 以下では実際のコードに即して説明します。
%
% \texttt{minijs}は，\texttt{jsclasses}に似た設定を行うパッケージです。
%
%    \begin{macrocode}
%<*minijs>
%% if jsclasses loaded, abort loading this package
\ifx\@jsc@uplatextrue\@undefined\else
  \PackageInfo{minijs}{jsclasses does not need minijs, exiting}
  \expandafter\endinput
\fi
%% "fake" jsarticle
\expandafter\def\csname ver@jsarticle.cls\endcsname{}
%</minijs>
%    \end{macrocode}
%
% \begin{macro}{\bxjs@clsname}
%
% 文書クラスの名前です。エラーメッセージ表示などで使われます。
%
%    \begin{macrocode}
%<*class>
%% このファイルは日本語文字を含みます.
%<article>\def\bxjs@clsname{bxjsarticle}
%<book>\def\bxjs@clsname{bxjsbook}
%<report>\def\bxjs@clsname{bxjsreport}
%<slide>\def\bxjs@clsname{bxjsslide}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifjsc@needsp@tch}
%
% [2016-08-22] 従来\texttt{jsclasses}では，\pLaTeX や\LaTeX の
% 不都合な点に対して，クラスファイル内で独自に対策を施していま
% した。しかし，2016年以降，コミュニティ版\pLaTeX が次第に対策
% コードをカーネル内に取り込むようになりました。そこで，新しい
% \pLaTeX カーネルと衝突しないように，日付が古い場合だけパッチ
% をあてる場合があります。この処理に使用するフラグを定義します。
%
%    \begin{macrocode}
%</class>
%<*class|minijs>
\newif\ifjsc@needsp@tch
\jsc@needsp@tchfalse
%</class|minijs>
%<*class>
%    \end{macrocode}
% \end{macro}
%
% \paragraph{環境検査 \ZRX}
% \mbox{}
%
% \begin{macro}{\jsDocClass}
% 〔トークン〕
% 文書クラスの種別。
% 以下の定値トークンの何れかと同値\Means
% |\jsArticle|＝bxjsarticle、
% |\jsBook|＝bxjsbook、
% |\jsReport|＝bxjsreport、
% |\jsSlide|＝bxjsslide。
%    \begin{macrocode}
\let\jsArticle=a
\let\jsBook=b
\let\jsReport=r
\let\jsSlide=s
%<article>\let\jsDocClass\jsArticle
%<book>\let\jsDocClass\jsBook
%<report>\let\jsDocClass\jsReport
%<slide>\let\jsDocClass\jsSlide
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@test@engine}
% |\bxjs@test@engine\制御綴{|\Meta{コード}|}|\Means
% |\制御綴| の意味が同名のプリミティブである場合にのみ
% \Meta{コード}を実行する。
%    \begin{macrocode}
\def\bxjs@test@engine#1#2{%
  \edef\bxjs@tmpa{\string#1}%
  \edef\bxjs@tmpb{\meaning#1}%
  \ifx\bxjs@tmpa\bxjs@tmpb #2\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jsEngine}
% 〔暗黙文字トークン〕
% エンジン（{\TeX}処理系）の種別\Means
% |j|＝{\pTeX}系、
% |x|＝{\XeTeX}、
% |p|＝{\pdfTeX}、
% |l|＝{\LuaTeX}、
% |J|＝NTT {\JTeX}、
% |O|＝Omega系、
% |n|＝以上の何れでもない。
% \Note {\pdfTeX}と{\LuaTeX}についてはDVIモードの場合も含む。
%    \begin{macrocode}
\let\jsEngine=n
\bxjs@test@engine\kanjiskip{\let\jsEngine=j}
\bxjs@test@engine\jintercharskip{\let\jsEngine=J}
\bxjs@test@engine\Omegaversion{\let\jsEngine=O}
\bxjs@test@engine\XeTeXversion{\let\jsEngine=x}
\bxjs@test@engine\pdftexversion{\let\jsEngine=p}
\bxjs@test@engine\luatexversion{\let\jsEngine=l}
%    \end{macrocode}
% \end{macro}
%
% 現状での処理系バージョン要件は以下の通りである。
% \begin{itemize}
% \item \XeTeX\Means 0.997版（2007年）以上
% \end{itemize}
%
% \TODO[3.0] 以下で3.0版でのバージョン要件の予定について述べておく。
%
% 3.0版での\Strong{クラス本体の}処理系バージョン要件は以下の通りである。
% \begin{itemize}
% \item \TeX\Means    3.0版[1990/03]以上
% \item \pTeX\Means   2.0版[1995/03]以上
% \item \upTeX\Means  0.10版[2007/07]以上
% \item \pdfTeX\Means 1.40版[2007/01]以上
% \item \LuaTeX\Means 0.60版[2010/04]以上
% \item \XeTeX\Means  0.9994版[2009/06]以上
% \end{itemize}
% \Note OmegaとNTT {\JTeX}は“公式にはサポート外”の扱い
% （動作は何も保証されない）
% であるが、クラス本体では処理系の種類は敢えて検査しないことにする。
% \Note クラス本体での要件は敢えて緩くしている。
% 標準和文ドライバ（minimalも含む）についてまた別に要件を定めるので、
% 実質的にはそちらの要件を満たすことが求められる。
%
% {\TeX}処理系のバージョンがサポート対象であるかを検査する。
%    \begin{macrocode}
\@tempswatrue
\if x\jsEngine
  \ifdim\the\XeTeXversion\XeTeXrevision\p@<0.997\p@
    \@tempswafalse \fi
\fi
%    \end{macrocode}
% 非サポートのバージョン場合は強制終了させる。
%    \begin{macrocode}
\if@tempswa \expandafter\@gobble
\else
  \ClassError\bxjs@clsname
   {The engine in use is all too old}
   {It's a fatal error. I'll quit right now.}
  \expandafter\@firstofone
\fi{\endinput\@@end}
%    \end{macrocode}
%
% 万が一「2.09互換モード」になっていた場合は、
% これ以上進むと危険なので強制終了させる。
%    \begin{macrocode}
\if@compatibility
  \ClassError\bxjs@clsname
   {Something went chaotic!\MessageBreak
    (How come '\string\documentstyle' is there?)\MessageBreak
    I cannot go a single step further...}
   {If the chant of '\string\documentstyle' was just a blunder of yours,\MessageBreak
    then there'll still be hope....}
  \expandafter\@firstofone
\else \expandafter\@gobble
\fi{\typeout{Farewell!}\endinput\@@end}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@if@format@at@least}
% |\bxjs@if@format@at@least{|\Meta{日付}|}{|\Meta
% {真}|}{|\Meta{偽}|}|\Means
% {\LaTeX}カーネルの版が指定の日付以降であるか。
%    \begin{macrocode}
\def\bxjs@if@format@at@least{\@ifl@t@r\fmtversion}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@if@package@at@least}
% |\bxjs@if@package@at@least{|\Meta{名前}|}{|\Meta{日付}|}{|\Meta
% {真}|}{|\Meta{偽}|}|\Means
% ぞの名前のパッケージの指定の日付以降の版が読み込まれているか。
% そもそも読み込まれていない場合は偽になる。
% \Note 2017/04/15版より前のカーネルの |\@ifpackagelater| は
% 非読込の場合に実行するとエラーになることに注意。
%    \begin{macrocode}
\bxjs@if@format@at@least{2017/04/15}{%
  \let\bxjs@if@package@at@least\@ifpackagelater
}{%else
  \def\bxjs@if@package@at@least#1#2{%
    \@ifpackageloaded{#1}{\@ifpackagelater{#1}{#2}}{\@secondoftwo}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifjsWithupTeX}
% 〔スイッチ〕
% エンジンが「内部漢字コードがUnicodeの{\upTeX}」であるか。
% \Note つまり、|\jsEngine|＝|j| である場合、このスイッチが真なら
% {\upLaTeX}、偽なら{\pLaTeX}である。
% 2023年6月に{\pLaTeX}の{\TeX}処理系が「{\epTeX}」から
% 「内部漢字コードが非Unicodeの{\eupTeX}」に変わったが、
% これによる影響はない。
%    \begin{macrocode}
\newif\ifjsWithupTeX
\ifx\ucs\@undefined\else \ifnum\ucs"3000="3000
  \jsWithupTeXtrue
\fi\fi
\let\if@jsc@uplatex\ifjsWithupTeX
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifjsWithpTeXng}
% 〔スイッチ〕
% エンジンが{\pTeX-ng}であるか。
%    \begin{macrocode}
\newif\ifjsWithpTeXng
\bxjs@test@engine\ngbanner{\jsWithpTeXngtrue}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifjsWitheTeX}
% 〔スイッチ〕
% エンジンが{\eTeX}拡張をもつか。
% \Note {\XeTeX}と{\LuaTeX}は{\eTeX}拡張をもつ版のみがあり、
% NTT {\JTeX}はもたない版のみがある。
% その他のエンジンは両方の版がある。
%    \begin{macrocode}
\newif\ifjsWitheTeX
\bxjs@test@engine\eTeXversion{\jsWitheTeXtrue}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifjsInPdfMode}
% 〔スイッチ〕
% {\pdfTeX}・{\LuaTeX}がPDFモードで動作しているか。
%    \begin{macrocode}
\newif\ifjsInPdfMode
\@nameuse{jsInPdfMode\ifnum0%
  \ifx\pdfoutput\@undefined\else\the\pdfoutput\fi
  \ifx\outputmode\@undefined\else\the\outputmode\fi
  >0 true\else false\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@explIII}
% 〔スイッチ〕
% expl3がカーネルに組み込まれているか。
% \Note 2020/02/02版以降のカーネルには組み込まれている。
%    \begin{macrocode}
\newif\ifbxjs@explIII
\bxjs@if@format@at@least{2020/02/02}{\bxjs@explIIItrue}{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@brace@safe}
% 〔スイッチ〕
% オプション中の波括弧の使用にカーネルが対応しているか。
% \Note 正確に言うと、2021/06/01版以降のカーネルでは
% 「未使用オプション判定」
% の処理で |=| 以降のトークン列
% （key-valueのvalueの部分）
% を無視するので、この部分には波括弧を含めることができる。
% \Note |\@removeelement| と |\in@| の実装は変更されておらず、
% これらのマクロの第1引数には波括弧を含むトークン列を指定できない。
%    \begin{macrocode}
\newif\ifbxjs@brace@safe
\bxjs@if@format@at@least{2021/06/01}{\bxjs@brace@safetrue}{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@TUenc}
% 〔スイッチ〕
% {\LaTeX}の既定のフォントエンコーディングがTUであるか。
% \Note 2017/01/01以降の{\LaTeX}カーネルにおいて
% 「Unicodeを表す{\LaTeX}公式のフォントエンコーディング」
% である“TU”が導入され、
% これ以降の{\LaTeX}を{\XeTeX}または{\LuaTeX}で動かしている場合は、
% 既定のエンコーディングがTUになる。
% それ以外の場合は、既定のエンコーディングはOT1である。
%    \begin{macrocode}
\newif\ifbxjs@TUenc
\def\bxjs@tmpa{TU}\edef\bxjs@tmpb{\f@encoding}
\ifx\bxjs@tmpa\bxjs@tmpb
  \bxjs@TUenctrue
\fi
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@old@hook@system}
% 〔スイッチ〕
% {\LaTeX}の新しいフック管理システムが\Strong{未導入}であるか。
% \Note カーネルの2020/10/01版で導入された。
%    \begin{macrocode}
\newif\ifbxjs@old@hook@system
\bxjs@if@format@at@least{2020/10/01}{}{\bxjs@old@hook@systemtrue}
%    \end{macrocode}
% \end{macro}
%
% \paragraph{依存パッケージ読込 \ZRX}
% \mbox{}
%
% 長さ値の指定で式を利用可能にするため |calc| を読み込む。
%    \begin{macrocode}
\RequirePackage{calc}
%    \end{macrocode}
% クラスオプションでkey-value形式を使用するため |keyval| を読み込む。
%    \begin{macrocode}
\RequirePackage{keyval}
%    \end{macrocode}
% PDFモードの判定を{\LaTeX}公式のパッケージに任せたいので、
% もし「|iftex| の |\ifpdf|」が利用できるならば、
% |jsInPdfMode| スイッチをその値に一致させる。
% \Note |iftex| で |\ifpdf| が利用できるのは1.0版[2019/10/24]から。
%    \begin{macrocode}
\IfFileExists{iftex.sty}{%
  \RequirePackage{iftex}
}{}
\begingroup\expandafter\endgroup
\expandafter\ifx\csname ifpdf\endcsname\@undefined\else
  \expandafter\let\csname ifjsInPdfMode\expandafter\endcsname
      \csname ifpdf\endcsname
\fi
%    \end{macrocode}
%
% クラスの本体ではこの他に以下のパッケージが読み込まれる。
% \begin{quote}
%   |geometry|
% \end{quote}
% また状況によっては以下のパッケージが読み込まれる可能性がある。
% \begin{quote}
%   |bxwareki|、|jslogo|、|plautopatch|、|type1cm|
% \end{quote}
% \Note 和文ドライバがさらにパッケージを読み込むこともある。
%
% \begin{macro}{\jsAtEndOfClass}
% このクラスの読込終了時に対するフック。
% （補助パッケージ中で用いられる。）
%    \begin{macrocode}
\def\jsAtEndOfClass{%
  \expandafter\g@addto@macro\csname\bxjs@clsname.cls-h@@k\endcsname}
%    \end{macrocode}
% \end{macro}
%
% 互換性のための補助パッケージを読み込む。
%    \begin{macrocode}
\IfFileExists{bxjscompat.sty}{%
  \RequirePackage{bxjscompat}%
}{}
%    \end{macrocode}
%
% \paragraph{BXJSクラス特有の設定 \ZRX}
% \mbox{}
%
% {\LuaTeX}の場合、本クラス用のLuaモジュールを用意する。
%    \begin{macrocode}
\ifx l\jsEngine
  \directlua{ bxjs = {} }
\fi
%    \end{macrocode}
%
% \begin{macro}{\bxjs@protected}
% {\eTeX}拡張が有効な場合にのみ |\protected|
% の効果をもつ。
%    \begin{macrocode}
\ifjsWitheTeX \let\bxjs@protected\protected
\else \let\bxjs@protected\@empty
\fi
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@robust@def}
% 無引数の頑強な命令を定義する。
%    \begin{macrocode}
\ifjsWitheTeX
  \def\bxjs@robust@def{\protected\def}
\else
  \def\bxjs@robust@def{\DeclareRobustCommand*}
\fi
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@CGHN}
% {\LaTeX}カーネルの2021/11/15版の改修で「要素の順が変わった」
% フック名について、“新仕様において正しい名前”を
% “使用中の{\LaTeX}において正しい名前”に変換する。
% 例えば、|\bxjs@CGHN{package/PKG/after}| は旧仕様の{\LaTeX}では
% “|package/after/PKG|”に展開される。
%    \begin{macrocode}
\bxjs@if@format@at@least{2021/11/15}{%
  \def\bxjs@CGHN#1{#1}%
}{%else
  \def\bxjs@CGHN#1{\bxjs@CGHN@a#1//}%
  \def\bxjs@CGHN@a#1/#2/#3//{#1/#3/#2}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@cond}
% |\bxjs@cond\ifXXX|……|\fi{|\Meta{真}|}{|\Meta{偽}|}|\par
% {\TeX}のif-文（|\ifXXX|……\Meta{真}|\else|\Meta{偽}|\fi|）を
% 末尾呼出形式に変換するためのマクロ。
%    \begin{macrocode}
\@gobbletwo\if\if \def\bxjs@cond#1\fi{%
  #1\expandafter\@firstoftwo
  \else\expandafter\@secondoftwo
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \TODO[2.9] |\bxjs@expanded| を定義する。
%
% \begin{macro}{\bxjs@cslet}
% |\bxjs@cslet{|\Meta{名前1}|}\制御綴|\Means
%    \begin{macrocode}
\def\bxjs@cslet#1{%
  \expandafter\let\csname#1\endcsname}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@csletcs}
% |\bxjs@csletcs{|\Meta{名前1}|}{|\Meta{名前2}|}|\Means
%    \begin{macrocode}
\def\bxjs@csletcs#1#2{%
  \expandafter\let\csname#1\expandafter\endcsname\csname#2\endcsname}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@catopt}
% |\bxjs@catopt{|\Meta{文字列1}|}{|\Meta{文字列2}|}|\Means
% 2つの文字列を |,| で繋いだ文字列。
% ただし少なくとも一方が空の場合は |,| を入れない。
% 完全展開可能。
%    \begin{macrocode}
\def\bxjs@catopt#1#2{%
  #1\if\relax#1\relax\else\if\relax#2\relax\else,\fi\fi#2}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@ifplus}
% |\@ifstar| の |+| 版。
%    \begin{macrocode}
\def\bxjs@ifplus#1{\@ifnextchar+{\@firstoftwo{#1}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@trim}
% |\bxjs@trim\CS| で、|\CS| の内容のトークン列を先頭と末尾の
% 空白トークン群を除去したものに置き換える。
%    \begin{macrocode}
\def\bxjs@trim#1{\expandafter\bxjs@trim@a#1\@nil#1}
\def\bxjs@trim@a{\futurelet\bxjs@tmpb\bxjs@trim@b}
\def\bxjs@trim@b{\bxjs@cond\ifx\bxjs@tmpb\@sptoken\fi
  {\bxjs@trim@c\bxjs@trim@a}{\bxjs@trim@d}}
\def\bxjs@trim@c#1 {#1}
\def\bxjs@trim@d#1\@nil{\bxjs@trim@e#1\@nil: \@nil\@nnil}
\def\bxjs@trim@e#1 \@nil#2\@nnil{\bxjs@cond\ifx\@nnil#2\@nnil\fi
  {\bxjs@trim@f#1\@nnil}{\bxjs@trim@e#1\@nil: \@nil\@nnil}}
\def\bxjs@trim@f#1\@nil#2\@nnil#3{\def#3{#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@set@array@from@clist}
% |\bxjs@set@array@from@clist{|\Meta{配列名接頭辞}|}{|%
% \Meta{コンマ区切りリスト}|}|\Means
% コンマ区切りの値のリストから擬似配列を生成する。
% \Note 各要素について、先頭・末尾の空白トークン群は除去される。
%    \begin{macrocode}
\def\bxjs@set@array@from@clist#1#2{%
  \@tempcnta\z@
  \@for\bxjs@tmpa:=\@empty#2\do{%
     \bxjs@trim\bxjs@tmpa \bxjs@cslet{#1/\the\@tempcnta}\bxjs@tmpa
     \advance\@tempcnta\@ne}
  \bxjs@cslet{#1/\the\@tempcnta}\relax}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@gset@tempcnta}
% |calc| の整数式を用いて |\@tempcnta| の値を設定する。
%    \begin{macrocode}
\let\c@bxjs@tempcnta\@tempcnta
\def\bxjs@gset@tempcnta{\setcounter{bxjs@tempcnta}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@advance@qc}
% |\bxjs@advance@qc\CS{|\Meta{値}|}|\Means
% 擬似整数レジスタに値を加算する。
%    \begin{macrocode}
\def\bxjs@advance@qc#1#2{%
  \begingroup
    \@tempcnta=#1\relax \advance\@tempcnta by#2\relax
    \global\chardef\bxjs@g@tmpa\@tempcnta
  \endgroup \let#1\bxjs@g@tmpa}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@new@count}
% \begin{macro}{\bxjs@advance@count}
% {\eTeX}拡張が有効なら通常の整数レジスタ、
% 無効なら擬似整数レジスタを用いる。
%    \begin{macrocode}
\ifjsWitheTeX
  \let\bxjs@new@count\newcount
  \def\bxjs@advance@count#1#2{\advance#1by#2\relax}
\else
  \def\bxjs@new@count#1{\chardef#1\z@}
  \let\bxjs@advance@count\bxjs@advance@qc
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\jsSetQHLength}
% |\jsSetQHLength\CS{|\Meta{長さ式}|}|\Means
% |\setlength| の変種で、通常の |calc| の長さ式の代わりに、
% 「|Q|/|H|/|trueQ|/|trueH|/|zw|/|zh| の単位付きの実数」
% が記述できる（この場合は式は使えない）。
%    \begin{macrocode}
\def\jsSetQHLength#1#2{%
  \begingroup
    \bxjs@parse@qh{#2}%
    \ifx\bxjs@tmpb\relax
      \setlength\@tempdima{#2}%
      \xdef\bxjs@g@tmpa{\the\@tempdima}%
    \else \global\let\bxjs@g@tmpa\bxjs@tmpb
    \fi
  \endgroup
  #1=\bxjs@g@tmpa\relax}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@parse@qh}
% |#1| が |Q|/|H|/|trueQ|/|trueH|/|zw|/|zh| で終わる場合、
% 単位用の寸法値マクロ |\bxjs@unit@XXX| が定義済なら、
% |\bxjs@tmpb| に |#1| に等しい寸法の表現を返し、
% そうでないならエラーを出す。
% それ以外では、|\bxjs@tmpb| は |\relax| になる。
% \Note {(u)\pLaTeX}の場合はこれらの和文単位はエンジンでサポートされる。
% しかし和文フォントの設定が完了するまでは |zw|/|zh| の値は正しくない。
%    \begin{macrocode}
\if j\jsEngine \def\bxjs@parse@qh@units{zw,zh}
\else \def\bxjs@parse@qh@units{trueQ,trueH,Q,H,zw,zh}
\fi
\def\bxjs@parse@qh#1{%
  \let\bxjs@tmpb\relax
  \@for\bxjs@tmpa:=\bxjs@parse@qh@units\do{%
    \ifx\bxjs@tmpb\relax
      \edef\bxjs@next{{\bxjs@tmpa}{#1}}%
      \expandafter\bxjs@parse@qh@a\csname bxjs@unit@\bxjs@tmpa\expandafter
          \endcsname\bxjs@next
    \fi}}
\def\bxjs@parse@qh@a#1#2#3{%
  \def\bxjs@next##1#2\@nil##2\@nnil{\bxjs@parse@qh@b{##1}{##2}#1}%
  \bxjs@next#3\@nil#2\@nil\@nnil}
\def\bxjs@parse@qh@b#1#2#3{%
  \ifx\@nnil#2\@nnil\else
    \ifx#3\relax
      \ClassError\bxjs@clsname
       {You cannot use '\bxjs@tmpa' here}{\@ehc}%
      \def\bxjs@tmpb{0pt}%
    \else
      \@tempdimb#3\relax \@tempdimb#1\@tempdimb
      \edef\bxjs@tmpb{\the\@tempdimb}%
    \fi
  \fi}
%    \end{macrocode}
% 今の段階では |Q|/|H| だけが使用可能。
%    \begin{macrocode}
  \def\bxjs@unit@Q{0.25mm}\let\bxjs@unit@H\bxjs@unit@Q
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@after@preamble}
% 〔スイッチ〕
% 文書本体が開始しているか。
%    \begin{macrocode}
\newif\ifbxjs@after@preamble
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@begin@document@hook}
% BXJSクラス用の文書本体開始時フック。
%    \begin{macrocode}
\@onlypreamble\bxjs@begin@document@hook
\def\bxjs@begin@document@hook{\bxjs@after@preambletrue}
\AtBeginDocument{\bxjs@begin@document@hook}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@post@option@hook}
% |\ProcessOptions| 直後に実行されるフック。
%    \begin{macrocode}
\@onlypreamble\bxjs@post@option@hook
\let\bxjs@post@option@hook\@empty
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@pre@jadriver@hook}
% 和文ドライバ読込直前に実行されるフック。
%    \begin{macrocode}
\@onlypreamble\bxjs@pre@jadriver@hook
\let\bxjs@pre@jadriver@hook\@empty
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@endpreamble@hook}
% BXJSクラス用の |\AtEndPreamble| フック。
% \Note |\AtEndPreamble| が利用できない場合は無効になる。
%    \begin{macrocode}
\@onlypreamble\bxjs@endpreamble@hook
\let\bxjs@endpreamble@hook\@empty
\AtEndOfClass{%
  \ifx\AtEndPreamble\@undefined\else
    \AtEndPreamble{\bxjs@endpreamble@hook}%
  \fi}
%    \end{macrocode}
% \end{macro}
%
% 一時的な手続き用の制御綴。
%    \begin{macrocode}
\@onlypreamble\bxjs@tmpdo
\@onlypreamble\bxjs@tmpdo@a
\@onlypreamble\bxjs@tmpdo@b
\@onlypreamble\bxjs@tmpdo@c
\@onlypreamble\bxjs@tmpdo@d
%    \end{macrocode}
%
% \begin{macro}{\jsInhibitGlue}
% |\inhibitglue| が定義されていればそれを
% 実行し、未定義ならば何もしない。
%    \begin{macrocode}
\bxjs@robust@def\jsInhibitGlue{%
  \ifx\inhibitglue\@undefined\else \inhibitglue \fi}
%    \end{macrocode}
% \end{macro}	
%
% \section{オプション}
%
% これらのクラスは |\documentclass{jsarticle}|
% あるいは |\documentclass[オプション]{jsarticle}|
% のように呼び出します。
%
% まず，オプションに関連するいくつかのコマンドやスイッチ（論理変数）を定
% 義します。
%
% \begin{macro}{\if@restonecol}
%
% 段組のときに真になる論理変数です。
%
%    \begin{macrocode}
\newif\if@restonecol
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\if@titlepage}
%
% これを真にすると表題，概要を独立したページに出力します。
%
%    \begin{macrocode}
\newif\if@titlepage
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\if@openright}
%
% |\chapter|，|\part| を右ページ起こしにするかどうかです。
% 横組の書籍では真が標準で，要するに片起こし，奇数ページ起こしになります。
%
%    \begin{macrocode}
%<book|report>\newif\if@openright
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\if@openleft}
%
% [2017-02-24] |\chapter|，|\part| を左ページ起こしにするかどうかです。
%
%    \begin{macrocode}
%<book|report>\newif\if@openleft
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\if@mainmatter}
%
% 真なら本文，偽なら前付け・後付けです。
% 偽なら |\chapter| で章番号が出ません。
%
% \begin{ZRnote}
% BXJSではreport系でも定義されることに注意。
% \end{ZRnote}
%    \begin{macrocode}
%<book|report>\newif\if@mainmatter \@mainmattertrue
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\if@enablejfam}
%
% 和文フォントを数式フォントとして登録するかどうかを示すスイッチです。
%
% \begin{ZRnote}
% JSクラスと異なり、初期値は偽とする。
% \end{ZRnote}
%    \begin{macrocode}
\newif\if@enablejfam \@enablejfamfalse
%    \end{macrocode}
% \end{macro}
%
% 以下で各オプションを宣言します。
%
% \paragraph{用紙サイズ}
%
% JISやISOのA0判は面積 $1\,\mathrm{m}^2$，縦横比 $1:\sqrt{2}$
% の長方形の辺の長さを mm 単位に切り捨てたものです。
% これを基準として順に半截しては mm 単位に切り捨てたものがA1，A2，…です。
%
% B判はJISとISOで定義が異なります。
% JISではB0判の面積が $1.5\,\mathrm{m}^2$ ですが，
% ISOではB1判の辺の長さがA0判とA1判の辺の長さの幾何平均です。
% したがってISOのB0判は $1000\,\mathrm{mm} \times 1414\,\mathrm{mm}$ です。
% このため，\LaTeXe の \texttt{b5paper}
% は $250\,\mathrm{mm} \times 176\,\mathrm{mm}$ ですが，
% \pLaTeXe の \texttt{b5paper}
% は $257\,\mathrm{mm} \times 182\,\mathrm{mm}$ になっています。
% ここでは\pLaTeXe にならってJISに従いました。
%
% デフォルトは \texttt{a4paper} です。
%
% \texttt{b5var}（B5変形，182mm×230mm），
% \texttt{a4var}（A4変形，210mm×283mm）を追加しました。
%
% \begin{ZRnote}
% BXJSクラスではページレイアウト設定に |geometry| パッケージを用いる。
% 用紙サイズ設定は |geometry| に渡すオプションの指定と扱われる。
%    \begin{macrocode}
\@onlypreamble\bxjs@setpaper
\def\bxjs@setpaper#1{\def\bxjs@param@paper{#1}}
\newif\ifbxjs@iso@bsize
\DeclareOption{iso-bsize}{\bxjs@iso@bsizetrue}
\@onlypreamble\bxjs@setpaper@bsize
\def\bxjs@setpaper@bsize#1{\edef\bxjs@param@paper{%
  b#1\ifbxjs@iso@bsize paper\else j\fi}}
\DeclareOption{a3paper}{\bxjs@setpaper{a3paper}}
\DeclareOption{a4paper}{\bxjs@setpaper{a4paper}}
\DeclareOption{a5paper}{\bxjs@setpaper{a5paper}}
\DeclareOption{a6paper}{\bxjs@setpaper{a6paper}}
\DeclareOption{b4paper}{\bxjs@setpaper@bsize{4}}
\DeclareOption{b5paper}{\bxjs@setpaper@bsize{5}}
\DeclareOption{b6paper}{\bxjs@setpaper@bsize{6}}
\DeclareOption{a4j}{\bxjs@setpaper{a4paper}}
\DeclareOption{a5j}{\bxjs@setpaper{a5paper}}
\DeclareOption{b4j}{\bxjs@setpaper{b4j}}
\DeclareOption{b5j}{\bxjs@setpaper{b5j}}
\DeclareOption{a4var}{\bxjs@setpaper{{210truemm}{283truemm}}}
\DeclareOption{b5var}{\bxjs@setpaper{{182truemm}{230truemm}}}
\DeclareOption{letterpaper}{\bxjs@setpaper{letterpaper}}
\DeclareOption{legalpaper}{\bxjs@setpaper{legalpaper}}
\DeclareOption{executivepaper}{\bxjs@setpaper{executivepaper}}
%    \end{macrocode}
% |geometry| の用紙サイズのオプション名を全てサポートする。
%    \begin{macrocode}
\@for\bxjs@tmpa:={%
  a0,a1,a2,c0,c1,c2,c3,c4,c5,c6,ansia,ansib,ansic,ansid,ansie%
}\do{\edef\bxjs@next{%
  \noexpand\DeclareOption{\bxjs@tmpa paper}%
    {\noexpand\bxjs@setpaper{\bxjs@tmpa paper}}%
}\bxjs@next}
\DeclareOption{screen}{\bxjs@setpaper{screen}}
%    \end{macrocode}
% ただし |b?paper| は |iso-bsize| の指定に従いISOとJISの
% 適切な方のB列を選択する。
%    \begin{macrocode}
\@for\bxjs@tmpa:={0,1,2,3}\do{\edef\bxjs@next{%
  \noexpand\DeclareOption{b\bxjs@tmpa paper}%
    {\noexpand\bxjs@setpaper@bsize{\bxjs@tmpa}}%
}\bxjs@next}
%    \end{macrocode}
% Pandocで用紙サイズを指定した場合は出力{\LaTeX}ソースにおいて
% 「後ろに |paper| を付けた名前のオプション」が指定される。
% これに対処するため、後ろに |paper| をつけた形を用意する。
% さらに、「Pandocで用紙サイズを |custom| とすると実質的に何も設定しない」
% ようにするため |custompaper| というオプションを用意する。
%    \begin{macrocode}
\DeclareOption{a4varpaper}{\bxjs@setpaper{{210truemm}{283truemm}}}
\DeclareOption{b5varpaper}{\bxjs@setpaper{{182truemm}{230truemm}}}
\DeclareOption{screenpaper}{\bxjs@setpaper{screen}}
\DeclareOption{custompaper}{}
%    \end{macrocode}
% \end{ZRnote}
%
% \paragraph{横置き}
%
% 用紙の縦と横の長さを入れ換えます。
%
%    \begin{macrocode}
\newif\if@landscape
\@landscapefalse
\DeclareOption{landscape}{\@landscapetrue}
%    \end{macrocode}
%
% \paragraph{slide}
%
% オプション \texttt{slide} を新設しました。
%
% [2016-10-08] \texttt{slide} オプションは article 以外では使い物にならなかったので，
% 簡単のため article のみで使えるオプションとしました。
%
%    \begin{macrocode}
\newif\if@slide
%    \end{macrocode}
%
% \begin{ZRnote}
% BXJSではスライド用のクラス |bxjsslide| を用意しているので、
% 本来はこのスイッチは不要なはずである。
% しかし、JSクラスの一部のコードをそのまま使うために保持している。
% \Note この |\if@slide| という制御綴は、ユニークでないにも関わらず、
% 衝突した場合に正常動作が保たれない、という問題を抱えている。
%    \begin{macrocode}
%<!slide>\@slidefalse
%<slide>\@slidetrue
%    \end{macrocode}
% \end{ZRnote}
%
% \paragraph{サイズオプション}
%
% 10pt，11pt，12pt のほかに，8pt，9pt，14pt，17pt，21pt，25pt，30pt，36pt，43pt を追加しました。
% これは等比数列になるように選んだものです（従来の 20pt も残しました）。
% |\@ptsize| の定義が変だったのでご迷惑をおかけしましたが，
% 標準的なドキュメントクラスと同様にポイント数から10を引いたものに直しました。
%
% [2003-03-22] 14Qオプションを追加しました。
%
% [2003-04-18] 12Qオプションを追加しました。
%
% [2016-07-08] |\mag| を使わずに各種寸法をスケールさせるためのオプション \texttt{nomag} を新設しました。
% \texttt{usemag} オプションの指定で従来通りの動作となります。デフォルトは \texttt{usemag} です。
%
% [2016-07-24] オプティカルサイズを調整するためにNFSSへパッチを当てるオプション \texttt{nomag*} を新設しました。
%
% \begin{ZRnote}
% |\@ptsize| は |10pt|, |11pt|, |12pt| が指定された時のみ
% JSクラスと同じ値とし、
% それ以外は |\jsUnusualPtSize|（= $-20$）にする。
%
%    \begin{macrocode}
\newcommand{\@ptsize}{0}
\def\bxjs@param@basefontsize{10pt}
\def\jsUnusualPtSize{-20}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@setbasefontsize}
% 基底フォントサイズを実際に変更する。
%    \begin{macrocode}
\def\bxjs@setbasefontsize#1{%
%    \end{macrocode}
% Q単位の長さ指定をサポートするため |\jsSetQHLength| を使う。
% \Note クラスオプションのトークン列の中に展開可能なトークンが
% ある場合、{\LaTeX}はクラスファイルの読込の前にそれを展開しようとする。
% このため、この位置で |\jQ| をサポートすることは
% 原理的に不可能である。
%    \begin{macrocode}
  \jsSetQHLength\@tempdima{#1}%
  \edef\bxjs@param@basefontsize{\the\@tempdima}%
  \ifdim\@tempdima=10pt         \long\def\@ptsize{0}%
  \else\ifdim\@tempdima=10.95pt \long\def\@ptsize{1}%
  \else\ifdim\@tempdima=12pt    \long\def\@ptsize{2}%
  \else \long\edef\@ptsize{\jsUnusualPtSize}\fi\fi\fi}
%    \end{macrocode}
%
% \TODO 恐らく |14pt| と |base=14.4pt| 等の関係も全く等価であるべき。
%    \begin{macrocode}
\def\bxjs@setjbasefontsize#1{%
  \setkeys{bxjs}{jbase=#1}}
%    \end{macrocode}
% \end{macro}
%
% |\ifjsc@mag| は「|\mag| を使うか」を表すスイッチ。
%
% |\ifjsc@mag@xreal| は「NFSSにパッチを当てるか」を表すスイッチ。
%    \begin{macrocode}
\newif\ifjsc@mag
\newif\ifjsc@mag@xreal
%\let\jsc@magscale\@undefined
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareOption{8pt}{\bxjs@setbasefontsize{8pt}}
\DeclareOption{9pt}{\bxjs@setbasefontsize{9pt}}
\DeclareOption{10pt}{\bxjs@setbasefontsize{10pt}}
\DeclareOption{11pt}{\bxjs@setbasefontsize{10.95pt}}
\DeclareOption{12pt}{\bxjs@setbasefontsize{12pt}}
\DeclareOption{14pt}{\bxjs@setbasefontsize{14.4pt}}
\DeclareOption{17pt}{\bxjs@setbasefontsize{17.28pt}}
\DeclareOption{20pt}{\bxjs@setbasefontsize{20pt}}
\DeclareOption{21pt}{\bxjs@setbasefontsize{20.74pt}}
\DeclareOption{25pt}{\bxjs@setbasefontsize{24.88pt}}
\DeclareOption{30pt}{\bxjs@setbasefontsize{29.86pt}}
\DeclareOption{36pt}{\bxjs@setbasefontsize{35.83pt}}
\DeclareOption{43pt}{\bxjs@setbasefontsize{43pt}}
\DeclareOption{12Q}{\bxjs@setjbasefontsize{3mm}}
\DeclareOption{14Q}{\bxjs@setjbasefontsize{3.5mm}}
\DeclareOption{10ptj}{\bxjs@setjbasefontsize{10pt}}
\DeclareOption{10.5ptj}{\bxjs@setjbasefontsize{10.5pt}}
\DeclareOption{11ptj}{\bxjs@setjbasefontsize{11pt}}
\DeclareOption{12ptj}{\bxjs@setjbasefontsize{12pt}}
%    \end{macrocode}
%
% JSクラス互換のmagstyle設定オプション。
%    \begin{macrocode}
\DeclareOption{usemag}{\let\bxjs@magstyle\bxjs@magstyle@@usemag}
\DeclareOption{nomag}{\let\bxjs@magstyle\bxjs@magstyle@@nomag}
\DeclareOption{nomag*}{\let\bxjs@magstyle\bxjs@magstyle@@xreal}
%    \end{macrocode}
% 
% \end{ZRnote}
%
% \paragraph{トンボオプション}
%
% トンボ（crop marks）を出力します。
% 実際の処理は\pLaTeXe 本体で行います（\texttt{plcore.dtx} 参照）。
% オプション \texttt{tombow} で日付付きのトンボ，
% オプション \texttt{tombo} で日付なしのトンボを出力します。
% これらはアスキー版のままです。
% カウンタ |\hour|，|\minute| はp\LaTeXe 本体で宣言されています。
%
% \begin{ZRnote}
% 取りあえず、{\pTeX}系の場合に限り、JSクラスのトンボ関連の
% コードをそのまま活かしておく。
% 正常に動作する保証はない。
% \end{ZRnote}
%    \begin{macrocode}
\if j\jsEngine
\hour\time \divide\hour by 60\relax
\@tempcnta\hour \multiply\@tempcnta 60\relax
\minute\time \advance\minute-\@tempcnta
\DeclareOption{tombow}{%
  \tombowtrue \tombowdatetrue
  \setlength{\@tombowwidth}{.1\p@}%
  \@bannertoken{%
     \jobname\space(\number\year-\two@digits\month-\two@digits\day
     \space\two@digits\hour:\two@digits\minute)}%
  \maketombowbox}
\DeclareOption{tombo}{%
  \tombowtrue \tombowdatefalse
  \setlength{\@tombowwidth}{.1\p@}%
  \maketombowbox}
\fi
%    \end{macrocode}
%
% \paragraph{面付け}
%
% オプション \texttt{mentuke} で幅ゼロのトンボを出力します。
% 面付けに便利です。これもアスキー版のままです。
%
%    \begin{macrocode}
\if j\jsEngine
\DeclareOption{mentuke}{%
  \tombowtrue \tombowdatefalse
  \setlength{\@tombowwidth}{\z@}%
  \maketombowbox}
\fi
%    \end{macrocode}
%
% \paragraph{両面，片面オプション}
%
% \texttt{twoside} で奇数ページ・偶数ページのレイアウトが変わります。
%
% [2003-04-29] \texttt{vartwoside} でどちらのページも傍注が右側になります。
%
%    \begin{macrocode}
\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse}
\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue}
\DeclareOption{vartwoside}{\@twosidetrue \@mparswitchfalse}
%    \end{macrocode}
%
% \paragraph{二段組}
%
% \texttt{twocolumn} で二段組になります。
%
%    \begin{macrocode}
\DeclareOption{onecolumn}{\@twocolumnfalse}
\DeclareOption{twocolumn}{\@twocolumntrue}
%    \end{macrocode}
%
% \paragraph{表題ページ}
%
% \texttt{titlepage} で表題・概要を独立したページに出力します。
%
%    \begin{macrocode}
\DeclareOption{titlepage}{\@titlepagetrue}
\DeclareOption{notitlepage}{\@titlepagefalse}
%    \end{macrocode}
%
% \paragraph{右左起こし}
%
% 書籍では章は通常は奇数ページ起こしになりますが，横組ではこれを
% \texttt{openright} と表すことにしてあります。
% \texttt{openany} で偶数ページからでも始まるようになります。
%
% [2017-02-24] \texttt{openright} は横組では奇数ページ起こし，縦組では
% 偶数ページ起こしを表します。ややこしいですが，これは\LaTeX の標準クラスが
% 西欧の横組事情しか考慮せずに，奇数ページ起こしと右起こしを一緒にしてしまっ
% たせいです。縦組での奇数ページ起こしと横組での偶数ページ起こしも表現したい
% ので，jsclassesでは新たに \texttt{openleft} も追加しました。
%
%    \begin{macrocode}
%<book|report>\DeclareOption{openright}{\@openrighttrue\@openleftfalse}
%<book|report>\DeclareOption{openleft}{\@openlefttrue\@openrightfalse}
%<book|report>\DeclareOption{openany}{\@openrightfalse\@openleftfalse}
%    \end{macrocode}
%
% \paragraph{eqnarray環境と数式の位置}
%
% 森本さんのご教示にしたがって前に移動しました。
%
% \begin{environment}{eqnarray}
%
%    \LaTeX の |eqnarray| 環境では |&| でできるアキが大きすぎる
%    ようですので，少し小さくします。
%    また，中央の要素も |\displaystyle| にします。
%
% [2022-09-13] \LaTeXe~2021-11-15 (ltmath.dtx 2021/10/14 v1.2j)で
% |\@currentcounter|が追加されましたので，追随します。
%
% [2025-05-26] \LaTeXe~2025-06-01に追従し，最初の|$$|を|\dollardollar@begin|に
% 変更しました．|\providecommand|で|\dollardollar@begin|を定義しているので，
% 古い\LaTeXe カーネルでも問題ありません．
%
%    \begin{macrocode}
\providecommand\dollardollar@begin{$$}
\def\eqnarray{%
   \stepcounter{equation}%
   \def\@currentlabel{\p@equation\theequation}%
   \def\@currentcounter{equation}%
   \global\@eqnswtrue
   \m@th
   \global\@eqcnt\z@
   \tabskip\@centering
   \let\\\@eqncr
   \dollardollar@begin\everycr{}\halign to\displaywidth\bgroup
       \hskip\@centering$\displaystyle\tabskip\z@skip{##}$\@eqnsel
      &\global\@eqcnt\@ne \hfil$\displaystyle{{}##{}}$\hfil
      &\global\@eqcnt\tw@ $\displaystyle{##}$\hfil\tabskip\@centering
      &\global\@eqcnt\thr@@ \hb@xt@\z@\bgroup\hss##\egroup
         \tabskip\z@skip
      \cr}
%    \end{macrocode}
% \end{environment}
%
% \texttt{leqno} で数式番号が左側になります。
% \texttt{fleqn} で数式が本文左端から一定距離のところに出力されます。
% 森本さんにしたがって訂正しました。
%
% [2022-09-13] \LaTeXe~2021-11-15 (ltmath.dtx 2021/10/14 v1.2j)で
% |\@currentcounter|が追加されましたので，追随します。
%
%    \begin{macrocode}
\DeclareOption{leqno}{\input{leqno.clo}}
\DeclareOption{fleqn}{\input{fleqn.clo}%
% fleqn用のeqnarray環境の再定義
  \def\eqnarray{%
    \stepcounter{equation}%
    \def\@currentlabel{\p@equation\theequation}%
    \def\@currentcounter{equation}%
    \global\@eqnswtrue\m@th
    \global\@eqcnt\z@
    \tabskip\mathindent
    \let\\=\@eqncr
    \setlength\abovedisplayskip{\topsep}%
    \ifvmode
      \addtolength\abovedisplayskip{\partopsep}%
    \fi
    \addtolength\abovedisplayskip{\parskip}%
    \setlength\belowdisplayskip{\abovedisplayskip}%
    \setlength\belowdisplayshortskip{\abovedisplayskip}%
    \setlength\abovedisplayshortskip{\abovedisplayskip}%
    \dollardollar@begin\everycr{}\halign to\linewidth% $$
    \bgroup
      \hskip\@centering$\displaystyle\tabskip\z@skip{##}$\@eqnsel
      &\global\@eqcnt\@ne \hfil$\displaystyle{{}##{}}$\hfil
      &\global\@eqcnt\tw@
        $\displaystyle{##}$\hfil \tabskip\@centering
      &\global\@eqcnt\thr@@ \hb@xt@\z@\bgroup\hss##\egroup
    \tabskip\z@skip\cr
    }}
%    \end{macrocode}
%
% \paragraph{文献リスト}
%
% 文献リストをopen形式（著者名や書名の後に改行が入る）で出力します。
% これは使われることはないのでコメントアウトしてあります。
%
%    \begin{macrocode}
% \DeclareOption{openbib}{%
%   \AtEndOfPackage{%
%    \renewcommand\@openbib@code{%
%       \advance\leftmargin\bibindent
%       \itemindent -\bibindent
%       \listparindent \itemindent
%       \parsep \z@}%
%    \renewcommand\newblock{\par}}}
%    \end{macrocode}
%
% \paragraph{数式フォントとして和文フォントを登録しないオプション}
%
% 数式中では16通りのフォントしか使えません。
% AMSFontsや \texttt{mathptmx} パッケージを使って数式フォントを
% たくさん使うと ``Too many math alphabets \ldots'' というエラーが
% 起こってしまいます。\texttt{disablejfam} オプションを付ければ，
% 明朝・ゴシックを数式用フォントとして登録するのをやめますので，
% 数式用フォントが二つ節約できます。
% いずれにしても |\textmc| や |\mbox| や \texttt{amsmath}
% パッケージの |\text| を使えば数式中で和文フォントが使えますので，
% この新ドキュメントクラスでは標準で和文フォントを数式用に登録
% しないことにしていたのですが，従来のドキュメントクラスの仕様に
% 合わせることにしました。
%
% \begin{ZRnote}
% \begin{macro}{\bxjs@enablejfam}
% 〔暗黙文字トークン〕
% |enablejfam| オプションの状態：
%    \begin{macrocode}
%\let\bxjs@enablejfam\@undefined
%    \end{macrocode}
% \end{macro}
%
% |enablejfam| オプションの処理。
%    \begin{macrocode}
\def\bxjs@kv@enablejfam@true{\let\bxjs@enablejfam=t}
\def\bxjs@kv@enablejfam@false{\let\bxjs@enablejfam=f}
\def\bxjs@kv@enablejfam@default{\let\bxjs@enablejfam\@undefined}
\define@key{bxjs}{enablejfam}[true]{%
  \bxjs@set@keyval{enablejfam}{#1}{}}
%    \end{macrocode}
%
% JSクラスとの互換のため |disablejfam| オプションを定義する。
%    \begin{macrocode}
\DeclareOption{disablejfam}{\let\bxjs@enablejfam=f}
%    \end{macrocode}
%
% \Note 実際に何らかの設定を行うのは和文ドライバである。
% 和文ドライバとエンジンの組合せにより、|enablejfam| が |default| である
% 場合に「数式和文ファミリ」が有効と無効の選択は異なるし、またそもそも
% 有効と無効の一方しか選択できない場合もある。
%
% \end{ZRnote}
%
% \paragraph{ドラフト}
%
% \texttt{draft} でoverfull boxの起きた行末に5ptの罫線を引きます。
%
% [2016-07-13] |\ifdraft| を定義するのをやめました。
%
% \begin{ZRnote}
% \begin{macro}{\ifjsDraft}
% 〔スイッチ〕
% |draft| オプションが指定されているか。
% \Note JSクラスの |\ifdraft| が廃止されたので、
% BXJSクラスでも |\ifdraft| を2.0版で廃止した。
%    \begin{macrocode}
\newif\ifjsDraft
\DeclareOption{draft}{\jsDrafttrue \overfullrule=5pt }
\DeclareOption{final}{\jsDraftfalse \overfullrule=0pt }
%    \end{macrocode}
% \end{macro}
% \end{ZRnote}
%
% \paragraph{和文フォントメトリックの選択}
%
% このクラスファイルでは，和文TFMとして東京書籍印刷の小林肇さんの
% 作られたJISフォントメトリック（\texttt{jis}，\texttt{jisg}）
% を標準で使うことにしますが，
% 従来の \texttt{min10}，\texttt{goth10} などを使いたいときは
% \texttt{mingoth} というオプションを指定します。
% また，\texttt{winjis} オプションで \texttt{winjis} メトリック
% （OTFパッケージと同じpsitauさん作；ソースに書かれたWindowsの
% 機種依存文字がdvips, dvipdfmxなどで出力出来るようになる）が使えます。
%
% [2018-02-04] \texttt{winjis} オプションはコッソリ削除しました。
% 代替として，同等なものをパッケージ化(winjis.sty)して，
% GitHubにはコッソリ置いておきます。
%
% \begin{ZRnote}
% BXJSクラスではここは和文ドライバの管轄。
% \end{ZRnote}
%
% \paragraph{papersizeスペシャルの利用}
%
% dvipsやdvioutで用紙設定を自動化するには
% オプション \texttt{papersize} を与えます。
%
% \begin{ZRnote}
% BXJSクラスでは |geometry| パッケージがこの処理を行う。
%
% \begin{macro}{\ifbxjs@papersize}
% 〔スイッチ〕 papersizeスペシャルを出力するか。
% 既定で有効であるが、|nopapersize| オプションで無効にできる。
% \Note JSクラスでは |\ifpapersize| という制御綴だが、これは採用しない。
%    \begin{macrocode}
\newif\ifbxjs@papersize
\bxjs@papersizetrue
\DeclareOption{nopapersize}{\bxjs@papersizefalse}
\DeclareOption{papersize}{\bxjs@papersizetrue}
%    \end{macrocode}
% \end{macro}
% \end{ZRnote}
%
% \paragraph{英語化}
%
% オプション \texttt{english} を新設しました。
%
% \begin{ZRnote}
% \Note |\if@english| は非ユニークで衝突耐性がない。
% \end{ZRnote}
%
%    \begin{macrocode}
\newif\if@english
\@englishfalse
\DeclareOption{english}{\@englishtrue}
%    \end{macrocode}
%
% \paragraph{jsbookをjsreportもどきに}
%
% オプション \texttt{report} を新設しました。
%
% [2017-02-13] 従来は「jsreport相当」をjsbookの \texttt{report} オプションで提供して
% いましたが，新しくjsreportクラスも作りました。どちらでもお好きな方を使ってください。
%
% \begin{ZRnote}
% BXJSでは当初から |bxjsreport| クラスが用意されている。
% \end{ZRnote}
%
% \paragraph{\texttt{jslogo}パッケージの読み込み}
%
% \LaTeX 関連のロゴを再定義する\texttt{jslogo}パッケージを
% 読み込まないオプション\texttt{nojslogo}を新設しました。
% \texttt{jslogo}オプションの指定で従来どおりの動作となります。
% デフォルトは\texttt{jslogo}で，すなわちパッケージを読み込みます。
%
% \begin{ZRnote}
% BXJSクラスでは、|nojslogo| を既定とする。
% \end{ZRnote}
%    \begin{macrocode}
\newif\if@jslogo \@jslogofalse
\DeclareOption{jslogo}{\@jslogotrue}
\DeclareOption{nojslogo}{\@jslogofalse}
%    \end{macrocode}
%
% \paragraph{複合設定オプション \ZRX}
% \mbox{}
% \TODO[3.x] |\bxjs@invscale| を書く場所を決める。
% （JSクラスと同じにはできなそう。）
% \begin{macro}{\bxjs@invscale}
% |\bxjs@invscale| は{\TeX}における「長さのスケール」の逆関数を求めるもの。
% 例えば |\bxjs@invscale\dimX{1.3}| は |\dimX=1.3\dimX| の
% 逆の演算を行う。
% \Note 局所化の |\begingroup|～|\endgroup| について、
% 以前は |\group|～|\egroup| を使っていたが、これだと数式モード中では
% 空のサブ数式を生み出してしまうため修正した。
% \Note 元の長さが128\,pt以上の場合でも動作するように修正した。
%    \begin{macrocode}
\mathchardef\bxjs@isc@ll=128
\mathchardef\bxjs@isc@sl=259
\def\bxjs@isc@sl@h{65539 }
\def\bxjs@invscale#1#2{%
  \begingroup \@tempdima=#1\relax \@tempdimb#2\p@\relax
    \ifdim\@tempdima<\bxjs@isc@ll\p@
      \@tempcnta\@tempdima \multiply\@tempcnta\@cclvi
      \divide\@tempcnta\@tempdimb \multiply\@tempcnta\@cclvi
    \else
      \@tempcnta\@tempdima \divide\@tempcnta\@tempdimb
      \multiply\@tempcnta\p@ \let\bxjs@isc@sl\bxjs@isc@sl@h
    \fi
    \@tempcntb\p@ \divide\@tempcntb\@tempdimb
    \advance\@tempcnta-\@tempcntb \advance\@tempcnta-\tw@
    \@tempdimb\@tempcnta\@ne
    \advance\@tempcnta\@tempcntb \advance\@tempcnta\@tempcntb
    \advance\@tempcnta\bxjs@isc@sl \@tempdimc\@tempcnta\@ne
    \@whiledim\@tempdimb<\@tempdimc\do{%
      \@tempcntb\@tempdimb \advance\@tempcntb\@tempdimc
      \advance\@tempcntb\@ne \divide\@tempcntb\tw@
      \ifdim #2\@tempcntb>\@tempdima
        \advance\@tempcntb\m@ne \@tempdimc=\@tempcntb\@ne
      \else \@tempdimb=\@tempcntb\@ne \fi}%
    \xdef\bxjs@gtmpa{\the\@tempdimb}%
  \endgroup #1=\bxjs@gtmpa\relax}
%    \end{macrocode}
% \end{macro}
%
% \begin{ZRnote}
% 複合設定オプションとは、
% 「エンジンやドライバや和文ドライバの設定を含む、
% 複数の設定を一度に行うオプション」
% のことである。
% ある特定の設定を短く書く必要性が高いと判断される場合に
% 用意される。
%
% |pandoc| オプションは、Pandocで{\LaTeX}用の既定テンプレートを
% 用いて他形式から{\LaTeX}（およびPDF）形式に変換する用途に
% 最適化した設定を与える。
%    \begin{macrocode}
\DeclareOption{pandoc}{%
  \bxjs@apply@pandoc@opt}
\@onlypreamble\bxjs@apply@pandoc@opt
\def\bxjs@apply@pandoc@opt{%
%    \end{macrocode}
% 和文ドライバを |pandoc| に、エンジン指定を |autodetect-engine| に
% 変更する。
% \Note 実際の和文ドライバ・エンジン設定より優先される。
%    \begin{macrocode}
  \g@addto@macro\bxjs@post@option@hook{%
    \bxjs@oldfontcommandstrue
    \setkeys{bxjs}{ja=pandoc}%
    \let\bxjs@engine@given=*}%
%    \end{macrocode}
% ドライバオプションを |dvi=dvipdfmx| 相当に変更する。
% \Note これは実際のドライバ設定で上書きできる
% （オプション宣言順に注意）。
%    \begin{macrocode}
  \ifx\bxjs@driver@opt\@undefined
    \def\bxjs@driver@opt{dvipdfmx}%
    \bxjs@dvi@opttrue
  \fi
  \global\let\bxjs@apply@pandoc@opt\relax}
%    \end{macrocode}
%
% |pandoc+| オプションは、|pandoc| と同じ設定をした上で、
% さらに和文パラメタの先頭に |_plus| を追加する。
%    \begin{macrocode}
\DeclareOption{pandoc+}{%
  \g@addto@macro\bxjs@post@option@hook{%
    \edef\jsJaParam{\bxjs@catopt{_plus}\jsJaParam}}%
  \ExecuteOptions{pandoc}}
%    \end{macrocode}
% \end{ZRnote}
%
% \paragraph{エンジン・ドライバオプション \ZRX}
%
% \begin{macro}{\bxjs@engine@given}
% 〔暗黙文字トークン〕
% オプションで明示されたエンジンの種別。
%    \begin{macrocode}
%\let\bxjs@engine@given\@undefined
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@engine@opt}
% 明示されたエンジンのオプション名。
%    \begin{macrocode}
%\let\bxjs@engine@opt\@undefined
%    \end{macrocode}
% \end{macro}
%
% エンジン明示指定のオプションの処理。
% \Note 0.9pre版の暫定仕様と異なり、エンジン名は |...latex|
% に限定する。
% |xetex| や |pdftex| は一般的な{\LaTeX}の慣習に従って
% 「ドライバの指定」とみなすべきだから。
%
%    \begin{macrocode}
\DeclareOption{autodetect-engine}{%
  \let\bxjs@engine@given=*}
\DeclareOption{latex}{%
  \def\bxjs@engine@opt{latex}%
  \let\bxjs@engine@given=n}
\DeclareOption{platex}{%
  \def\bxjs@engine@opt{platex}%
  \let\bxjs@engine@given=j}
\DeclareOption{uplatex}{%
  \def\bxjs@engine@opt{uplatex}%
  \let\bxjs@engine@given=u}
\DeclareOption{xelatex}{%
  \def\bxjs@engine@opt{xelatex}%
  \let\bxjs@engine@given=x}
\DeclareOption{pdflatex}{%
  \def\bxjs@engine@opt{pdflatex}%
  \let\bxjs@engine@given=p}
\DeclareOption{lualatex}{%
  \def\bxjs@engine@opt{lualatex}%
  \let\bxjs@engine@given=l}
\DeclareOption{platex-ng}{%
  \def\bxjs@engine@opt{platex-ng}%
  \let\bxjs@engine@given=g}
\DeclareOption{platex-ng*}{%
  \def\bxjs@engine@opt{platex-ng*}%
  \let\bxjs@platexng@nodrv=t%
  \let\bxjs@engine@given=g}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@driver@given}
% 〔暗黙文字トークン〕
% オプションで明示されたドライバの種別。
%    \begin{macrocode}
%\let\bxjs@driver@given\@undefined
\let\bxjs@driver@@dvimode=0
\let\bxjs@driver@@dvipdfmx=1
\let\bxjs@driver@@pdfmode=2
\let\bxjs@driver@@xetex=3
\let\bxjs@driver@@dvips=4
\let\bxjs@driver@@none=5
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@driver@opt}
% 明示された「ドライバ指定」のオプション名。
%    \begin{macrocode}
%\let\bxjs@driver@opt\@undefined
%    \end{macrocode}
% \end{macro}
%
% \Note |class-nodvidriver| はBXJSクラスの仕様上は |nodvidriver| と完全に
% 等価であるが、「グローバルオプションに何があるか」の点で異なる。
%    \begin{macrocode}
\DeclareOption{dvips}{%
  \def\bxjs@driver@opt{dvips}%
  \let\bxjs@driver@given\bxjs@driver@@dvips}
\DeclareOption{dviout}{%
  \def\bxjs@driver@opt{dviout}%
  \let\bxjs@driver@given\bxjs@driver@@dvimode}
\DeclareOption{xdvi}{%
  \def\bxjs@driver@opt{xdvi}%
  \let\bxjs@driver@given\bxjs@driver@@dvimode}
\DeclareOption{dvipdfmx}{%
  \def\bxjs@driver@opt{dvipdfmx}%
  \let\bxjs@driver@given\bxjs@driver@@dvipdfmx}
\DeclareOption{nodvidriver}{%
  \def\bxjs@driver@opt{nodvidriver}%
  \let\bxjs@driver@given\bxjs@driver@@none}
\DeclareOption{class-nodvidriver}{%
  \def\bxjs@driver@opt{class-nodvidriver}%
  \let\bxjs@driver@given\bxjs@driver@@none}
\DeclareOption{pdftex}{%
  \def\bxjs@driver@opt{pdftex}%
  \let\bxjs@driver@given\bxjs@driver@@pdfmode}
\DeclareOption{luatex}{%
  \def\bxjs@driver@opt{luatex}%
  \let\bxjs@driver@given\bxjs@driver@@pdfmode}
\DeclareOption{xetex}{%
  \def\bxjs@driver@opt{xetex}%
  \let\bxjs@driver@given\bxjs@driver@@xetex}
%    \end{macrocode}
%
% |dvipdfmx-if-dvi| は2.0版より非推奨となった。
%    \begin{macrocode}
\DeclareOption{dvipdfmx-if-dvi}{\bxjs@depre@opt@do{dvipdfmx-if-dvi}{dvi=dvipdfmx}}
%    \end{macrocode}
%
% \paragraph{その他のBXJS独自オプション \ZRX}
%
% \TODO[3.x] 互換用オプションを分離する。
%
% \begin{macro}{\bxjs@depre@opt}
% \begin{macro}{\bxjs@depre@opt@do}
% 非推奨のオプションについて警告を出す。
%    \begin{macrocode}
\@onlypreamble\bxjs@depre@opt
\def\bxjs@depre@opt#1#2{%
  \ClassWarningNoLine\bxjs@clsname
   {The old option '#1' is DEPRECATED\MessageBreak
    and may be abolished in future!\MessageBreak
    You should instead write:\MessageBreak
    \space\space #2}}
\@onlypreamble\bxjs@depre@opt@do
\def\bxjs@depre@opt@do#1#2{%
  \bxjs@depre@opt{#1}{#2}%
  \setkeys{bxjs}{#2}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\ifbxjs@bigcode}
% 〔スイッチ〕
% {\upTeX}で有効化するToUnicode CMapとして
% 「|UTF8-UCS2|」の代わりに「|UTF8-UTF16|」を使うか。
% BMP外の文字に対応できる「|UTF8-UTF16|」の方が望ましいのであるが、
% このファイルが利用可能かの確実な判定が困難であるため、
% 既定を真とした上で、オプションで指定することとする。
% \Note 2.0版より、既定値を常に真とする。
%    \begin{macrocode}
\newif\ifbxjs@bigcode \bxjs@bigcodetrue
%    \end{macrocode}
% \end{macro}
%
% |nobigcode|／|bigcode| オプションの定義。
%    \begin{macrocode}
\DeclareOption{nobigcode}{%
  \bxjs@bigcodefalse}
\DeclareOption{bigcode}{%
  \bxjs@bigcodetrue}
%    \end{macrocode}
%
% \begin{macro}{\ifbxjs@oldfontcommands}
% 〔スイッチ〕
% |\allowoldfontcommands| を既定で有効にするか。
%    \begin{macrocode}
\newif\ifbxjs@oldfontcommands
%    \end{macrocode}
% \end{macro}
%
% |nooldfontcommands|、|oldfontcommands| オプションの定義。
% \Note |oldfontcommands| オプションの名前は\Pkg{memoir}クラスに倣った。
% ちなみに\Pkg{KOMA-Script}では |enabledeprecatedfontcommands| であるが
% これはチョットアレなので避けた。
%    \begin{macrocode}
\DeclareOption{nooldfontcommands}{%
  \bxjs@oldfontcommandsfalse}
\DeclareOption{oldfontcommands}{%
  \bxjs@oldfontcommandstrue}
%    \end{macrocode}
%
% \paragraph{無効および廃止されたオプション \ZRX}
%
% \begin{macro}{\bxjs@register@badopt}
% badoptマクロを登録する。
% 文書本体開始時に、当該オプションが「未使用のグローバルオプション」に
% なっている場合にbadoptマクロが実行される。
%    \begin{macrocode}
\ifbxjs@brace@safe
  \@onlypreamble\bxjs@register@badopt
  \def\bxjs@register@badopt#1{%
    \expandafter\@onlypreamble\csname bxjs@badopt/#1\endcsname
    \@namedef{bxjs@badopt/#1}}
  \g@addto@macro\bxjs@begin@document@hook{%
    \@for\bxjs@tmpa:=\@unusedoptionlist\do{%
      \@nameuse{bxjs@badopt/\bxjs@tmpa}}}
\fi
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@invalid@opt}
% 無効オプションを宣言する。
% そのオプションが指定された場合、それがグローバルオプションとして
% 他のパッケージによって使用されていなければ、
% 文書本体開始時にエラーを出す。
% \Note 古いカーネルでは未使用検査ができないため、その場で警告を出す。
%    \begin{macrocode}
\@onlypreamble\bxjs@invalid@opt
\ifbxjs@brace@safe
  \def\bxjs@invalid@opt#1#2{%
    \bxjs@register@badopt{#1}{\ClassError\bxjs@clsname{#2}\@ehc}}
\else
  \def\bxjs@invalid@opt#1#2{%
    \DeclareOption{#1}{\ClassWarningNoLine\bxjs@clsname{#2}}}
\fi
%    \end{macrocode}
% \end{macro}
%
% JSクラスにはあるがBXJSクラスにはないオプションを
% 「無効オプション」として宣言する。
% \Note |ltjsclasses| クラスでも警告を出している。
%    \begin{macrocode}
\bxjs@invalid@opt{winjis}{%
  This class does not support 'winjis' option}
\bxjs@invalid@opt{mingoth}{%
  This class does not support 'mingoth' option}
\bxjs@invalid@opt{jis}{%
  This class does not support 'jis' option}
\if j\jsEngine\else
\bxjs@invalid@opt{tombo}{%
  Option 'tombo' can be used only on (u)pLaTeX}
\bxjs@invalid@opt{tombow}{%
  Option 'tombow' can be used only on (u)pLaTeX}
\bxjs@invalid@opt{mentuke}{%
  Option 'mentuke' can be used only on (u)pLaTeX}
\fi
%    \end{macrocode}
%
% \paragraph{keyval型のオプション \ZRX}
%
% その他のオプションは |keyval| の機構を用いて処理する。
%    \begin{macrocode}
\DeclareOption*{%
  \bxjs@check@ja@prefix \ifx\bxjs@next\relax
  \def\bxjs@next{\bxjs@cls@setkeys{bxjs}}%
  \expandafter\bxjs@next\expandafter{\CurrentOption}%
  \else
%    \end{macrocode}
% オプションが |ja:XXX| という形式である場合は |japaram={XXX}| に
% 振り替える。
%    \begin{macrocode}
    \edef\bxjs@next{%
      \noexpand\setkeys{bxjs}{japaram={\bxjs@next}}%
    }\bxjs@next
  \fi}
%    \end{macrocode}
% \begin{macro}{\bxjs@check@ja@prefix}
% オプション文字列が |ja:| で始まるかを検査し、そうである場合は
% 後続の文字列を |\bxjs@next| に代入する。
%    \begin{macrocode}
\def\bxjs@check@ja@prefix{%
  \let\bxjs@next\relax
  \expandafter\bxjs@check@ja@prefix@a\CurrentOption\@nil ja:\@nil\@nnil}
\def\bxjs@check@ja@prefix@a#1ja:#2\@nil#3\@nnil{%
  \ifx\@nil#1\@nil \def\bxjs@next{#2}\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@safe@setkeys}
% 未知のキーに対してエラー無しで無視する |\setkeys|。
% \Note ネスト不可。
%    \begin{macrocode}
\def\bxjs@safe@setkeys#1#2{%
  \let\bxjs@save@KV@errx\KV@errx \let\KV@errx\@gobble
  \setkeys{#1}{#2}%
  \let\KV@errx\bxjs@save@KV@errx}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@cls@setkeys}
% 未知のキーに対して（エラー無しで）|\OptionNotUsed| を行う |\setkeys|。
% |\DeclareOption*| 中で用いる。
%    \begin{macrocode}
\def\bxjs@cls@setkeys#1#2{%
  \let\bxjs@save@KV@errx\KV@errx
  \def\KV@errx##1{\OptionNotUsed}%
  \setkeys{#1}{#2}%
  \let\KV@errx\bxjs@save@KV@errx}
\ifbxjs@brace@safe\else
  \let\bxjs@cls@setkeys\bxjs@safe@setkeys
\fi
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@declare@enum@option}
% |\bxjs@declare@enum@option{|\Meta{オプション名}|}{|^^A
%    \Meta{enum名}|}{|\Meta{初期値}|}|\par
% “\Meta{オプション名}|=|\Meta{値}”のオプション指定に対して、
% |\|[|bxjs@|\Meta{enum名}] を |\|[|bxjs@|\Meta{enum名}|@@|\Meta{値}] に
% 等置する（後者の制御綴が未定義の場合はエラー）、という動作を規定する。
%    \begin{macrocode}
\@onlypreamble\bxjs@declare@enum@option
\def\bxjs@declare@enum@option#1#2#3{%
  \bxjs@csletcs{bxjs@#2}{bxjs@#2@@#3}%
  \define@key{bxjs}{#1}{%
    \@ifundefined{bxjs@#2@@##1}{%
      \bxjs@error@keyval{#1}{##1}%
    }{\bxjs@csletcs{bxjs@#2}{bxjs@#2@@##1}}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@declare@bool@option}
% |\bxjs@declare@bool@option{|\Meta{オプション名}|}{|^^A
%     \Meta{スイッチ名}|}{|\Meta{初期値}|}|\par
% “\Meta{オプション名}|=|\Meta{真偽値}”のオプション指定に対して、
% |\if|[|bxjs@|\Meta{スイッチ名}] を設定する、という動作を規定する。
%    \begin{macrocode}
\@onlypreamble\bxjs@declare@bool@option
\def\bxjs@declare@bool@option#1#2#3{%
  \csname newif\expandafter\endcsname\csname ifbxjs@#2\endcsname
  \@nameuse{bxjs@#2#3}%
  \define@key{bxjs}{#1}[true]{%
    \@ifundefined{bxjs@#2##1}{%
      \bxjs@error@keyval{#1}{##1}%
    }{\@nameuse{bxjs@#2##1}}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@set@keyval}
% |\bxjs@set@keyval{|\meta{key}|}{|\meta{value}|}{|\meta{error}|}|\par
% |\bxjs@kv@|\meta{key}|@|\meta{value} が定義済ならそれを実行し、
% 未定義ならエラーを出す。
%    \begin{macrocode}
\def\bxjs@set@keyval#1#2#3{%
  \bxjs@csletcs{bxjs@next}{bxjs@kv@#1@#2}%
  \ifx\bxjs@next\relax
    \bxjs@error@keyval{#1}{#2}%
    #3%
  \else \bxjs@next
  \fi}
\@onlypreamble\bxjs@error@keyval
\def\bxjs@error@keyval#1#2{%
  \ClassError\bxjs@clsname
   {Invalid value '#2' for option #1}\@ehc}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jsScale}
% 〔実数値マクロ〕
% 和文スケール値。
%    \begin{macrocode}
\def\jsScale{0.924715}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@base@opt}
% 明示された |base| オプションの値。
%    \begin{macrocode}
%\let\bxjs@base@opt\@undefined
%    \end{macrocode}
% \end{macro}
%
% |base| オプションの処理。
%    \begin{macrocode}
\define@key{bxjs}{base}{%
  \edef\bxjs@base@opt{#1}%
  \bxjs@setbasefontsize{#1}}
\define@key{bxjs}{fontsize}{\setkeys{bxjs}{base=#1}}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@jbase@opt}
% 明示された |jbase| オプションの値。
%    \begin{macrocode}
%\let\bxjs@jbase@opt\@undefined
%    \end{macrocode}
% \end{macro}
%
% |jbase| オプションの処理。
%     \begin{macrocode}
\define@key{bxjs}{jbase}{\edef\bxjs@jbase@opt{#1}}
\define@key{bxjs}{jafontsize}{\setkeys{bxjs}{jbase=#1}}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@scale@opt}
% 明示された |scale| オプションの値。
%    \begin{macrocode}
%\let\bxjs@scale@opt\@undefined
%    \end{macrocode}
% \end{macro}
%
% |scale| オプションの処理。
%    \begin{macrocode}
\define@key{bxjs}{scale}{%
  \edef\bxjs@scale@opt{#1}%
  \let\jsScale\bxjs@scale@opt}
\define@key{bxjs}{jafontscale}{\setkeys{bxjs}{scale=#1}}
%    \end{macrocode}
%
% |noscale| オプションの処理。
% \TODO[3.0] |noscale| は廃止の予定。
%    \begin{macrocode}
\DeclareOption{noscale}{\bxjs@depre@opt@do{noscale}{scale=1}}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@param@mag}
% |mag| オプションの値。
%    \begin{macrocode}
\let\bxjs@param@mag\relax
%    \end{macrocode}
% \end{macro}
%
% |mag| オプションの処理。
%    \begin{macrocode}
\define@key{bxjs}{mag}{\edef\bxjs@param@mag{#1}}
%    \end{macrocode}
%
% |paper| オプションの処理。
%    \begin{macrocode}
\define@key{bxjs}{paper}{\edef\bxjs@param@paper{#1}}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@jadriver}
% 和文ドライバの名前。
%    \begin{macrocode}
\let\bxjs@jadriver\relax
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\bxjs@jadriver@opt}
% 明示された和文ドライバの名前。
%    \begin{macrocode}
%\let\bxjs@jadriver@opt\@undefined
%    \end{macrocode}
% \end{macro}
%
% |ja| オプションの処理。
% \Note |jadriver| は0.9版で用いられた旧称。
% \TODO[3.0] |jadriver| は廃止の予定。
% \Note 単なる |ja| という指定は無視される（Pandoc 対策）。
%    \begin{macrocode}
\define@key{bxjs}{jadriver}{%
  \bxjs@depre@opt{jadriver}{ja=#1}\edef\bxjs@jadriver@opt{#1}}
\define@key{bxjs}{ja}[\relax]{%
  \ifx\relax#1\else\edef\bxjs@jadriver@opt{#1}\fi}
%    \end{macrocode}
%
% \begin{macro}{\jsJaFont}
% 和文フォント設定の名前。
%    \begin{macrocode}
\let\jsJaFont\@empty
%    \end{macrocode}
% \end{macro}
%
% |jafont| オプションの処理。
%    \begin{macrocode}
\define@key{bxjs}{jafont}{\edef\jsJaFont{#1}}
%    \end{macrocode}
%
% \begin{macro}{\jsJaParam}
% 和文ドライバパラメタの文字列。
%    \begin{macrocode}
\let\jsJaParam\@empty
%    \end{macrocode}
% \end{macro}
%
% |japaram| オプションの処理。
%    \begin{macrocode}
\define@key{bxjs}{japaram}{%
  \edef\jsJaParam{\bxjs@catopt\jsJaParam{#1}}}
%    \end{macrocode}
%
% 引数をもつ |pandoc|・|pandoc+| オプションは、その引数を
% 和文パラメタの指定と見なす。
%    \begin{macrocode}
\define@key{bxjs}{pandoc}[]{%
  \ExecuteOptions{pandoc}%
  \edef\jsJaParam{\bxjs@catopt\jsJaParam{#1}}}
\define@key{bxjs}{pandoc+}[]{%
  \ExecuteOptions{pandoc+}%
  \edef\jsJaParam{\bxjs@catopt\jsJaParam{#1}}}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@magstyle}
% magstyle設定値。（古いイマイチな名前。）
%    \begin{macrocode}
\let\bxjs@magstyle@@mag=m
\let\bxjs@magstyle@@real=r
\let\bxjs@magstyle@@xreal=x
%    \end{macrocode}
% （新しい素敵な名前。）
% \Note ただし制御綴としては、|*|付の名前は扱い難いので、|\bxjs@magstyle@@xreal|
% の方を優先させる。
%    \begin{macrocode}
\let\bxjs@magstyle@@usemag\bxjs@magstyle@@mag
\let\bxjs@magstyle@@nomag\bxjs@magstyle@@real
\bxjs@cslet{bxjs@magstyle@@nomag*}\bxjs@magstyle@@xreal
%    \end{macrocode}
% |\bxjs@magstyle@@default| は既定の値を表す。
%    \begin{macrocode}
\let\bxjs@magstyle@@default\bxjs@magstyle@@usemag
\ifx l\jsEngine \ifnum\luatexversion>86
  \let\bxjs@magstyle@@default\bxjs@magstyle@@xreal
\fi\fi
\ifjsWithpTeXng
  \let\bxjs@magstyle@@default\bxjs@magstyle@@xreal
\fi
\let\bxjs@magstyle\bxjs@magstyle@@default
%    \end{macrocode}
% \end{macro}
%
% |magstyle| オプションの処理。
%    \begin{macrocode}
\define@key{bxjs}{magstyle}{%
  \bxjs@csletcs{bxjs@magstyle}{bxjs@magstyle@@#1}%
  \ifx\bxjs@magstyle\relax
    \bxjs@error@keyval{magstyle}{#1}%
    \let\bxjs@magstyle\bxjs@magstyle@@default
  \fi}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@geometry}
% |geometry| オプションの指定値。
%    \begin{macrocode}
\let\bxjs@geometry@@class=c
\let\bxjs@geometry@@user=u
\bxjs@declare@enum@option{geometry}{geometry}{class}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@fancyhdr}
% 〔スイッチ〕 |fancyhdr| の指定値。
% |fancyhdr| パッケージに対する調整を行うか。
%    \begin{macrocode}
\bxjs@declare@bool@option{fancyhdr}{fancyhdr}{true}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@dvi@opt}
% 〔スイッチ〕|dvi| オプションが指定されたか。
%    \begin{macrocode}
\newif\ifbxjs@dvi@opt
%    \end{macrocode}
% \end{macro}
%
% DVIモードのドライバとドライバ種別との対応。
%    \begin{macrocode}
\let\bxjs@dvidriver@@dvipdfmx=\bxjs@driver@@dvipdfmx
\let\bxjs@dvidriver@@dvips=\bxjs@driver@@dvips
\let\bxjs@dvidriver@@dviout=\bxjs@driver@@dvimode
\let\bxjs@dvidriver@@xdvi=\bxjs@driver@@dvimode
\let\bxjs@dvidriver@@nodvidriver=\bxjs@driver@@none
\bxjs@cslet{bxjs@dvidriver@@class-nodvidriver}\bxjs@driver@@none
%    \end{macrocode}
%
% |dvi| オプションの処理。
%    \begin{macrocode}
\define@key{bxjs}{dvi}{%
  \bxjs@csletcs{bxjs@tmpa}{bxjs@dvidriver@@#1}%
  \ifx\bxjs@tmpa\relax
    \bxjs@error@keyval{dvi}{#1}%
  \else
%    \end{macrocode}
% |\bxjs@driver@given| を未定義にしていることに注意。
%    \begin{macrocode}
    \def\bxjs@driver@opt{#1}%
    \let\bxjs@driver@given\@undefined
    \bxjs@dvi@opttrue
  \fi}
%    \end{macrocode}
%
% \begin{macro}{\ifbxjs@layout@buggyhmargin}
% 〔スイッチ〕
% |bxjsbook| の左右マージンがアレか。
% \Note |layout| が |v1| の場合はアレになる。
%    \begin{macrocode}
\newif\ifbxjs@layout@buggyhmargin
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@force@chapterabstract}
% 〔スイッチ〕
% abstract環境をchapterabstractにするか。
% \Note |bxjsbook| では常に真。
% |bxjsreport| では |layout| が |v1| の場合に真になる。
%    \begin{macrocode}
\newif\ifbxjs@force@chapterabstract
%<book>\bxjs@force@chapterabstracttrue
%    \end{macrocode}
% \end{macro}
%
% |layout| オプションの処理。
%    \begin{macrocode}
\@namedef{bxjs@kv@layout@v1}{%
%<book>\bxjs@layout@buggyhmargintrue
%<report>\bxjs@force@chapterabstracttrue
}
\@namedef{bxjs@kv@layout@v2}{%
%<book>\bxjs@layout@buggyhmarginfalse
%<report>\bxjs@force@chapterabstractfalse
}
\define@key{bxjs}{layout}{%
  \bxjs@set@keyval{layout}{#1}{}}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@textwidth@limit}
% |textwidth-limit| の指定値。
%    \begin{macrocode}
%\let\bxjs@textwidth@limit@opt\@undefined
\define@key{bxjs}{textwidth-limit}{%
  \bxjs@depre@opt{textwidth-limit}{textwidth=#1zw}%
  \edef\bxjs@textwidth@limit@opt{#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@textwidth@opt}
% |textwidth| の指定値。
%    \begin{macrocode}
%\let\bxjs@textwidth@opt\@undefined
\define@key{bxjs}{textwidth}{\edef\bxjs@textwidth@opt{#1}}
\define@key{bxjs}{line_length}{\setkeys{bxjs}{textwidth=#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@number@of@lines@opt}
% |number-of-lines| の指定値。
%    \begin{macrocode}
%\let\bxjs@number@of@lines@opt\@undefined
\define@key{bxjs}{number-of-lines}{\edef\bxjs@number@of@lines@opt{#1}}
\define@key{bxjs}{number_of_lines}{\setkeys{bxjs}{number-of-lines=#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@paragraph@mark}
% |paragraph-mark| の指定値。
% パラグラフのマーク。
%    \begin{macrocode}
%\let\bxjs@paragraph@mark\@undefined
\define@key{bxjs}{paragraph-mark}{%
  \edef\bxjs@paragraph@mark{#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@whole@zw@lines}
% 〔スイッチ〕 |whole-zw-lines| の指定値。
%    \begin{macrocode}
\bxjs@declare@bool@option{whole-zw-lines}{whole@zw@lines}{true}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@jaspace@cmd}
% 〔スイッチ〕 |jaspace-cmd| の指定値。
%    \begin{macrocode}
\bxjs@declare@bool@option{jaspace-cmd}{jaspace@cmd}{true}
\define@key{bxjs}{xkanjiskip-cmd}[true]{\setkeys{bxjs}{jaspace-cmd=#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@fix@at@cmd}
% 〔スイッチ〕 |fix-at-cmd| の指定値。
%    \begin{macrocode}
\bxjs@declare@bool@option{fix-at-cmd}{fix@at@cmd}{true}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@hyperref@enc}
% 〔スイッチ〕 |hyperref-enc| の指定値。
%    \begin{macrocode}
\bxjs@declare@bool@option{hyperref-enc}{hyperref@enc}{true}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@everyparhook}
% |everyparhook| の指定値。
%    \begin{macrocode}
\chardef\bxjs@everyparhook@@none=0
\chardef\bxjs@everyparhook@@compat=1
\chardef\bxjs@everyparhook@@modern=2
\bxjs@declare@enum@option{everyparhook}{everyparhook}{%
  \if j\jsEngine compat\else modern\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@label@section}
% |label-section| の指定値。
%    \begin{macrocode}
\chardef\bxjs@label@section@@none=0
\chardef\bxjs@label@section@@compat=1
\chardef\bxjs@label@section@@modern=2
\bxjs@declare@enum@option{label-section}{label@section}{compat}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@usezw}
% 〔スイッチ〕 |use-zw| の指定値。
% \TODO[3.0] |zw|/|nozw| は廃止の予定。
%    \begin{macrocode}
\bxjs@declare@bool@option{use-zw}{usezw}{true}
\DeclareOption{nozw}{\bxjs@depre@opt@do{nozw}{use-zw=false}}
\DeclareOption{zw}{\bxjs@depre@opt@do{zw}{use-zw=true}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@disguise@js}
% 〔スイッチ〕 |disguise-js| の指定値。
% \TODO[3.0] |js|/|nojs| は廃止の予定。
%    \begin{macrocode}
\bxjs@declare@bool@option{disguise-js}{disguise@js}{true}
\DeclareOption{nojs}{\bxjs@depre@opt@do{nojs}{disguise-js=false}}
\DeclareOption{js}{\bxjs@depre@opt@do{js}{disguise-js=true}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@precisetext}
% 〔スイッチ〕 |precise-text| の指定値。
%    \begin{macrocode}
\bxjs@declare@bool@option{precise-text}{precisetext}{false}
\DeclareOption{noprecisetext}{\bxjs@depre@opt@do{noprecisetext}{precise-text=false}}
\DeclareOption{precisetext}{\bxjs@depre@opt@do{precisetext}{precise-text=true}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@simplejasetup}
% 〔スイッチ〕 |simple-ja-setup| の指定値。
%    \begin{macrocode}
\bxjs@declare@bool@option{simple-ja-setup}{simplejasetup}{true}
\DeclareOption{nosimplejasetup}{\bxjs@depre@opt@do{nosimplejasetup}{simple-ja-setup=false}}
\DeclareOption{simplejasetup}{\bxjs@depre@opt@do{simplejasetup}{simple-ja-setup=true}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@plautopatch}
% 〔スイッチ〕 |plautopatch| の指定値。
%    \begin{macrocode}
\bxjs@declare@bool@option{plautopatch}{plautopatch}{false}
\g@addto@macro\bxjs@plautopatchtrue{\let\bxjs@plautopatch@given\@undefined}
\g@addto@macro\bxjs@plautopatchfalse{\def\bxjs@plautopatch@given{false}}
%    \end{macrocode}
% \end{macro}
%
% \paragraph{オプションの実行}
% \mbox{}
% \begin{ZRnote}
% {\LaTeX}カーネルの2021/06/01より前の版では、
% クラスやパッケージのオプションのトークン列の中に波括弧が含まれると
% 正常に処理ができない。
% これに対処する為 |\@removeelement| の実装に少し手を加えて
% 「第2引数が空の場合の処理をショートカットする」
% ことにより、この場合に波括弧を含む第1引数が通るようにする。
% \Note クラスに |\DeclareOption*| があり |\OptionNotUsed| を使って
% いない場合は |\@unusedoptions|
% は常に空のままであることを利用している。
%    \begin{macrocode}
\ifbxjs@brace@safe\else
\let\bxjs@org@removeelement\@removeelement
\def\@removeelement#1#2#3{%
  \def\reserved@a{#2}%
  \ifx\reserved@a\@empty \let#3\@empty
  \else \bxjs@org@removeelement{#1}{#2}{#3}%
  \fi}
\fi
%    \end{macrocode}
%
% \end{ZRnote}
%
% デフォルトのオプションを実行します。
% |multicols| や |url| を |\RequirePackage| するのはやめました。
%
%    \begin{macrocode}
%<article>\ExecuteOptions{a4paper,oneside,onecolumn,notitlepage,final}
%<book>\ExecuteOptions{a4paper,twoside,onecolumn,titlepage,openright,final}
%<report>\ExecuteOptions{a4paper,oneside,onecolumn,titlepage,openany,final}
%<slide>\ExecuteOptions{36pt,a4paper,landscape,oneside,onecolumn,titlepage,final}
\ProcessOptions\relax
\bxjs@post@option@hook
%    \end{macrocode}
%
% 後処理
% \Note |landscape| の処理のコードはBXJSでは無意味なので除外する。
%
%    \begin{macrocode}
\if@slide
  \def\maybeblue{\@ifundefined{ver@color.sty}{}{\color{blue}}}
\fi
%<*jsclasses>
\if@landscape
  \setlength\@tempdima  {\paperheight}
  \setlength\paperheight{\paperwidth}
  \setlength\paperwidth {\@tempdima}
\fi
%</jsclasses>
%    \end{macrocode}
%
% \paragraph{グローバルオプションの整理 \ZRX}
%
% 2021/06/01より前の版の{\LaTeX}カーネルでは、
% グローバルオプションのトークン列に |{ }| が含まれていると、
% 後のパッケージで |\ProcessOptions*| がエラーを起こす。
% 従って、このようなオプションは除外することにする。
% \TODO[3.0] 2021/06/01版以降のカーネルについてこの処理を廃止する。
% （仕様変更に準じる扱いとする。）
%    \begin{macrocode}
\def\bxjs@tmpdo{%
  \def\bxjs@tmpa{\@gobble}%
  \expandafter\bxjs@tmpdo@a\@classoptionslist,\@nil,%
  \let\@classoptionslist\bxjs@tmpa}
\def\bxjs@tmpdo@a#1,{%
  \ifx\@nil#1\relax\else
    \bxjs@tmpdo@b#1{}\@nil
    \if@tempswa \edef\bxjs@tmpa{\bxjs@tmpa,#1}\fi
    \expandafter\bxjs@tmpdo@a
  \fi}
\def\bxjs@tmpdo@b#1#{\bxjs@tmpdo@c}
\def\bxjs@tmpdo@c#1\@nil{%
  \ifx\@nil#1\@nil \@tempswatrue \else \@tempswafalse \fi}
\bxjs@tmpdo
%    \end{macrocode}
%
% |papersize|、|10pt|、|noscale| の各オプションは他のパッケージと衝突を
% 起こす可能性があるため、グローバルオプションから外す。
% \TODO[3.0] |noscale| オプションは廃止予定。
%
%    \begin{macrocode}
\@expandtwoargs\@removeelement
  {papersize}\@classoptionslist\@classoptionslist
\@expandtwoargs\@removeelement
  {10pt}\@classoptionslist\@classoptionslist
\@expandtwoargs\@removeelement
  {noscale}\@classoptionslist\@classoptionslist
%    \end{macrocode}
%
% \paragraph{使用エンジンの検査・自動判定}
%
% デフォルトで現在使われているエンジンが p\LaTeX か up\LaTeX かを判定します。
% ユーザによって |platex| オプションまたは |uplatex| オプションが明示的に
% 指定されている場合は、実際に使われているエンジンと一致しているかを検査し，一致
% しない場合はエラーメッセージを表示します。
%
% [2016-11-09] p\LaTeX / up\LaTeX を自動判別するオプション |autodetect-engine| を新設しました。
% up\LaTeX の場合は，グローバルオプションに |uplatex| を追加することで，
% 自動判定に応じて |otf| パッケージにも |uplatex| オプションが渡るようにします。
%
% [2023-02-12] |autodetect-engine| 指定時の挙動を規定化しました。
% また |platex| を新設しました。オプション |autodetect-engine|, |platex|, |uplatex| の
% うち最後に指定されたものが有効になります。
%
% \begin{ZRnote}
%
% 正規化前の和文ドライバの値を |\bxjs@jadriver| に設定する。
%    \begin{macrocode}
\ifx\bxjs@jadriver@opt\@undefined\else
  \let\bxjs@jadriver\bxjs@jadriver@opt
\fi
%    \end{macrocode}
%
% エンジン明示指定のオプションが与えられた場合は、
% それが実際のエンジンと一致するかを検査する。
%    \begin{macrocode}
\let\bxjs@tmpb\jsEngine
\ifx j\bxjs@tmpb\ifjsWithpTeXng
  \let\bxjs@tmpb=g
\fi\fi
\ifx j\bxjs@tmpb\ifjsWithupTeX
  \let\bxjs@tmpb=u
\fi\fi
\ifx p\bxjs@tmpb\ifjsInPdfMode\else
  \let\bxjs@tmpb=n
\fi\fi
%    \end{macrocode}
% （この時点で |\bxjs@tmpb| は |\bxjs@engine@given| と
% 同じ規則で分類したコードをもっている。）
%    \begin{macrocode}
\ifx *\bxjs@engine@given
  \let\bxjs@engine@given\bxjs@tmpb
%    \end{macrocode}
% エンジン指定が |autodetect-engine| であり、かつ実際のエンジンが
% {(u)\pLaTeX}だった場合は、本来のエンジンオプションを
% グローバルオプションに加える。
%    \begin{macrocode}
  \ifx j\bxjs@engine@given
    \g@addto@macro\@classoptionslist{,platex}
  \else\ifx u\bxjs@engine@given
    \g@addto@macro\@classoptionslist{,uplatex}
  \fi\fi
\fi
\ifx\bxjs@engine@given\@undefined\else
  \ifx\bxjs@engine@given\bxjs@tmpb\else
    \ClassError\bxjs@clsname
     {Option '\bxjs@engine@opt' used on wrong engine}\@ehc
  \fi
\fi
%    \end{macrocode}
%
% エンジンが{\pTeX-ng}の場合、グローバルオプションに |uplatex| を
% 追加する。
%    \begin{macrocode}
\ifjsWithpTeXng
  \g@addto@macro\@classoptionslist{,uplatex}
\fi
%    \end{macrocode}
%
% \end{ZRnote}
%
% \paragraph{ドライバ指定 \ZRX}
%
% ドライバ指定のオプションが与えられた場合は、
% それがエンジンと整合するかを検査する。
%    \begin{macrocode}
\@tempswatrue
\ifx \bxjs@driver@given\@undefined\else
  \ifjsInPdfMode
    \ifx\bxjs@driver@given\bxjs@driver@@pdfmode\else
      \@tempswafalse
    \fi
  \else\ifx x\jsEngine
    \ifx\bxjs@driver@given\bxjs@driver@@xetex\else
      \@tempswafalse
    \fi
  \else
    \ifx\bxjs@driver@given\bxjs@driver@@pdfmode
      \@tempswafalse
    \else\ifx\bxjs@driver@given\bxjs@driver@@xetex
      \@tempswafalse
    \fi\fi
    \ifjsWithpTeXng\ifx\bxjs@driver@given\bxjs@driver@@dvipdfmx\else
      \@tempswafalse
    \fi\fi
  \fi\fi
\fi
\if@tempswa\else
  \ClassError\bxjs@clsname
   {Option '\bxjs@driver@opt' used on wrong engine}\@ehc
\fi
%    \end{macrocode}
%
% DVI出力のエンジンである場合の追加処理。
%    \begin{macrocode}
\ifjsInPdfMode \@tempswafalse
\else\ifx x\jsEngine \@tempswafalse
\else\ifjsWithpTeXng \@tempswafalse
\else \@tempswatrue
\fi\fi\fi
\if@tempswa
%    \end{macrocode}
% ドライバオプションがない場合は警告を出す。
% \Note ただし |ja| 非指定の場合はスキップする
% （0.3 版との互換性のため）。
%    \begin{macrocode}
  \ifx\bxjs@driver@opt\@undefined
    \if \ifbxjs@explIII T\else\ifx\bxjs@jadriver@opt\@undefined F\else T\fi\fi T%
      \ClassWarningNoLine\bxjs@clsname
       {A driver option is MISSING!!\MessageBreak
        You should properly specify one of the valid\MessageBreak
        driver options according to the DVI driver\MessageBreak
        that is in use:\MessageBreak
        \@spaces dvips, dvipdfmx, dviout, xdvi,\MessageBreak
        \@spaces nodvidriver}
    \fi
  \fi
%    \end{macrocode}
% |dvi=XXX| が指定されていた場合は、
% |XXX| が指定された時と同じ動作にする。
% （グローバルオプションに |XXX| を追加する。）
%    \begin{macrocode}
  \ifbxjs@dvi@opt
    \edef\bxjs@next{%
      \let\noexpand\bxjs@driver@given
       \csname bxjs@dvidriver@@\bxjs@driver@opt\endcsname
      \noexpand\g@addto@macro\noexpand\@classoptionslist
       {,\bxjs@driver@opt}%
    }\bxjs@next
  \fi
\fi
%    \end{macrocode}
%
% エンジンが{\pTeX-ng}の場合、グローバルオプションに |dvipdfmx|
% を追加する。
% ただし、エンジンオプションが |platex-ng*|（|*|付）の場合、および
% 既に |dvipdfmx| が指定されている場合を除く。
%    \begin{macrocode}
\ifjsWithpTeXng
  \ifx\bxjs@driver@given\bxjs@driver@@dvipdfmx
    \let\bxjs@platexng@nodrv\@undefined
  \else\ifx t\bxjs@platexng@nodrv\else
    \g@addto@macro\@classoptionslist{,dvipdfmx}
  \fi\fi
\fi
%    \end{macrocode}
%
% ドライバが |nodvidriver| であった場合の処理。
% DVIウェア依存の処理を全て無効化する。
%    \begin{macrocode}
\ifx\bxjs@driver@given\bxjs@driver@@none
  \bxjs@papersizefalse
\fi
%    \end{macrocode}
%
% \paragraph{その他のBXJS特有の後処理 \ZRX}
%
% |\documentclass| より前に |plautopatch| パッケージが読み込まれて
% いる場合は |bxjs@plautopatch| を真にする。
%    \begin{macrocode}
\@ifpackageloaded{plautopatch}{%
  \bxjs@plautopatchtrue
}{}
%    \end{macrocode}
%
% 標準の和文ドライバの名前の定数。
%    \begin{macrocode}
\def\bxjs@@minimal{minimal}
\def\bxjs@@standard{standard}
\def\bxjs@@pandoc{pandoc}
\def\bxjs@@modern{modern}
%    \end{macrocode}
%
% |\bxjs@jadriver| の正規化。
% 値が未指定の場合は |minimal| に変える。
% ただしエンジンが{(u)\pTeX}である場合は |standard|
% に変える。
% \Note {(u)\pTeX}以外で |ja| を省略するのは2.0版より非推奨となった。
%    \begin{macrocode}
\ifx\bxjs@jadriver\relax
  \ifx j\jsEngine
    \let\bxjs@jadriver\bxjs@@standard
  \else
    \ClassWarningNoLine\bxjs@clsname
     {The option 'ja' is MISSING!!\MessageBreak
      So 'ja=minimal' is assumed as fallback, but\MessageBreak
      such implicit setting is now DEPRECATED!\MessageBreak
      You should write 'ja=minimal' explicitly,\MessageBreak
      if it is intended}
    \let\bxjs@jadriver\bxjs@@minimal
  \fi
\fi
%    \end{macrocode}
%
% |plautopatch| が真の場合はここで |plautopatch| を読み込む。
% \Note この時点で既に読み込まれているパッケージは、
% |calc|、|keyval|、|iftex|。
% \Note Pandocモードでは |plautopatch| の既定値を真とする。
%    \begin{macrocode}
\ifx\bxjs@jadriver\bxjs@@pandoc \ifx\bxjs@plautopatch@given\@undefined
    \ifjsWitheTeX
  \bxjs@plautopatchtrue
\fi\fi\fi
\ifx j\jsEngine \ifbxjs@plautopatch
  \RequirePackage{plautopatch}[2018/08/22]%v0.3
\fi\fi
%    \end{macrocode}
%
% エンジンオプションがない場合はエラーを出す。
% \Note ただし |ja| 非指定の場合はスキップする。
%    \begin{macrocode}
\ifx\bxjs@jadriver@opt\@undefined\else
  \ifx\bxjs@engine@given\@undefined
    \ClassError\bxjs@clsname
     {An engine option must be explicitly given}%
     {When you use a Japanese-driver you must specify a correct\MessageBreak
      engine option.\MessageBreak\@ehc}
\fi\fi
%    \end{macrocode}
%
% 新しい{\LuaTeX}（0.87版以降）ではmagがアレなので、
% |magstyle=usemag| が指定されていた場合はエラーを出す。
% （この場合の既定値は |nomag*| であり、
% エラーの場合は既定値に置き換えられる。）
%    \begin{macrocode}
\ifx\bxjs@magstyle@@default\bxjs@magstyle@@mag\else
  \ifx\bxjs@magstyle\bxjs@magstyle@@mag
    \let\bxjs@magstyle\bxjs@magstyle@@default
    \ClassError\bxjs@clsname
     {The engine does not support 'magstyle=usemag'}%
     {LuaTeX v0.87 or later no longer supports the "mag" feature of TeX.\MessageBreak
      The default value 'nomag*' is used instead.\MessageBreak \@ehc}
  \fi
\fi
%    \end{macrocode}
%
% |base|、|jbase|、|scale| の値を用いて和文スケール値を解決する。
% \Note |\bxjs@param@basefontsize| と |\jsScale| へのオプション値の反映は
% 既に実施されていることに注意。
% |jbase| 非指定の場合はこのままでよい。
%    \begin{macrocode}
\ifx\bxjs@jbase@opt\@undefined\else
  \ifx\bxjs@base@opt\@undefined
%    \end{macrocode}
% |jbase| 指定済で |base| 未指定の場合は、|\jsScale| の値を採用して
% 和文基底サイズを決定する。
%    \begin{macrocode}
    \jsSetQHLength\@tempdima{\bxjs@jbase@opt}%
    \bxjs@invscale\@tempdima\jsScale
    \bxjs@setbasefontsize{\@tempdima}%
  \else
%    \end{macrocode}
% |jbase| と |base| がともに指定済の場合は、それらの値から
% 和文スケール値を決定する。
%    \begin{macrocode}
    \ifx\bxjs@scale@opt\@undefined\else
      \ClassWarningNoLine\bxjs@clsname
       {Redundant 'scale' option is ignored}%
    \fi
    \jsSetQHLength\@tempdima{\bxjs@jbase@opt}%
    \@tempdimb=\bxjs@param@basefontsize\relax
    \edef\jsScale{\strip@pt\@tempdimb}%
    \bxjs@invscale\@tempdima\jsScale
    \edef\jsScale{\strip@pt\@tempdima}%
  \fi
\fi
%    \end{macrocode}
%
% \begin{macro}{\Cjascale}
% 和文クラス共通仕様（※ただしZR氏提唱）における、
% 和文スケール値の変数。
%    \begin{macrocode}
\let\Cjascale\jsScale
%    \end{macrocode}
% \end{macro}
%
% |disguise-js=true| 指定時は、jsarticle（または jsbook）クラスを
% 読込済のように振舞う。
% \Note 「2つのクラスを読み込んだ状態」は |\LoadClass| を使用した
% 場合に出現するので、別に異常ではない。
%    \begin{macrocode}
\ifbxjs@disguise@js
%<book|report>\def\bxjs@js@clsname{jsbook}
%<!book&!report>\def\bxjs@js@clsname{jsarticle}
  \@namedef{ver@\bxjs@js@clsname.cls}{2001/01/01 (bxjs)}
\fi
%    \end{macrocode}
%
% |color|/|graphics| パッケージが持つ出力用紙サイズ設定の機能は、
% BXJSクラスでは余計なので無効にしておく。
% このため、グローバルで |nosetpagesize| を設定しておく。
%    \begin{macrocode}
\g@addto@macro\@classoptionslist{,nosetpagesize}
%    \end{macrocode}
%
% |oldfontcommands| オプション指定時は |\allowoldfontcommands|
% 命令を実行する。
%    \begin{macrocode}
\ifbxjs@oldfontcommands
  \AtEndOfClass{\allowoldfontcommands}
\fi
%    \end{macrocode}
%
% \paragraph{papersizeスペシャルの出力}
%
% |dvi| ファイルの先頭にdvipsのpapersize specialを書き込むことで，
% 出力用紙サイズを設定します。これはdvipdfmxや最近のdvioutにも有効です。
% どうやらpapersize specialにはtrue付の単位は許されず，かつ単位は
% 常にtrueなものと扱われるようです。
% そこで，後で出てくる（☆）の部分，「|\mag|にあわせてスケール」よりも
% 手前で実行しておくことになります。
%
% トンボの付いたときの用紙サイズは無意味ですが，
% いわゆる「ノビ」サイズという縦横1インチずつ長い用紙に出力することを考えて，
% 1インチずつ加えました。
% ところが\pLaTeXe はトンボ出力幅を両側に1インチとっていますので，
% dvips使用時に
% \begin{quote}
%   |-O -0.5in,-0.5in|
% \end{quote}
% というオプションを与えて両側0.5インチのトンボにするといいでしょう。
%
% [2003-05-17] トンボをプレビューに使うことを考えて1インチを2インチにしました。
%
% [2016-07-11] memoirクラスのマニュアルによると，トンボを含めた用紙の寸法は
% |\stockwidth|，|\stockheight|と呼ぶようですので，これを使うことにしました。
%
% [2017-01-11] トンボオプションが指定されているとき「だけ」|\stockwidth|，
% |\stockheight|を定義するようにしました。
%
% [2020-10-04] \LaTeXe~2020-10-01でカーネルの |\shipout| コードが拡張され
% |\AtBeginDvi| の実行タイミングが変化したので，この時点で
% 発行する |\special| の中身を展開しておくようにしました。
% こうしないと，用紙サイズ設定を間違ってしまいます(Issue \#72)。
%
% [2022-09-12] 次期\LaTeXe カーネルに|\stockwidth|，|\stockheight|が
% 追加されるようですので，
% クラスファイル側では未定義のときのみこれらの長さ変数を定義します。
% h20y6mさん，ありがとうございます。
%
% \begin{ZRnote}
% BXJSでは出力用紙サイズ記録は |geometry| パッケージが行う。
%
% また、JSクラスと異なり、|\stockwidth|、|\stockheight| は常に定義される。
% \end{ZRnote}
%    \begin{macrocode}
\ifx\stockwidth\@undefined\newdimen\stockwidth\fi
\ifx\stockheight\@undefined\newdimen\stockheight\fi
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname iftombow\expandafter\endcsname\csname iftrue\endcsname
  \setlength{\stockwidth}{\paperwidth}
  \setlength{\stockheight}{\paperheight}
  \advance \stockwidth 2in
  \advance \stockheight 2in
\fi
%    \end{macrocode}
%
% \paragraph{基準となる行送り}
%
% \begin{macro}{\n@baseline}
%
% 基準となる行送りをポイント単位で表したものです。
%
%    \begin{macrocode}
%<slide>\def\n@baseline{13}%
%<!slide>\ifdim\bxjs@param@basefontsize<10pt \def\n@baseline{15}%
%<!slide>\else \def\n@baseline{16}\fi
%    \end{macrocode}
% \end{macro}
%
% \paragraph{拡大率の設定}
% \mbox{}
% \begin{ZRnote}
% |\bxjs@magstyle| の値に応じてスイッチ |jsc@mag| と |jsc@mag@xreal| を
% 設定する。
%    \begin{macrocode}
\ifx\bxjs@magstyle\bxjs@magstyle@@mag
  \jsc@magtrue
\else\ifx\bxjs@magstyle\bxjs@magstyle@@xreal
  \jsc@mag@xrealtrue
\fi\fi
%    \end{macrocode}
% \end{ZRnote}
%
% サイズの変更は\TeX のプリミティブ |\mag| を使って行います。
% 9ポイントについては行送りも若干縮めました。
% サイズについては全面的に見直しました。
%
% [2008-12-26] 1000 / |\mag| に相当する |\inv@mag| を定義しました。
% |truein| を使っていたところを |\inv@mag in| に直しましたので，
% |geometry| パッケージと共存できると思います。
% なお，新ドキュメントクラス側で |10pt| 以外にする場合の注意：
% \begin{itemize}
% \item |geometry| 側でオプション |truedimen| を指定してください。
% \item |geometry| 側でオプション |mag| は使えません。
% \end{itemize}
%
% \begin{ZRnote}
% 設定すべき |\mag| 値を (基底サイズ)/(10\,pt) $\times$ 1000 と算出。
% BXJSクラスでは、|\mag| を直接指定したい場合は、|geometry| 側では
% なくクラスのオプションで行うものとする。
%    \begin{macrocode}
\ifx\bxjs@param@mag\relax
  \@tempdima=\bxjs@param@basefontsize
  \advance\@tempdima.001pt \multiply\@tempdima25
  \divide\@tempdima16384\relax \@tempcnta\@tempdima\relax
  \edef\bxjs@param@mag{\the\@tempcnta}
\else
% mag値が直接指定された場合
  \bxjs@gset@tempcnta{\bxjs@param@mag}
  \ifnum\@tempcnta<\z@ \@tempcnta=\z@ \fi
% 有効なmag値の範囲は1--32768
  \edef\bxjs@param@mag{\the\@tempcnta}
  \advance\@tempcnta100000
  \def\bxjs@tmpa#1#2#3#4#5\@nil{\@tempdima=#2#3#4.#5\p@}
  \expandafter\bxjs@tmpa\the\@tempcnta\@nil
  \edef\bxjs@param@basefontsize{\the\@tempdima}
\fi
\@tempcnta\bxjs@param@mag \advance\@tempcnta100000
\def\bxjs@tmpa#1#2#3#4\@nil{\@tempdima=#2#3.#4\p@}
\expandafter\bxjs@tmpa\the\@tempcnta\@nil
\edef\jsc@magscale{\strip@pt\@tempdima}
\let\jsBaseFontSize\bxjs@param@basefontsize
%    \end{macrocode}
% \end{ZRnote}
%
% [2016-07-08] |\jsc@mpt| および |\jsc@mmm| に，それぞれ1ptおよび1mmを拡大させた値を格納します。
% 以降のレイアウト指定ではこちらを使います。
%
% \begin{ZRnote}
% \Note 2.9版において |\p@?| 表記を廃止。
%    \begin{macrocode}
\newdimen\jsc@mpt
\newdimen\jsc@mmm
\ifjsc@mag
  \jsc@mpt=1\p@
  \jsc@mmm=1mm
\else
  \jsc@mpt=\jsc@magscale\p@
  \jsc@mmm=\jsc@magscale mm
\fi
%    \end{macrocode}
%
% ここで{p\TeX}のzwに相当する単位として用いる長さ変数 |\jsZw| を作成する。
% 約束により、これは |\jsScale| $\times$ (指定フォントサイズ) に等しい。
%
% |use-zw| が真の時は |\zw| を |\jsZw| と同義にする。
%    \begin{macrocode}
\newdimen\jsZw
\jsZw=10\jsc@mpt \jsZw=\jsScale\jsZw
\ifbxjs@usezw
  \providecommand*\zw{\jsZw}
\fi
%    \end{macrocode}
%
% \begin{macro}{\zwspace}
% 全角幅の水平空き。
%    \begin{macrocode}
\def\zwspace{\hskip\jsZw\relax}
%    \end{macrocode}
% \end{macro}
%
% そして、magstyle が |nomag*| の場合は、NFSSにパッチを当てる。
%    \begin{macrocode}
\ifjsc@mag@xreal
  \RequirePackage{type1cm}
  \let\jsc@invscale\bxjs@invscale
%    \end{macrocode}
% \end{ZRnote}
%    \begin{macrocode}
  \ifbxjs@TUenc
    \expandafter\let\csname TU/lmr/m/n/10\endcsname\relax
  \else
    \expandafter\let\csname OT1/cmr/m/n/10\endcsname\relax
  \fi
  \expandafter\let\csname OMX/cmex/m/n/10\endcsname\relax
  \let\jsc@get@external@font\get@external@font
  \def\get@external@font{%
    \jsc@preadjust@extract@font
    \jsc@get@external@font}
  \def\jsc@fstrunc#1{%
    \edef\jsc@tmpa{\strip@pt#1}%
    \expandafter\jsc@fstrunc@a\jsc@tmpa.****\@nil}
  \def\jsc@fstrunc@a#1.#2#3#4#5#6\@nil{%
    \if#5*\else
      \edef\jsc@tmpa{#1%
      \ifnum#2#3>\z@ .#2\ifnum#3>\z@ #3\fi\fi}%
    \fi}
  \def\jsc@preadjust@extract@font{%
    \let\jsc@req@size\f@size
    \dimen@\f@size\p@ \jsc@invscale\dimen@\jsc@magscale
    \advance\dimen@.005pt\relax \jsc@fstrunc\dimen@
    \let\jsc@ref@size\jsc@tmpa
    \let\f@size\jsc@ref@size}
  \def\execute@size@function#1{%
    \let\jsc@cref@size\f@size
    \let\f@size\jsc@req@size
    \csname s@fct@#1\endcsname}
  \let\jsc@DeclareErrorFont\DeclareErrorFont
  \def\DeclareErrorFont#1#2#3#4#5{%
    \@tempdimc#5\p@ \@tempdimc\jsc@magscale\@tempdimc
    \edef\jsc@tmpa{{#1}{#2}{#3}{#4}{\strip@pt\@tempdimc}}
    \expandafter\jsc@DeclareErrorFont\jsc@tmpa}
  \def\gen@sfcnt{%
    \edef\mandatory@arg{\mandatory@arg\jsc@cref@size}%
    \empty@sfcnt}
  \def\genb@sfcnt{%
    \edef\mandatory@arg{%
      \mandatory@arg\expandafter\genb@x\jsc@cref@size..\@@}%
    \empty@sfcnt}
  \ifbxjs@TUenc\else
    \DeclareErrorFont{OT1}{cmr}{m}{n}{10}
  \fi
\fi
%    \end{macrocode}
%
% [2016-11-16] latex.ltx (ltspace.dtx)で定義されている |\smallskip| の，
% 単位 |pt| を |\jsc@mpt| に置き換えた |\jsc@smallskip| を定義します。
% これは |\maketitle| で用いられます。
% |\jsc@medskip| と |\jsc@bigskip| は必要ないのでコメントアウトしています。
%
% \begin{macro}{\jsc@smallskip}
% \begin{macro}{\jsc@medskip}
% \begin{macro}{\jsc@bigskip}
%    \begin{macrocode}
\def\jsc@smallskip{\vspace\jsc@smallskipamount}
%\def\jsc@medskip{\vspace\jsc@medskipamount}
%\def\jsc@bigskip{\vspace\jsc@bigskipamount}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\jsc@smallskipamount}
% \begin{macro}{\jsc@medskipamount}
% \begin{macro}{\jsc@bigskipamount}
%    \begin{macrocode}
\newskip\jsc@smallskipamount
\jsc@smallskipamount=3\jsc@mpt plus 1\jsc@mpt minus 1\jsc@mpt
%\newskip\jsc@medskipamount
%\jsc@medskipamount =6\jsc@mpt plus 2\jsc@mpt minus 2\jsc@mpt
%\newskip\jsc@bigskipamount
%\jsc@bigskipamoun =12\jsc@mpt plus 4\jsc@mpt minus 4\jsc@mpt
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% |\paperwidth|，|\paperheight|を|\mag|にあわせてスケールしておきます（☆）。
%
% [2016-07-11] 新しく追加した|\stockwidth|，|\stockheight|も|\mag|にあわせて
% スケールします。
%
% [2017-01-11] トンボオプションが指定されているとき「だけ」|\stockwidth|，
% |\stockheight|が定義されています。
%
%    \begin{macrocode}
%    \end{macrocode}
%
% \paragraph{pagesizeスペシャルの出力}
%
% [2003-05-17] dvipdfm(x)のpagesizeスペシャルを出力します。
%
% [2004-08-08] 今のdvipdfmxはdvips用スペシャルを理解するようなので外しました。
%
%    \begin{macrocode}
% \ifpapersize
%   \setlength{\@tempdima}{\paperwidth}
%   \setlength{\@tempdimb}{\paperheight}
%   \iftombow
%     \advance \@tempdima 2truein
%     \advance \@tempdimb 2truein
%   \fi
%   \AtBeginDvi{\special{pdf: pagesize width \the\@tempdima\space height \the\@tempdimb}}
% \fi
%    \end{macrocode}
%
% \section{和文フォントの変更}
%
% \begin{ZRnote}
% 和文フォントの設定は和文ドライバの管轄。
%
% ここでは、|jsclasse.dtx| との差分を抑制するために、
% オリジナルのコードを無効化した状態で挿入しておく。
% \end{ZRnote}
%    \begin{macrocode}
%</class>
%<*jsclasses>
%<*class>
%    \end{macrocode}
%
% JISの1ポイントは0.3514mm（約1/72.28インチ），
% PostScriptの1ポイントは1/72インチですが，
% \TeX では1/72.27インチを1pt（ポイント），
% 1/72インチを1bp（ビッグポイント）と表します。
% QuarkXPressなどのDTPソフトは標準で1/72インチを1ポイント
% としますが，以下ではすべて1/72.27インチを1ptとしています。
% 1インチは定義により25.4mmです。
%
% さらにややこしいことに，\pTeX （アスキーが日本語化した\TeX ）
% の公称10ポイントの和文フォント（\texttt{min10} など）は，
% 実寸（標準の字送り量）が9.62216ptです。
% これは3.3818mm，写研の写植機の単位では13.527級，
% PostScriptの単位では9.5862ポイントになります。
% \texttt{jis} フォントなどもこの値を踏襲しています。
%
% この公称10ポイントのフォントを，ここでは13級に縮小して
% 使うことにします。そのためには，$13/13.527 = 0.961$ 倍
% すればいいことになります（\texttt{min10} や \texttt{jis} の場合）。
% 9.62216ポイントの和文フォントをさらに0.961倍したことにより，
% 約9.25ポイント，
% DTPで使う単位（1/72インチ）では9.21ポイントということになり，
% 公称10ポイントといっても実は9ポイント強になります。
%
% [2018-02-04] 上記のとおりの「クラスファイルが意図する
% 和文スケール値（$1\,\mathrm{zw} \div \textmc{要求サイズ}$）」を
% 表す実数値マクロ |\Cjascale| を定義します。このマクロが定義されて
% いる場合，OTFパッケージ（2018/02/01以降のバージョン）はこれに
% 従います。jsarticle, jsbook, jsreportでは，
% $9.62216\,\mathrm{pt} * 0.961 / 10\,\mathrm{pt} = 0.924690$ です。
%
%    \begin{macrocode}
%</class>
%<*minijs>
%% min/goth -> jis/jisg (for pLaTeX only)
\ifnum\jis"2121="3000 \else
\@for\@tempa:=5,6,7,8,9,10,10.95,12,14.4,17.28,20.74,24.88\do{%
  \expandafter\let\csname JY1/mc/m/n/\@tempa\endcsname\relax
  \expandafter\let\csname JY1/gt/m/n/\@tempa\endcsname\relax
  \expandafter\let\csname JT1/mc/m/n/\@tempa\endcsname\relax
  \expandafter\let\csname JT1/gt/m/n/\@tempa\endcsname\relax
}
\def\Cjascale{0.924690}
\DeclareFontShape{JY1}{mc}{m}{n}{<-> s * [0.961] jis}{}
\DeclareFontShape{JY1}{gt}{m}{n}{<-> s * [0.961] jisg}{}
\DeclareFontShape{JT1}{mc}{m}{n}{<-> s * [0.961] tmin10}{}
\DeclareFontShape{JT1}{gt}{m}{n}{<-> s * [0.961] tgoth10}{}
\fi
%</minijs>
%<*class>
%<*!jspf>
\def\Cjascale{0.924690}
\ifmingoth
  \DeclareFontShape{\jsc@JYn}{mc}{m}{n}{<-> s * [0.961] \jsc@pfx@ min10}{}
  \DeclareFontShape{\jsc@JYn}{gt}{m}{n}{<-> s * [0.961] \jsc@pfx@ goth10}{}
  \DeclareFontShape{\jsc@JTn}{mc}{m}{n}{<-> s * [0.961] \jsc@pfx@ tmin10}{}
  \DeclareFontShape{\jsc@JTn}{gt}{m}{n}{<-> s * [0.961] \jsc@pfx@ tgoth10}{}
\else
  \ifjisfont
    \DeclareFontShape{\jsc@JYn}{mc}{m}{n}{<-> s * [0.961] \jsc@pfx@ jis}{}
    \DeclareFontShape{\jsc@JYn}{gt}{m}{n}{<-> s * [0.961] \jsc@pfx@ jisg}{}
    \DeclareFontShape{\jsc@JTn}{mc}{m}{n}{<-> s * [0.961] \jsc@pfx@ tmin10}{}
    \DeclareFontShape{\jsc@JTn}{gt}{m}{n}{<-> s * [0.961] \jsc@pfx@ tgoth10}{}
  \else
    \if@jsc@uplatex
      \DeclareFontShape{JY2}{mc}{m}{n}{<-> s * [0.924690] upjisr-h}{}
      \DeclareFontShape{JY2}{gt}{m}{n}{<-> s * [0.924690] upjisg-h}{}
      \DeclareFontShape{JT2}{mc}{m}{n}{<-> s * [0.924690] upjisr-v}{}
      \DeclareFontShape{JT2}{gt}{m}{n}{<-> s * [0.924690] upjisg-v}{}
    \else
      \DeclareFontShape{\jsc@JYn}{mc}{m}{n}{<-> s * [0.961] \jsc@pfx@ jis}{}
      \DeclareFontShape{\jsc@JYn}{gt}{m}{n}{<-> s * [0.961] \jsc@pfx@ jisg}{}
      \DeclareFontShape{\jsc@JTn}{mc}{m}{n}{<-> s * [0.961] \jsc@pfx@ tmin10}{}
      \DeclareFontShape{\jsc@JTn}{gt}{m}{n}{<-> s * [0.961] \jsc@pfx@ tgoth10}{}
    \fi
  \fi
\fi
%</!jspf>
%    \end{macrocode}
%
% 某学会誌では，
% 和文フォントをPostScriptの9ポイントにするために，
% $9/(9.62216*72/72.27) = 0.93885$ 倍します。
%
% [2018-02-04] 和文スケール値 |\Cjascale| は
% $9.62216\,\mathrm{pt} * 0.93885 / 10\,\mathrm{pt} = 0.903375$ です。
%
%    \begin{macrocode}
%<*jspf>
\def\Cjascale{0.903375}
\ifmingoth
  \DeclareFontShape{\jsc@JYn}{mc}{m}{n}{<-> s * [0.93885] \jsc@pfx@ min10}{}
  \DeclareFontShape{\jsc@JYn}{gt}{m}{n}{<-> s * [0.93885] \jsc@pfx@ goth10}{}
  \DeclareFontShape{\jsc@JTn}{mc}{m}{n}{<-> s * [0.93885] \jsc@pfx@ tmin10}{}
  \DeclareFontShape{\jsc@JTn}{gt}{m}{n}{<-> s * [0.93885] \jsc@pfx@ tgoth10}{}
\else
  \ifjisfont
    \DeclareFontShape{\jsc@JYn}{mc}{m}{n}{<-> s * [0.93885] \jsc@pfx@ jis}{}
    \DeclareFontShape{\jsc@JYn}{gt}{m}{n}{<-> s * [0.93885] \jsc@pfx@ jisg}{}
    \DeclareFontShape{\jsc@JTn}{mc}{m}{n}{<-> s * [0.93885] \jsc@pfx@ tmin10}{}
    \DeclareFontShape{\jsc@JTn}{gt}{m}{n}{<-> s * [0.93885] \jsc@pfx@ tgoth10}{}
  \else
    \if@jsc@uplatex
      \DeclareFontShape{JY2}{mc}{m}{n}{<-> s * [0.903375] upjisr-h}{}
      \DeclareFontShape{JY2}{gt}{m}{n}{<-> s * [0.903375] upjisg-h}{}
      \DeclareFontShape{JT2}{mc}{m}{n}{<-> s * [0.903375] upjisr-v}{}
      \DeclareFontShape{JT2}{gt}{m}{n}{<-> s * [0.903375] upjisg-v}{}
    \else
      \DeclareFontShape{\jsc@JYn}{mc}{m}{n}{<-> s * [0.93885] \jsc@pfx@ jis}{}
      \DeclareFontShape{\jsc@JYn}{gt}{m}{n}{<-> s * [0.93885] \jsc@pfx@ jisg}{}
      \DeclareFontShape{\jsc@JTn}{mc}{m}{n}{<-> s * [0.93885] \jsc@pfx@ tmin10}{}
      \DeclareFontShape{\jsc@JTn}{gt}{m}{n}{<-> s * [0.93885] \jsc@pfx@ tgoth10}{}
    \fi
  \fi
\fi
%</jspf>
%    \end{macrocode}
%
% 和文でイタリック体，斜体，サンセリフ体，
% タイプライタ体の代わりにゴシック体を使うことにします。
%
% [2003-03-16] イタリック体，斜体について，和文でゴシックを当てていましたが，
% 数学の定理環境などで多量のイタリック体を使うことがあり，ゴシックに
% すると黒々となってしまうという弊害がありました。
% |amsthm| を使わない場合は定理の本文が明朝になるように |\newtheorem|
% 環境を手直ししてしのいでいましたが，
% \TeX が数学で多用されることを考えると，イタリック体に明朝体を
% 当てたほうがいいように思えてきましたので，
% イタリック体・斜体に対応する和文を明朝体に変えることにしました。
%
% [2004-11-03] |\rmfamily| も和文対応にしました。
%
%    \begin{macrocode}
% \DeclareFontShape{\jsc@JYn}{mc}{bx}{n}{<->ssub*gt/m/n}{} % in \jsc@JYnmc
% \DeclareFontShape{\jsc@JYn}{gt}{bx}{n}{<->ssub*gt/m/n}{} % in \jsc@JYngt
\DeclareFontShape{\jsc@JYn}{mc}{m}{it}{<->ssub*mc/m/n}{}
\DeclareFontShape{\jsc@JYn}{mc}{m}{sl}{<->ssub*mc/m/n}{}
\DeclareFontShape{\jsc@JYn}{mc}{m}{sc}{<->ssub*mc/m/n}{}
\DeclareFontShape{\jsc@JYn}{gt}{m}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JYn}{gt}{m}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JYn}{mc}{bx}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JYn}{mc}{bx}{sl}{<->ssub*gt/m/n}{}
% \DeclareFontShape{\jsc@JTn}{mc}{bx}{n}{<->ssub*gt/m/n}{} % in \jsc@JTnmc
% \DeclareFontShape{\jsc@JTn}{gt}{bx}{n}{<->ssub*gt/m/n}{} % in \jsc@JTngt
\DeclareFontShape{\jsc@JTn}{mc}{m}{it}{<->ssub*mc/m/n}{}
\DeclareFontShape{\jsc@JTn}{mc}{m}{sl}{<->ssub*mc/m/n}{}
\DeclareFontShape{\jsc@JTn}{mc}{m}{sc}{<->ssub*mc/m/n}{}
\DeclareFontShape{\jsc@JTn}{gt}{m}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JTn}{gt}{m}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JTn}{mc}{bx}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JTn}{mc}{bx}{sl}{<->ssub*gt/m/n}{}
%    \end{macrocode}
%
% [2020-02-02] \LaTeXe~2020-02-02でNFSSが拡張され，
% それに伴いオリジナルの |\rmfamily| などの定義が変化しました。
% |\DeclareRobustCommand| で直接定義すると，これを上書きして
% NFSSの拡張部分を壊してしまいますので，
% 新たに提供されたフックにコードを挿入します。
% 従来のコードも\LaTeXe~2019-10-01以前のために残してありますが，
% \texttt{mweights}パッケージ対策も施しました(forum:2763)。
%
% [2020-10-04] \LaTeXe~2020-10-01では |\AddToHook| を利用します。
%
% ^^A Note that |\AddToHook| is defined as follows:
% ^^A \begin{itemize}
% ^^A   \item Format date 2020-02-02 or older: undefined
% ^^A   \item Format date 2020-10-01 or newer: available
% ^^A   \item ... under \texttt{latexrelease} rollback: defined but no-op
% ^^A \end{itemize}
%
%    \begin{macrocode}
%</class>
%<*class|minijs>
%% ad-hoc "relation font"
\@ifl@t@r\fmtversion{2020/10/01}
    {\jsc@needsp@tchfalse}{\jsc@needsp@tchtrue}
\ifjsc@needsp@tch          % --- for 2020-02-02 or older BEGIN
\ifx\@rmfamilyhook\@undefined  % old
\DeclareRobustCommand\rmfamily
        {\not@math@alphabet\rmfamily\mathrm
         \romanfamily\rmdefault\kanjifamily\mcdefault\selectfont}
\DeclareRobustCommand\sffamily
        {\not@math@alphabet\sffamily\mathsf
         \romanfamily\sfdefault\kanjifamily\gtdefault\selectfont}
\DeclareRobustCommand\ttfamily
        {\not@math@alphabet\ttfamily\mathtt
         \romanfamily\ttdefault\kanjifamily\gtdefault\selectfont}
\AtBeginDocument{%
  \ifx\mweights@init\@undefined\else  % mweights.sty is loaded
    % my definitions above should have been overwritten, recover it!
    % \selectfont is executed twice but I don't care about speed...
    \expandafter\g@addto@macro\csname rmfamily \endcsname
      {\kanjifamily\mcdefault\selectfont}%
    \expandafter\g@addto@macro\csname sffamily \endcsname
      {\kanjifamily\gtdefault\selectfont}%
    \expandafter\g@addto@macro\csname ttfamily \endcsname
      {\kanjifamily\gtdefault\selectfont}%
  \fi}
\else                          % 2020-02-02
\g@addto@macro\@rmfamilyhook
  {\prepare@family@series@update@kanji{mc}\mcdefault}
\g@addto@macro\@sffamilyhook
  {\prepare@family@series@update@kanji{gt}\gtdefault}
\g@addto@macro\@ttfamilyhook
  {\prepare@family@series@update@kanji{gt}\gtdefault}
\fi
\else % --- for 2020-02-02 or older END & for 2020-10-01 BEGIN
\AddToHook{rmfamily}%
  {\prepare@family@series@update@kanji{mc}\mcdefault}
\AddToHook{sffamily}%
  {\prepare@family@series@update@kanji{gt}\gtdefault}
\AddToHook{ttfamily}%
  {\prepare@family@series@update@kanji{gt}\gtdefault}
\fi   % --- for 2020-10-01 END
%</class|minijs>
%<*class>
%    \end{macrocode}
%
% \begin{macro}{\textmc}
% \begin{macro}{\textgt}
%
% 次のコマンドはイタリック補正なども含めて定義されていますが，
% 和文ではイタリック補正はあまり役に立たず，
% 欧文・和文間のグルーが入らないという副作用もありますので，
% 単純な定義に直します。
%
% [2016-08-26] 和欧文間の |\xkanjiskip| が入らない問題は，
% plfonts.dtx v1.3i (2000/07/13)
% の時点で修正されていました。逆に，\texttt{amsmath}パッケージを
% 読み込んだ場合に，数式内の添字で文字サイズが変化するようになる
% はずのところが，変わらなくなっていましたので，修正しました。
%
% [2017-09-03] Yue ZHANGさん作の\texttt{fixjfm}パッケージが
% |\documentclass| より前に |\RequirePackage{fixjfm}| として
% 読み込まれていた場合には，その定義を優先するため，
% このクラスファイルでは再定義しません。
%
% [2017-09-19] 2010年の\pTeX の修正で，イタリック補正と和欧文間の
% |\xkanjiskip| の衝突が起きなくなっていますから，もうここにある
% ような単純化は必要ありません。ただし，このクラスファイルが
% 古い\TeX 環境で利用される可能性も捨てきれないので，とりあえず
% 残しておきます。
%
%    \begin{macrocode}
\ifx\DeclareFixJFMCJKTextFontCommand\@undefined
\DeclareRobustCommand\textmc[1]{%
    \relax\ifmmode \expandafter\nfss@text \fi{\mcfamily #1}}
\DeclareRobustCommand\textgt[1]{%
    \relax\ifmmode \expandafter\nfss@text \fi{\gtfamily #1}}
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% 新クラスでも \texttt{disablejfam} オプションを与えなければ数式内で
% 日本語が使えるようにしました。
%
% さらに2005/12/01版のLaTeXに対応したpLaTeXに対応しました
% （Thanks: ymtさん）。
%
% [2010-03-14] |http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=411|
% での山本さんのご指摘に従って修正しました。
%
%    \begin{macrocode}
\def\reDeclareMathAlphabet#1#2#3{%
  \edef\@tempa{\expandafter\@gobble\string#2}%
  \edef\@tempb{\expandafter\@gobble\string#3}%
  \edef\@tempc{\string @\expandafter\@gobbletwo\string#2}%
  \ifx\@tempc\@tempa%
    \edef\@tempa{\expandafter\@gobbletwo\string#2}%
    \edef\@tempb{\expandafter\@gobbletwo\string#3}%
  \fi
  \begingroup
    \let\protect\noexpand
    \def\@tempaa{\relax}%
    \expandafter\ifx\csname RDMAorg@\@tempa\endcsname\relax
      \edef\@tempaa{\expandafter\def\expandafter\noexpand%
        \csname RDMAorg@\@tempa\endcsname{%
          \expandafter\noexpand\csname\@tempa\endcsname}}%
    \fi
    \def\@tempbb{\relax}%
    \expandafter\ifx\csname RDMAorg@\@tempb\endcsname\relax
      \edef\@tempbb{\expandafter\def\expandafter\noexpand%
        \csname RDMAorg@\@tempb\endcsname{%
          \expandafter\noexpand\csname\@tempb\endcsname}}%
    \fi
    \edef\@tempc{\@tempaa\@tempbb}%
  \expandafter\endgroup\@tempc%
  \edef#1{\noexpand\protect\expandafter\noexpand\csname%
    \expandafter\@gobble\string#1\space\space\endcsname}%
  \expandafter\edef\csname\expandafter\@gobble\string#1\space\space\endcsname%
    {\noexpand\DualLang@mathalph@bet%
      {\expandafter\noexpand\csname RDMAorg@\@tempa\endcsname}%
      {\expandafter\noexpand\csname RDMAorg@\@tempb\endcsname}%
  }%
}
\@onlypreamble\reDeclareMathAlphabet
\def\DualLang@mathalph@bet#1#2{%
  \relax\ifmmode
    \ifx\math@bgroup\bgroup%     2e normal style     (\mathrm{...})
      \bgroup\let\DualLang@Mfontsw\DLMfontsw@standard
    \else
      \ifx\math@bgroup\relax%    2e two letter style (\rm->\mathrm)
        \let\DualLang@Mfontsw\DLMfontsw@oldstyle
      \else
        \ifx\math@bgroup\@empty% 2.09 oldlfont style ({\mathrm ...})
          \let\DualLang@Mfontsw\DLMfontsw@oldlfont
        \else%                   panic! assume 2e normal style
          \bgroup\let\DualLang@Mfontsw\DLMfontsw@standard
        \fi
      \fi
    \fi
  \else
    \let\DualLang@Mfontsw\@firstoftwo
  \fi
  \DualLang@Mfontsw{#1}{#2}%
}
\def\DLMfontsw@standard#1#2#3{#1{#2{#3}}\egroup}
\def\DLMfontsw@oldstyle#1#2{#1\relax\@fontswitch\relax{#2}}
\def\DLMfontsw@oldlfont#1#2{#1\relax#2\relax}
\if@enablejfam
  \DeclareSymbolFont{mincho}{\jsc@JYn}{mc}{m}{n}
  \DeclareSymbolFontAlphabet{\mathmc}{mincho}
  \SetSymbolFont{mincho}{bold}{\jsc@JYn}{gt}{m}{n}
  \jfam\symmincho
  \DeclareMathAlphabet{\mathgt}{\jsc@JYn}{gt}{m}{n}
  \AtBeginDocument{%
    \reDeclareMathAlphabet{\mathrm}{\@mathrm}{\@mathmc}
    \reDeclareMathAlphabet{\mathbf}{\@mathbf}{\@mathgt}}
\fi
%    \end{macrocode}
%
% \begin{macro}{\textsterling}
%
% これは |\pounds| 命令で実際に呼び出される文字です。
% 従来からのOT1エンコーディングでは |\$| のイタリック体が |\pounds|
% なので \texttt{cmti} が使われていましたが，
% 1994年春からは \texttt{cmu}（upright italic，直立イタリック体）
% に変わりました。
% しかし \texttt{cmu} はその性格からして実験的なものであり，
% |\pounds| 以外で使われるとは思えないので，
% ここでは \texttt{cmti} に戻してしまいます。
%
% [2003-08-20] Computer Modernフォントを使う機会も減り，T1エンコーディング
% が一般的になってきました。この定義はもうあまり意味がないので消します。
%
%    \begin{macrocode}
% \DeclareTextCommand{\textsterling}{OT1}{{\itshape\char`\$}}
%    \end{macrocode}
% \end{macro}
%
% 禁則パラメータも若干修正します。
%
% アスキーの \texttt{kinsoku.dtx} では次の三つが5000に設定されています。
% これを10000に再設定します。
%
%    \begin{macrocode}
\prebreakpenalty\jis"2147=10000      % 5000   ’
\postbreakpenalty\jis"2148=10000     % 5000   “
\prebreakpenalty\jis"2149=10000      % 5000   ”
%    \end{macrocode}
%
% 「\TeX！」「〒515」の記号と数字の間に四分アキが入らないようにします。
%
%    \begin{macrocode}
\inhibitxspcode`！=1
\inhibitxspcode`〒=2
%    \end{macrocode}
%
% 以前の版では，たとえば「ベース名.拡張子」のように和文文字で書いたとき，
% ピリオドの後に四分アキが入らないようにするために
%    \begin{macrocode}
% \xspcode`.=0
%    \end{macrocode}
% のようにしていました。ただ，「Foo Inc.は……」のように書いたときにも
% スペースが入らなくなるので，ちょっとまずい修正だったかもしれません。
% 元に戻しました。
%
% とりあえず「|ベース名.\mbox{}拡張子|」と書いてください。
%
% 「CやC++では……」と書くと，C++の直後に四分アキが入らないのでバランスが悪くなります。
% 四分アキが入るようにしました。\% の両側も同じです。
%
%    \begin{macrocode}
\xspcode`+=3
\xspcode`\%=3
%    \end{macrocode}
%
% これ以外にT1エンコーディングで80〜ffの文字もすべて欧文文字ですので，
% 両側の和文文字との間にスペースが入らなければなりません。
%
%    \begin{macrocode}
\xspcode`^^80=3
\xspcode`^^81=3
\xspcode`^^82=3
\xspcode`^^83=3
\xspcode`^^84=3
\xspcode`^^85=3
\xspcode`^^86=3
\xspcode`^^87=3
\xspcode`^^88=3
\xspcode`^^89=3
\xspcode`^^8a=3
\xspcode`^^8b=3
\xspcode`^^8c=3
\xspcode`^^8d=3
\xspcode`^^8e=3
\xspcode`^^8f=3
\xspcode`^^90=3
\xspcode`^^91=3
\xspcode`^^92=3
\xspcode`^^93=3
\xspcode`^^94=3
\xspcode`^^95=3
\xspcode`^^96=3
\xspcode`^^97=3
\xspcode`^^98=3
\xspcode`^^99=3
\xspcode`^^9a=3
\xspcode`^^9b=3
\xspcode`^^9c=3
\xspcode`^^9d=3
\xspcode`^^9e=3
\xspcode`^^9f=3
\xspcode`^^a0=3
\xspcode`^^a1=3
\xspcode`^^a2=3
\xspcode`^^a3=3
\xspcode`^^a4=3
\xspcode`^^a5=3
\xspcode`^^a6=3
\xspcode`^^a7=3
\xspcode`^^a8=3
\xspcode`^^a9=3
\xspcode`^^aa=3
\xspcode`^^ab=3
\xspcode`^^ac=3
\xspcode`^^ad=3
\xspcode`^^ae=3
\xspcode`^^af=3
\xspcode`^^b0=3
\xspcode`^^b1=3
\xspcode`^^b2=3
\xspcode`^^b3=3
\xspcode`^^b4=3
\xspcode`^^b5=3
\xspcode`^^b6=3
\xspcode`^^b7=3
\xspcode`^^b8=3
\xspcode`^^b9=3
\xspcode`^^ba=3
\xspcode`^^bb=3
\xspcode`^^bc=3
\xspcode`^^bd=3
\xspcode`^^be=3
\xspcode`^^bf=3
\xspcode`^^c0=3
\xspcode`^^c1=3
\xspcode`^^c2=3
\xspcode`^^c3=3
\xspcode`^^c4=3
\xspcode`^^c5=3
\xspcode`^^c6=3
\xspcode`^^c7=3
\xspcode`^^c8=3
\xspcode`^^c9=3
\xspcode`^^ca=3
\xspcode`^^cb=3
\xspcode`^^cc=3
\xspcode`^^cd=3
\xspcode`^^ce=3
\xspcode`^^cf=3
\xspcode`^^d0=3
\xspcode`^^d1=3
\xspcode`^^d2=3
\xspcode`^^d3=3
\xspcode`^^d4=3
\xspcode`^^d5=3
\xspcode`^^d6=3
\xspcode`^^d7=3
\xspcode`^^d8=3
\xspcode`^^d9=3
\xspcode`^^da=3
\xspcode`^^db=3
\xspcode`^^dc=3
\xspcode`^^dd=3
\xspcode`^^de=3
\xspcode`^^df=3
\xspcode`^^e0=3
\xspcode`^^e1=3
\xspcode`^^e2=3
\xspcode`^^e3=3
\xspcode`^^e4=3
\xspcode`^^e5=3
\xspcode`^^e6=3
\xspcode`^^e7=3
\xspcode`^^e8=3
\xspcode`^^e9=3
\xspcode`^^ea=3
\xspcode`^^eb=3
\xspcode`^^ec=3
\xspcode`^^ed=3
\xspcode`^^ee=3
\xspcode`^^ef=3
\xspcode`^^f0=3
\xspcode`^^f1=3
\xspcode`^^f2=3
\xspcode`^^f3=3
\xspcode`^^f4=3
\xspcode`^^f5=3
\xspcode`^^f6=3
\xspcode`^^f7=3
\xspcode`^^f8=3
\xspcode`^^f9=3
\xspcode`^^fa=3
\xspcode`^^fb=3
\xspcode`^^fc=3
\xspcode`^^fd=3
\xspcode`^^fe=3
\xspcode`^^ff=3
%    \end{macrocode}
%
%    \begin{macrocode}
%</class>
%</jsclasses>
%<*class>
%    \end{macrocode}
%
% \begin{macro}{\@}
%
% 欧文といえば，\LaTeX の |\def\@{\spacefactor\@m}| という定義（|\@m| は1000）
% では |I watch TV\@.| と書くと V とピリオドのペアカーニングが効かなくなります。
% そこで，次のような定義に直し，|I watch TV.\@| と書くことにします。
%
% [2016-07-14] 2015-01-01の\LaTeX で，auxiliary filesに書き出されたときに
% スペースが食われないようにする修正が入りました。これに合わせて |{}| を補いました。
%
% \begin{ZRnote}
% BXJSクラスでの変更点：
% \begin{itemize}
% \item |fix-at-cmd| オプションが偽の場合は再定義しない。
% \item 固定の3000でなく実際のピリオドのsfcode値を使う。
% \item 「防御的な |\@|」での不具合を防ぐため、大文字直後の |\@|
%   は標準と同等の動作にする。
% \end{itemize}
% \end{ZRnote}
%
%    \begin{macrocode}
\chardef\bxjs@periodchar=`\.
\bxjs@robust@def\bxjs@SE{%
  \ifnum\spacefactor<\@m \spacefactor\@m
  \else \spacefactor\sfcode\bxjs@periodchar
  \fi}
\ifbxjs@fix@at@cmd
  \def\@{\bxjs@SE{}}
\fi
%    \end{macrocode}
% \end{macro}
%
% \section{フォントサイズ}
%
% フォントサイズを変える命令（|\normalsize|，|\small| など）
% の実際の挙動の設定は，三つの引数をとる命令 |\@setfontsize| を使って，
% たとえば
% \begin{quote}
%   |\@setfontsize{\normalsize}{10}{16}|
% \end{quote}
% のようにして行います。これは
% \begin{quote}
%   |\normalsize| は10ポイントのフォントを使い，行送りは16ポイントである
% \end{quote}
% という意味です。
% ただし，処理を速くするため，
% 以下では10と同義の\LaTeX の内部命令 |\@xpt| を使っています。
% この |\@xpt| の類は次のものがあり，\LaTeX 本体で定義されています。
%\begin{verbatim}
%   \@vpt      5         \@vipt    6      \@viipt   7
%   \@viiipt   8         \@ixpt    9      \@xpt    10
%   \@xipt    10.95      \@xiipt  12      \@xivpt  14.4
%\end{verbatim}
%
% ここでは |\@setfontsize| の定義を少々変更して，
% 段落の字下げ |\parindent|，
% 和文文字間のスペース |\kanjiskip|，
% 和文・欧文間のスペース |\xkanjiskip| を変更しています。
%
% |\kanjiskip| は\pLaTeXe で |0pt plus .4pt minus .5pt| に設定していますが，
% これはそもそも文字サイズの変更に応じて変わるべきものです。
% それに，プラスになったりマイナスになったりするのは，
% 追い出しと追い込みの混在が生じ，統一性を欠きます。
% なるべく追い出しになるようにプラスの値だけにしたいところですが，
% ごくわずかなマイナスは許すことにしました。
%
% |\xkanjiskip| については，四分つまり全角の1/4を標準として，
% 追い出すために三分あるいは二分まで延ばすのが一般的ですが，
% ここではTimesやPalatinoのスペースがほぼ四分であることに着目して，
% これに一致させています。これなら書くときにスペースを空けても
% 空けなくても同じ出力になります。
%
% |\parindent| については，0（以下）でなければ全角幅（1zw）に直します。
%
% [2008-02-18] |english| オプションで |\parindent| を 1em にしました。
%
% \begin{ZRnote}
% |\fontsize| 命令（|\large| 等でなく）でフォントサイズ変更した場合
% にもフックが実行されるように、|\@setfontsize| では
% なく |\set@fontsize| に対してパッチを当てるように変更。
% \begin{macro}{\bxjs@patch@set@fontsize}
% |\set@fontsize| にパッチを当てる。
% \Note |\set@fontsize| を書き換えるパッケージへの対策のため、
% クラス読込中に複数回実行する。
% 前回の実行直後から |\set@fontsize| が更新されている場合にのみ
% 実際にパッチを当てる。
% \TODO[3.0] 新しい{\LaTeX}カーネルで |selectfont| フックを利用する。
%    \begin{macrocode}
%\let\bxjs@prev@set@fontsize\@undefined
\@onlypreamble\bxjs@patch@set@fontsize
\def\bxjs@patch@set@fontsize{%
  \ifx\bxjs@prev@set@fontsize\set@fontsize\else
    \def\bxjs@tmpa{\def\set@fontsize####1####2####3}%
\expandafter\bxjs@tmpa\expandafter{%
  \set@fontsize{##1}{##2}{##3}%
% 末尾にコードを追加
  \expandafter\def\expandafter\size@update\expandafter{%
    \size@update
    \jsFontSizeChanged}%
}
    \let\bxjs@prev@set@fontsize\set@fontsize
  \fi}
%    \end{macrocode}
% \end{macro}
% この場とパッケージ末尾で作動させる。
%    \begin{macrocode}
\bxjs@patch@set@fontsize
\AtEndOfClass{\bxjs@patch@set@fontsize}
%    \end{macrocode}
%
% \begin{macro}{\jsFontSizeChanged}
% フォントサイズ変更時に呼ばれるフック。
% |\jsZw| を再設定している。
% その後でユーザ定義用のフック |\jsResetDimen| を実行する。
%    \begin{macrocode}
\newcommand*\jsFontSizeChanged{%
  \jsZw=\f@size\p@
  \jsZw=\jsScale \jsZw
  \ifdim\parindent>\z@
    \if@english \parindent=1em
    \else       \parindent=1\jsZw
    \fi
  \fi\relax
  \jsResetDimen}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jsResetDimen}
% ユーザ定義用のフック。
%    \begin{macrocode}
\providecommand*\jsResetDimen{}
%    \end{macrocode}
% \end{macro}
% \end{ZRnote}
%
% \begin{macro}{\jsc@setfontsize}
% クラスファイルの内部では，拡大率も考慮した |\jsc@setfontsize| を
% |\@setfontsize| の変わりに用いることにします。
%    \begin{macrocode}
\ifjsc@mag
  \let\jsc@setfontsize\@setfontsize
\else
  \def\jsc@setfontsize#1#2#3{%
    \@setfontsize#1{#2\jsc@mpt}{#3\jsc@mpt}}
% microtype対策
  \ifjsWitheTeX\if j\jsEngine\else
    \def\jsc@setfontsize#1#2#3{%
      \edef\bxjs@sfs@next{%
        \unexpanded{\@setfontsize#1}%
           {\the\dimexpr#2\jsc@mpt\relax}{\the\dimexpr#3\jsc@mpt\relax}%
      }\bxjs@sfs@next}
  \fi\fi
\fi
%    \end{macrocode}
% \end{macro}
%
% これらのグルーをもってしても行分割ができない場合は，
% |\emergencystretch| に訴えます。
%
% \begin{ZRnote}
% これはフォントサイズ非依存なので |\Cwd| で書くのが適当だが、
% |\Cwd| はまだ定義されていない。
% \end{ZRnote}
%    \begin{macrocode}
\emergencystretch 3\jsZw
%    \end{macrocode}
%
% \begin{macro}{\ifnarrowbaselines}
% \begin{macro}{\narrowbaselines}
% \begin{macro}{\widebaselines}
%
% 欧文用に行間を狭くする論理変数と，それを真・偽にするためのコマンドです。
%
% [2003-06-30] 数式に入るところで |\narrowbaselines|
% を実行しているので |\abovedisplayskip| 等が初期化
% されてしまうというshintokさんのご指摘に対して，
% しっぽ愛好家さんが次の修正を教えてくださいました。
%
% [2008-02-18] |english| オプションで最初の段落のインデントをしないようにしました。
%
% TODO: Hasumiさん [qa:54539] のご指摘は考慮中です。
%
% \begin{ZRnote}
% 別行立て数式に入るときに |\narrowbaselines| が呼ばれるが、
% このコードでは「数式中で |\normalsize| などのサイズ命令
% （|\@currsize| の実体）が呼ばれた」ことになり警告が出る。
% JSクラスでは、|\@setfontsize| 中の |\@nomath| 実行を消して
% 「そもそもサイズ命令で警告が出ない」ようにしている。
% 警告が常に出ないのも望ましくないので、BXJSクラスの実装では、
% |\narrowbaselines| の時だけ警告が出ないようにする。
% \end{ZRnote}
%
%    \begin{macrocode}
\newif\ifnarrowbaselines
\if@english
  \narrowbaselinestrue
\fi
\def\narrowbaselines{%
  \narrowbaselinestrue
  \skip0=\abovedisplayskip
  \skip2=\abovedisplayshortskip
  \skip4=\belowdisplayskip
  \skip6=\belowdisplayshortskip
% 一時的に警告を無効化する
  \let\bxjs@save@nomath\@nomath
  \let\@nomath\@gobble
  \@currsize\selectfont
  \let\@nomath\bxjs@save@nomath
  \abovedisplayskip=\skip0
  \abovedisplayshortskip=\skip2
  \belowdisplayskip=\skip4
  \belowdisplayshortskip=\skip6\relax}
\def\widebaselines{\narrowbaselinesfalse\@currsize\selectfont}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{ZRnote}
% |microtype| パッケージを読み込んだ場合、|\normalsize| 等の
% フォントサイズ変更命令の定義の中にif文が使われていると、
% 不可解なエラーが発生する。
% これは |microtype| が邪悪なトリックを使用しているせいなのだが、
% 一応こちら側で対策をとることにする。
% \begin{macro}{\bxjs@if@narrowbaselines}
% スイッチ |narrowbaselines| を{\LaTeX}式条件文にしたもの。
%    \begin{macrocode}
\def\bxjs@if@narrowbaselines{%
  \ifnarrowbaselines\expandafter\@firstoftwo
  \else \expandafter\@secondoftwo
  \fi
}
%    \end{macrocode}
% \end{macro}
% \end{ZRnote}
%
% \begin{macro}{\normalsize}
%
% 標準のフォントサイズと行送りを選ぶコマンドです。
%
% 本文10ポイントのときの行送りは，
% 欧文の標準クラスファイルでは12ポイント，
% アスキーの和文クラスファイルでは15ポイントになっていますが，
% ここでは16ポイントにしました。
% ただし |\narrowbaselines| で欧文用の12ポイントになります。
%
% 公称10ポイントの和文フォントが約9.25ポイント
% （アスキーのものの0.961倍）であることもあり，
% 行送りがかなりゆったりとしたと思います。
% 実際，$16/9.25 \approx 1.73$ であり，
% 和文の推奨値の一つ「二分四分」（1.75）
% に近づきました。
%
% \begin{ZRnote}
% |microtype| 対策のためif文を避ける。
% 後の |\small|・|\footnotesize| も同様。
% \end{ZRnote}
%    \begin{macrocode}
\renewcommand{\normalsize}{%
  \bxjs@if@narrowbaselines{%
    \jsc@setfontsize\normalsize\@xpt\@xiipt
  }{%else
    \jsc@setfontsize\normalsize\@xpt{\n@baseline}%
  }%
%    \end{macrocode}
%
% 数式の上のアキ（|\abovedisplayskip|），
% 短い数式の上のアキ（|\abovedisplayshortskip|），
% 数式の下のアキ（|\belowdisplayshortskip|）の設定です。
%
% [2003-02-16] ちょっと変えました。
%
% [2009-08-26] \TeX\ Q\,\&\,A 52569から始まる議論について逡巡して
% いましたが，結局，微調節してみることにしました。
%
%    \begin{macrocode}
  \abovedisplayskip 11\jsc@mpt \@plus3\jsc@mpt \@minus4\jsc@mpt
  \abovedisplayshortskip \z@ \@plus3\jsc@mpt
  \belowdisplayskip 9\jsc@mpt \@plus3\jsc@mpt \@minus4\jsc@mpt
  \belowdisplayshortskip \belowdisplayskip
%    \end{macrocode}
%
% 最後に，リスト環境のトップレベルのパラメータ |\@listI| を，
% |\@listi| にコピーしておきます。|\@listI| の設定は後で出てきます。
%
%    \begin{macrocode}
  \let\@listi\@listI}
%    \end{macrocode}
%
% ここで実際に標準フォントサイズで初期化します。
%
%    \begin{macrocode}
%</class>
%<*class|minijs>
%% initialize
\normalsize
%</class|minijs>
%<*class>
%    \end{macrocode}
%
% \end{macro}
%
% \begin{macro}{\Cht}
% \begin{macro}{\Cdp}
% \begin{macro}{\Cwd}
% \begin{macro}{\Cvs}
% \begin{macro}{\Chs}
%
% 基準となる長さの設定をします。
% \pLaTeXe カーネル（\texttt{plfonts.dtx}）で宣言されている
% パラメータに実際の値を設定します。
% たとえば |\Cwd| は |\normalfont| の全角幅（1zw）です。
%
% [2017-08-31] 基準とする文字を「全角空白」（EUCコード\texttt{0xA1A1}）から
% 「漢」（JISコード\texttt{0x3441}）へ変更しました。
%
% \begin{ZRnote}
% |\Cwd| 等の変数は{\pTeX}系以外では未定義なのでここで定義する。
%    \begin{macrocode}
\ifx\Cht\@undefined \newdimen\Cht \fi
\ifx\Cdp\@undefined \newdimen\Cdp \fi
\ifx\Cwd\@undefined \newdimen\Cwd \fi
\ifx\Cvs\@undefined \newdimen\Cvs \fi
\ifx\Chs\@undefined \newdimen\Chs \fi
%    \end{macrocode}
%
% 規約上、現在の |\jsZw| の値が |\Cwd| である。
% BXJSでは |\Cht| と |\Cdp| は単純に |\Cwd| の88\%と12\%の値とする。
% \end{ZRnote}
%    \begin{macrocode}
\setlength\Cht{0.88\jsZw}
\setlength\Cdp{0.12\jsZw}
\setlength\Cwd{1\jsZw}
\setlength\Cvs{\baselineskip}
\setlength\Chs{1\jsZw}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\small}
%
% |\small| も |\normalsize| と同様に設定します。
% 行送りは，|\normalsize| が16ポイントなら，
% 割合からすれば$16 \times 0.9 = 14.4$ポイントになりますが，
% |\small| の使われ方を考えて，ここでは和文13ポイント，
% 欧文11ポイントとします。
% また，|\topsep| と |\parsep| は，元はそれぞれ$4 \pm 2$，$2 \pm 1$
% ポイントでしたが，ここではゼロ（|\z@|）にしました。
%
%    \begin{macrocode}
\newcommand{\small}{%
  \bxjs@if@narrowbaselines{%
%<!kiyou>    \jsc@setfontsize\small\@ixpt{11}%
%<kiyou>    \jsc@setfontsize\small{8.8888}{11}%
  }{%else
%<!kiyou>    \jsc@setfontsize\small\@ixpt{13}%
%<kiyou>    \jsc@setfontsize\small{8.8888}{13.2418}%
  }%
  \abovedisplayskip 9\jsc@mpt \@plus3\jsc@mpt \@minus4\jsc@mpt
  \abovedisplayshortskip  \z@ \@plus3\jsc@mpt
  \belowdisplayskip \abovedisplayskip
  \belowdisplayshortskip \belowdisplayskip
  \def\@listi{\leftmargin\leftmargini
              \topsep \z@
              \parsep \z@
              \itemsep \parsep}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\footnotesize}
%
% |\footnotesize| も同様です。
% |\topsep| と |\parsep| は，元はそれぞれ$3 \pm 1$，$2 \pm 1$
% ポイントでしたが，ここではゼロ（|\z@|）にしました。
%
%    \begin{macrocode}
\newcommand{\footnotesize}{%
  \bxjs@if@narrowbaselines{%
%<!kiyou>    \jsc@setfontsize\footnotesize\@viiipt{9.5}%
%<kiyou>    \jsc@setfontsize\footnotesize{8.8888}{11}%
  }{%else
%<!kiyou>    \jsc@setfontsize\footnotesize\@viiipt{11}%
%<kiyou>    \jsc@setfontsize\footnotesize{8.8888}{13.2418}%
  }%
  \abovedisplayskip 6\jsc@mpt \@plus2\jsc@mpt \@minus3\jsc@mpt
  \abovedisplayshortskip  \z@ \@plus2\jsc@mpt
  \belowdisplayskip \abovedisplayskip
  \belowdisplayshortskip \belowdisplayskip
  \def\@listi{\leftmargin\leftmargini
              \topsep \z@
              \parsep \z@
              \itemsep \parsep}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\scriptsize}
% \begin{macro}{\tiny}
% \begin{macro}{\large}
% \begin{macro}{\Large}
% \begin{macro}{\LARGE}
% \begin{macro}{\huge}
% \begin{macro}{\Huge}
% \begin{macro}{\HUGE}
%
% それ以外のサイズは，本文に使うことがないので，
% 単にフォントサイズと行送りだけ変更します。
% 特に注意すべきは |\large| で，
% これは二段組のときに節見出しのフォントとして使い，
% 行送りを |\normalsize| と同じにすることによって，
% 節見出しが複数行にわたっても段間で行が揃うようにします。
%
% [2004-11-03] |\HUGE| を追加。
%
%    \begin{macrocode}
\newcommand{\scriptsize}{\jsc@setfontsize\scriptsize\@viipt\@viiipt}
\newcommand{\tiny}{\jsc@setfontsize\tiny\@vpt\@vipt}
\if@twocolumn
%<!kiyou>  \newcommand{\large}{\jsc@setfontsize\large\@xiipt{\n@baseline}}
%<kiyou>  \newcommand{\large}{\jsc@setfontsize\large{11.111}{\n@baseline}}
\else
%<!kiyou>  \newcommand{\large}{\jsc@setfontsize\large\@xiipt{17}}
%<kiyou>  \newcommand{\large}{\jsc@setfontsize\large{11.111}{17}}
\fi
%<!kiyou>\newcommand{\Large}{\jsc@setfontsize\Large\@xivpt{21}}
%<kiyou>\newcommand{\Large}{\jsc@setfontsize\Large{12.222}{21}}
\newcommand{\LARGE}{\jsc@setfontsize\LARGE\@xviipt{25}}
\newcommand{\huge}{\jsc@setfontsize\huge\@xxpt{28}}
\newcommand{\Huge}{\jsc@setfontsize\Huge\@xxvpt{33}}
\newcommand{\HUGE}{\jsc@setfontsize\HUGE{30}{40}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% 別行立て数式の中では |\narrowbaselines| にします。
% 和文の行送りのままでは，行列や場合分けの行送り，
% 連分数の高さなどが不釣合いに大きくなるためです。
%
% 本文中の数式の中では |\narrowbaselines| にしていません。
% 本文中ではなるべく行送りが変わるような大きいものを使わず，
% 行列は |amsmath| の |smallmatrix| 環境を使うのがいいでしょう。
%
%    \begin{macrocode}
\everydisplay=\expandafter{\the\everydisplay \narrowbaselines}
%    \end{macrocode}
%
% しかし，このおかげで別行数式の上下のスペースが少し違ってしまいました。
% とりあえず |amsmath| の |equation| 関係は |okumacro| のほうで逃げていますが，
% もっとうまい逃げ道があればお教えください。
%
% 見出し用のフォントは |\bfseries| 固定ではなく，|\headfont|
% という命令で定めることにします。
% これは太ゴシックが使えるときは |\sffamily| |\bfseries|
% でいいと思いますが，通常の中ゴシックでは単に |\sffamily|
% だけのほうがよさそうです。
% 『p\LaTeXe 美文書作成入門』（1997年）では |\sffamily|
% |\fontseries{sbc}| として新ゴMと合わせましたが，
% |\fontseries{sbc}| はちょっと幅が狭いように感じました。
%
%    \begin{macrocode}
% \newcommand{\headfont}{\bfseries}
\newcommand{\headfont}{\sffamily}
% \newcommand{\headfont}{\sffamily\fontseries{sbc}\selectfont}
%    \end{macrocode}
%
% \section{レイアウト}
%
% \paragraph{二段組}
%
% \begin{macro}{\columnsep}
% \begin{macro}{\columnseprule}
%
% |\columnsep| は二段組のときの左右の段間の幅です。
% 元は10ptでしたが，2zwにしました。
% このスペースの中央に |\columnseprule| の幅の罫線が引かれます。
%
%    \begin{macrocode}
%<!kiyou>\setlength\columnsep{2\Cwd}
%<kiyou>\setlength\columnsep{28truebp}
\setlength\columnseprule{\z@}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \paragraph{段落}
%
% \begin{macro}{\lineskip}
% \begin{macro}{\normallineskip}
% \begin{macro}{\lineskiplimit}
% \begin{macro}{\normallineskiplimit}
%
% 上下の行の文字が |\lineskiplimit| より接近したら，
% |\lineskip| より近づかないようにします。
% 元は0ptでしたが1ptに変更しました。
% \texttt{normal...} の付いた方は保存用です。
%
%    \begin{macrocode}
\setlength\lineskip{1\jsc@mpt}
\setlength\normallineskip{1\jsc@mpt}
\setlength\lineskiplimit{1\jsc@mpt}
\setlength\normallineskiplimit{1\jsc@mpt}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\baselinestretch}
%
% 実際の行送りが |\baselineskip| の何倍かを表すマクロです。たとえば
% \begin{quote}
%   |\renewcommand{\baselinestretch}{2}|
% \end{quote}
% とすると，行送りが通常の2倍になります。ただし，
% これを設定すると，たとえ |\baselineskip| が伸縮するように
% 設定しても，行送りの伸縮ができなくなります。
% 行送りの伸縮はしないのが一般的です。
%
%    \begin{macrocode}
\renewcommand{\baselinestretch}{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\parskip}
% \begin{macro}{\parindent}
%
% |\parskip| は段落間の追加スペースです。
% 元は 0pt plus 1pt になっていましたが，ここではゼロにしました。
% |\parindent| は段落の先頭の字下げ幅です。
%
%    \begin{macrocode}
\setlength\parskip{\z@}
\if@slide
  \setlength\parindent{0\p@}
\else
  \setlength\parindent{1\Cwd}
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@lowpenalty}
% \begin{macro}{\@medpenalty}
% \begin{macro}{\@highpenalty}
%
% |\nopagebreak|，|\nolinebreak| は引数に応じて次のペナルティ値
% のうちどれかを選ぶようになっています。
% ここはオリジナル通りです。
%
%    \begin{macrocode}
\@lowpenalty   51
\@medpenalty  151
\@highpenalty 301
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\interlinepenalty}
%
% 段落中の改ページのペナルティです。デフォルトは 0 です。
%
%    \begin{macrocode}
% \interlinepenalty 0
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\brokenpenalty}
%
% ページの最後の行がハイフンで終わる際のペナルティです。
% デフォルトは100です。
%
%    \begin{macrocode}
% \brokenpenalty 100
%    \end{macrocode}
% \end{macro}
%
% \subsection{ページレイアウト}
%
% \begin{ZRnote}
% BXJSではページレイアウトの処理は |geometry| パッケージが担当している。
% \end{ZRnote}
%
% \paragraph{準備 \ZRX}
% \mbox{}
%
% \begin{macro}{\bxjs@bd@pre@geometry@hook}
% begin-documentフックのコード内で、|geometry| パッケージが挿入する
% コードの直前で実行されるフック。
%    \begin{macrocode}
\@onlypreamble\bxjs@bd@pre@geometry@hook
\let\bxjs@bd@pre@geometry@hook\@empty
%    \end{macrocode}
% \end{macro}
%
% 現状ではここで |\mag| を設定している。
%
% |\topskip| も指定する。
%    \begin{macrocode}
\ifjsc@mag
\mag=\bxjs@param@mag
\fi
\setlength{\topskip}{10\jsc@mpt}
%    \end{macrocode}
%
% |\jsSetQHLength| のための和文単位の定義。
%    \begin{macrocode}
\def\bxjs@unit@trueQ{0.25truemm}\let\bxjs@unit@trueH\bxjs@unit@trueQ
\def\bxjs@unit@zw{\jsZw}\let\bxjs@unit@zh\bxjs@unit@zw
%    \end{macrocode}
%
% |\bxjs@param@paper| が長さ指定の場合、
% |geometry| の形式（|papersize={W,H}|）に変換する。
% |{W}{H}| の形式について。
%    \begin{macrocode}
\@tempswafalse
\def\bxjs@tmpdo{\@ifnextchar\bgroup\bxjs@tmpdo@a\remove@to@nnil}
\def\bxjs@tmpdo@a#1{\edef\bxjs@tmpa{#1}%
  \@ifnextchar\bgroup\bxjs@tmpdo@b\remove@to@nnil}
\def\bxjs@tmpdo@b#1{\edef\bxjs@tmpa{\bxjs@tmpa,#1}%
  \@ifnextchar\@nnil\bxjs@tmpdo@c\remove@to@nnil}
\def\bxjs@tmpdo@c\@nnil{\@tempswatrue
  \edef\bxjs@param@paper{papersize={\bxjs@tmpa}}}
\expandafter\bxjs@tmpdo\bxjs@param@paper\@nnil
%    \end{macrocode}
% |W,H| の形式について。
%    \begin{macrocode}
\if@tempswa\else
  \def\bxjs@tmpa{\@nil,\@nil}
  \def\bxjs@tmpdo#1,#2,#3\@nnil{%
    \def\bxjs@tmpb{#3}\ifx\bxjs@tmpa\bxjs@tmpb
      \@tempswatrue\edef\bxjs@param@paper{papersize={#1,#2}}\fi}
  \expandafter\bxjs@tmpdo\bxjs@param@paper,\@nil,\@nil\@nnil
\fi
%    \end{macrocode}
% |W*H| の形式について。
%    \begin{macrocode}
\if@tempswa\else
  \def\bxjs@tmpa{\@nil*\@nil}
  \def\bxjs@tmpdo#1*#2*#3\@nnil{%
    \def\bxjs@tmpb{#3}\ifx\bxjs@tmpa\bxjs@tmpb
      \@tempswatrue\edef\bxjs@param@paper{papersize={#1,#2}}\fi}
  \expandafter\bxjs@tmpdo\bxjs@param@paper*\@nil*\@nil\@nnil
\fi
%    \end{macrocode}
%
% \begin{macro}{\bxjs@layout@paper}
% |geometry| の用紙設定のオプション。
%    \begin{macrocode}
\edef\bxjs@layout@paper{%
  \ifjsc@mag truedimen,\fi
  \if@landscape landscape,\fi
  \bxjs@param@paper}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@layout}
% |geometry| のページレイアウトのオプション列。
% 文書クラス毎に異なる。
%    \begin{macrocode}
%<*article|report>
\def\bxjs@layout@base{%
  headheight=\topskip,footskip=0.03367\paperheight,%
  headsep=\footskip-\topskip,includeheadfoot,%
}
\edef\bxjs@layout{\bxjs@layout@base
  hscale=0.76,hmarginratio=1:1,%
  vscale=0.83,vmarginratio=1:1,%
}
%</article|report>
%<*book>
\def\bxjs@layout@base{%
  headheight=\topskip,headsep=6\jsc@mmm,nofoot,includeheadfoot,%
}
\ifbxjs@layout@buggyhmargin     %---
% アレ
\edef\bxjs@layout{\bxjs@layout@base
  hmargin=36\jsc@mmm,hmarginratio=1:1,%
  vscale=0.83,vmarginratio=1:1,%
}
\else                           %---
% 非アレ
\edef\bxjs@layout{\bxjs@layout@base
  hmargin=18\jsc@mmm,%
  vscale=0.83,vmarginratio=1:1,%
}
\fi                             %---
%</book>
%<*slide>
\def\bxjs@layout@base{%
  noheadfoot,%
}
\edef\bxjs@layout{\bxjs@layout@base
  hscale=0.9,hmarginratio=1:1,%
  vscale=0.944,vmarginratio=1:1,%
}
%</slide>
%    \end{macrocode}
% \end{macro}
%
% |textwidth| オプションの設定を反映する。
%    \begin{macrocode}
%<*!book>
\ifx\bxjs@textwidth@opt\@undefined\else
  \jsSetQHLength\@tempdima{\bxjs@textwidth@opt}
  \edef\bxjs@layout{\bxjs@layout width=\the\@tempdima,}
\fi
%</!book>
\ifx\bxjs@number@of@lines@opt\@undefined\else
  \bxjs@gset@tempcnta{\bxjs@number@of@lines@opt}
  \edef\bxjs@layout{\bxjs@layout lines=\the\@tempcnta,}
\fi
%    \end{macrocode}
%
% \begin{macro}{\fullwidth}
% 〔寸法レジスタ〕
% ヘッダ・フッタ領域の横幅。
%    \begin{macrocode}
\newdimen\fullwidth
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@textwidth@limit}
% 〔寸法値マクロ〕
% |bxjsbook| における、|\textwidth| 上限の値。
%
% \begin{macro}{\jsTextWidthLimit}
% 〔実数値マクロ〕
% |\bxjs@textwidth@limit| の全角（|\Cwd|）単位での値。
%    \begin{macrocode}
%<*book>
\newcommand\jsTextWidthLimit{40}
\@tempdima=\jsTextWidthLimit\Cwd
\ifx\bxjs@textwidth@limit@opt\@undefined\else
  \bxjs@gset@tempcnta{\bxjs@textwidth@limit@opt}
  \@tempdima=\@tempcnta\Cwd
\fi
\ifx\bxjs@textwidth@opt\@undefined\else
  \jsSetQHLength\@tempdima{\bxjs@textwidth@opt}
\fi
\edef\bxjs@textwidth@limit{\the\@tempdima}
\ifdim\@tempdima=\jsTextWidthLimit\Cwd\else
  \bxjs@invscale\@tempdima{\strip@pt\Cwd}
  \long\edef\jsTextWidthLimit{\strip@pt\@tempdima}
\fi
%</book>
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\bxjs@preproc@layout}
% |geometry| の前処理。
%
% |geometry| は |\topskip| が標準の行高（|\ht\strutbox|）より小さくならない
% ようにする自動調整を行うが、これをどうするかは未検討。
% 今のところ、単純に回避（無効化）している。
%    \begin{macrocode}
\def\bxjs@preproc@layout{%
  \edef\bxjs@save@ht@strutbox{\the\ht\strutbox}\ht\strutbox=10\jsc@mpt}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@postproc@layout}
% |geometry| の後処理。
%    \begin{macrocode}
\def\bxjs@postproc@layout{%
%    \end{macrocode}
% |geometry| のドライバを再設定する。
%    \begin{macrocode}
  \ifx\bxjs@geometry@driver\relax\else
    \let\Gm@driver\bxjs@geometry@driver
  \fi
%    \end{macrocode}
% |\ht\strutbox| の値を元に戻す。
%    \begin{macrocode}
  \ht\strutbox=\bxjs@save@ht@strutbox\relax
%    \end{macrocode}
% |\textwidth| の値を補正する。
%    \begin{macrocode}
  \ifbxjs@whole@zw@lines
    \@tempdimb=\textwidth
    \if@twocolumn \@tempdima=2\Cwd \else \@tempdima=1\Cwd \fi
    \advance\textwidth.005pt\relax
    \divide\textwidth\@tempdima \multiply\textwidth\@tempdima
    \advance\@tempdimb-\textwidth
    \advance\oddsidemargin 0.5\@tempdimb
    \advance\evensidemargin 0.5\@tempdimb
  \fi
  \fullwidth=\textwidth
%    \end{macrocode}
% |bxjsbook| の場合は、|geometry| が設定した |\textwidth| は |\fullwidth| と
% して扱い、その値から実際の |\textwidth| を導出する。
%    \begin{macrocode}
%<*book>
  \@tempdima=\bxjs@textwidth@limit\relax
  \ifbxjs@whole@zw@lines
    \advance\@tempdima.005pt\relax
    \divide\@tempdima\Cwd \multiply\@tempdima\Cwd
  \fi
  \ifdim\textwidth>\@tempdima
    \textwidth=\@tempdima
    \addtolength\evensidemargin{\fullwidth-\textwidth}
  \fi
%</book>
%    \end{macrocode}
% |\textheight| 関連の調整。
%    \begin{macrocode}
  \@tempdimb=\textheight
  \advance\textheight-\topskip
  \advance\textheight.005pt\relax
  \divide\textheight\baselineskip \multiply\textheight\baselineskip
  \advance\textheight\topskip
  \advance\@tempdimb-\textheight
  \advance\topmargin0.5\@tempdimb
%    \end{macrocode}
% |\headheight| 関連の調整。
%    \begin{macrocode}
  \@tempdima=\topskip
  \advance\headheight\@tempdima
  \advance\topmargin-\@tempdima
%    \end{macrocode}
% marginpar関連の調整。
%    \begin{macrocode}
  \setlength\marginparsep{\columnsep}
  \setlength\marginparpush{\baselineskip}
  \setlength\marginparwidth{\paperwidth-\oddsidemargin-1truein%
      -\textwidth-10\jsc@mmm-\marginparsep}
  \ifbxjs@whole@zw@lines
    \divide\marginparwidth\Cwd \multiply\marginparwidth\Cwd
  \fi
%    \end{macrocode}
% 連動する変数。
%    \begin{macrocode}
  \maxdepth=.5\topskip
  \stockwidth=\paperwidth
  \stockheight=\paperheight
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jsGeometryOptions}
% |geometry|パッケージに渡すオプションのリスト。
% \Note |geometry=user| 指定時にユーザが利用することを想定している。
%    \begin{macrocode}
\edef\jsGeometryOptions{%
  \bxjs@layout@paper,\bxjs@layout}
%    \end{macrocode}
% \end{macro}
%
% \paragraph{geometry パッケージを読み込む \ZRX}
% \mbox{}
%
% \begin{macro}{\bxjs@apply@bd@pre@geometry@hook}
% |geometry| パッケージのbegin-documentフックの処理に割り込む。
% \Note {\LaTeX}のフックシステムがある場合はムニャムニャ。
%    \begin{macrocode}
\def\bxjs@geometry@name{geometry}
\ifbxjs@old@hook@system
  \let\bxjs@apply@bd@pre@geometry@hook\AtBeginDocument
\else
  \def\bxjs@apply@bd@pre@geometry@hook{%
    \AddToHook{begindocument}[\bxjs@geometry@name]}
\fi
%    \end{macrocode}
% \end{macro}
%
% |geoemtry=class| の場合に、実際に |geometry| パッケージを読みこむ。
%    \begin{macrocode}
\ifx\bxjs@geometry\bxjs@geometry@@class
%    \end{macrocode}
%
% |geometry| のドライバオプション指定。
% |nopapersize| 指定時は、special命令出力を抑止するために
% ドライバを |none| にする。
% そうでない場合は、クラスで指定したドライバオプションが引き継がれる
% ので何もしなくてよいが、例外として、ドライバが |dvipdfmx| の
% 時は、現状の |geometry| は |dvipdfm| を指定する必要がある。
%    \begin{macrocode}
\ifbxjs@papersize
  \ifx\bxjs@driver@given\bxjs@driver@@dvipdfmx
    \PassOptionsToPackage{dvipdfm}{geometry}
  \else\ifx\bxjs@driver@given\bxjs@driver@@dvimode
    \PassOptionsToPackage{dvipdfm}{geometry}
  \fi\fi
  \let\bxPapersizeSpecialDone=t
\else
  \PassOptionsToPackage{driver=none}{geometry}
\fi
%    \end{macrocode}
%
% ここで |geometry| を読み込む。
% \Note |geometry| のbegin-documentフックにおいて、{\LuaTeX}の
% 旧版互換を有効にする。
%    \begin{macrocode}
\bxjs@apply@bd@pre@geometry@hook{%
  \bxjs@bd@pre@geometry@hook
  \@nameuse{ImposeOldLuaTeXBehavior}}
\bxjs@preproc@layout
\edef\bxjs@next{%
  \noexpand\RequirePackage[\bxjs@layout@paper,\bxjs@layout]{geometry}%
}\bxjs@next
\bxjs@apply@bd@pre@geometry@hook{\@nameuse{RevokeOldLuaTeXBehavior}}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@geometry@driver}
% |geometry| が用いるドライバの名前。
% \Note この値は一度決めた後は変わってほしくないので、
% |\bxjs@postproc@layout| において書き戻す処理を入れている。
%    \begin{macrocode}
\let\bxjs@geometry@driver\Gm@driver
\bxjs@postproc@layout
%    \end{macrocode}
% \end{macro}
%
% |geometry| のドライバ自動判別に対する前処理。
%    \begin{macrocode}
\g@addto@macro\bxjs@bd@pre@geometry@hook{%
%    \end{macrocode}
% BXJSの2.0版より、|geometry| の4.x版のサポートは廃止された。
%    \begin{macrocode}
    \@ifpackagelater{geometry}{2010/02/12}{}{%else
      \PackageError\bxjs@clsname
       {Your 'geometry' package is too old (< v5.0)}%
       {\@ehc}%
      \let\Gm@driver\relax}%
%    \end{macrocode}
% エンジンが |platex-ng| の時は |geometry| のドライバを |pdftex| にする。
%    \begin{macrocode}
    \ifjsWithpTeXng
      \ifx\Gm@driver\@empty
        \def\Gm@driver{pdftex}%
      \fi
    \fi}
%    \end{macrocode}
%
% \begin{macro}{\setpagelayout}
% ページレイアウト設定のためのユーザ命令。
%    \begin{macrocode}
\def\setpagelayout{%
  \bxjs@ifplus{\bxjs@setpagelayout@a\tw@}{%else
    \@ifstar{\bxjs@setpagelayout@a\@ne}{\bxjs@setpagelayout@a\z@}}}
\def\bxjs@setpagelayout@a#1#2{%
  \ifcase#1% modify
    \def\bxjs@next{\ifjsc@mag truedimen,\fi #2}%
  \or% reset(*)
    \def\bxjs@next{reset,\bxjs@layout@paper,#2}%
  \or% semireset(+)
    \def\bxjs@next{reset,\bxjs@layout@paper,\bxjs@layout@base,#2}%
  \fi
  \bxjs@preproc@layout
  \edef\bxjs@next{%
    \noexpand\geometry{\bxjs@next}%
  }\bxjs@next
  \bxjs@postproc@layout}
%    \end{macrocode}
% \end{macro}
%
% \paragraph{geometry パッケージを読み込まない \ZRX}
%
% |geometry=user|の場合の処理。
%    \begin{macrocode}
\else\ifx\bxjs@geometry\bxjs@geometry@@user
%    \end{macrocode}
%
% この場合はユーザが何らかの方法（例えば |geometry| を読み込む）
% でページレイアウトを設定する必要がある。
% もし、本体開始時に |\textwidth| がカーネル設定の値（|.5\maxdimen|）
% のままになっている場合はエラーを出す。
% \Note |\jsUseMinimalPageLayout| は動作テスト用。
%    \begin{macrocode}
\g@addto@macro\bxjs@begin@document@hook{%
  \ifdim\textwidth=.5\maxdimen
    \ClassError\bxjs@clsname
     {Page layout is not properly set}%
     {\@ehd}%
  \fi}
\def\jsUseMinimalPageLayout{%
  \setlength{\textwidth}{6.5in}%
  \setlength{\textheight}{8in}}
%    \end{macrocode}
%
% |\setpagelayout| はとりあえず無効にしておく。
%    \begin{macrocode}
\let\bxjs@geometry@driver\relax
\def\setpagelayout{%
  \bxjs@ifplus{\bxjs@pagelayout@a}{%else
    \@ifstar{\bxjs@pagelayout@a}{\bxjs@pagelayout@a}}}
\def\bxjs@pagelayout@a#1{%
  \ClassError\bxjs@clsname
   {Command '\string\setpagelayout' is not supported,\MessageBreak
    because 'geometry' value is not 'class'}\@eha}
%
\fi\fi
%    \end{macrocode}
%
% \paragraph{縦方向のスペース}
% \mbox{}
% \begin{ZRnote}
% ここでは、|jsclasse.dtx| との差分を抑制するために、
% オリジナルのコードを無効化した状態で挿入しておく。
% \end{ZRnote}
%    \begin{macrocode}
%<*jsclasses>
%    \end{macrocode}
%
% \begin{macro}{\headheight}
% \begin{macro}{\topskip}
%
% |\topskip| は本文領域上端と本文1行目のベースラインとの距離です。
% あまりぎりぎりの値にすると，本文中に $\int$ のような高い文字が
% 入ったときに1行目のベースラインが他のページより下がってしまいます。
% ここでは本文の公称フォントサイズ（10pt）にします。
%
% [2003-06-26] |\headheight| はヘッダの高さで，
% 元は12ptでしたが，新ドキュメントクラスでは |\topskip|
% と等しくしていました。ところが，|fancyhdr| パッケージ
% で |\headheight| が小さいとおかしいことになるようです
% ので，2倍に増やしました。代わりに，版面の上下揃えの
% 計算では |\headheight| ではなく |\topskip| を使う
% ことにしました。
%
% [2016-08-17] 圏点やルビが一行目に来た場合に下がるのを防ぐた
% め，|\topskip| を10ptから1.38zwに増やしました。
% |\headheight| は従来と同じ20ptのままとします。
%
%    \begin{macrocode}
\setlength\topskip{1.38zw}%% from 10\jsc@mpt (2016-08-17)
\if@slide
  \setlength\headheight{0\jsc@mpt}
\else
  \setlength\headheight{20\jsc@mpt}%% from 2\topskip (2016-08-17); from \topskip (2003-06-26)
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\footskip}
%
% |\footskip| は本文領域下端とフッタ下端との距離です。
% 標準クラスファイルでは，book で0.35in（約8.89mm），
% book 以外で30pt（約10.54mm）となっていましたが，
% ここではA4判のときちょうど1cmとなるように，
% |\paperheight| の0.03367倍（最小 |\baselineskip|）としました。
% 書籍については，フッタは使わないことにして，ゼロにしました。
%
%    \begin{macrocode}
%<*article|kiyou>
\if@slide
  \setlength\footskip{0pt}
\else
  \setlength\footskip{0.03367\paperheight}
  \ifdim\footskip<\baselineskip
    \setlength\footskip{\baselineskip}
  \fi
\fi
%</article|kiyou>
%<jspf>\setlength\footskip{9\jsc@mmm}
%<*book>
\if@report
  \setlength\footskip{0.03367\paperheight}
  \ifdim\footskip<\baselineskip
    \setlength\footskip{\baselineskip}
  \fi
\else
  \setlength\footskip{0pt}
\fi
%</book>
%<*report>
\setlength\footskip{0.03367\paperheight}
\ifdim\footskip<\baselineskip
  \setlength\footskip{\baselineskip}
\fi
%</report>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\headsep}
%
% |\headsep| はヘッダ下端と本文領域上端との距離です。
% 元は book で18pt（約6.33mm），
% それ以外で25pt（約8.79mm）になっていました。
% ここでは article は |\footskip| $-$ |\topskip| としました。
%
% [2016-10-08] article の \texttt{slide} のとき，
% および book の非 \texttt{report} と kiyou のときに |\headsep| を
% 減らしそこねていたのを修正しました（2016-08-17での修正漏れ）。
%
%    \begin{macrocode}
%<*article>
\if@slide
  \setlength\headsep{0\jsc@mpt}
  \addtolength\headsep{-\topskip}%% added (2016-10-08)
  \addtolength\headsep{10\jsc@mpt}%% added (2016-10-08)
\else
  \setlength\headsep{\footskip}
  \addtolength\headsep{-\topskip}
\fi
%</article>
%<*book>
\if@report
  \setlength\headsep{\footskip}
  \addtolength\headsep{-\topskip}
\else
  \setlength\headsep{6\jsc@mmm}
  \addtolength\headsep{-\topskip}%% added (2016-10-08)
  \addtolength\headsep{10\jsc@mpt}%% added (2016-10-08)
\fi
%</book>
%<*report>
\setlength\headsep{\footskip}
\addtolength\headsep{-\topskip}
%</report>
%<*jspf>
\setlength\headsep{9\jsc@mmm}
\addtolength\headsep{-\topskip}
%</jspf>
%<*kiyou>
\setlength\headheight{0\jsc@mpt}
\setlength\headsep{0\jsc@mpt}
\addtolength\headsep{-\topskip}%% added (2016-10-08)
\addtolength\headsep{10\jsc@mpt}%% added (2016-10-08)
%</kiyou>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\maxdepth}
%
% |\maxdepth| は本文最下行の最大の深さで，
% plain \TeX や\LaTeX~2.09では4ptに固定でした。
% \LaTeX2e では |\maxdepth| $+$ |\topskip| を本文フォントサイズ
% の1.5倍にしたいのですが，|\topskip| は本文フォントサイズ
% （ここでは10pt）に等しいので，結局 |\maxdepth| は |\topskip|
% の半分の値（具体的には5pt）にします。
%
%    \begin{macrocode}
\setlength\maxdepth{.5\topskip}
%    \end{macrocode}
% \end{macro}
%
% \paragraph{本文の幅と高さ}
%
% \begin{macro}{\fullwidth}
%
% 本文の幅が全角40文字を超えると読みにくくなります。
% そこで，書籍の場合に限って，
% 紙の幅が広いときは外側のマージンを余分にとって全角40文字に押え，
% ヘッダやフッタは本文領域より広く取ることにします。
% このときヘッダやフッタの幅を表す |\fullwidth| という長さを定義します。
%
%    \begin{macrocode}
\newdimen\fullwidth
%    \end{macrocode}
%
% この |\fullwidth| は article では紙幅 |\paperwidth|の0.76倍を超えない
% 全角幅の整数倍（二段組では全角幅の偶数倍）にします。0.76倍という数値は
% A4縦置きの場合に紙幅から約2インチを引いた値になるように選びました。
% book では紙幅から36ミリを引いた値にしました。
%
% \begin{macro}{\textwidth}
%
% 書籍以外では本文領域の幅 |\textwidth| は |\fullwidth| と等しくします。
% |article| ではA4縦置きで49文字となります。
% 某学会誌スタイルでは50zw（25文字×2段）＋段間8mmとします。
%
%    \begin{macrocode}
%<*article>
\if@slide
  \setlength\fullwidth{0.9\paperwidth}
\else
  \setlength\fullwidth{0.76\paperwidth}
\fi
\if@twocolumn \@tempdima=2zw \else \@tempdima=1zw \fi
\divide\fullwidth\@tempdima \multiply\fullwidth\@tempdima
\setlength\textwidth{\fullwidth}
%</article>
%<*book>
\if@report
  \setlength\fullwidth{0.76\paperwidth}
\else
  \setlength\fullwidth{\paperwidth}
  \addtolength\fullwidth{-36\jsc@mmm}
\fi
\if@twocolumn \@tempdima=2zw \else \@tempdima=1zw \fi
\divide\fullwidth\@tempdima \multiply\fullwidth\@tempdima
\setlength\textwidth{\fullwidth}
\if@report \else
  \if@twocolumn \else
    \ifdim \fullwidth>40zw
      \setlength\textwidth{40zw}
    \fi
  \fi
\fi
%</book>
%<*report>
\setlength\fullwidth{0.76\paperwidth}
\if@twocolumn \@tempdima=2zw \else \@tempdima=1zw \fi
\divide\fullwidth\@tempdima \multiply\fullwidth\@tempdima
\setlength\textwidth{\fullwidth}
%</report>
%<*jspf>
\setlength\fullwidth{50zw}
\addtolength\fullwidth{8\jsc@mmm}
\setlength\textwidth{\fullwidth}
%</jspf>
%<*kiyou>
\setlength\fullwidth{48zw}
\addtolength\fullwidth{\columnsep}
\setlength\textwidth{\fullwidth}
%</kiyou>
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\textheight}
%
% 紙の高さ |\paperheight| は，1インチと |\topmargin|
% と |\headheight| と |\headsep| と |\textheight|
% と |\footskip| とページ下部の余白を加えたものです。
%
% 本文部分の高さ |\textheight| は，
% 紙の高さ |\paperheight| の0.83倍から，
% ヘッダの高さ，ヘッダと本文の距離，本文とフッタ下端の距離，
% |\topskip| を引き，
% それを |\baselineskip| の倍数に切り捨て，
% 最後に |\topskip| を加えます。
% 念のため0.1ポイント余分に加えておきます。
% 0.83倍という数値は，A4縦置きの場合に紙の高さから
% 上下マージン各約1インチを引いた値になるように選びました。
%
% 某学会誌スタイルでは44行にします。
%
% [2003-06-26] |\headheight| を |\topskip| に直しました。
% 以前はこの二つは値が同じであったので，変化はないはずです。
%
% [2016-08-26] |\topskip| を10ptから1.38zwに増やしましたので，
% その分 |\textheight| を増やします（2016-08-17での修正漏れ）。
%
% [2016-10-08] article の slide のときに |\headheight| はゼロ
% なので，さらに修正しました（2016-08-17での修正漏れ）。
%
%    \begin{macrocode}
%<*article|book|report>
\if@slide
  \setlength{\textheight}{0.95\paperheight}
\else
  \setlength{\textheight}{0.83\paperheight}
\fi
\addtolength{\textheight}{-10\jsc@mpt}%% from -\topskip (2016-10-08); from -\headheight (2003-06-26)
\addtolength{\textheight}{-\headsep}
\addtolength{\textheight}{-\footskip}
\addtolength{\textheight}{-\topskip}
\divide\textheight\baselineskip
\multiply\textheight\baselineskip
%</article|book|report>
%<jspf>\setlength{\textheight}{51\baselineskip}
%<kiyou>\setlength{\textheight}{47\baselineskip}
\addtolength{\textheight}{\topskip}
\addtolength{\textheight}{0.1\jsc@mpt}
%<jspf>\setlength{\mathindent}{10\jsc@mmm}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\flushbottom}
%
% [2016-07-18] |\textheight| に念のため0.1ポイント余裕を持たせて
% いるのと同様に，|\flushbottom| にも余裕を持たせます。
% 元の\LaTeXe での完全な |\flushbottom| の定義は
%\begin{verbatim}
%  \def\flushbottom{%
%    \let\@textbottom\relax \let\@texttop\relax}
%\end{verbatim}
% ですが，次のようにします。
%
%    \begin{macrocode}
\def\flushbottom{%
  \def\@textbottom{\vskip \z@ \@plus.1\jsc@mpt}%
  \let\@texttop\relax}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\marginparsep}
% \begin{macro}{\marginparpush}
%
% |\marginparsep| は欄外の書き込みと本文との間隔です。
% |\marginparpush| は欄外の書き込みどうしの最小の間隔です。
%
%    \begin{macrocode}
\setlength\marginparsep{\columnsep}
\setlength\marginparpush{\baselineskip}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\oddsidemargin}
% \begin{macro}{\evensidemargin}
%
% それぞれ奇数ページ，偶数ページの左マージンから1インチ引いた値です。
% 片面印刷では |\oddsidemargin| が使われます。
% \TeX は上・左マージンに |1truein| を挿入しますが，
% トンボ関係のオプションが指定されるとp\LaTeXe （|plcore.ltx|）
% はトンボの内側に |1in| のスペース（|1truein| ではなく）を挿入するので，
% 場合分けしています。
%
%    \begin{macrocode}
\setlength{\oddsidemargin}{\paperwidth}
\addtolength{\oddsidemargin}{-\fullwidth}
\setlength{\oddsidemargin}{.5\oddsidemargin}
\iftombow
  \addtolength{\oddsidemargin}{-1in}
\else
  \addtolength{\oddsidemargin}{-\inv@mag in}
\fi
\setlength{\evensidemargin}{\oddsidemargin}
\if@mparswitch
  \addtolength{\evensidemargin}{\fullwidth}
  \addtolength{\evensidemargin}{-\textwidth}
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\marginparwidth}
%
% |\marginparwidth| は欄外の書き込みの横幅です。
% 外側マージンの幅（|\evensidemargin| $+$ 1インチ）から1センチを引き，
% さらに |\marginparsep|（欄外の書き込みと本文のアキ）を引いた値に
% しました。最後に1\,zwの整数倍に切り捨てます。
%
%    \begin{macrocode}
\setlength\marginparwidth{\paperwidth}
\addtolength\marginparwidth{-\oddsidemargin}
\addtolength\marginparwidth{-\inv@mag in}
\addtolength\marginparwidth{-\textwidth}
\addtolength\marginparwidth{-10\jsc@mmm}
\addtolength\marginparwidth{-\marginparsep}
\@tempdima=1zw
\divide\marginparwidth\@tempdima
\multiply\marginparwidth\@tempdima
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\topmargin}
%
% 上マージン（紙の上端とヘッダ上端の距離）
% から1インチ引いた値です。
%
% [2003-06-26] |\headheight| を |\topskip| に直しました。
% 以前はこの二つは値が同じであったので，変化はないはずです。
%
% [2016-08-17] |\topskip| を10ptから1.38zwに直しましたが，
% |\topmargin| は従来の値から変わらないように調節しました。
% …のつもりでしたが，|\textheight| を増やし忘れていたので
% 変わってしまっていました（2016-08-26修正済み）。
%
%    \begin{macrocode}
\setlength\topmargin{\paperheight}
\addtolength\topmargin{-\textheight}
\if@slide
  \addtolength\topmargin{-\headheight}
\else
  \addtolength\topmargin{-10\jsc@mpt}%% from -\topskip (2016-10-08); from -\headheight (2003-06-26)
\fi
\addtolength\topmargin{-\headsep}
\addtolength\topmargin{-\footskip}
\setlength\topmargin{0.5\topmargin}
%<kiyou>\setlength\topmargin{81truebp}
\iftombow
  \addtolength\topmargin{-1in}
\else
  \addtolength\topmargin{-\inv@mag in}
\fi
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</jsclasses>
%    \end{macrocode}
%
% \paragraph{脚注}
% \mbox{}
% \begin{ZRnote}
% ここからのコードは以下の点を除いて JS クラスのものを踏襲する。
% \begin{itemize}
% \item zw の代わりに |\jsZw| を用いる。
% \item article/report/book/slide の切り分けの処理が異なる。
% \end{itemize}
% \end{ZRnote}
%
% \begin{macro}{\footnotesep}
%
% 各脚注の頭に入る支柱（strut）の高さです。
% 脚注間に余分のアキが入らないように，
% |\footnotesize| の支柱の高さ（行送りの0.7倍）に等しくします。
%
% \begin{ZRnote}
% ここは元々は
%\begin{verbatim}
%{\footnotesize\global\setlength\footnotesep{\baselineskip}}
%\end{verbatim}
% としていたが、そもそも |\global||\setlength|～ は\Pkg{calc}使用時には
% 有意義な動作をしない。
% |\global||\footnotesep| だと所望の値が得られるが、
% 同時に |\footnotesize| のフォントを固定させてしまうという副作用をもつ。
% なので、実際の設定値を直接使うことにする。
% \end{ZRnote}
%    \begin{macrocode}
\footnotesep=11\jsc@mpt \footnotesep=0.7\footnotesep
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\footins}
%
% |\skip\footins| は本文の最終行と最初の脚注との間の距離です。
% 標準の10ポイントクラスでは 9 plus 4 minus 2 ポイントになっていますが，
% 和文の行送りを考えてもうちょっと大きくします。
%
%    \begin{macrocode}
\setlength{\skip\footins}{16\jsc@mpt \@plus 5\jsc@mpt \@minus 2\jsc@mpt}
%    \end{macrocode}
% \end{macro}
%
% \paragraph{フロート関連}
%
% フロート（図，表）関連のパラメータは\LaTeXe 本体で定義されていますが，
% ここで設定変更します。本文ページ（本文とフロートが共存するページ）
% とフロートだけのページで設定が異なります。
% ちなみに，カウンタは内部では |\c@| を名前に冠したマクロになっています。
%
% \begin{macro}{\c@topnumber}
%
% |topnumber| カウンタは本文ページ上部のフロートの最大数です。
%
% [2003-08-23] ちょっと増やしました。
%
%    \begin{macrocode}
\setcounter{topnumber}{9}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\topfraction}
%
% 本文ページ上部のフロートが占有できる最大の割合です。
% フロートが入りやすいように，元の値 0.7 を 0.8 [2003-08-23: 0.85] に変えてあります。
%
%    \begin{macrocode}
\renewcommand{\topfraction}{.85}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\c@bottomnumber}
%
% |bottomnumber| カウンタは本文ページ下部のフロートの最大数です。
%
% [2003-08-23] ちょっと増やしました。
%
%    \begin{macrocode}
\setcounter{bottomnumber}{9}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bottomfraction}
%
% 本文ページ下部のフロートが占有できる最大の割合です。元は 0.3 でした。
%
%    \begin{macrocode}
\renewcommand{\bottomfraction}{.8}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\c@totalnumber}
%
% |totalnumber| カウンタは本文ページに入りうるフロートの最大数です。
%
% [2003-08-23] ちょっと増やしました。
%
%    \begin{macrocode}
\setcounter{totalnumber}{20}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\textfraction}
%
% 本文ページに最低限入らなければならない本文の割合です。
% フロートが入りやすいように元の 0.2 を 0.1 に変えました。
%
%    \begin{macrocode}
\renewcommand{\textfraction}{.1}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\floatpagefraction}
%
% フロートだけのページでのフロートの最小割合です。
% これも 0.5 を 0.8 に変えてあります。
%
%    \begin{macrocode}
\renewcommand{\floatpagefraction}{.8}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\c@dbltopnumber}
%
% 二段組のとき本文ページ上部に出力できる
% 段抜きフロートの最大数です。
%
% [2003-08-23] ちょっと増やしました。
%
%    \begin{macrocode}
\setcounter{dbltopnumber}{9}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\dbltopfraction}
%
% 二段組のとき本文ページ上部に出力できる
% 段抜きフロートが占めうる最大の割合です。
% 0.7 を 0.8 に変えてあります。
%
%    \begin{macrocode}
\renewcommand{\dbltopfraction}{.8}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\dblfloatpagefraction}
%
% 二段組のときフロートだけのページに入るべき
% 段抜きフロートの最小割合です。
% 0.5 を 0.8 に変えてあります。
%
%    \begin{macrocode}
\renewcommand{\dblfloatpagefraction}{.8}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\floatsep}
% \begin{macro}{\textfloatsep}
% \begin{macro}{\intextsep}
%
% |\floatsep| はページ上部・下部のフロート間の距離です。
% |\textfloatsep| はページ上部・下部のフロートと本文との距離です。
% |\intextsep| は本文の途中に出力されるフロートと本文との距離です。
%
%    \begin{macrocode}
\setlength\floatsep    {12\jsc@mpt \@plus 2\jsc@mpt \@minus 2\jsc@mpt}
\setlength\textfloatsep{20\jsc@mpt \@plus 2\jsc@mpt \@minus 4\jsc@mpt}
\setlength\intextsep   {12\jsc@mpt \@plus 2\jsc@mpt \@minus 2\jsc@mpt}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\dblfloatsep}
% \begin{macro}{\dbltextfloatsep}
%
% 二段組のときの段抜きのフロートについての値です。
%
%    \begin{macrocode}
\setlength\dblfloatsep    {12\jsc@mpt \@plus 2\jsc@mpt \@minus 2\jsc@mpt}
\setlength\dbltextfloatsep{20\jsc@mpt \@plus 2\jsc@mpt \@minus 4\jsc@mpt}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@fptop}
% \begin{macro}{\@fpsep}
% \begin{macro}{\@fpbot}
%
% フロートだけのページに入るグルーです。
% |\@fptop| はページ上部，
% |\@fpbot| はページ下部，
% |\@fpsep| はフロート間に入ります。
%
%    \begin{macrocode}
\setlength\@fptop{0\jsc@mpt \@plus 1fil}
\setlength\@fpsep{8\jsc@mpt \@plus 2fil}
\setlength\@fpbot{0\jsc@mpt \@plus 1fil}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@dblfptop}
% \begin{macro}{\@dblfpsep}
% \begin{macro}{\@dblfpbot}
%
% 段抜きフロートについての値です。
%
%    \begin{macrocode}
\setlength\@dblfptop{0\jsc@mpt \@plus 1fil}
\setlength\@dblfpsep{8\jsc@mpt \@plus 2fil}
\setlength\@dblfpbot{0\jsc@mpt \@plus 1fil}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \section{改ページ（日本語\TeX{}開発コミュニティ版のみ）}\label{sec:cleardoublepage}
%
% \begin{macro}{\pltx@cleartorightpage}
% \begin{macro}{\pltx@cleartoleftpage}
% \begin{macro}{\pltx@cleartooddpage}
% \begin{macro}{\pltx@cleartoevenpage}
% [2017-02-24] コミュニティ版\pLaTeX の標準クラス2017/02/15に合わせて，
% 同じ命令を追加しました。
% \begin{enumerate}
%   \item|\pltx@cleartorightpage|：右ページになるまでページを繰る命令
%   \item|\pltx@cleartoleftpage|：左ページになるまでページを繰る命令
%   \item|\pltx@cleartooddpage|：奇数ページになるまでページを繰る命令
%   \item|\pltx@cleartoevenpage|：偶数ページになるまでページを繰る命令
% \end{enumerate}
% となっています。
%
%    \begin{macrocode}
%\def\pltx@cleartorightpage{\clearpage\if@twoside
%  \ifodd\c@page
%    \iftdir
%      \hbox{}\thispagestyle{empty}\newpage
%      \if@twocolumn\hbox{}\newpage\fi
%    \fi
%  \else
%    \ifydir
%      \hbox{}\thispagestyle{empty}\newpage
%      \if@twocolumn\hbox{}\newpage\fi
%    \fi
%  \fi\fi}
%\def\pltx@cleartoleftpage{\clearpage\if@twoside
%  \ifodd\c@page
%    \ifydir
%      \hbox{}\thispagestyle{empty}\newpage
%      \if@twocolumn\hbox{}\newpage\fi
%    \fi
%  \else
%    \iftdir
%      \hbox{}\thispagestyle{empty}\newpage
%      \if@twocolumn\hbox{}\newpage\fi
%    \fi
%  \fi\fi}
\def\pltx@cleartooddpage{\clearpage\if@twoside
  \ifodd\c@page\else
    \hbox{}\thispagestyle{empty}\newpage
    \if@twocolumn\hbox{}\newpage\fi
  \fi\fi}
\def\pltx@cleartoevenpage{\clearpage\if@twoside
  \ifodd\c@page
    \hbox{}\thispagestyle{empty}\newpage
    \if@twocolumn\hbox{}\newpage\fi
  \fi\fi}
%    \end{macrocode}
%
% \begin{ZRnote}
% BXJSクラスでは |\iftdir| 等が使えないので、
% 横組を仮定した定義を用いる。
%    \begin{macrocode}
\let\pltx@cleartorightpage\pltx@cleartooddpage
\let\pltx@cleartoleftpage\pltx@cleartoevenpage
%    \end{macrocode}
%
% |\vsize| の値がアレな場合は本体開始まで |\clearpage| を無効にする。
%    \begin{macrocode}
\ifdim\vsize=\z@
\begingroup
\toks@\expandafter{\clearpage}
\xdef\clearpage{\noexpand\ifbxjs@after@preamble\the\toks@\noexpand\fi}
\endgroup
\fi
%    \end{macrocode}
% \end{ZRnote}
%
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\cleardoublepage}
% [2017-02-24] コミュニティ版\pLaTeX の標準クラス2017/02/15に合わせて，
% reportとbookクラスの場合に|\cleardoublepage|を再定義します。
%    \begin{macrocode}
%<*book|report>
\if@openleft
  \let\cleardoublepage\pltx@cleartoleftpage
\else\if@openright
  \let\cleardoublepage\pltx@cleartorightpage
\fi\fi
%</book|report>
%    \end{macrocode}
% \end{macro}
%
% \section{ページスタイル}\label{sec:pagestyle}
%
% ページスタイルとして，\LaTeXe （欧文版）の標準クラス
% では |empty|，|plain|，|headings|，|myheadings| があります。
% このうち |empty|，|plain| スタイルは\LaTeXe 本体
% で定義されています。
%
% アスキーのクラスファイルでは |headnombre|，|footnombre|，
% |bothstyle|，|jpl@in| が追加されていますが，
% ここでは欧文標準のものだけにしました。
%
% ページスタイルは |\ps@...| の形のマクロで定義されています。
%
% \begin{macro}{\@evenhead}
% \begin{macro}{\@oddhead}
% \begin{macro}{\@evenfoot}
% \begin{macro}{\@oddfoot}
%
% |\@oddhead|，|\@oddfoot|，|\@evenhead|，|\@evenfoot| は
% 偶数・奇数ページの柱（ヘッダ，フッタ）を出力する命令です。
% これらは |\fullwidth| 幅の |\hbox| の中で呼び出されます。
% |\ps@...| の中で定義しておきます。
%
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% 柱の内容は，|\chapter| が呼び出す |\chaptermark{何々}|，
% |\section| が呼び出す |\sectionmark{何々}| で設定します。
% 柱を扱う命令には次のものがあります。
%
% \begin{quote}
%   \begin{tabbing}
%     |\markboth{左}{右} | \= 両方の柱を設定します。\\
%     |\markright{右}|     \> 右の柱を設定します。\\
%     |\leftmark|          \> 左の柱を出力します。\\
%     |\rightmark|         \> 右の柱を出力します。
%   \end{tabbing}
% \end{quote}
%
% 柱を設定する命令は，右の柱が左の柱の下位にある場合は十分まともに
% 動作します。たとえば左マークを |\chapter|，右マークを |\section|
% で変更する場合がこれにあたります。
% しかし，同一ページに複数の |\markboth| があると，
% おかしな結果になることがあります。
%
% |\tableofcontents| のような命令で使われる |\@mkboth| は，
% |\ps@...| コマンド中で |\markboth| か |\@gobbletwo|（何もしない）
% に |\let| されます。
%
% \begin{macro}{\ps@empty}
%
% |empty| ページスタイルの定義です。
% \LaTeX 本体で定義されているものをコメントアウトした形で
% 載せておきます。
%
%    \begin{macrocode}
% \def\ps@empty{%
%   \let\@mkboth\@gobbletwo
%   \let\@oddhead\@empty
%   \let\@oddfoot\@empty
%   \let\@evenhead\@empty
%   \let\@evenfoot\@empty}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ps@plainhead}
% \begin{macro}{\ps@plainfoot}
% \begin{macro}{\ps@plain}
%
% |plainhead| はシンプルなヘッダだけのページスタイルです。
%
% |plainfoot| はシンプルなフッタだけのページスタイルです。
%
% |plain| は |book| では |plainhead|，それ以外では |plainfoot| になります。
%
%    \begin{macrocode}
\def\ps@plainfoot{%
  \let\@mkboth\@gobbletwo
  \let\@oddhead\@empty
  \def\@oddfoot{\normalfont\hfil\thepage\hfil}%
  \let\@evenhead\@empty
  \let\@evenfoot\@oddfoot}
\def\ps@plainhead{%
  \let\@mkboth\@gobbletwo
  \let\@oddfoot\@empty
  \let\@evenfoot\@empty
  \def\@evenhead{%
    \if@mparswitch \hss \fi
    \hbox to \fullwidth{\textbf{\thepage}\hfil}%
    \if@mparswitch\else \hss \fi}%
  \def\@oddhead{%
    \hbox to \fullwidth{\hfil\textbf{\thepage}}\hss}}
%<book>\let\ps@plain\ps@plainhead
%<!book>\let\ps@plain\ps@plainfoot
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\ps@headings}
%
% |headings| スタイルはヘッダに見出しとページ番号を出力します。
% ここではヘッダにアンダーラインを引くようにしてみました。
%
% まず article の場合です。
%
%    \begin{macrocode}
%<*article|slide>
\if@twoside
  \def\ps@headings{%
    \let\@oddfoot\@empty
    \let\@evenfoot\@empty
    \def\@evenhead{\if@mparswitch \hss \fi
      \underline{\hbox to \fullwidth{\textbf{\thepage}\hfil\leftmark}}%
      \if@mparswitch\else \hss \fi}%
    \def\@oddhead{%
      \underline{%
        \hbox to \fullwidth{{\rightmark}\hfil\textbf{\thepage}}}\hss}%
    \let\@mkboth\markboth
    \def\sectionmark##1{\markboth{%
       \ifnum \c@secnumdepth >\z@ \bxjs@label@sect{section}\hskip1\jsZw\fi
       ##1}{}}%
    \def\subsectionmark##1{\markright{%
       \ifnum \c@secnumdepth >\@ne \bxjs@label@sect{subsection}\hskip1\jsZw\fi
       ##1}}%
  }
\else % if not twoside
  \def\ps@headings{%
    \let\@oddfoot\@empty
    \def\@oddhead{%
      \underline{%
        \hbox to \fullwidth{{\rightmark}\hfil\textbf{\thepage}}}\hss}%
    \let\@mkboth\markboth
    \def\sectionmark##1{\markright{%
        \ifnum \c@secnumdepth >\z@ \bxjs@label@sect{section}\hskip1\jsZw\fi
        ##1}}}
\fi
%</article|slide>
%    \end{macrocode}
%
% 次は book および report の場合です。
% [2011-05-10] しっぽ愛好家さん [qa:6370] のパッチを取り込ませていただきました
% （北見さん [qa:55896] のご指摘ありがとうございます）。
%
%    \begin{macrocode}
%<*book|report>
%    \end{macrocode}
%
% \begin{ZRnote}
% \begin{macro}{\bxjs@maybe@autoxspacing}
% |\autoxspacing| が定義済ならばそれを実行する。
% \Note |\autoxspacing| は未定義の可能性があるため代わりに用いる。
%    \begin{macrocode}
\def\bxjs@maybe@autoxspacing{%
  \ifx\autoxspacing\@undefined\else \autoxspacing \fi}
%    \end{macrocode}
% \end{macro}
% \end{ZRnote}
%
%    \begin{macrocode}
\newif\if@omit@number
\def\ps@headings{%
  \let\@oddfoot\@empty
  \let\@evenfoot\@empty
  \def\@evenhead{%
    \if@mparswitch \hss \fi
    \underline{\hbox to \fullwidth{\bxjs@maybe@autoxspacing
        \textbf{\thepage}\hfil\leftmark}}%
    \if@mparswitch\else \hss \fi}%
  \def\@oddhead{\underline{\hbox to \fullwidth{\bxjs@maybe@autoxspacing
        {\if@twoside\rightmark\else\leftmark\fi}\hfil\textbf{\thepage}}}\hss}%
  \let\@mkboth\markboth
  \def\chaptermark##1{\markboth{%
    \ifnum \c@secnumdepth >\m@ne
      \if@mainmatter
        \if@omit@number\else
          \@chapapp\thechapter\@chappos\hskip1\jsZw
        \fi
      \fi
    \fi
    ##1}{}}%
  \def\sectionmark##1{\markright{%
    \ifnum \c@secnumdepth >\z@ \bxjs@label@sect{section}\hskip1\jsZw\fi
    ##1}}}%
%</book|report>
%    \end{macrocode}
%
% 最後は学会誌の場合です。
%
%    \begin{macrocode}
%<*jspf>
\def\ps@headings{%
  \def\@oddfoot{\normalfont\hfil\thepage\hfil}
  \def\@evenfoot{\normalfont\hfil\thepage\hfil}
  \def\@oddhead{\normalfont\hfil \@title \hfil}
  \def\@evenhead{\normalfont\hfil プラズマ・核融合学会誌\hfil}}
%</jspf>
%    \end{macrocode}
%
% \end{macro}
%
% \begin{macro}{\ps@myheadings}
%
% |myheadings| ページスタイルではユーザが |\markboth| や |\markright| で
% 柱を設定するため，ここでの定義は非常に簡単です。
%
% [2004-01-17] 渡辺徹さんのパッチを適用しました。
%
%    \begin{macrocode}
\def\ps@myheadings{%
  \let\@oddfoot\@empty\let\@evenfoot\@empty
  \def\@evenhead{%
    \if@mparswitch \hss \fi%
    \hbox to \fullwidth{\thepage\hfil\leftmark}%
    \if@mparswitch\else \hss \fi}%
  \def\@oddhead{%
    \hbox to \fullwidth{\rightmark\hfil\thepage}\hss}%
  \let\@mkboth\@gobbletwo
%<book|report>  \let\chaptermark\@gobble
  \let\sectionmark\@gobble
%<!book&!report>  \let\subsectionmark\@gobble
}
%    \end{macrocode}
% \end{macro}
%
% \section{文書のマークアップ}
%
% \begin{ZRnote}
% \begin{macro}{\bxjs@phantomsection}
% |hyperref| が読み込まれている場合に |\phantomsection| を実行する。
%    \begin{macrocode}
\let\bxjs@phantomsection\relax
\g@addto@macro\bxjs@begin@document@hook{%
  \@ifpackageloaded{hyperref}{%
    \let\bxjs@phantomsection\phantomsection
  }{}%
}
%    \end{macrocode}
% \end{macro}
% \end{ZRnote}
%
% \subsection{表題}
%
% \begin{macro}{\title}
% \begin{macro}{\author}
% \begin{macro}{\date}
%
%    これらは\LaTeX 本体で次のように定義されています。
%    ここではコメントアウトした形で示します。
%
%    \begin{macrocode}
% \newcommand*{\title}[1]{\gdef\@title{#1}}
% \newcommand*{\author}[1]{\gdef\@author{#1}}
% \newcommand*{\date}[1]{\gdef\@date{#1}}
% \date{\today}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{ZRnote}
% \begin{macro}{\subtitle}
% \begin{macro}{\jsSubtitle}
% 副題を設定する。
% \Note プレアンブルにおいて |\newcommand*{\subtitle}{...}| が
% 行われることへの対策として、
% |\subtitle| の定義を |\title| の実行まで遅延させることにする。
% もしどうしても主題より前に副題を設定したい場合は、
% |\jsSubtitle| 命令を直接用いればよい。
% \TODO[3.0] |\subtitle| の遅延処理はPandocモードに移す。
% 
% 本体を |\jsSubtitle| として定義する。
%    \begin{macrocode}
\newcommand*{\jsSubtitle}[1]{\gdef\bxjs@subtitle{#1}}
%\let\bxjs@subtitle\@undefined
%    \end{macrocode}
%
% |\title| にフックを入れる。
%    \begin{macrocode}
\renewcommand*{\title}[1]{\bxjs@decl@subtitle\gdef\@title{#1}}
\g@addto@macro\bxjs@begin@document@hook{\bxjs@decl@subtitle}
\def\bxjs@decl@subtitle{%
  \global\let\bxjs@decl@subtitle\relax
  \ifx\subtitle\@undefined
    \global\let\subtitle\jsSubtitle
  \fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\bxjs@annihilate@subtitle}
% |\subtitle| 命令を無効化する。
% \Note 独自の |\subtitle| が使われている場合は無効化しない。
%    \begin{macrocode}
\def\bxjs@annihilate@subtitle{%
  \ifx\subtitle\jsSubtitle \global\let\subtitle\relax \fi
  \global\let\jsSubtitle\relax}
%    \end{macrocode}
% \end{macro}
%
% \end{ZRnote}
%
% \begin{macro}{\etitle}
% \begin{macro}{\eauthor}
% \begin{macro}{\keywords}
%
% 某学会誌スタイルで使う英語のタイトル，英語の著者名，キーワード，メールアドレスです。
%
%    \begin{macrocode}
%<*jspf>
\newcommand*{\etitle}[1]{\gdef\@etitle{#1}}
\newcommand*{\eauthor}[1]{\gdef\@eauthor{#1}}
\newcommand*{\keywords}[1]{\gdef\@keywords{#1}}
\newcommand*{\email}[1]{\gdef\authors@mail{#1}}
\newcommand*{\AuthorsEmail}[1]{\gdef\authors@mail{author's e-mail:\ #1}}
%</jspf>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\plainifnotempty}
%
% 従来の標準クラスでは，文書全体のページスタイルを |empty| に
% しても表題のあるページだけ |plain| になってしまうことが
% ありました。これは |\maketitle| の定義中
% に |\thispagestyle|\hspace{0pt}|{plain}| が入っている
% ためです。この問題を解決するために，
% 「全体のページスタイルが |empty| でないなら
% このページのスタイルを |plain| にする」という次の
% 命令を作ることにします。
%
%    \begin{macrocode}
\def\plainifnotempty{%
  \ifx \@oddhead \@empty
    \ifx \@oddfoot \@empty
    \else
      \thispagestyle{plainfoot}%
    \fi
  \else
    \thispagestyle{plainhead}%
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\maketitle}
%
% 表題を出力します。
% 著者名を出力する部分は，欧文の標準クラスファイルでは |\large|，
% 和文のものでは |\Large| になっていましたが，ここでは |\large|
% にしました。
%
% [2016-11-16] 新設された \texttt{nomag} および \texttt{nomag*} オプション
% の場合をデフォルト（\texttt{usemag} 相当）に合わせるため，|\smallskip| を
% |\jsc@smallskip| に置き換えました。|\smallskip| のままでは
% \texttt{nomag(*)} の場合にスケールしなくなり，レイアウトが変わってしまいます。
%
%    \begin{macrocode}
%<*article|book|report|slide>
\if@titlepage
  \newcommand{\maketitle}{%
    \begin{titlepage}%
      \let\footnotesize\small
      \let\footnoterule\relax
      \let\footnote\thanks
      \null\vfil
      \if@slide
        {\footnotesize \@date}%
        \begin{center}
          \mbox{} \\[1\jsZw]
          \large
          {\maybeblue\hrule height0\jsc@mpt depth2\jsc@mpt\relax}\par
          \jsc@smallskip
          \@title
          \ifx\bxjs@subtitle\@undefined\else
            \par\vskip\z@
            {\small \bxjs@subtitle\par}
          \fi
          \jsc@smallskip
          {\maybeblue\hrule height0\jsc@mpt depth2\jsc@mpt\relax}\par
          \vfill
          {\small \@author}%
        \end{center}
      \else
      \vskip 60\jsc@mpt
      \begin{center}%
        {\LARGE \@title \par}%
        \ifx\bxjs@subtitle\@undefined\else
          \vskip5\jsc@mpt
          {\normalsize \bxjs@subtitle\par}
        \fi
        \vskip 3em%
        {\large
          \lineskip .75em
          \begin{tabular}[t]{c}%
            \@author
          \end{tabular}\par}%
        \vskip 1.5em
        {\large \@date \par}%
      \end{center}%
      \fi
      \par
      \@thanks\vfil\null
    \end{titlepage}%
    \setcounter{footnote}{0}%
    \global\let\thanks\relax
    \global\let\maketitle\relax
    \global\let\@thanks\@empty
    \global\let\@author\@empty
    \global\let\@date\@empty
    \global\let\@title\@empty
    \global\let\title\relax
    \global\let\author\relax
    \global\let\date\relax
    \global\let\and\relax
    \bxjs@annihilate@subtitle
  }%
\else
  \newcommand{\maketitle}{\par
    \begingroup
      \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
      \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
      \long\def\@makefntext##1{\advance\leftskip 3\jsZw
        \parindent 1\jsZw\noindent
        \llap{\@textsuperscript{\normalfont\@thefnmark}\hskip0.3\jsZw}##1}%
      \if@twocolumn
        \ifnum \col@number=\@ne
          \@maketitle
        \else
          \twocolumn[\@maketitle]%
        \fi
      \else
        \newpage
        \global\@topnum\z@  % Prevents figures from going at top of page.
        \@maketitle
      \fi
      \plainifnotempty
      \@thanks
    \endgroup
    \setcounter{footnote}{0}%
    \global\let\thanks\relax
    \global\let\maketitle\relax
    \global\let\@thanks\@empty
    \global\let\@author\@empty
    \global\let\@date\@empty
    \global\let\@title\@empty
    \global\let\title\relax
    \global\let\author\relax
    \global\let\date\relax
    \global\let\and\relax
    \bxjs@annihilate@subtitle
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@maketitle}
%
% 独立した表題ページを作らない場合の表題の出力形式です。
%
%    \begin{macrocode}
  \def\@maketitle{%
    \newpage\null
    \vskip 2em
    \begin{center}%
      \let\footnote\thanks
      {\LARGE \@title \par}%
      \ifx\bxjs@subtitle\@undefined\else
        \vskip3\jsc@mpt
        {\normalsize \bxjs@subtitle\par}
      \fi
      \vskip 1.5em
      {\large
        \lineskip .5em
        \begin{tabular}[t]{c}%
          \@author
        \end{tabular}\par}%
      \vskip 1em
      {\large \@date}%
    \end{center}%
    \par\vskip 1.5em
%<article|slide>    \ifvoid\@abstractbox\else\centerline{\box\@abstractbox}\vskip1.5em\fi
  }
\fi
%</article|book|report|slide>
%<*jspf>
\newcommand{\maketitle}{\par
  \begingroup
    \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
    \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
    \long\def\@makefntext##1{\advance\leftskip 3\jsZw
      \parindent 1\jsZw\noindent
      \llap{\@textsuperscript{\normalfont\@thefnmark}\hskip0.3\jsZw}##1}%
      \twocolumn[\@maketitle]%
    \plainifnotempty
    \@thanks
  \endgroup
  \setcounter{footnote}{0}%
  \global\let\thanks\relax
  \global\let\maketitle\relax
  \global\let\@thanks\@empty
  \global\let\@author\@empty
  \global\let\@date\@empty
% \global\let\@title\@empty % \@title は柱に使う
  \global\let\title\relax
  \global\let\author\relax
  \global\let\date\relax
  \global\let\and\relax
  \ifx\authors@mail\@undefined\else{%
    \def\@makefntext{\advance\leftskip 3\jsZw \parindent -3\jsZw}%
    \footnotetext[0]{\itshape\authors@mail}%
  }\fi
  \global\let\authors@mail\@undefined}
\def\@maketitle{%
  \newpage\null
  \vskip 6em % used to be 2em
  \begin{center}
    \let\footnote\thanks
    \ifx\@title\@undefined\else{\LARGE\headfont\@title\par}\fi
    \lineskip .5em
    \ifx\@author\@undefined\else
      \vskip 1em
      \begin{tabular}[t]{c}%
        \@author
      \end{tabular}\par
    \fi
    \ifx\@etitle\@undefined\else
      \vskip 1em
      {\large \@etitle \par}%
    \fi
    \ifx\@eauthor\@undefined\else
      \vskip 1em
      \begin{tabular}[t]{c}%
        \@eauthor
      \end{tabular}\par
    \fi
    \vskip 1em
    \@date
  \end{center}
  \vskip 1.5em
  \centerline{\box\@abstractbox}
  \ifx\@keywords\@undefined\else
    \vskip 1.5em
    \centerline{\parbox{157\jsc@mmm}{\textsf{Keywords:}\\ \small\@keywords}}
  \fi
  \vskip 1.5em}
%</jspf>
%    \end{macrocode}
% \end{macro}
%
% \subsection{章・節}
%
% \begin{ZRnote}
% |label-section| オプション対応のための処理。
% \begin{macro}{\bxjs@label@sect}
% 節付 |#1| の番号を出力する。
% 節付 |XXX| に対して、|\labelXXX| が定義済ならそれが出力書式を表す。
% 未定義ならばカウンタの出力書式 |\theXXX| が使われる。
%    \begin{macrocode}
\def\bxjs@label@sect#1{%
  \@ifundefined{label#1}{\@nameuse{the#1}}{\@nameuse{label#1}}}
\def\@seccntformat#1{\bxjs@label@sect{#1}\quad}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\@secapp}
% 節番号の接頭辞。
% \begin{macro}{\@secpos}
% 節番号の接尾辞。
%    \begin{macrocode}
\ifnum\bxjs@label@section=\bxjs@label@section@@compat\else
\def\@secapp{\presectionname}
\def\@secpos{\postsectionname}
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macro}{\labelsection}
% 節番号の出力書式。
%    \begin{macrocode}
\ifnum\bxjs@label@section=\bxjs@label@section@@modern
\def\labelsection{\@secapp\thesection\@secpos}
\fi
%    \end{macrocode}
% \end{macro}
%
% \end{ZRnote}
%
% \paragraph{構成要素}
%
% |\@startsection| マクロは6個の必須引数と，オプションとして |*| と
% 1個のオプション引数と1個の必須引数をとります。
%
% \begin{quote}
% |\@startsection{名}{レベル}{字下げ}{前アキ}{後アキ}{スタイル}| \\
% |              *[別見出し]{見出し}|
% \end{quote}
%
% それぞれの引数の意味は次の通りです。
%
% \begin{description}
% \item[名] ユーザレベルコマンドの名前です（例: section）。
% \item[レベル] 見出しの深さを示す数値です
%    （chapter=1, section=2, \ldots ）。
%    この数値が |secnumdepth| 以下のとき見出し番号を出力します。
% \item[字下げ] 見出しの字下げ量です。
% \item[前アキ] この値の絶対値が見出し上側の空きです。
%    負の場合は，見出し直後の段落をインデントしません。
% \item[後アキ] 正の場合は，見出しの下の空きです。
%    負の場合は，絶対値が見出しの右の空きです
%    （見出しと同じ行から本文を始めます）。
% \item[スタイル] 見出しの文字スタイルの設定です。
% \item[\texttt{*}] この \texttt{*} 印がないと，見出し番号を付け，
%    見出し番号のカウンタに1を加算します。
% \item[別見出し] 目次や柱に出力する見出しです。
% \item[見出し] 見出しです。
% \end{description}
%
% 見出しの命令は通常 |\@startsection| とその最初の6個の引数として
% 定義されます。
%
% 次は |\@startsection| の定義です。
% 情報処理学会論文誌スタイルファイル（\texttt{ipsjcommon.sty}）
% を参考にさせていただきましたが，完全に行送りが |\baselineskip|
% の整数倍にならなくてもいいから前の行と重ならないようにしました。
%
%    \begin{macrocode}
\def\@startsection#1#2#3#4#5#6{%
  \if@noskipsec \leavevmode \fi
  \par
% 見出し上の空きを \@tempskipa にセットする
  \@tempskipa #4\relax
% \@afterindent は見出し直後の段落を字下げするかどうかを表すスイッチ
  \if@english \@afterindentfalse \else \@afterindenttrue \fi
% 見出し上の空きが負なら見出し直後の段落を字下げしない
  \ifdim \@tempskipa <\z@
    \@tempskipa -\@tempskipa \@afterindentfalse
  \fi
  \if@nobreak
%   \everypar{\everyparhook}% これは間違い
    \everypar{}%
  \else
    \addpenalty\@secpenalty
% 次の行は削除
%   \addvspace\@tempskipa
% 次の \noindent まで追加
    \ifdim \@tempskipa >\z@
      \if@slide\else
        \null
        \vspace*{-\baselineskip}%
      \fi
      \vskip\@tempskipa
    \fi
  \fi
  \noindent
% 追加終わり
  \@ifstar
    {\@ssect{#3}{#4}{#5}{#6}}%
    {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
%    \end{macrocode}
%
% |\@sect| と |\@xsect| は，
% 前のアキがちょうどゼロの場合にもうまくいくように，多少変えてあります。
% |\everyparhook| も挿入しています。
%
% \begin{ZRnote}
% |\everyparhook| の挿入は |everyparhook=compat| の時のみ行う。
% \begin{macro}{\bxjs@if@ceph}
% |\bxjs@if@ceph{|\Meta{コード}|}|\Means
% |everyparhook=compat| である場合にのみ\Meta{コード}を実行する。
%    \begin{macrocode}
\ifnum\bxjs@everyparhook=\bxjs@everyparhook@@compat
  \let\bxjs@if@ceph\@firstofone
\else \let\bxjs@if@ceph\@gobble
\fi
%    \end{macrocode}
% \end{macro}
% \end{ZRnote}
%
%    \begin{macrocode}
\def\@sect#1#2#3#4#5#6[#7]#8{%
  \ifnum #2>\c@secnumdepth
    \let\@svsec\@empty
  \else
    \refstepcounter{#1}%
    \protected@edef\@svsec{\@seccntformat{#1}\relax}%
  \fi
% 見出し後の空きを \@tempskipa にセット
  \@tempskipa #5\relax
% 条件判断の順序を入れ換えました
  \ifdim \@tempskipa<\z@
    \def\@svsechd{%
      #6{\hskip #3\relax
      \@svsec #8}%
      \csname #1mark\endcsname{#7}%
      \addcontentsline{toc}{#1}{%
        \ifnum #2>\c@secnumdepth \else
          \protect\numberline{\bxjs@label@sect{#1}}%
        \fi
        #7}}% 目次にフルネームを載せるなら #8
  \else
    \begingroup
      \interlinepenalty \@M % 下から移動
      #6{%
        \@hangfrom{\hskip #3\relax\@svsec}%
%       \interlinepenalty \@M % 上に移動
        #8\@@par}%
    \endgroup
    \csname #1mark\endcsname{#7}%
    \addcontentsline{toc}{#1}{%
      \ifnum #2>\c@secnumdepth \else
        \protect\numberline{\bxjs@label@sect{#1}}%
      \fi
      #7}% 目次にフルネームを載せるならここは #8
  \fi
  \@xsect{#5}}
%    \end{macrocode}
%
% 二つ挿入した |\everyparhook| のうち後者が |\paragraph| 類の後で2回実行され，
% それ以降は前者が実行されます。
%
% [2016-07-28] \texttt{slide}オプションと\texttt{twocolumn}オプションを
% 同時に指定した場合の罫線の位置を微調整しました。
%
%    \begin{macrocode}
\def\@xsect#1{%
% 見出しの後ろの空きを \@tempskipa にセット
  \@tempskipa #1\relax
% 条件判断の順序を変えました
  \ifdim \@tempskipa<\z@
    \@nobreakfalse
    \global\@noskipsectrue
    \everypar{%
      \if@noskipsec
        \global\@noskipsecfalse
       {\setbox\z@\lastbox}%
        \clubpenalty\@M
        \begingroup \@svsechd \endgroup
        \unskip
        \@tempskipa #1\relax
        \hskip -\@tempskipa
      \else
        \clubpenalty \@clubpenalty
        \everypar\expandafter{\bxjs@if@ceph\everyparhook}%
%    \end{macrocode}
% \TODO ↑ナニコレ？
%    \begin{macrocode}
      \fi\bxjs@if@ceph\everyparhook}%
  \else
    \par \nobreak
    \vskip \@tempskipa
    \@afterheading
  \fi
  \if@slide
    {\vskip\if@twocolumn-5\jsc@mpt\else-6\jsc@mpt\fi
     \maybeblue\hrule height0\jsc@mpt depth1\jsc@mpt
     \vskip\if@twocolumn 4\jsc@mpt\else 7\jsc@mpt\fi\relax}%
  \fi
  \par  % 2000-12-18
  \ignorespaces}
\def\@ssect#1#2#3#4#5{%
  \@tempskipa #3\relax
  \ifdim \@tempskipa<\z@
    \def\@svsechd{#4{\hskip #1\relax #5}}%
  \else
    \begingroup
      #4{%
        \@hangfrom{\hskip #1}%
          \interlinepenalty \@M #5\@@par}%
    \endgroup
  \fi
  \@xsect{#3}}
%    \end{macrocode}
%
% \paragraph{柱関係の命令}
%
% \begin{macro}{\chaptermark}
% \begin{macro}{\sectionmark}
% \begin{macro}{\subsectionmark}
% \begin{macro}{\subsubsectionmark}
% \begin{macro}{\paragraphmark}
% \begin{macro}{\subparagraphmark}
%
% |\...mark| の形の命令を初期化します（第\ref{sec:pagestyle}節参照）。
% |\chaptermark| 以外は\LaTeX 本体で定義済みです。
%
%    \begin{macrocode}
\newcommand*\chaptermark[1]{}
% \newcommand*{\sectionmark}[1]{}
% \newcommand*{\subsectionmark}[1]{}
% \newcommand*{\subsubsectionmark}[1]{}
% \newcommand*{\paragraphmark}[1]{}
% \newcommand*{\subparagraphmark}[1]{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \paragraph{カウンタの定義}
%
% \begin{macro}{\c@secnumdepth}
%
% |secnumdepth| は第何レベルの見出しまで
% 番号を付けるかを決めるカウンタです。
%
%    \begin{macrocode}
%<!book&!report>\setcounter{secnumdepth}{3}
%<book|report>\setcounter{secnumdepth}{2}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\c@chapter}
% \begin{macro}{\c@section}
% \begin{macro}{\c@subsection}
% \begin{macro}{\c@subsubsection}
% \begin{macro}{\c@paragraph}
% \begin{macro}{\c@subparagraph}
%
% 見出し番号のカウンタです。
% |\newcounter| の第1引数が新たに作るカウンタです。
% これは第2引数が増加するたびに 0 に戻されます。
% 第2引数は定義済みのカウンタです。
%
%    \begin{macrocode}
\newcounter{part}
%<book|report>\newcounter{chapter}
%<book|report>\newcounter{section}[chapter]
%<!book&!report>\newcounter{section}
\newcounter{subsection}[section]
\newcounter{subsubsection}[subsection]
\newcounter{paragraph}[subsubsection]
\newcounter{subparagraph}[paragraph]
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\thepart}
% \begin{macro}{\thechapter}
% \begin{macro}{\thesection}
% \begin{macro}{\thesubsection}
% \begin{macro}{\thesubsubsection}
% \begin{macro}{\theparagraph}
% \begin{macro}{\thesubparagraph}
%
% カウンタの値を出力する命令 |\the何々| を定義します。
%
% カウンタを出力するコマンドには次のものがあります。
%
% \begin{quote}
%   |\arabic{COUNTER}   | 1, 2, 3, \ldots \\
%   |\roman{COUNTER}    | i, ii, iii, \ldots \\
%   |\Roman{COUNTER}    | I, II, III, \ldots \\
%   |\alph{COUNTER}     | a, b, c, \ldots \\
%   |\Alph{COUNTER}     | A, B, C, \ldots \\
%   |\kansuji{COUNTER}  | 一, 二, 三, \ldots
% \end{quote}
%
% 以下ではスペース節約のため |@| の付いた内部表現を多用しています。
%
%    \begin{macrocode}
\renewcommand{\thepart}{\@Roman\c@part}
%<*!book&!report>
\ifnum\bxjs@label@section=\bxjs@label@section@@compat
\renewcommand{\thesection}{\presectionname\@arabic\c@section\postsectionname}
\renewcommand{\thesubsection}{\@arabic\c@section.\@arabic\c@subsection}
\else
\renewcommand{\thesection}{\@arabic\c@section}
\renewcommand{\thesubsection}{\thesection.\@arabic\c@subsection}
\fi
%</!book&!report>
%<*book|report>
\renewcommand{\thechapter}{\@arabic\c@chapter}
\renewcommand{\thesection}{\thechapter.\@arabic\c@section}
\renewcommand{\thesubsection}{\thesection.\@arabic\c@subsection}
%</book|report>
\renewcommand{\thesubsubsection}{%
   \thesubsection.\@arabic\c@subsubsection}
\renewcommand{\theparagraph}{%
   \thesubsubsection.\@arabic\c@paragraph}
\renewcommand{\thesubparagraph}{%
   \theparagraph.\@arabic\c@subparagraph}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@chapapp}
% \begin{macro}{\@chappos}
%
% |\@chapapp| の初期値は |\prechaptername|（第）です。
%
% |\@chappos| の初期値は |\postchaptername|（章）です。
%
% |\appendix| は |\@chapapp| を |\appendixname| に，
% |\@chappos| を空に再定義します。
%
% [2003-03-02] |\@secapp| は外しました。
%
%    \begin{macrocode}
%<book|report>\newcommand{\@chapapp}{\prechaptername}
%<book|report>\newcommand{\@chappos}{\postchaptername}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \paragraph{前付，本文，後付}
%
% 本のうち章番号があるのが「本文」，
% それ以外が「前付」「後付」です。
%
% \begin{macro}{\frontmatter}
%
% ページ番号をローマ数字にし，章番号を付けないようにします。
%
% [2017-03-05] |\frontmatter| と |\mainmatter| の2つの命令は，
% 改丁または改ページした後で |\pagenumbering{...}| でノンブルを1に
% リセットします。長い間 |\frontmatter| は \texttt{openany} のときに
% 単なる改ページとしていましたが，これではノンブルをリセットする際に
% 偶奇逆転が起こる場合がありました。\texttt{openany} かどうかに依らず
% 奇数ページまで繰るように修正することで，問題を解消しました。
% 実は，\LaTeX の標準クラスでは1998年に修正されていた問題です
% （コミュニティ版\pLaTeX の標準クラス2017/03/05も参照）。
%
%    \begin{macrocode}
%<*book|report>
\newcommand\frontmatter{%
  \pltx@cleartooddpage
  \@mainmatterfalse
  \pagenumbering{roman}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\mainmatter}
%
% ページ番号を算用数字にし，章番号を付けるようにします。
%
%    \begin{macrocode}
\newcommand\mainmatter{%
  \pltx@cleartooddpage
  \@mainmattertrue
  \pagenumbering{arabic}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\backmatter}
%
% 章番号を付けないようにします。ページ番号の付け方は変わりません。
%
%    \begin{macrocode}
\newcommand\backmatter{%
  \if@openleft
    \cleardoublepage
  \else\if@openright
    \cleardoublepage
  \else
    \clearpage
  \fi\fi
  \@mainmatterfalse}
%</book|report>
%    \end{macrocode}
% \end{macro}
%
% \paragraph{部}
%
% \begin{macro}{\part}
%
% 新しい部を始めます。
%
% |\secdef| を使って見出しを定義しています。
% このマクロは二つの引数をとります。
%
% \begin{quote}
% |\secdef{星なし}{星あり}|
% \end{quote}
%
% \begin{description}
% \item[星なし] \texttt{*} のない形の定義です。
% \item[星あり] \texttt{*} のある形の定義です。
% \end{description}
%
% |\secdef| は次のようにして使います。
%
%\begin{verbatim}
%   \def\chapter { ... \secdef \CMDA \CMDB }
%   \def\CMDA    [#1]#2{....} % \chapter[...]{...} の定義
%   \def\CMDB    #1{....}     % \chapter*{...} の定義
%\end{verbatim}
%
% まず |book| と |report| のクラス以外です。
%
%    \begin{macrocode}
%<*!book&!report>
\newcommand\part{%
  \if@noskipsec \leavevmode \fi
  \par
  \addvspace{4ex}%
  \if@english \@afterindentfalse \else \@afterindenttrue \fi
  \secdef\@part\@spart}
%</!book&!report>
%    \end{macrocode}
%
% |book| および |report| クラスの場合は，少し複雑です。
%
%    \begin{macrocode}
%<*book|report>
\newcommand\part{%
  \if@openleft
    \cleardoublepage
  \else\if@openright
    \cleardoublepage
  \else
    \clearpage
  \fi\fi
  \thispagestyle{empty}% 欧文用標準スタイルでは plain
  \if@twocolumn
    \onecolumn
    \@restonecoltrue
  \else
    \@restonecolfalse
  \fi
  \null\vfil
  \secdef\@part\@spart}
%</book|report>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@part}
%
% 部の見出しを出力します。
% |\bfseries| を |\headfont| に変えました。
%
% |book| および |report| クラス以外では |secnumdepth| が $-1$ より大きいとき
% 部番号を付けます。
%
%    \begin{macrocode}
%<*!book&!report>
\def\@part[#1]#2{%
  \ifnum \c@secnumdepth >\m@ne
    \refstepcounter{part}%
    \addcontentsline{toc}{part}{%
      \prepartname\thepart\postpartname\hspace{1\jsZw}#1}%
  \else
    \addcontentsline{toc}{part}{#1}%
  \fi
  \markboth{}{}%
  {\parindent\z@
    \raggedright
    \interlinepenalty \@M
    \normalfont
    \ifnum \c@secnumdepth >\m@ne
      \Large\headfont\prepartname\thepart\postpartname
      \par\nobreak
    \fi
    \huge \headfont #2%
    \markboth{}{}\par}%
  \nobreak
  \vskip 3ex
  \@afterheading}
%</!book&!report>
%    \end{macrocode}
%
% |book| および |report| クラスでは |secnumdepth| が $-2$ より大きいとき部番号を付けます。
%
%    \begin{macrocode}
%<*book|report>
\def\@part[#1]#2{%
  \ifnum \c@secnumdepth >-2\relax
    \refstepcounter{part}%
    \addcontentsline{toc}{part}{%
      \prepartname\thepart\postpartname\hspace{1\jsZw}#1}%
  \else
    \addcontentsline{toc}{part}{#1}%
  \fi
  \markboth{}{}%
  {\centering
    \interlinepenalty \@M
    \normalfont
    \ifnum \c@secnumdepth >-2\relax
      \huge\headfont \prepartname\thepart\postpartname
      \par\vskip20\jsc@mpt
    \fi
    \Huge \headfont #2\par}%
  \@endpart}
%</book|report>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@spart}
%
% 番号を付けない部です。
%
%    \begin{macrocode}
%<*!book&!report>
\def\@spart#1{{%
    \parindent \z@ \raggedright
    \interlinepenalty \@M
    \normalfont
    \huge \headfont #1\par}%
  \nobreak
  \vskip 3ex
  \@afterheading}
%</!book&!report>
%<*book|report>
\def\@spart#1{{%
    \centering
    \interlinepenalty \@M
    \normalfont
    \Huge \headfont #1\par}%
  \@endpart}
%</book|report>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@endpart}
%
% |\@part| と |\@spart| の最後で実行されるマクロです。
% 両面印刷のときは白ページを追加します。
% 二段組のときには，二段組に戻します。
%
% [2016-12-13] \texttt{openany} のときには白ページが追加されるのは変なので，
% その場合は追加しないようにしました。このバグは\LaTeX では
% classes.dtx v1.4b (2000/05/19)
% で修正されています。
%
%    \begin{macrocode}
%<*book|report>
\def\@endpart{\vfil\newpage
  \if@twoside
   \if@openleft %% added (2017/02/24)
    \null\thispagestyle{empty}\newpage
   \else\if@openright %% added (2016/12/13)
    \null\thispagestyle{empty}\newpage
   \fi\fi %% added (2016/12/13, 2017/02/24)
  \fi
  \if@restonecol
    \twocolumn
  \fi}
%</book|report>
%    \end{macrocode}
% \end{macro}
%
% \paragraph{章}
%
% \begin{macro}{\chapter}
%
%    章の最初のページスタイルは，全体が |empty| でなければ |plain| に
%    します。
%    また，|\@topnum| を 0 にして，
%    章見出しの上に図や表が来ないようにします。
%
%    \begin{macrocode}
%<*book|report>
\newcommand{\chapter}{%
  \if@openleft\cleardoublepage\else
  \if@openright\cleardoublepage\else\clearpage\fi\fi
  \plainifnotempty % 元: \thispagestyle{plain}
  \global\@topnum\z@
  \if@english \@afterindentfalse \else \@afterindenttrue \fi
  \secdef
    {\@omit@numberfalse\@chapter}%
    {\@omit@numbertrue\@schapter}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@chapter}
%
% 章見出しを出力します。
% |secnumdepth| が0以上かつ |\@mainmatter| が真のとき章番号を出力します。
%
%    \begin{macrocode}
\def\@chapter[#1]#2{%
  \ifnum \c@secnumdepth >\m@ne
    \if@mainmatter
      \refstepcounter{chapter}%
      \typeout{\@chapapp\thechapter\@chappos}%
      \addcontentsline{toc}{chapter}%
        {\protect\numberline
%       %{\if@english\thechapter\else\@chapapp\thechapter\@chappos\fi}%
        {\@chapapp\thechapter\@chappos}%
        #1}%
    \else\addcontentsline{toc}{chapter}{#1}\fi
  \else
    \addcontentsline{toc}{chapter}{#1}%
  \fi
  \chaptermark{#1}%
  \addtocontents{lof}{\protect\addvspace{10\jsc@mpt}}%
  \addtocontents{lot}{\protect\addvspace{10\jsc@mpt}}%
  \if@twocolumn
    \@topnewpage[\@makechapterhead{#2}]%
  \else
    \@makechapterhead{#2}%
    \@afterheading
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@makechapterhead}
%
%    実際に章見出しを組み立てます。
%    |\bfseries| を |\headfont| に変えました。
%
%    \begin{macrocode}
\def\@makechapterhead#1{%
  \vspace*{2\Cvs}% 欧文は50pt
  {\parindent \z@ \raggedright \normalfont
    \ifnum \c@secnumdepth >\m@ne
      \if@mainmatter
        \huge\headfont \@chapapp\thechapter\@chappos
        \par\nobreak
        \vskip \Cvs % 欧文は20pt
      \fi
    \fi
    \interlinepenalty\@M
    \Huge \headfont #1\par\nobreak
    \vskip 3\Cvs}} % 欧文は40pt
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@schapter}
%
% |\chapter*{...}| コマンドの本体です。
% |\chaptermark| を補いました。
%
%    \begin{macrocode}
\def\@schapter#1{%
  \chaptermark{#1}%
  \if@twocolumn
    \@topnewpage[\@makeschapterhead{#1}]%
  \else
    \@makeschapterhead{#1}\@afterheading
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@makeschapterhead}
%
% 番号なしの章見出しです。
%
%    \begin{macrocode}
\def\@makeschapterhead#1{%
  \vspace*{2\Cvs}% 欧文は50pt
  {\parindent \z@ \raggedright
    \normalfont
    \interlinepenalty\@M
    \Huge \headfont #1\par\nobreak
    \vskip 3\Cvs}} % 欧文は40pt
%</book|report>
%    \end{macrocode}
% \end{macro}
%
% \paragraph{下位レベルの見出し}
%
% \begin{macro}{\section}
%
% 欧文版では |\@startsection| の第4引数を負にして最初の段落の
% 字下げを禁止していますが，
% 和文版では正にして字下げするようにしています。
%
% 段組のときはなるべく左右の段が狂わないように工夫しています。
%
%    \begin{macrocode}
\if@twocolumn
  \newcommand{\section}{%
%<jspf>\ifx\maketitle\relax\else\maketitle\fi
    \@startsection{section}{1}{\z@}%
%<!kiyou>    {0.6\Cvs}{0.4\Cvs}%
%<kiyou>    {\Cvs}{0.5\Cvs}%
%   {\normalfont\large\headfont\@secapp}}
    {\normalfont\large\headfont\raggedright}}
\else
  \newcommand{\section}{%
    \if@slide\clearpage\fi
    \@startsection{section}{1}{\z@}%
    {\Cvs \@plus.5\Cdp \@minus.2\Cdp}% 前アキ
    {.5\Cvs \@plus.3\Cdp}% 後アキ
%   {\normalfont\Large\headfont\@secapp}}
    {\normalfont\Large\headfont\raggedright}}
\fi
%    \end{macrocode}
%
% \end{macro}
%
% \begin{macro}{\subsection}
%
% 同上です。
%
%    \begin{macrocode}
\if@twocolumn
  \newcommand{\subsection}{\@startsection{subsection}{2}{\z@}%
    {\z@}{\if@slide .4\Cvs \else \z@ \fi}%
    {\normalfont\normalsize\headfont}}
\else
  \newcommand{\subsection}{\@startsection{subsection}{2}{\z@}%
    {\Cvs \@plus.5\Cdp \@minus.2\Cdp}% 前アキ
    {.5\Cvs \@plus.3\Cdp}% 後アキ
    {\normalfont\large\headfont}}
\fi
%    \end{macrocode}
%
% \end{macro}
%
% \begin{macro}{\subsubsection}
%
% [2016-07-22] \texttt{slide}オプション指定時に |\subsubsection| の文字列
% と罫線が重なる問題に対処しました(forum:1982)。
%
%    \begin{macrocode}
\if@twocolumn
  \newcommand{\subsubsection}{\@startsection{subsubsection}{3}{\z@}%
    {\z@}{\if@slide .4\Cvs \else \z@ \fi}%
    {\normalfont\normalsize\headfont}}
\else
  \newcommand{\subsubsection}{\@startsection{subsubsection}{3}{\z@}%
    {\Cvs \@plus.5\Cdp \@minus.2\Cdp}%
    {\if@slide .5\Cvs \@plus.3\Cdp \else \z@ \fi}%
    {\normalfont\normalsize\headfont}}
\fi
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\paragraph}
% \begin{macro}{\jsParagraphMark}
%
%    見出しの後ろで改行されません。
%
% [2016-11-16] 従来は |\paragraph| の最初に出るマークを「■」に固定して
% いましたが，このマークを変更可能にするため |\jsParagraphMark| というマクロ
% に切り出しました。これで，たとえば
%\begin{verbatim}
%  \renewcommand{\jsParagraphMark}{★}
%\end{verbatim}
% とすれば「★」に変更できますし，マークを空にすることも容易です。
% なお，某学会クラスでは従来どおりマークは付きません。
%
% \begin{ZRnote}
%
% \Note BXJSクラスでは、1.1版[2016-02-14]から |\jsParagraphMark| を
% サポートしている。
%
% 段落のマーク（■）が必ず和文フォントで出力されるようにする。
%
% \begin{macro}{\jsJaChar}
% standard和文ドライバが読み込まれた場合は |\jachar| と同義で、
% それ以外は何もしない。
%    \begin{macrocode}
\let\jsJaChar\@empty
%    \end{macrocode}
% \end{macro}
%
% \end{ZRnote}
%    \begin{macrocode}
\newcommand\jsParagraphMark{\relax\jsJaChar{■}}
\let\bxjs@org@paragraph@mark\jsParagraphMark
\ifx\bxjs@paragraph@mark\@empty
  \let\jsParagraphMark\@empty
\else\ifx\bxjs@paragraph@mark\@undefined\else
  \long\edef\jsParagraphMark{\noexpand\jsJaChar{\bxjs@paragraph@mark}}
\fi\fi
\if@twocolumn
  \newcommand{\paragraph}{\@startsection{paragraph}{4}{\z@}%
    {\z@}{\if@slide .4\Cvs \else -1\jsZw\fi}% 改行せず 1\jsZw のアキ
%<jspf>    {\normalfont\normalsize\headfont}}
%<!jspf>    {\normalfont\normalsize\headfont\jsParagraphMark}}
\else
  \newcommand{\paragraph}{\@startsection{paragraph}{4}{\z@}%
    {0.5\Cvs \@plus.5\Cdp \@minus.2\Cdp}%
    {\if@slide .5\Cvs \@plus.3\Cdp \else -1\jsZw\fi}% 改行せず 1\jsZw のアキ
%<jspf>    {\normalfont\normalsize\headfont}}
%<!jspf>    {\normalfont\normalsize\headfont\jsParagraphMark}}
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\subparagraph}
%
%    見出しの後ろで改行されません。
%
%    \begin{macrocode}
\if@twocolumn
  \newcommand{\subparagraph}{\@startsection{subparagraph}{5}{\z@}%
    {\z@}{\if@slide .4\Cvs \@plus.3\Cdp \else -1\jsZw\fi}%
    {\normalfont\normalsize\headfont}}
\else
  \newcommand{\subparagraph}{\@startsection{subparagraph}{5}{\z@}%
    {\z@}{\if@slide .5\Cvs \@plus.3\Cdp \else -1\jsZw\fi}%
    {\normalfont\normalsize\headfont}}
\fi
%    \end{macrocode}
% \end{macro}
%
% \subsection{リスト環境}
%
% 第 $k$ レベルのリストの初期化をするのが |\@list|$k$ です
% （$k = \mathtt{i}, \mathtt{ii}, \mathtt{iii}, \mathtt{iv}$）。
% |\@list|$k$ は |\leftmargin| を |\leftmargin|$k$ に設定します。
%
% \begin{macro}{\leftmargini}
%
% 二段組であるかないかに応じてそれぞれ 2em，2.5em でしたが，
% ここでは全角幅の2倍にしました。
%
% [2002-05-11] 3zw に変更しました。
%
% [2005-03-19] 二段組は 2zw に戻しました。
%
%    \begin{macrocode}
\if@slide
  \setlength\leftmargini{1\jsZw}
\else
  \if@twocolumn
    \setlength\leftmargini{2\jsZw}
  \else
    \setlength\leftmargini{3\jsZw}
  \fi
\fi
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\leftmarginii}
% \begin{macro}{\leftmarginiii}
% \begin{macro}{\leftmarginiv}
% \begin{macro}{\leftmarginv}
% \begin{macro}{\leftmarginvi}
%
%    |ii|，|iii|，|iv| は |\labelsep| と
%    それぞれ `(m)'，`vii.'，`M.' の幅との和より大きくする
%    ことになっています。ここでは全角幅の整数倍に丸めました。
%
%    \begin{macrocode}
\if@slide
  \setlength\leftmarginii {1\jsZw}
  \setlength\leftmarginiii{1\jsZw}
  \setlength\leftmarginiv {1\jsZw}
  \setlength\leftmarginv  {1\jsZw}
  \setlength\leftmarginvi {1\jsZw}
\else
  \setlength\leftmarginii {2\jsZw}
  \setlength\leftmarginiii{2\jsZw}
  \setlength\leftmarginiv {2\jsZw}
  \setlength\leftmarginv  {1\jsZw}
  \setlength\leftmarginvi {1\jsZw}
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\labelsep}
% \begin{macro}{\labelwidth}
%
%    |\labelsep| はラベルと本文の間の距離です。
%    |\labelwidth| はラベルの幅です。
%    これは二分に変えました。
%
%    \begin{macrocode}
\setlength  \labelsep  {0.5\jsZw} % .5em
\setlength  \labelwidth{\leftmargini}
\addtolength\labelwidth{-\labelsep}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\partopsep}
%
%    リスト環境の前に空行がある場合，
%    |\parskip| と |\topsep| に |\partopsep| を
%    加えた値だけ縦方向の空白ができます。
%    0 に改変しました。
%
%    \begin{macrocode}
\setlength\partopsep{\z@} % {2\p@ \@plus 1\p@ \@minus 1\p@}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@beginparpenalty}
% \begin{macro}{\@endparpenalty}
% \begin{macro}{\@itempenalty}
%
%    リストや段落環境の前後，リスト項目間に挿入されるペナルティです。
%
%    \begin{macrocode}
\@beginparpenalty -\@lowpenalty
\@endparpenalty   -\@lowpenalty
\@itempenalty     -\@lowpenalty
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@listi}
% \begin{macro}{\@listI}
%
%    |\@listi| は |\leftmargin|，|\parsep|，|\topsep|，|\itemsep| などの
%    トップレベルの定義をします。
%    この定義は，フォントサイズコマンドによって変更されます
%    （たとえば |\small| の中では小さい値に設定されます）。
%    このため，|\normalsize| がすべてのパラメータを戻せるように，
%    |\@listI| で |\@listi| のコピーを保存します。
%    元の値はかなり複雑ですが，ここでは簡素化してしまいました。
%    特に最初と最後に行送りの半分の空きが入るようにしてあります。
%    アスキーの標準スタイルでは
%    トップレベルの |itemize|，|enumerate| 環境でだけ
%    最初と最後に行送りの半分の空きが入るようになっていました。
%
%    [2004-09-27] |\topsep| のグルー $_{-0.1}^{+0.2}$ |\baselineskip|
%    を思い切って外しました。
%
%    \begin{macrocode}
\def\@listi{\leftmargin\leftmargini
  \parsep \z@
  \topsep 0.5\baselineskip
  \itemsep \z@ \relax}
\let\@listI\@listi
%    \end{macrocode}
%
%    念のためパラメータを初期化します（実際には不要のようです）。
%
%    \begin{macrocode}
\@listi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@listii}
% \begin{macro}{\@listiii}
% \begin{macro}{\@listiv}
% \begin{macro}{\@listv}
% \begin{macro}{\@listvi}
%
%    第2\zrWDash6レベルのリスト環境のパラメータの設定です。
%
%    \begin{macrocode}
\def\@listii{\leftmargin\leftmarginii
  \labelwidth\leftmarginii \advance\labelwidth-\labelsep
  \topsep \z@
  \parsep \z@
  \itemsep\parsep}
\def\@listiii{\leftmargin\leftmarginiii
  \labelwidth\leftmarginiii \advance\labelwidth-\labelsep
  \topsep \z@
  \parsep \z@
  \itemsep\parsep}
\def\@listiv {\leftmargin\leftmarginiv
              \labelwidth\leftmarginiv
              \advance\labelwidth-\labelsep}
\def\@listv  {\leftmargin\leftmarginv
              \labelwidth\leftmarginv
              \advance\labelwidth-\labelsep}
\def\@listvi {\leftmargin\leftmarginvi
              \labelwidth\leftmarginvi
              \advance\labelwidth-\labelsep}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \paragraph{enumerate環境}
%
% |enumerate| 環境はカウンタ |enumi|，|enumii|，|enumiii|，
% |enumiv| を使います。|enum|$n$ は第 $n$ レベルの番号です。
%
% \begin{macro}{\theenumi}
% \begin{macro}{\theenumii}
% \begin{macro}{\theenumiii}
% \begin{macro}{\theenumiv}
%
%    出力する番号の書式を設定します。
%    これらは\LaTeX 本体（\texttt{ltlists.dtx} 参照）で定義済みですが，
%    ここでは表し方を変えています。
%    |\@arabic|，|\@alph|，|\@roman|，|\@Alph| はそれぞれ
%    算用数字，小文字アルファベット，小文字ローマ数字，大文字アルファベット
%    で番号を出力する命令です。
%
%    \begin{macrocode}
\renewcommand{\theenumi}{\@arabic\c@enumi}
\renewcommand{\theenumii}{\@alph\c@enumii}
\renewcommand{\theenumiii}{\@roman\c@enumiii}
\renewcommand{\theenumiv}{\@Alph\c@enumiv}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\labelenumi}
% \begin{macro}{\labelenumii}
% \begin{macro}{\labelenumiii}
% \begin{macro}{\labelenumiv}
%
%    |enumerate| 環境の番号を出力する命令です。
%    第2レベル以外は最後に欧文のピリオドが付きますが，
%    これは好みに応じて取り払ってください。
%    第2レベルの番号のかっこは和文用に換え，
%    その両側に入る余分なグルーを |\inhibitglue| で
%    取り除いています。
% \begin{ZRnote}
% 和文の括弧で囲むための補助命令 |\jsInJaParen| を
% 定義して |\labelenumii| でそれを用いている。
%^^A \Note 現状の |zxjatype| の |\inhibitglue| の実装には
%^^A 「前後のグルーを消してしまう」という不備があって、
%^^A そのため |enumii| の出力が異常になるという不具合があった。
% \end{ZRnote}
%
%    \begin{macrocode}
\newcommand*{\jsInJaParen}[1]{%
  \mbox{\jsInhibitGlue （#1）\jsInhibitGlue}}
\newcommand{\labelenumi}{\theenumi.}
\newcommand{\labelenumii}{\jsInJaParen{\theenumii}}
\newcommand{\labelenumiii}{\theenumiii.}
\newcommand{\labelenumiv}{\theenumiv.}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\p@enumii}
% \begin{macro}{\p@enumiii}
% \begin{macro}{\p@enumiv}
%
%    |\p@enum|$n$ は |\ref| コマンドで |enumerate| 環境の第 $n$ レベルの
%    項目が参照されるときの書式です。
%    これも第2レベルは和文用かっこにしました。
%
%    \begin{macrocode}
\renewcommand{\p@enumii}{\theenumi}
\renewcommand{\p@enumiii}{\theenumi\jsInhibitGlue （\theenumii ）}
\renewcommand{\p@enumiv}{\p@enumiii\theenumiii}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \paragraph{itemize環境}
%
% \begin{macro}{\labelitemi}
% \begin{macro}{\labelitemii}
% \begin{macro}{\labelitemiii}
% \begin{macro}{\labelitemiv}
%    |itemize| 環境の第 $n$ レベルのラベルを作るコマンドです。
%    \begin{macrocode}
\newcommand\labelitemi{\textbullet}
\newcommand\labelitemii{\normalfont\bfseries \textendash}
\newcommand\labelitemiii{\textasteriskcentered}
\newcommand\labelitemiv{\textperiodcentered}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \paragraph{description環境}
%
% \begin{environment}{description}
%
% 本来の |description| 環境では，項目名が短いと，説明部分の頭が
% それに引きずられて左に出てしまいます。
% これを解決した新しい |description| の実装です。
%
%    \begin{macrocode}
\newenvironment{description}{%
  \list{}{%
    \labelwidth=\leftmargin
    \labelsep=1\jsZw
    \advance \labelwidth by -\labelsep
    \let \makelabel=\descriptionlabel}}{\endlist}
%    \end{macrocode}
% \end{environment}
%
% \begin{macro}{\descriptionlabel}
%
%    |description| 環境のラベルを出力するコマンドです。
%    好みに応じて |#1| の前に適当な空き
%    （たとえば |\hspace{1\jsZw}|）を入れるのもいいと思います。
%
%    \begin{macrocode}
\newcommand*\descriptionlabel[1]{\normalfont\headfont #1\hfil}
%    \end{macrocode}
% \end{macro}
%
% \paragraph{概要}
%
% \begin{environment}{abstract}
%
% 概要（要旨，梗概）を出力する環境です。
% |book| クラスでは各章の初めにちょっとしたことを書くのに使います。
% |titlepage| オプション付きの |article| クラスでは，
% 独立したページに出力されます。
% |abstract| 環境は元は |quotation| 環境で作られていましたが，
% |quotation| 環境の右マージンをゼロにしたので，
% |list| 環境で作り直しました。
%
% JSPFスタイルでは実際の出力は |\maketitle| で行われます。
%
% \begin{ZRnote}
% |bxjsreport| クラスのabstract環境は：
% \begin{itemize}
% \item |layout=v1| の場合は |jsbook|＋|report| の動作を継承する。
%   つまり |jsbook| と同じになる。
% \item |layout=v2| の場合は新設の |jsreport| の動作を継承する。
%   つまり |jsarticle|（＋|titlapage|）と同じになる。
% \end{itemize}
%
% \begin{environment}{chapterabstract}
% |jsbook| のabstract環境
% （「各章の初めにちょっとしたことを書く」ためのもの）
% をchapterabstractと呼ぶことにする。
%    \begin{macrocode}
%<*book|report>
\newenvironment{chapterabstract}{%
  \begin{list}{}{%
    \listparindent=1\jsZw
    \itemindent=\listparindent
    \rightmargin=0pt
    \leftmargin=5\jsZw}\item[]}{\end{list}\vspace{\baselineskip}}
%</book|report>
%    \end{macrocode}
% \end{environment}
%
% “普通の”abstract環境の定義。
%    \begin{macrocode}
%<*article|report|slide>
\newbox\@abstractbox
\if@titlepage
  \newenvironment{abstract}{%
    \titlepage
    \null\vfil
    \@beginparpenalty\@lowpenalty
    \begin{center}%
      \headfont \abstractname
      \@endparpenalty\@M
    \end{center}%
%    \end{macrocode}
% BXJSクラスでは、
% 概要の最初の段落に段落下げが入るようにする。
%    \begin{macrocode}
    \par}%
  {\par\vfil\null\endtitlepage}
\else
  \newenvironment{abstract}{%
    \if@twocolumn
      \ifx\maketitle\relax
        \section*{\abstractname}%
      \else
        \global\setbox\@abstractbox\hbox\bgroup
        \begin{minipage}[b]{\textwidth}
          \small\parindent1\jsZw
          \begin{center}%
            {\headfont \abstractname\vspace{-.5em}\vspace{\z@}}%
          \end{center}%
          \list{}{%
            \listparindent\parindent
            \itemindent \listparindent
            \rightmargin \leftmargin}%
          \item\relax
      \fi
    \else
      \small
      \begin{center}%
        {\headfont \abstractname\vspace{-.5em}\vspace{\z@}}%
      \end{center}%
      \list{}{%
        \listparindent\parindent
        \itemindent \listparindent
        \rightmargin \leftmargin}%
      \item\relax
    \fi}{\if@twocolumn
      \ifx\maketitle\relax
      \else
        \endlist\end{minipage}\egroup
      \fi
    \else
      \endlist
    \fi}
\fi
%</article|report|slide>
%<*jspf>
\newbox\@abstractbox
\newenvironment{abstract}{%
  \global\setbox\@abstractbox\hbox\bgroup
  \begin{minipage}[b]{157\jsc@mmm}{\sffamily Abstract}\par
    \small
    \if@english \parindent6\jsc@mmm \else \parindent1\jsZw \fi}%
  {\end{minipage}\egroup}
%</jspf>
%    \end{macrocode}
%
% |bxjs@force@chapterabstract| が真の場合は、abstract環境を
% chapterabstract環境と等価にする。
%    \begin{macrocode}
%<*book|report>
\ifbxjs@force@chapterabstract
  \let\abstract\chapterabstract
  \let\endabstract\endchapterabstract
\fi
%</book|report>
%    \end{macrocode}
% \end{ZRnote}
%
% \end{environment}
%
% \paragraph{キーワード}
%
% \begin{environment}{keywords}
%
% キーワードを準備する環境です。
% 実際の出力は |\maketitle| で行われます。
%
%    \begin{macrocode}
%<*jspf>
%\newbox\@keywordsbox
%\newenvironment{keywords}{%
%  \global\setbox\@keywordsbox\hbox\bgroup
%  \begin{minipage}[b]{1570\jsc@mmm}{\sffamily Keywords:}\par
%    \small\parindent0\jsZw}%
%  {\end{minipage}\egroup}
%</jspf>
%    \end{macrocode}
% \end{environment}
%
% \paragraph{verse環境}
%
% \begin{environment}{verse}
%
% 詩のための |verse| 環境です。
%
%    \begin{macrocode}
\newenvironment{verse}{%
  \let \\=\@centercr
  \list{}{%
    \itemsep \z@
    \itemindent -2\jsZw % 元: -1.5em
    \listparindent\itemindent
    \rightmargin \z@
    \advance\leftmargin 2\jsZw}% 元: 1.5em
  \item\relax}{\endlist}
%    \end{macrocode}
% \end{environment}
%
% \paragraph{quotation環境}
%
% \begin{environment}{quotation}
%
% 段落の頭の字下げ量を1.5emから |\parindent| に変えました。
% また，右マージンを 0 にしました。
%
%    \begin{macrocode}
\newenvironment{quotation}{%
  \list{}{%
    \listparindent\parindent
    \itemindent\listparindent
    \rightmargin \z@}%
  \item\relax}{\endlist}
%    \end{macrocode}
% \end{environment}
%
% \paragraph{quote環境}
%
% \begin{environment}{quote}
%
% |quote| 環境は，段落がインデントされないことを除き，
% |quotation| 環境と同じです。
%
%    \begin{macrocode}
\newenvironment{quote}%
  {\list{}{\rightmargin\z@}\item\relax}{\endlist}
%    \end{macrocode}
% \end{environment}
%
% \paragraph{定理など}
%
% |ltthm.dtx| 参照。たとえば次のように定義します。
%\begin{verbatim}
%  \newtheorem{definition}{定義}
%  \newtheorem{axiom}{公理}
%  \newtheorem{theorem}{定理}
%\end{verbatim}
%
% [2001-04-26] 定理の中はイタリック体になりましたが，
% これでは和文がゴシック体になってしまうので，
% |\itshape| を削除しました。
%
% [2009-08-23] |\bfseries| を |\headfont| に直し，
% |\labelsep| を 1\,zw にし，括弧を全角にしました。
%
%    \begin{macrocode}
\def\@begintheorem#1#2{\trivlist\labelsep=1\jsZw
   \item[\hskip \labelsep{\headfont #1\ #2}]}
\def\@opargbegintheorem#1#2#3{\trivlist\labelsep=1\jsZw
      \item[\hskip \labelsep{\headfont #1\ #2（#3）}]}
%    \end{macrocode}
%
% \begin{environment}{titlepage}
%
% タイトルを独立のページに出力するのに使われます。
%
% [2017-02-24] コミュニティ版\pLaTeX の標準クラス2017/02/15に合わせて，
% bookクラスでタイトルを必ず奇数ページに送るようにしました。といっても，
% 横組クラスしかありませんでしたので，従来の挙動は何も変わっていません。
% また，book以外の場合のページ番号のリセットもコミュニティ版\pLaTeX の
% 標準クラス2017/02/15に合わせましたが，こちらも片面印刷あるいは
% 独立のタイトルページを作らないクラスばかりでしたので，従来の挙動は
% 何も変わらずに済みました。
%
%    \begin{macrocode}
\newenvironment{titlepage}{%
%<book>    \pltx@cleartooddpage %% 2017-02-24
    \if@twocolumn
      \@restonecoltrue\onecolumn
    \else
      \@restonecolfalse\newpage
    \fi
    \thispagestyle{empty}%
    \ifodd\c@page\setcounter{page}\@ne\else\setcounter{page}\z@\fi %% 2017-02-24
  }%
  {\if@restonecol\twocolumn \else \newpage \fi
    \if@twoside\else
      \setcounter{page}\@ne
    \fi}
%    \end{macrocode}
% \end{environment}
%
% \paragraph{付録}
%
% \begin{macro}{\appendix}
%
% 本文と付録を分離するコマンドです。
%
%    \begin{macrocode}
%<*!book&!report>
\newcommand{\appendix}{\par
  \setcounter{section}{0}%
  \setcounter{subsection}{0}%
  \ifnum\bxjs@label@section=\bxjs@label@section@@compat
  \gdef\presectionname{\appendixname}%
  \gdef\postsectionname{}%
% \gdef\thesection{\@Alph\c@section}% [2003-03-02]
  \gdef\thesection{\presectionname\@Alph\c@section\postsectionname}%
  \gdef\thesubsection{\@Alph\c@section.\@arabic\c@subsection}%
  \else
  \gdef\@secapp{\appendixname}%
  \gdef\@secpos{}%
  \gdef\thesection{\@Alph\c@section}%
  \fi}
%</!book&!report>
%<*book|report>
\newcommand{\appendix}{\par
  \setcounter{chapter}{0}%
  \setcounter{section}{0}%
  \gdef\@chapapp{\appendixname}%
  \gdef\@chappos{}%
  \gdef\thechapter{\@Alph\c@chapter}}
%</book|report>
%    \end{macrocode}
% \end{macro}
%
% \subsection{パラメータの設定}
%
% \paragraph{arrayとtabular環境}
%
% \begin{macro}{\arraycolsep}
%
% |array| 環境の列間には |\arraycolsep| の2倍の幅の空きが入ります。
%
%    \begin{macrocode}
\setlength\arraycolsep{5\jsc@mpt}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\tabcolsep}
%
% |tabular| 環境の列間には |\tabcolsep| の2倍の幅の空きが入ります。
%
%    \begin{macrocode}
\setlength\tabcolsep{6\jsc@mpt}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\arrayrulewidth}
%
% |array|，|tabular| 環境内の罫線の幅です。
%
%    \begin{macrocode}
\setlength\arrayrulewidth{.4\p@}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\doublerulesep}
%
% |array|，|tabular| 環境での二重罫線間のアキです。
%
%    \begin{macrocode}
\setlength\doublerulesep{2\p@}
%    \end{macrocode}
% \end{macro}
%
% \paragraph{tabbing環境}
%
% \begin{macro}{\tabbingsep}
%
% |\'| コマンドで入るアキです。
%
%    \begin{macrocode}
\setlength\tabbingsep{\labelsep}
%    \end{macrocode}
% \end{macro}
%
% \paragraph{minipage環境}
%
% \begin{macro}{\@mpfootins}
%
% |minipage| 環境の脚注の |\skip|\hspace{0pt}|\@mpfootins|
% は通常のページの |\skip|\hspace{0pt}|\footins|
% と同じ働きをします。
%
%    \begin{macrocode}
\skip\@mpfootins = \skip\footins
%    \end{macrocode}
% \end{macro}
%
% \paragraph{framebox環境}
%
% \begin{macro}{\fboxsep}
%
% |\fbox|，|\framebox| で内側のテキストと枠との間の空きです。
%
% \begin{macro}{\fboxrule}
%
% |\fbox|，|\framebox| の罫線の幅です。
%
%    \begin{macrocode}
\setlength\fboxsep{3\jsc@mpt}
\setlength\fboxrule{.4\p@}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \paragraph{equationとeqnarray環境}
%
% \begin{macro}{\theequation}
%
% 数式番号を出力するコマンドです。
%
%    \begin{macrocode}
%<!book&!report>\renewcommand \theequation {\@arabic\c@equation}
%<*book|report>
\@addtoreset{equation}{chapter}
\renewcommand\theequation
  {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@equation}
%</book|report>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jot}
%
%    |eqnarray| の行間に余分に入るアキです。
%    デフォルトの値をコメントアウトして示しておきます。
%
%    \begin{macrocode}
% \setlength\jot{3pt}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@eqnnum}
%
%    数式番号の形式です。
%    デフォルトの値をコメントアウトして示しておきます。
%
%    |\jsInhibitGlue （\theequation ）\jsInhibitGlue| のように和文かっこ
%    を使うことも可能です。
%
%    \begin{macrocode}
% \def\@eqnnum{(\theequation)}
%    \end{macrocode}
% \end{macro}
%
%    |amsmath| パッケージを使う場合は |\tagform@| を次のように修正します。
%
%    \begin{macrocode}
% \def\tagform@#1{\maketag@@@{（\ignorespaces#1\unskip\@@italiccorr ）}}
%    \end{macrocode}
%
% \subsection{フロート}
%
% タイプ \texttt{TYPE} のフロートオブジェクトを
% 扱うには，次のマクロを定義します。
% \begin{description}
% \item[\texttt{\bslash fps@TYPE}]
%   フロートを置く位置（float placement specifier）です。
% \item[\texttt{\bslash ftype@TYPE}]
%   フロートの番号です。2の累乗（1，2，4，\ldots ）でなければなりません。
% \item[\texttt{\bslash ext@TYPE}]
%   フロートの目次を出力するファイルの拡張子です。
% \item[\texttt{\bslash fnum@TYPE}]
%   キャプション用の番号を生成するマクロです。
% \item[\texttt{\bslash @makecaption}{\meta{num}}{\meta{text}}]
%   キャプションを出力するマクロです。
%   \meta{num} は |\fnum@...| の生成する番号，
%   \meta{text} はキャプションのテキストです。
%   テキストは適当な幅の |\parbox| に入ります。
% \end{description}
%
% \paragraph{figure環境}
%
% \begin{macro}{\c@figure}
%
% 図番号のカウンタです。
%
% \begin{macro}{\thefigure}
%
% 図番号を出力するコマンドです。
%
%    \begin{macrocode}
%<*!book&!report>
\newcounter{figure}
\renewcommand \thefigure {\@arabic\c@figure}
%</!book&!report>
%<*book|report>
\newcounter{figure}[chapter]
\renewcommand \thefigure
     {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@figure}
%</book|report>
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\fps@figure}
% \begin{macro}{\ftype@figure}
% \begin{macro}{\ext@figure}
% \begin{macro}{\fnum@figure}
%
%    |figure| のパラメータです。
%    |\figurename| の直後に |~| が入っていましたが，
%    ここでは外しました。
%
%    \begin{macrocode}
\def\fps@figure{tbp}
\def\ftype@figure{1}
\def\ext@figure{lof}
\def\fnum@figure{\figurename\nobreak\thefigure}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{environment}{figure}
% \begin{environment}{figure*}
%
% |*| 形式は段抜きのフロートです。
%
%    \begin{macrocode}
\newenvironment{figure}%
               {\@float{figure}}%
               {\end@float}
\newenvironment{figure*}%
               {\@dblfloat{figure}}%
               {\end@dblfloat}
%    \end{macrocode}
% \end{environment}
% \end{environment}
%
% \paragraph{table環境}
%
% \begin{macro}{\c@table}
% \begin{macro}{\thetable}
%
% 表番号カウンタと表番号を出力するコマンドです。
% アスキー版では |\thechapter.| が |\thechapter{}・| になっていますが，
% ここではオリジナルのままにしています。
%
%    \begin{macrocode}
%<*!book&!report>
\newcounter{table}
\renewcommand\thetable{\@arabic\c@table}
%</!book&!report>
%<*book|report>
\newcounter{table}[chapter]
\renewcommand \thetable
     {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@table}
%</book|report>
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\fps@table}
% \begin{macro}{\ftype@table}
% \begin{macro}{\ext@table}
% \begin{macro}{\fnum@table}
%
% |table| のパラメータです。
% |\tablename| の直後に |~| が入っていましたが，
% ここでは外しました。
%
%    \begin{macrocode}
\def\fps@table{tbp}
\def\ftype@table{2}
\def\ext@table{lot}
\def\fnum@table{\tablename\nobreak\thetable}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{environment}{table}
% \begin{environment}{table*}
%
% |*| は段抜きのフロートです。
%
%    \begin{macrocode}
\newenvironment{table}%
               {\@float{table}}%
               {\end@float}
\newenvironment{table*}%
               {\@dblfloat{table}}%
               {\end@dblfloat}
%    \end{macrocode}
% \end{environment}
% \end{environment}
%
% \subsection{キャプション}
%
% \begin{macro}{\@makecaption}
%
% |\caption| コマンドにより呼び出され，
% 実際にキャプションを出力するコマンドです。
% 第1引数はフロートの番号，
% 第2引数はテキストです。
%
% \begin{macro}{\abovecaptionskip}
% \begin{macro}{\belowcaptionskip}
%
% それぞれキャプションの前後に挿入されるスペースです。
% |\belowcaptionskip| が0になっていましたので，
% キャプションを表の上につけた場合にキャプションと表が
% くっついてしまうのを直しました。
%
%    \begin{macrocode}
\newlength\abovecaptionskip
\newlength\belowcaptionskip
\setlength\abovecaptionskip{5\jsc@mpt} % 元: 10\p@
\setlength\belowcaptionskip{5\jsc@mpt} % 元: 0\p@
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% 実際のキャプションを出力します。
% オリジナルと異なり，文字サイズを |\small| にし，
% キャプションの幅を2cm狭くしました。
%
% [2003-11-05] ロジックを少し変えてみました。
%
% [2018-12-11] 遅くなりましたが，|listings| パッケージを使うときに
% |title| を指定すると ``1zw'' が出力されてしまう
% 問題 (forum:1543，Issue \#71) に対処しました。
%
%    \begin{macrocode}
%<*!jspf>
% \long\def\@makecaption#1#2{{\small
%   \advance\leftskip10\jsc@mmm
%   \advance\rightskip10\jsc@mmm
%   \vskip\abovecaptionskip
%   \sbox\@tempboxa{#1\hskip1\jsZw\relax #2}%
%   \ifdim \wd\@tempboxa >\hsize
%     #1\hskip1\jsZw\relax #2\par
%   \else
%     \global \@minipagefalse
%     \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
%   \fi
%   \vskip\belowcaptionskip}}
\long\def\@makecaption#1#2{{\small
  \advance\leftskip .0628\linewidth
  \advance\rightskip .0628\linewidth
  \vskip\abovecaptionskip
  \sbox\@tempboxa{#1\zwspace#2}%
  \ifdim \wd\@tempboxa <\hsize \centering \fi
  #1\zwspace#2\par
  \vskip\belowcaptionskip}}
%</!jspf>
%<*jspf>
\long\def\@makecaption#1#2{%
  \vskip\abovecaptionskip
  \sbox\@tempboxa{\small\sffamily #1\quad #2}%
  \ifdim \wd\@tempboxa >\hsize
    {\small\sffamily
      \list{#1}{%
        \renewcommand{\makelabel}[1]{##1\hfil}
        \itemsep    \z@
        \itemindent \z@
        \labelsep   \z@
        \labelwidth 11\jsc@mmm
        \listparindent\z@
        \leftmargin 11\jsc@mmm}\item\relax #2\endlist}
  \else
    \global \@minipagefalse
    \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
  \fi
  \vskip\belowcaptionskip}
%</jspf>
%    \end{macrocode}
% \end{macro}
%
% \section{フォントコマンド}
%
% ここでは\LaTeX~2.09で使われていたコマンドを定義します。
% これらはテキストモードと数式モードのどちらでも動作します。
% これらは互換性のためのもので，
% できるだけ |\text...| と |\math...| を使ってください。
%
% [2016-07-15] KOMA-Script中の |\scr@DeclareOldFontCommand| に倣い、
% これらの命令を使うときには警告を発することにしました。
%
% [2016-07-16] 警告を最初の一回だけ発することにしました。また，
% 例外的に警告を出さないようにするスイッチも付けます。
%
% \begin{macro}{\if@jsc@warnoldfontcmd}
% \begin{macro}{\if@jsc@warnoldfontcmdexception}
% \begin{ZRnote}
% |\if@jsc@warnoldfontcmd| はBXJSクラスでは不使用。\par
% |\if@jsc@warnoldfontcmdexception| は |\allow/disallowoldfontcommands|
% の状態を表す。
% \end{ZRnote}
%    \begin{macrocode}
\newif\if@jsc@warnoldfontcmd
\@jsc@warnoldfontcmdtrue
\newif\if@jsc@warnoldfontcmdexception
\@jsc@warnoldfontcmdexceptionfalse
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\jsc@DeclareOldFontCommand}
%    \begin{macrocode}
\newcommand*{\jsc@DeclareOldFontCommand}[3]{%
  \g@addto@macro\bxjs@oldfontcmd@list{\do#1}%
  \DeclareOldFontCommand{#1}{%
    \bxjs@oldfontcmd{#1}#2%
  }{%
    \bxjs@oldfontcmd{#1}#3%
  }%
}
\DeclareRobustCommand*{\jsc@warnoldfontcmd}[1]{%
  \ClassInfo\bxjs@clsname
   {Old font command '\string#1' is used!!\MessageBreak
    The first occurrence is}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{ZRnote}
%
% \begin{macro}{\allowoldfontcommands}
% “二文字フォント命令”の使用を許可する（警告しない）。
% \begin{macro}{\disallowoldfontcommands}
% “二文字フォント命令”の使用に対して警告を出す。
%    \begin{macrocode}
\DeclareRobustCommand*{\allowoldfontcommands}{%
  \@jsc@warnoldfontcmdexceptiontrue}
\DeclareRobustCommand*{\disallowoldfontcommands}{%
  \@jsc@warnoldfontcmdexceptionfalse}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%    \begin{macrocode}
\let\bxjs@oldfontcmd@list\@empty
\def\bxjs@oldfontcmd#1{%
  \expandafter\bxjs@oldfontcmd@a\csname bxjs@ofc/\string#1\endcsname#1}
\def\bxjs@oldfontcmd@a#1#2{%
  \if@jsc@warnoldfontcmdexception\else
    \global\@jsc@warnoldfontcmdfalse
    \ifx#1\relax
      \global\let#1=t%
      \jsc@warnoldfontcmd{#2}%
    \fi
  \fi}
\def\bxjs@warnoldfontcmd@final{%
% \par
  \global\let\bxjs@warnoldfontcmd@final\@empty
  \let\@tempa\@empty
  \def\do##1{%
    \@ifundefined{bxjs@ofc/\string##1}{}{%else
      \edef\@tempa{\@tempa \space\string##1}}}%
  \bxjs@oldfontcmd@list
  \ifx\@tempa\@empty\else
    \ClassWarningNoLine\bxjs@clsname
     {Some old font commands were used in text:\MessageBreak
      \space\@tempa\MessageBreak
      You should note, that since 1994 LaTeX2e provides a\MessageBreak
      new font selection scheme called NFSS2 with several\MessageBreak
      new, combinable font commands. The
      class provides\MessageBreak
      the old font commands only for compatibility}
  \fi}
%    \end{macrocode}
% 単純に |\AtEndDocument| のフックの中で |\bxjs@warnoldfontcmd@final| を
% 実行した場合、最終ページのヘッダ・フッタの中にある二文字フォント命令は
% それより後に実行されるため捕捉できない。
% これに対処するため、|\end{document}| 中に実行される |\clearpage| の処理の
% 直後に |\bxjs....final| が呼ばれるようにする。
% \Note 新しい{\LaTeX}ではフックシステムの機能を利用する。
%    \begin{macrocode}
\ifbxjs@old@hook@system
  \AtEndDocument{%
    \g@addto@macro\clearpage{\bxjs@warnoldfontcmd@final}}
\else
  \AddToHook{enddocument/afterlastpage}{\bxjs@warnoldfontcmd@final}
\fi
%    \end{macrocode}
%
% \end{ZRnote}
%
% \begin{macro}{\mc}
% \begin{macro}{\gt}
% \begin{macro}{\rm}
% \begin{macro}{\sf}
% \begin{macro}{\tt}
%
% フォントファミリを変更します。
%
%    \begin{macrocode}
\jsc@DeclareOldFontCommand{\mc}{\normalfont\mcfamily}{\mathmc}
\jsc@DeclareOldFontCommand{\gt}{\normalfont\gtfamily}{\mathgt}
\jsc@DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\jsc@DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
\jsc@DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\bf}
%
% ボールドシリーズにします。通常のミーディアムシリーズに戻す
% コマンドは |\mdseries| です。
%
%    \begin{macrocode}
\jsc@DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\it}
% \begin{macro}{\sl}
% \begin{macro}{\sc}
%
% フォントシェイプを変えるコマンドです。
% 斜体とスモールキャップスは数式中では何もしません
% （警告メッセージを出力します）。
% 通常のアップライト体に戻すコマンドは |\upshape| です。
%
%    \begin{macrocode}
\jsc@DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
\jsc@DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
\jsc@DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\cal}
% \begin{macro}{\mit}
%
% 数式モード以外では何もしません（警告を出します）。
%
%    \begin{macrocode}
\DeclareRobustCommand*{\cal}{\@fontswitch\relax\mathcal}
\DeclareRobustCommand*{\mit}{\@fontswitch\relax\mathnormal}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \section{相互参照}
%
% \subsection{目次の類}
%
% |\section| コマンドは |.toc| ファイルに次のような行を出力します。
% \begin{quote}
%   |\contentsline{section}{タイトル}{ページ}|
% \end{quote}
% たとえば |\section| に見出し番号が付く場合，上の「タイトル」は
% \begin{quote}
%   |\numberline{番号}{見出し}|
% \end{quote}
% となります。
% この「番号」は |\thesection| コマンドで生成された見出し番号です。
%
% |figure| 環境の |\caption| コマンドは |.lof| ファイルに
% 次のような行を出力します。
% \begin{quote}
% |\contentsline{figure}{\numberline{番号}{キャプション}{ページ}|
% \end{quote}
% この「番号」は |\thefigure| コマンドで生成された図番号です。
%
% |table| 環境も同様です。
%
% |\contentsline{...}| は |\l@...| というコマンドを実行するので，
% あらかじめ |\l@chapter|，|\l@section|，|\l@figure| などを
% 定義しておかなければなりません。
% これらの多くは |\@dottedtocline| コマンドを使って定義します。
% これは
% \begin{quote}
%   |\@dottedtocline{レベル}{インデント}{幅}{タイトル}{ページ}|
% \end{quote}
% という書式です。
% \begin{description}
% \item[レベル] この値が |tocdepth| 以下のときだけ出力されます。
%   |\chapter| はレベル0，|\section| はレベル1，等々です。
% \item[インデント] 左側の字下げ量です。
% \item[幅] 「タイトル」に |\numberline| コマンドが含まれる場合，
%   節番号が入る箱の幅です。
% \end{description}
%
% \begin{macro}{\@pnumwidth}
%
% ページ番号の入る箱の幅です。
%
% \begin{macro}{\@tocrmarg}
%
% 右マージンです。
% |\@tocrmarg| $\ge$ |\@pnumwidth| とします。
%
% \begin{macro}{\@dotsep}
%
% 点の間隔です（単位 mu）。
%
% \begin{macro}{\c@tocdepth}
%
% 目次ページに出力する見出しレベルです。
% 元は \texttt{article} で3，その他で2でしたが，
% ここでは一つずつ減らしています。
%
%    \begin{macrocode}
\newcommand\@pnumwidth{1.55em}
\newcommand\@tocrmarg{2.55em}
\newcommand\@dotsep{4.5}
%<!book&!report>\setcounter{tocdepth}{2}
%<book|report>\setcounter{tocdepth}{1}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \paragraph{目次}
%
% \begin{macro}{\tableofcontents}
%
% 目次を生成します。
%
% \begin{macro}{\jsc@tocl@width}
%
% [2013-12-30] |\prechaptername| などから見積もった目次のラベルの長さです。(by ts)
%
%    \begin{macrocode}
\newdimen\jsc@tocl@width
\newcommand{\tableofcontents}{%
%<*book|report>
  \settowidth\jsc@tocl@width{\headfont\prechaptername\postchaptername}%
  \settowidth\@tempdima{\headfont\appendixname}%
  \ifdim\jsc@tocl@width<\@tempdima \setlength\jsc@tocl@width{\@tempdima}\fi
  \ifdim\jsc@tocl@width<2\jsZw \divide\jsc@tocl@width by 2 \advance\jsc@tocl@width 1\jsZw\fi
  \if@twocolumn
    \@restonecoltrue\onecolumn
  \else
    \@restonecolfalse
  \fi
  \chapter*{\contentsname}%
  \@mkboth{\contentsname}{}%
%</book|report>
%<*!book&!report>
  \settowidth\jsc@tocl@width{\headfont\presectionname\postsectionname}%
  \settowidth\@tempdima{\headfont\appendixname}%
  \ifdim\jsc@tocl@width<\@tempdima\relax\setlength\jsc@tocl@width{\@tempdima}\fi
  \ifdim\jsc@tocl@width<2\jsZw \divide\jsc@tocl@width by 2 \advance\jsc@tocl@width 1\jsZw\fi
  \section*{\contentsname}%
  \@mkboth{\contentsname}{\contentsname}%
%</!book&!report>
  \@starttoc{toc}%
%<book|report>  \if@restonecol\twocolumn\fi
}
%    \end{macrocode}
% \end{macro}\end{macro}
%
% \begin{macro}{\l@part}
%
% 部の目次です。
%
%    \begin{macrocode}
\newcommand*{\l@part}[2]{%
  \ifnum \c@tocdepth >-2\relax
%<!book&!report>    \addpenalty\@secpenalty
%<book|report>    \addpenalty{-\@highpenalty}%
    \addvspace{2.25em \@plus\jsc@mpt}%
    \begingroup
      \parindent \z@
%     \@pnumwidth should be \@tocrmarg
%     \rightskip \@pnumwidth
      \rightskip \@tocrmarg
      \parfillskip -\rightskip
      {\leavevmode
        \large \headfont
        \setlength\@lnumwidth{4\jsZw}%
        #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par
      \nobreak
%<book|report>    \global\@nobreaktrue
%<book|report>    \everypar{\global\@nobreakfalse\everypar{}}%
    \endgroup
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l@chapter}
%
% 章の目次です。|\@lnumwidth| を4.683zwに増やしました。
%
% [2013-12-30] |\@lnumwidth| を |\jsc@tocl@width| から
% 決めるようにしてみました。(by ts)
%
%    \begin{macrocode}
%<*book|report>
\newcommand*{\l@chapter}[2]{%
  \ifnum \c@tocdepth >\m@ne
    \addpenalty{-\@highpenalty}%
    \addvspace{1.0em \@plus\jsc@mpt}
%   \vskip 1.0em \@plus\p@   % book.clsでは↑がこうなっている
    \begingroup
      \parindent\z@
%     \rightskip\@pnumwidth
      \rightskip\@tocrmarg
      \parfillskip-\rightskip
      \leavevmode\headfont
%     % \if@english\setlength\@lnumwidth{5.5em}\else\setlength\@lnumwidth{4.683\jsZw}\fi
      \setlength\@lnumwidth{\jsc@tocl@width}\advance\@lnumwidth 2.683\jsZw
      \advance\leftskip\@lnumwidth \hskip-\leftskip
      #1\nobreak\hfil\nobreak\hbox to\@pnumwidth{\hss#2}\par
      \penalty\@highpenalty
    \endgroup
  \fi}
%</book|report>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l@section}
%
% 節の目次です。
%
%    \begin{macrocode}
%<*!book&!report>
\newcommand*{\l@section}[2]{%
  \ifnum \c@tocdepth >\z@
    \addpenalty{\@secpenalty}%
    \addvspace{1.0em \@plus\jsc@mpt}%
    \begingroup
      \parindent\z@
%     \rightskip\@pnumwidth
      \rightskip\@tocrmarg
      \parfillskip-\rightskip
      \leavevmode\headfont
%     % \setlength\@lnumwidth{4\jsZw}% 元1.5em [2003-03-02]
      \setlength\@lnumwidth{\jsc@tocl@width}\advance\@lnumwidth 2\jsZw
      \advance\leftskip\@lnumwidth \hskip-\leftskip
      #1\nobreak\hfil\nobreak\hbox to\@pnumwidth{\hss#2}\par
    \endgroup
  \fi}
%</!book&!report>
%    \end{macrocode}
%
% インデントと幅はそれぞれ1.5em，2.3emでしたが，
% 1zw，3.683zwに変えました。
%    \begin{macrocode}
%<book|report> % \newcommand*{\l@section}{\@dottedtocline{1}{1\jsZw}{3.683\jsZw}}
%    \end{macrocode}
%
% [2013-12-30] 上のインデントは |\jsc@tocl@width| から決めるように
% しました。(by ts)
%
% \end{macro}
%
% \begin{macro}{\l@subsection}
% \begin{macro}{\l@subsubsection}
% \begin{macro}{\l@paragraph}
% \begin{macro}{\l@subparagraph}
%
% さらに下位レベルの目次項目の体裁です。
% あまり使ったことがありませんので，要修正かもしれません。
%
% [2013-12-30] ここも  |\jsc@tocl@width| から決めるように
% してみました。(by ts)
%
%    \begin{macrocode}
%<*!book&!report>
% \newcommand*{\l@subsection}   {\@dottedtocline{2}{1.5em}{2.3em}}
% \newcommand*{\l@subsubsection}{\@dottedtocline{3}{3.8em}{3.2em}}
% \newcommand*{\l@paragraph}    {\@dottedtocline{4}{7.0em}{4.1em}}
% \newcommand*{\l@subparagraph} {\@dottedtocline{5}{10em}{5em}}
%
% \newcommand*{\l@subsection}   {\@dottedtocline{2}{1zw}{3zw}}
% \newcommand*{\l@subsubsection}{\@dottedtocline{3}{2\jsZw}{3\jsZw}}
% \newcommand*{\l@paragraph}    {\@dottedtocline{4}{3\jsZw}{3\jsZw}}
% \newcommand*{\l@subparagraph} {\@dottedtocline{5}{4\jsZw}{3\jsZw}}
%
\newcommand*{\l@subsection}{%
          \@tempdima\jsc@tocl@width \advance\@tempdima -1\jsZw
          \@dottedtocline{2}{\@tempdima}{3\jsZw}}
\newcommand*{\l@subsubsection}{%
          \@tempdima\jsc@tocl@width \advance\@tempdima 0\jsZw
          \@dottedtocline{3}{\@tempdima}{4\jsZw}}
\newcommand*{\l@paragraph}{%
          \@tempdima\jsc@tocl@width \advance\@tempdima 1\jsZw
          \@dottedtocline{4}{\@tempdima}{5\jsZw}}
\newcommand*{\l@subparagraph}{%
          \@tempdima\jsc@tocl@width \advance\@tempdima 2\jsZw
          \@dottedtocline{5}{\@tempdima}{6\jsZw}}
%</!book&!report>
%<*book|report>
% \newcommand*{\l@subsection}   {\@dottedtocline{2}{3.8em}{3.2em}}
% \newcommand*{\l@subsubsection}{\@dottedtocline{3}{7.0em}{4.1em}}
% \newcommand*{\l@paragraph}    {\@dottedtocline{4}{10em}{5em}}
% \newcommand*{\l@subparagraph} {\@dottedtocline{5}{12em}{6em}}
\newcommand*{\l@section}{%
          \@tempdima\jsc@tocl@width \advance\@tempdima -1\jsZw
          \@dottedtocline{1}{\@tempdima}{3.683\jsZw}}
\newcommand*{\l@subsection}{%
          \@tempdima\jsc@tocl@width \advance\@tempdima 2.683\jsZw
          \@dottedtocline{2}{\@tempdima}{3.5\jsZw}}
\newcommand*{\l@subsubsection}{%
          \@tempdima\jsc@tocl@width \advance\@tempdima 6.183\jsZw
          \@dottedtocline{3}{\@tempdima}{4.5\jsZw}}
\newcommand*{\l@paragraph}{%
          \@tempdima\jsc@tocl@width \advance\@tempdima 10.683\jsZw
          \@dottedtocline{4}{\@tempdima}{5.5\jsZw}}
\newcommand*{\l@subparagraph}{%
          \@tempdima\jsc@tocl@width \advance\@tempdima 16.183\jsZw
          \@dottedtocline{5}{\@tempdima}{6.5\jsZw}}
%</book|report>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\numberline}
% \begin{macro}{\@lnumwidth}
%
% 欧文版\LaTeX では |\numberline{...}| は幅 |\@tempdima| の箱に左詰め
% で出力する命令ですが，
% アスキー版では |\@tempdima| の代わりに |\@lnumwidth| という変数
% で幅を決めるように再定義しています。
% 後続文字が全角か半角かでスペースが変わらないように |\hspace|
% を入れておきました。
%
%    \begin{macrocode}
\newdimen\@lnumwidth
\def\numberline#1{\hb@xt@\@lnumwidth{#1\hfil}\hspace{0pt}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@dottedtocline}
% \begin{macro}{\jsTocLine}
%
% \LaTeX 本体（\texttt{ltsect.dtx} 参照）での定義と同じですが，
% |\@tempdima| を |\@lnumwidth| に変えています。
%
% [2018-06-23] デフォルトでは\jsTocLine のようにベースラインになります。\par
% これを変更可能にするため，|\jsTocLine| というマクロに切り出しました。
% 例えば，仮想ボディの中央
% {\renewcommand{\jsTocLine}{\leaders \hbox {\hss ・\hss}\hfill}\jsTocLine}
% に変更したい場合は
%\begin{verbatim}
%  \renewcommand{\jsTocLine}{\leaders \hbox {\hss ・\hss}\hfill}
%\end{verbatim}
% とします。
%
%    \begin{macrocode}
\def\jsTocLine{\leaders\hbox{%
  $\m@th \mkern \@dotsep mu\hbox{.}\mkern \@dotsep mu$}\hfill}
\def\@dottedtocline#1#2#3#4#5{\ifnum #1>\c@tocdepth \else
  \vskip \z@ \@plus.2\jsc@mpt
  {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
    \parindent #2\relax\@afterindenttrue
   \interlinepenalty\@M
   \leavevmode
   \@lnumwidth #3\relax
   \advance\leftskip \@lnumwidth \null\nobreak\hskip -\leftskip
    {#4}\nobreak
    \jsTocLine \nobreak\hb@xt@\@pnumwidth{%
         \hfil\normalfont \normalcolor #5}\par}\fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \paragraph{図目次と表目次}
%
% \begin{macro}{\listoffigures}
%
% 図目次を出力します。
%
%    \begin{macrocode}
\newcommand{\listoffigures}{%
%<*book|report>
  \if@twocolumn\@restonecoltrue\onecolumn
  \else\@restonecolfalse\fi
  \chapter*{\listfigurename}%
  \@mkboth{\listfigurename}{}%
%</book|report>
%<*!book&!report>
  \section*{\listfigurename}%
  \@mkboth{\listfigurename}{\listfigurename}%
%</!book&!report>
  \@starttoc{lof}%
%<book|report>  \if@restonecol\twocolumn\fi
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l@figure}
%
% 図目次の項目を出力します。
%
%    \begin{macrocode}
\newcommand*{\l@figure}{\@dottedtocline{1}{1\jsZw}{3.683\jsZw}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\listoftables}
%
% 表目次を出力します。
%
%    \begin{macrocode}
\newcommand{\listoftables}{%
%<*book|report>
  \if@twocolumn\@restonecoltrue\onecolumn
  \else\@restonecolfalse\fi
  \chapter*{\listtablename}%
  \@mkboth{\listtablename}{}%
%</book|report>
%<*!book&!report>
  \section*{\listtablename}%
  \@mkboth{\listtablename}{\listtablename}%
%</!book&!report>
  \@starttoc{lot}%
%<book|report>  \if@restonecol\twocolumn\fi
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l@table}
%
% 表目次は図目次と同じです。
%
%    \begin{macrocode}
\let\l@table\l@figure
%    \end{macrocode}
% \end{macro}
%
% \subsection{参考文献}
%
% \begin{macro}{\bibindent}
%
% オープンスタイルの参考文献で使うインデント幅です。
% 元は 1.5em でした。
%
%    \begin{macrocode}
\newdimen\bibindent
\setlength\bibindent{2\jsZw}
%    \end{macrocode}
% \end{macro}
%
% \begin{environment}{thebibliography}
%
% 参考文献リストを出力します。
%
% [2016-07-16] \LaTeX~2.09で使われていたフォントコマンドの警告を，
% 文献スタイル（.bst）ではよく |\bf| がいまだに用いられることが多いため，
% |thebibliography| 環境内では例外的に出さないようにしました。
%
%    \begin{macrocode}
\newenvironment{thebibliography}[1]{%
  \@jsc@warnoldfontcmdexceptiontrue
  \global\let\presectionname\relax
  \global\let\postsectionname\relax
%<article|slide>  \section*{\refname}\@mkboth{\refname}{\refname}%
%<*kiyou>
  \vspace{1.5\baselineskip}
  \subsubsection*{\refname}\@mkboth{\refname}{\refname}%
  \vspace{0.5\baselineskip}
%</kiyou>
%<book|report>  \chapter*{\bibname}\@mkboth{\bibname}{}%
%<book|report>  \addcontentsline{toc}{chapter}{\bibname}%
   \list{\@biblabel{\@arabic\c@enumiv}}%
        {\settowidth\labelwidth{\@biblabel{#1}}%
         \leftmargin\labelwidth
         \advance\leftmargin\labelsep
         \@openbib@code
         \usecounter{enumiv}%
         \let\p@enumiv\@empty
         \renewcommand\theenumiv{\@arabic\c@enumiv}}%
%<kiyou>   \small
   \sloppy
   \clubpenalty4000
   \@clubpenalty\clubpenalty
   \widowpenalty4000%
   \sfcode`\.\@m}
  {\def\@noitemerr
    {\@latex@warning{Empty `thebibliography' environment}}%
   \endlist}
%    \end{macrocode}
% \end{environment}
%
% \begin{macro}{\newblock}
%
% |\newblock| はデフォルトでは小さなスペースを生成します。
%
%    \begin{macrocode}
\newcommand{\newblock}{\hskip .11em\@plus.33em\@minus.07em}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@openbib@code}
%
% |\@openbib@code| はデフォルトでは何もしません。
% この定義は |openbib| オプションによって変更されます。
%
%    \begin{macrocode}
\let\@openbib@code\@empty
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@biblabel}
%
% |\bibitem[...]| のラベルを作ります。
% \texttt{ltbibl.dtx} の定義の半角 [] を全角［］に変え，
% 余分なスペースが入らないように |\jsInhibitGlue| ではさみました。
% とりあえずコメントアウトしておきますので，必要に応じて生かしてください。
%
%    \begin{macrocode}
% \def\@biblabel#1{\jsInhibitGlue ［#1］\jsInhibitGlue}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\cite}
% \begin{macro}{\@cite}
% \begin{macro}{\@citex}
%
% 文献の番号を出力する部分は \texttt{ltbibl.dtx} で定義されていますが，
% コンマとかっこを和文フォントにするには次のようにします。
% とりあえずコメントアウトしておきましたので，必要に応じて生かしてください。
% かっこの前後に入るグルーを |\jsInhibitGlue| で取っていますので，
% オリジナル同様，\verb*+Knuth~\cite{knu} + のように半角空白
% で囲んでください。
%
%    \begin{macrocode}
% \def\@citex[#1]#2{\leavevmode
%   \let\@citea\@empty
%   \@cite{\@for\@citeb:=#2\do
%     {\@citea\def\@citea{，\inhibitglue\penalty\@m\ }%
%      \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
%      \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi
%      \@ifundefined{b@\@citeb}{\mbox{\normalfont\bfseries ?}%
%        \G@refundefinedtrue
%        \@latex@warning
%          {Citation `\@citeb' on page \thepage \space undefined}}%
%        {\@cite@ofmt{\csname b@\@citeb\endcsname}}}}{#1}}
% \def\@cite#1#2{\jsInhibitGlue ［{#1\if@tempswa ，#2\fi}］\jsInhibitGlue}
%    \end{macrocode}
%
% 引用番号を上ツキの 1）のようなスタイルにするには次のようにします。
% |\cite| の先頭に |\unskip| を付けて先行のスペース（\verb|~| も）
% を帳消しにしています。
%
%    \begin{macrocode}
% \DeclareRobustCommand\cite{\unskip
%   \@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}
% \def\@cite#1#2{$^{\hbox{\scriptsize{#1\if@tempswa
%   ，\jsInhibitGlue\ #2\fi}）}}$}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \subsection{索引}
%
% \begin{environment}{theindex}
%
% 2\zrWDash3段組の索引を作成します。
% 最後が偶数ページのときにマージンがずれる現象を直しました（Thanks: 藤村さん）。
%
%    \begin{macrocode}
\newenvironment{theindex}{% 索引を3段組で出力する環境
    \if@twocolumn
      \onecolumn\@restonecolfalse
    \else
      \clearpage\@restonecoltrue
    \fi
    \columnseprule.4pt \columnsep 2\jsZw
    \ifx\multicols\@undefined
%    \end{macrocode}
% \begin{ZRnote}
% |hyperref| 使用時に索引へのリンクが正常に作られるように、
% |hyperref| の説明書の解説に従って |\phantomsection| を配置した。
% \end{ZRnote}
%    \begin{macrocode}
%<book|report>      \twocolumn[\bxjs@phantomsection
%<book|report>        \addcontentsline{toc}{chapter}{\indexname}%
%<book|report>        \@makeschapterhead{\indexname}]%
%<!book&!report>      \def\presectionname{}\def\postsectionname{}%
%<!book&!report>      \twocolumn[\section*{\indexname}]%
    \else
      \ifdim\textwidth<\fullwidth
        \setlength{\evensidemargin}{\oddsidemargin}
        \setlength{\textwidth}{\fullwidth}
        \setlength{\linewidth}{\fullwidth}
%<book|report>        \begin{multicols}{3}[\chapter*{\indexname}%
%<book|report>        \addcontentsline{toc}{chapter}{\indexname}]%
%<!book&!report>        \def\presectionname{}\def\postsectionname{}%
%<!book&!report>        \begin{multicols}{3}[\section*{\indexname}]%
      \else
%<book|report>        \begin{multicols}{2}[\chapter*{\indexname}%
%<book|report>        \addcontentsline{toc}{chapter}{\indexname}]%
%<!book&!report>        \def\presectionname{}\def\postsectionname{}%
%<!book&!report>        \begin{multicols}{2}[\section*{\indexname}]%
      \fi
    \fi
%<book|report>    \@mkboth{\indexname}{}%
%<!book&!report>    \@mkboth{\indexname}{\indexname}%
    \plainifnotempty % \thispagestyle{plain}
    \parindent\z@
    \parskip\z@ \@plus .3\jsc@mpt\relax
    \let\item\@idxitem
    \raggedright
    \footnotesize\narrowbaselines
  }{
    \ifx\multicols\@undefined
      \if@restonecol\onecolumn\fi
    \else
      \end{multicols}
    \fi
    \clearpage
  }
%    \end{macrocode}
% \end{environment}
%
% \begin{macro}{\@idxitem}
% \begin{macro}{\subitem}
% \begin{macro}{\subsubitem}
%
% 索引項目の字下げ幅です。|\@idxitem| は |\item| の項目の字下げ幅です。
%
%    \begin{macrocode}
\newcommand{\@idxitem}{\par\hangindent 4\jsZw} % 元 40pt
\newcommand{\subitem}{\@idxitem \hspace*{2\jsZw}} % 元 20pt
\newcommand{\subsubitem}{\@idxitem \hspace*{3\jsZw}} % 元 30pt
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\indexspace}
%
% 索引で先頭文字ごとのブロックの間に入るスペースです。
%
%    \begin{macrocode}
\newcommand{\indexspace}{\par \vskip 10\jsc@mpt \@plus5\jsc@mpt \@minus3\jsc@mpt\relax}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\seename}
% \begin{macro}{\alsoname}
%
% 索引の |\see|，|\seealso| コマンドで出力されるものです。
% デフォルトはそれぞれ \emph{see}，\emph{see also} という英語ですが，
% ここではとりあえず両方とも「→」に変えました。
% $\Rightarrow$（|$\Rightarrow$|）などでもいいでしょう。
%
%    \begin{macrocode}
\newcommand\seename{\if@english see\else →\fi}
\newcommand\alsoname{\if@english see also\else →\fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \subsection{脚注}
%
% \begin{macro}{\footnote}
% \begin{macro}{\footnotemark}
%
% 和文の句読点・閉じかっこ類の直後で用いた際に
% 余分なアキが入るのを防ぐため，
% |\inhibitglue| を入れることにします。
% p\LaTeX の日付が2016/09/03より新しい場合は，このパッチが不要なのであてません。
%
% \begin{ZRnote}
% パッチの必要性は「|\pltx@foot@penalty| が未定義か」で行う。
% |\inhibitglue| の代わりに |\jsInhibitGlue| を使う。
% \end{ZRnote}
%    \begin{macrocode}
\ifx\pltx@foot@penalty\@undefined
  \let\footnotes@ve=\footnote
  \def\footnote{\jsInhibitGlue\footnotes@ve}
  \let\footnotemarks@ve=\footnotemark
  \def\footnotemark{\jsInhibitGlue\footnotemarks@ve}
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@makefnmark}
%
% 脚注番号を付ける命令です。
% ここでは脚注番号の前に記号 $*$ を付けています。
% 「注1」の形式にするには |\textasteriskcentered|
%  を |注\kern0.1em| にしてください。
% |\@xfootnotenext| と合わせて，
% もし脚注番号が空なら記号も出力しないようにしてあります。
%
% [2002-04-09] インプリメントの仕方を変えたため消しました。
%
% [2013-04-23] 新しい\pTeX では脚注番号のまわりにスペースが入りすぎることを防ぐため，
% 北川さんのパッチ [qa:57090] を取り込みました。
%
% [2013-05-14] plcore.ltx に倣った形に書き直しました（Thanks: 北川さん）。
%
% [2016-07-11] コミュニティ版p\LaTeX の変更に追随しました（Thanks: 角藤さん）。
% p\LaTeX の日付が2016/04/17より新しい場合は，このパッチが不要なのであてません。
%
% \begin{ZRnote}
% {\pTeX}依存のコードなので、minimal和文ドライバ実装に移動。
% \end{ZRnote}
% \end{macro}
%
% \begin{macro}{\thefootnote}
%
% 脚注番号に * 印が付くようにしました。
% ただし，番号がゼロのときは * 印も脚注番号も付きません。
%
% [2003-08-15] |\textasteriskcentered| ではフォントによって
% 下がりすぎるので変更しました。
%
% [2016-10-08] TODO: 脚注番号が |newtxtext| や |newpxtext| の使用時に
% おかしくなってしまいます。これらのパッケージは内部で |\thefootnote| を
% 再定義していますので，気になる場合はパッケージを読み込むときに
% \texttt{defaultsups} オプションを付けてください(qa:57284, qa:57287)。
%
%    \begin{macrocode}
\def\thefootnote{\ifnum\c@footnote>\z@\leavevmode\lower.5ex\hbox{*}\@arabic\c@footnote\fi}
%    \end{macrocode}
%
% 「注1」の形式にするには次のようにしてください。
%
%    \begin{macrocode}
% \def\thefootnote{\ifnum\c@footnote>\z@ 注\kern0.1\jsZw\@arabic\c@footnote\fi}
%    \end{macrocode}
%
% \end{macro}
%
% \begin{macro}{\footnoterule}
%
% 本文と脚注の間の罫線です。
%
%    \begin{macrocode}
\renewcommand{\footnoterule}{%
  \kern-2.6\jsc@mpt \kern-.4\p@
  \hrule width .4\columnwidth
  \kern 2.6\jsc@mpt}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\c@footnote}
%
% 脚注番号は章ごとにリセットされます。
%
%    \begin{macrocode}
%<book|report>\@addtoreset{footnote}{chapter}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@footnotetext}
%
% 脚注で |\verb| が使えるように改変してあります。
% Jeremy Gibbons, \textit{\TeX\ and TUG NEWS},
%  Vol.~2, No.~4 (1993), p.~9）
%
% [2016-08-25] コミュニティ版\pLaTeX の「閉じ括弧類の直後に
% |\footnotetext| が続く場合に改行が起きることがある問題に対処」
% と同等のコードを追加しました。
%
% [2016-09-08] コミュニティ版\pLaTeX のバグ修正に追随しました。
%
% [2016-11-29] 古い\pLaTeX で使用された場合を考慮してコードを改良。
% ^^A 脚注直後に改行を可能にするために|\null|を入れる場合，
% ^^A 同時にペナルティも考慮しなければ誤った改行が起きる可能性がある。
% ^^A このため，|\ifhmode\null\fi|は
% ^^A   |\ifx\pltx@foot@penalty\@undefined\else ... \fi|
% ^^A 条件の内側に置いておくのが安全。
%
% [2018-03-11] |\next|などいくつかの内部命令を |\jsc@...| 付きの
% ユニークな名前にしました。
%
% [2022-09-13] \LaTeXe~2021-11-15 (ltfloat.dtx 2021/10/14 v1.2g)で
% |\@currentcounter|が追加されましたので，追随します。
% なお，\LaTeXe~2021-06-01 (ltfloat.dtx 2021/02/10 v1.2e)で
% parhook対応として |\par| が追加されていますが，
% 実は同時に |\color@endgroup| も |\endgraf| するように変更
% されていますので，不要だと思います。というわけで追加しません。
%    \begin{macrocode}
\long\def\@footnotetext{%
  \insert\footins\bgroup
    \normalfont\footnotesize
    \interlinepenalty\interfootnotelinepenalty
    \splittopskip\footnotesep
    \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
    \hsize\columnwidth \@parboxrestore
    \def\@currentcounter{footnote}%
    \protected@edef\@currentlabel{%
       \csname p@footnote\endcsname\@thefnmark
    }%
    \color@begingroup
      \@makefntext{%
        \rule\z@\footnotesep\ignorespaces}%
      \futurelet\jsc@next\jsc@fo@t}
\def\jsc@fo@t{\ifcat\bgroup\noexpand\jsc@next \let\jsc@next\jsc@f@@t
                                \else \let\jsc@next\jsc@f@t\fi \jsc@next}
\def\jsc@f@@t@prefix{\inhibitglue\ignorespaces}
\def\jsc@f@@t{\bgroup\aftergroup\jsc@@foot\afterassignment\jsc@f@@t@prefix\let\jsc@next}
\def\jsc@f@t#1{\jsc@f@@t@prefix#1\jsc@@foot}
\def\jsc@@foot{\@finalstrut\strutbox\color@endgroup\egroup
  \ifx\pltx@foot@penalty\@undefined\else
    \ifhmode\null\fi
    \ifnum\pltx@foot@penalty=\z@\else
      \penalty\pltx@foot@penalty
      \pltx@foot@penalty\z@
    \fi
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@makefntext}
%
% 実際に脚注を出力する命令です。
% |\@makefnmark| は脚注の番号を出力する命令です。
% ここでは脚注が左端から一定距離に来るようにしてあります。
%
%    \begin{macrocode}
\newcommand\@makefntext[1]{%
  \advance\leftskip 3\jsZw
  \parindent 1\jsZw
  \noindent
  \llap{\@makefnmark\hskip0.3\jsZw}#1}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@xfootnotenext}
%
% 最初の |\footnotetext{...}| は番号が付きません。
% 著者の所属などを脚注の欄に書くときに便利です。
%
% すでに |\footnote| を使った後なら |\footnotetext[0]{...}|
% とすれば番号を付けない脚注になります。
% ただし，この場合は脚注番号がリセットされてしまうので，
% 工夫が必要です。
%
% [2002-04-09] インプリメントの仕方を変えたため消しました。
%
%    \begin{macrocode}
% \def\@xfootnotenext[#1]{%
%   \begingroup
%      \ifnum#1>\z@
%        \csname c@\@mpfn\endcsname #1\relax
%        \unrestored@protected@xdef\@thefnmark{\thempfn}%
%      \else
%        \unrestored@protected@xdef\@thefnmark{}%
%      \fi
%   \endgroup
%   \@footnotetext}
%    \end{macrocode}
% \end{macro}
%
% \begin{ZRnote}
% ここまでのコードは JS クラスを踏襲する。
% \end{ZRnote}
%
% \section{段落の頭へのグルー挿入禁止}
%
% 段落頭のかぎかっこなどを見かけ1字半下げから全角1字下げに直します。
%
% \begin{ZRnote}
% \begin{macro}{\jsInhibitGlueAtParTop}
% 「段落頭の括弧の空き補正」の処理を |\jsInhibitGlueAtParTop|
% という命令にして、これを再定義可能にした。
%    \begin{macrocode}
\let\jsInhibitGlueAtParTop\@empty
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\everyparhook}
% 全ての段落の冒頭で実行されるフック。
% これの初期値を先述の |\jsInhibitGlueAtParTop| とする。
%    \begin{macrocode}
\def\everyparhook{\jsInhibitGlueAtParTop}
\ifnum\bxjs@everyparhook=\bxjs@everyparhook@@compat
\g@addto@macro\bxjs@begin@document@hook{\everypar{\everyparhook}}
\fi
%    \end{macrocode}
% \end{macro}
% \end{ZRnote}
%
% [2016-07-18] |\inhibitglue| の発行対象を |\inhibitxspcode| が2に
% 設定されているものすべてに拡大しました。
%
% [2016-12-01] すぐ上の変更で |\@tempa| を使っていたのがよくなかった
% ので，プレフィックスを付けて |\jsc@tempa| にしました(forum:2085)。
%
% [2017-02-13] |\jsc@tempa| は実はテンポラリではなく「この処理専用の
% ユニーク制御綴」である必要があります。間違って別の箇所で使う危険性が
% 高いので，専用の命令 |\jsc@ig@temp| に置き換えました(Issue \#54)。
%
% \begin{ZRnote}
% 次の |\@inhibitglue| はJSクラスでの |\jsInhibitGlueAtParTop| の
% 実装である。
% エンジンが |(u)platex| の場合はこれを採用する。
% \end{ZRnote}
%    \begin{macrocode}
\ifx j\jsEngine
\def\@inhibitglue{%
  \futurelet\@let@token\@@inhibitglue}
\begingroup
\let\GDEF=\gdef
\let\CATCODE=\catcode
\let\ENDGROUP=\endgroup
\CATCODE`k=12
\CATCODE`a=12
\CATCODE`n=12
\CATCODE`j=12
\CATCODE`i=12
\CATCODE`c=12
\CATCODE`h=12
\CATCODE`r=12
\CATCODE`t=12
\CATCODE`e=12
\GDEF\KANJI@CHARACTER{kanji character }
\ENDGROUP
\def\@@inhibitglue{%
  \expandafter\expandafter\expandafter\jsc@inhibitglue\expandafter\meaning\expandafter\@let@token\KANJI@CHARACTER\relax\jsc@end}
\expandafter\def\expandafter\jsc@inhibitglue\expandafter#\expandafter1\KANJI@CHARACTER#2#3\jsc@end{%
  \def\jsc@ig@temp{#1}%
  \ifx\jsc@ig@temp\@empty
    \ifnum\the\inhibitxspcode`#2=2\relax
      \inhibitglue
    \fi
  \fi}
\fi
%    \end{macrocode}
%
% \begin{ZRnote}
% ここからしばらく
% 「（本物の）|\everypar| に追加した |\everyparhook| を保持する」
% ためのパッチ処理が続く。
% これは、|everyparhook=compat| の場合にのみ実行する。
% \end{ZRnote}
%    \begin{macrocode}
\ifnum\bxjs@everyparhook=\bxjs@everyparhook@@compat
%    \end{macrocode}
%
% これだけではいけないようです。あちこちに |\everypar| を初期化するコマンドが
% 隠されていました。
%
% まず，環境の直後の段落です。
%
% [2016-11-19] ltlists.dtx 2015/05/10 v1.0tの変更に追随して |\clubpenalty| の
% リセットを追加しました。
%
%    \begin{macrocode}
\def\@doendpe{%
  \@endpetrue
  \def\par{%
    \@restorepar\clubpenalty\@clubpenalty\everypar{\everyparhook}\par\@endpefalse}%
  \everypar{{\setbox\z@\lastbox}\everypar{\everyparhook}\@endpefalse\everyparhook}}
%    \end{macrocode}
%
% [2017-08-31] minipage環境にも対策します。
%
%    \begin{macrocode}
\def\@setminipage{%
  \@minipagetrue
  \everypar{\@minipagefalse\everypar{\everyparhook}}%
}
%    \end{macrocode}
%
% |\item| 命令の直後です。
%
%    \begin{macrocode}
\def\@item[#1]{%
  \if@noparitem
    \@donoparitem
  \else
    \if@inlabel
      \indent \par
    \fi
    \ifhmode
      \unskip\unskip \par
    \fi
    \if@newlist
      \if@nobreak
        \@nbitem
      \else
        \addpenalty\@beginparpenalty
        \addvspace\@topsep
        \addvspace{-\parskip}%
      \fi
    \else
      \addpenalty\@itempenalty
      \addvspace\itemsep
    \fi
    \global\@inlabeltrue
  \fi
  \everypar{%
    \@minipagefalse
    \global\@newlistfalse
    \if@inlabel
      \global\@inlabelfalse
      {\setbox\z@\lastbox
       \ifvoid\z@
         \kern-\itemindent
       \fi}%
      \box\@labels
      \penalty\z@
    \fi
    \if@nobreak
      \@nobreakfalse
      \clubpenalty \@M
    \else
      \clubpenalty \@clubpenalty
      \everypar{\everyparhook}%
    \fi\everyparhook}%
  \if@noitemarg
    \@noitemargfalse
    \if@nmbrlist
      \refstepcounter\@listctr
    \fi
  \fi
  \sbox\@tempboxa{\makelabel{#1}}%
  \global\setbox\@labels\hbox{%
    \unhbox\@labels
    \hskip \itemindent
    \hskip -\labelwidth
    \hskip -\labelsep
    \ifdim \wd\@tempboxa >\labelwidth
      \box\@tempboxa
    \else
      \hbox to\labelwidth {\unhbox\@tempboxa}%
    \fi
    \hskip \labelsep}%
  \ignorespaces}
%    \end{macrocode}
%
% 二つ挿入した |\everyparhook| のうち後者が |\section| 類の直後に2回，
% 前者が3回目以降に実行されます。
%
%    \begin{macrocode}
\def\@afterheading{%
  \@nobreaktrue
  \everypar{%
    \if@nobreak
      \@nobreakfalse
      \clubpenalty \@M
      \if@afterindent \else
        {\setbox\z@\lastbox}%
      \fi
    \else
      \clubpenalty \@clubpenalty
      \everypar{\everyparhook}%
    \fi\everyparhook}}
%    \end{macrocode}
%
% \begin{ZRnote}
% 「|\everyparhook| 用のパッチ処理」はここまで。
% \end{ZRnote}
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
% |\@gnewline| についてはちょっと複雑な心境です。
% もともとのp\LaTeXe は段落の頭にグルーが入る方で統一されていました。
% しかし |\\| の直後にはグルーが入らず，不統一でした。
% そこで |\\| の直後にもグルーを入れるように直していただいた経緯があります。
% しかし，ここでは逆にグルーを入れない方で統一したいので，
% また元に戻してしまいました。
%
% しかし単に戻すだけでも駄目みたいなので，ここでも最後にグルーを消しておきます。
%
% \begin{ZRnote}
% \Note |luatexja| を読み込んだ場合に lltjcore.sty によって上書きされる
% のを防ぐため遅延させる。
% \end{ZRnote}
%    \begin{macrocode}
\ifnum\bxjs@everyparhook=\bxjs@everyparhook@@none\else
\AtEndOfClass{%
\def\@gnewline #1{%
  \ifvmode
    \@nolnerr
  \else
    \unskip \reserved@e {\reserved@f#1}\nobreak \hfil \break \null
    \jsInhibitGlue \ignorespaces
  \fi}
}
\fi
%    \end{macrocode}
%
% \section{いろいろなロゴ}
%
% \LaTeX 関連のロゴを作り直します。
%
% [2016-07-14] ロゴの定義は\texttt{jslogo}パッケージに移転しました。
% 後方互換のため，\texttt{jsclasses}ではデフォルトでこれを読み込みます。
% \texttt{nojslogo}オプションが指定されている場合は読み込みません。
%
% \begin{ZRnote}
% BXJSクラスでも |jslogo| オプション指定の場合に jslogo パッケージを
% 読み込むようにした。
% ただしJSクラスと異なり、既定では読み込まない。
% \Note |\小|、|\上小| の制御綴は定義しない。
% \end{ZRnote}
%    \begin{macrocode}
\if@jslogo
  \IfFileExists{jslogo.sty}{%
    \RequirePackage{jslogo}%
  }{%
    \ClassWarningNoLine\bxjs@clsname
     {The package 'jslogo' is not installed.\MessageBreak
      It is included in the recent release of\MessageBreak
      the 'jsclasses' bundle}
  }
\fi
%    \end{macrocode}
%
% \section{\texttt{amsmath} との衝突の回避}
%
% \begin{macro}{\ltx@ifnextchar}
% \begin{macro}{\ProvidesFile}
%
% \texttt{amsmath} パッケージでは行列中で |\@ifnextchar|
% を再定義していますが，これが\LaTeX の |\ProvidesFile|
% で悪さをする例がFTeXで報告されています。
% これを避けるためのtDBさんのフィックスを挿入しておきます。
% 副作用がありましたらお知らせください。
%
% この現象については私のTeX掲示板 4273〜，16058〜 で議論がありました。
% なお，AMS関係のパッケージを読み込む際に psamsfonts オプションを
% 与えても回避できます（Thanks: しっぽ愛好家さん）。
%
% [2016-11-19] 本家の ltclass.dtx 2004/01/28 v1.1g で修正されているので
% コメントアウトしました。
%
%    \begin{macrocode}
%\let\ltx@ifnextchar\@ifnextchar
%\def\ProvidesFile#1{%
%  \begingroup
%    \catcode`\ 10 %
%    \ifnum \endlinechar<256 %
%      \ifnum \endlinechar>\m@ne
%        \catcode\endlinechar 10 %
%      \fi
%    \fi
%    \@makeother\/%
%    \@makeother\&%
%    \ltx@ifnextchar[{\@providesfile{#1}}{\@providesfile{#1}[]}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \section{初期設定}
%
% \paragraph{いろいろな語}
%
% \begin{macro}{\prepartname}
% \begin{macro}{\postpartname}
% \begin{macro}{\prechaptername}
% \begin{macro}{\postchaptername}
% \begin{macro}{\presectionname}
% \begin{macro}{\postsectionname}
%    \begin{macrocode}
\newcommand{\prepartname}{\if@english Part~\else 第\fi}
\newcommand{\postpartname}{\if@english\else 部\fi}
%<book|report>\newcommand{\prechaptername}{\if@english Chapter~\else 第\fi}
%<book|report>\newcommand{\postchaptername}{\if@english\else 章\fi}
\newcommand{\presectionname}{}%  第
\newcommand{\postsectionname}{}% 節
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\contentsname}
% \begin{macro}{\listfigurename}
% \begin{macro}{\listtablename}
%    \begin{macrocode}
\newcommand{\contentsname}{\if@english Contents\else 目次\fi}
\newcommand{\listfigurename}{\if@english List of Figures\else 図目次\fi}
\newcommand{\listtablename}{\if@english List of Tables\else 表目次\fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\refname}
% \begin{macro}{\bibname}
% \begin{macro}{\indexname}
%    \begin{macrocode}
\newcommand{\refname}{\if@english References\else 参考文献\fi}
\newcommand{\bibname}{\if@english Bibliography\else 参考文献\fi}
\newcommand{\indexname}{\if@english Index\else 索引\fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\figurename}
% \begin{macro}{\tablename}
%    \begin{macrocode}
%<!jspf>\newcommand{\figurename}{\if@english Fig.~\else 図\fi}
%<jspf>\newcommand{\figurename}{Fig.~}
%<!jspf>\newcommand{\tablename}{\if@english Table~\else 表\fi}
%<jspf>\newcommand{\tablename}{Table~}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\appendixname}
% \begin{macro}{\abstractname}
%    \begin{macrocode}
% \newcommand{\appendixname}{\if@english Appendix~\else 付録\fi}
\newcommand{\appendixname}{\if@english \else 付録\fi}
%<!book>\newcommand{\abstractname}{\if@english Abstract\else 概要\fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \paragraph{今日の日付}
%
% \LaTeX で処理した日付を出力します。
% ^^A |jarticle| などと違って，標準を西暦にし，
% ^^A 余分な空白が入らないように改良しました。
% ^^A -- 2018年7月以降は |jarticle| なども標準が西暦，
% ^^A -- 2019年4月以降は余分な空白が入らなくなっています。
% 和暦にするには |\和暦| と書いてください。
% ^^A ちなみにこの文章の作成日は西暦では{\西暦\today}で，
% ^^A 和暦では{\和暦\today}です。
%
% \begin{ZRnote}
% 環境変数 |SOURCE_DATE_EPOCH|／|FORCE_SOURCE_DATE| が
% 設定されている場合は“今日”が過去・未来の日付になる可能性がある。
% BXJSクラスでは、和暦の扱いは |bxwareki| パッケージに任せる。
% \Note 2.0版より、\textbf{完全に} |bxwareki| に任せる。
%
% \begin{macro}{\西暦}
% \begin{macro}{\和暦}
% 8ビット欧文{\TeX}ではそもそも非ASCIIの制御綴は使えないのであるが、
% JSクラスのユーザ命令である |\西暦|/|\和暦| だけは\textbf{擬似的}に
% 使えるようにする。
% 欧文{\TeX}では
% \begin{itemize}
% \item |\西暦|＝|\^^e8^^a5^^bf^^e6^^9a^^a6|
% \item |\和暦|＝|\^^e5^^92^^8c^^e6^^9a^^a6|
% \end{itemize}
% と扱われるため、|\^^e8| と |\^^e5| を「固定の引数付のマクロ」として
% 定義すればよい。
% もちろん、同じバイトで始まる他の名前（例えば |\西暦true|）
% とは共存できないので、
% この2つのユーザ命令以外の非ASCIIの制御綴は使わないようにする。
%
% {\TeX}エンジンの種類により処理を分ける。
%    \begin{macrocode}
\@onlypreamble\bxjs@decl@Seireki@cmds
\@tempswafalse
\if p\jsEngine \@tempswatrue \fi
\if n\jsEngine \@tempswatrue \fi
\bxjs@cond\if@tempswa\fi{%
%    \end{macrocode}
% 8ビット欧文{\TeX}の場合。
% \begin{macro}{\ifjsSeireki}
% 〔スイッチ〕|西暦| スイッチ（|\if西暦|）の代わりに用いる。
%    \begin{macrocode}
\newif\ifjsSeireki \jsSeirekitrue
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\bxjs@decl@Seireki@cmds}
% 本クラス用の |\西暦|/|\和暦| の命令を定義するためのマクロ。
% \Note |\def\西暦| は実際には |\^^e8| の定義文であることに注意。
%    \begin{macrocode}
\def\bxjs@decl@Seireki@cmds{%
  \def\西暦{\jsSeirekitrue}%
  \def\和暦{\jsSeirekifalse\bxjs@wareki@used}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\Seireki}
% \begin{macro}{\Wareki}
% |\西暦|/|\和暦| の代わりになるASCII名の命令も（念のため）
% 用意しておく。
%    \begin{macrocode}
\def\Seireki{\jsSeirekitrue}
\def\Wareki{\jsSeirekifalse\bxjs@wareki@used}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%    \begin{macrocode}
\def\bxjs@if@use@seireki{\bxjs@cond\ifjsSeireki\fi}
\def\bxjs@iai{\noexpand~}
}{%
%    \end{macrocode}
% 8ビット欧文{\TeX}ではない場合。
% ここではJSクラスと合わせるため |西暦| スイッチを使う。
%    \begin{macrocode}
\newif\if西暦 \西暦true
\def\bxjs@decl@Seireki@cmds{%
  \def\西暦{\西暦true}%
  \def\和暦{\西暦false\bxjs@wareki@used}}
\def\Seireki{\西暦true}
\def\Wareki{\西暦false\bxjs@wareki@used}
\def\bxjs@if@use@seireki{\bxjs@cond\if西暦\fi}
\let\bxjs@iai\@empty
}
\bxjs@decl@Seireki@cmds
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\ifbxjs@bxwareki@avail}
% |bxwareki| パッケージが使用できるか。
% \Note 8ビット欧文でかつ非e-TeXなエンジン（現状ではサポート外だが）
% では |bxwareki| を読むだけでエラーが発生してしまうので、
% この場合は読込を回避する。
%    \begin{macrocode}
\newif\ifbxjs@bxwareki@avail
\IfFileExists{bxwareki.sty}{%
  \if \if n\jsEngine \ifjsWitheTeX T\else F\fi\else T\fi T%
    \RequirePackage{bxwareki}[2018/04/08]%v0.2
    \bxjs@bxwareki@availtrue
  \fi}{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@wareki@used}
% |bxwareki| が利用できないのに和暦出力をしようとした場合に
% 警告を出す。
%    \begin{macrocode}
\ifbxjs@bxwareki@avail \let\bxjs@wareki@used\@empty
\else
  \bxjs@robust@def\bxjs@wareki@used{%
    \global\let\bxjs@wareki@used\@empty
    \ClassWarning\bxjs@clsname
     {Wareki mode is not supported, since\MessageBreak
      'bxwareki' is unavailable, reported}}
  \g@addto@macro\bxjs@begin@document@hook{%
    \let\bxjs@wareki@used\@empty}
\fi
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jayear}
% 和暦における年の表記の「年」以前の部分（元号＋年数）。
% \Note |\heisei| の代替となる機能（だから常に和暦を扱う）。
% \begin{macro}{\heisei}
% 年数を表す整数レジスタで、元号が「平成」である場合にのみ定義される。
% \Note JSクラスと互換の機能。
%    \begin{macrocode}
\ifbxjs@bxwareki@avail
  \let\jayear\warekiyear
  \def\bxjs@tmpa{H}\ifx\bxjs@tmpa\warekigengoinitial
    \newcount\heisei \heisei=\value{warekiyear}
  \fi
%    \end{macrocode}
% ただし |bxwareki| が使えない場合は西暦表示にフォールバックする。
%    \begin{macrocode}
\else
  \edef\jayear{\the\year \bxjs@iai}
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \end{ZRnote}
%
% \begin{macro}{\today}
% 英語、西暦、和暦で場合分けをする。
% \Note diffの都合のためまた |jsclasses| のコードを挿入する。
%    \begin{macrocode}
%<*jsclasses>
\newif\if西暦 \西暦true
\def\西暦{\西暦true}
\def\和暦{\西暦false}
\newcount\heisei \heisei\year \advance\heisei-1988\relax
\def\pltx@today@year@#1{%
  \ifnum\numexpr\year-#1=1 元\else
    \ifnum1=\iftdir\ifmdir0\else1\fi\else0\fi
      \kansuji\numexpr\year-#1\relax
    \else
      \number\numexpr\year-#1\relax\nobreak
    \fi
  \fi 年
}
\def\pltx@today@year{%
  \ifnum\numexpr\year*10000+\month*100+\day<19890108
    昭和\pltx@today@year@{1925}%
  \else\ifnum\numexpr\year*10000+\month*100+\day<20190501
    平成\pltx@today@year@{1988}%
  \else
    令和\pltx@today@year@{2018}%
  \fi\fi}
%</jsclasses>
\begingroup
\let\bxjs@next\relax
\ifbxjs@bxwareki@avail \ifx\warekigengo\@empty\else
  \def\bxjs@next{\warekitoday}
  \bxjs@test@engine\unexpanded{%
    \def\bxjs@next{\unexpanded\expandafter{\warekitoday}}}
\fi\fi
\def\!#1#2#3{\noexpand#1\noexpand#2\noexpand#3}
\ifx\bxjs@iai\@empty \let\!\@empty \fi
\xdef\bxjs@today{%
  \if@english
    \ifcase\month\or
      January\or February\or March\or April\or May\or June\or
      July\or August\or September\or October\or November\or December\fi
      \space\number\day, \number\year
  \else
    \ifx\bxjs@next\relax \expandafter\@firstoftwo
    \else \noexpand\bxjs@if@use@seireki
    \fi {%
      \number\year\bxjs@iai\!年%
      \bxjs@iai\number\month\bxjs@iai\!月%
      \bxjs@iai\number\day\bxjs@iai\!日%
    }{\bxjs@next}%
  \fi}
\endgroup
\let\today\bxjs@today
%    \end{macrocode}
% \end{macro}
%
% \begin{ZRnote}
% texjporg版の日本語用Babel定義ファイル（|japanese.ldf|）が読み込まれた
% 場合に影響を受けないようにする。
%    \begin{macrocode}
\g@addto@macro\bxjs@begin@document@hook{%
  \ifx\bbl@jpn@maybekansuji\@undefined\else
    \bxjs@decl@Seireki@cmds
    \g@addto@macro\datejapanese{%
      \let\today\bxjs@today}%
  \fi}
%    \end{macrocode}
% \end{ZRnote}
%
% \paragraph{ハイフネーション例外}
%
% \TeX のハイフネーションルールの補足です（ペンディング：eng-lish）
%
%    \begin{macrocode}
\hyphenation{ado-be post-script ghost-script phe-nom-e-no-log-i-cal man-u-script}
%    \end{macrocode}
%
% \paragraph{ページ設定}
%
% ページ設定の初期化です。
%
%    \begin{macrocode}
%<slide>\pagestyle{empty}%
%<article|report>\pagestyle{plain}%
%<book>\pagestyle{headings}%
\pagenumbering{arabic}
\if@twocolumn
  \twocolumn
  \sloppy
  \flushbottom
\else
  \onecolumn
  \raggedbottom
\fi
%<*slide>
  \renewcommand\familydefault{\sfdefault}
  \raggedright
%</slide>
%    \end{macrocode}
%
%
% \section{実験的コード}
%
% \begin{ZRnote}
% この節はJSクラスの話で、BXJSクラスには当てはまらない。
% \end{ZRnote}
%
% [2016-11-29] コミュニティ版p\LaTeX で新設されたテスト用パッケージ
% （\texttt{exppl2e}パッケージ）が文書クラスより先に読み込まれていた
% 場合は，jsclassesもテスト版として動作します。この処置は
% jsarticle，jsbook，jsreportにのみ行い，jspfとkiyouは除外しておきます。
% exppl2eパッケージが読みこまれていない場合は通常版として動作しますので，
% ここで終了します。
%
% 以上です。
%
% \section{BXJS独自の追加処理 \ZRX}
%
% \paragraph{\textbackslash strong命令の補填}
%
% |fontspec| で提供される |\strong| 命令と |strongenv| 環境を
% 全てのエンジンで使えるようにする。
% \Note この実装は特にエンジンや和文処理パッケージに依存しないはず
% であるが、現状ではstandard和文ドライバでの提供となっていて、
% そこで有効化のオプションが定義されている。
% ここでは |\js～| の名前で定義することにする。
%
% \begin{macro}{\jsStrongText}
% 強調用の宣言型命令。
%    \begin{macrocode}
\bxjs@robust@def\jsStrongText{\bxjs@strong@text}%
%    \end{macrocode}
% |fontspec| と互換の |\strongfontdeclare| 命令も提供する。
% 既定の設定は |\bfseries|（太字）である。
% \Note |\strongfontdeclare| は試験的機能とする。
%    \begin{macrocode}
\chardef\bxjs@strong@level=0
\DeclareRobustCommand*\jsStrongDeclare[1]{%
  \bxjs@set@array@from@clist{bxjs@strong}{#1}%
  \chardef\bxjs@strong@level\z@}
\jsStrongDeclare{\bfseries}
\def\bxjs@strong@text{%
  \bxjs@csletcs{bxjs@tmpa}{bxjs@strong/\the\bxjs@strong@level}%
  \ifx\bxjs@tmpa\relax
    \bxjs@advance@qc\bxjs@strong@level\m@ne \bxjs@strong@text
  \else \bxjs@advance@qc\bxjs@strong@level\@ne \bxjs@tmpa
  \fi}
% \end{macro}
%
% \paragraph{共通命令の実装}
%
% |\jQ| 等の「単位」系の共通命令を実装する。
%
% \begin{macro}{\bxjs@const@unit}
% 固定値の単位として使える制御綴を定義する。
%
% {\eTeX}拡張が使える場合は、
% 「|\dimexpr|外部寸法表記|\relax|」の形式
% （これは内部値なので単位として使える）
% に展開されるマクロとして定義する。
%    \begin{macrocode}
\@onlypreamble\bxjs@const@unit
\@onlypreamble\bxjs@const@unit@a
\ifjsWitheTeX
  \def\bxjs@const@unit#1#2#3{%
    \protected\edef#1{\dimexpr\the\dimexpr#3\relax\relax}}
%    \end{macrocode}
% {\eTeX}拡張が使えない場合は、何らかの寸法パラメタに値を保持する必要が
% あるが、レジスタは貴重なので代わりに
% 「ダミーのTFMを定義してその |\fontdimen| を使う」
% というテクニックを用いる（アレ）。
%    \begin{macrocode}
\else
  \let\bxjs@Ct\fontdimen \font\bxjs@Ut=cmtex9 at 0.98245pt
  \bxjs@Ct8\bxjs@Ut=8sp \bxjs@Ct16\bxjs@Ut=\z@
  \def\bxjs@const@unit#1#2{%
    \expandafter\bxjs@const@unit@a\csname bxjs@#2@\endcsname#1}
  \def\bxjs@const@unit@a#1#2#3{%
    \chardef#1\bxjs@Ct8\bxjs@Ut \bxjs@advance@qc#1\@ne \bxjs@Ct8\bxjs@Ut#1sp
    \bxjs@Ct#1\bxjs@Ut=#3\relax \def#2{\bxjs@Ct#1\bxjs@Ut}}
\fi
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jQ}
% \begin{macro}{\jH}
% |\jQ| と |\jH| はともに0.25\,mmに等しい。
%    \begin{macrocode}
\bxjs@const@unit\jQ{jQ}{0.25mm}
\let\jH\jQ
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\trueQ}
% \begin{macro}{\trueH}
% |\trueQ| と |\trueH| はともに0.25\,true\,mmに等しい。
%    \begin{macrocode}
\ifjsc@mag
  \@tempdimb=\jsBaseFontSize\relax
  \edef\bxjs@tmpa{\strip@pt\@tempdimb}%
  \@tempdima=2.5mm
  \bxjs@invscale\@tempdima\bxjs@tmpa
  \bxjs@const@unit\trueQ{trueQ}{\@tempdima}
  \@tempdima=10pt
  \bxjs@invscale\@tempdima\bxjs@tmpa
  \bxjs@const@unit\bxjs@truept{truept}{\@tempdima}
\else \let\trueQ\jQ \let\bxjs@truept\p@
\fi
\let\trueH\trueQ
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\ascQ}
% \begin{macro}{\ascpt}
% |\ascQ| は |\trueQ| を和文スケール値で割った値。
% 例えば、|\fontsize{12\ascQ}{16\trueH}| とすると、
% 和文が12Qになる。
%
% 同様に、|\ascpt| は |truept| を和文スケールで割った値。
%    \begin{macrocode}
\@tempdima\trueQ \bxjs@invscale\@tempdima\jsScale
\bxjs@const@unit\ascQ{ascQ}{\@tempdima}
\@tempdima\bxjs@truept \bxjs@invscale\@tempdima\jsScale
\bxjs@const@unit\ascpt{ascpt}{\@tempdima}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\jafontsize}
% |\jafontsize{|\Meta{フォントサイズ}|}{|\Meta{行送り}|}|\Means
% 和文フォント規準で、すなわち、1\,zwが\Meta{フォントサイズ}に
% 等しくなるようにフォントサイズを指定する。
% この命令の引数では、|Q|/|H| の単位が使用できる。
%    \begin{macrocode}
\DeclareRobustCommand*\jsJaFontSize[2]{%
  \begingroup
    \bxjs@jafontsize@a{#1}%
    \@tempdimb\jsInverseScale\@tempdima
    \bxjs@jafontsize@a{#2}%
    \xdef\bxjs@g@tmpa{%
      \noexpand\fontsize{\the\@tempdimb}{\the\@tempdima}}%
  \endgroup\bxjs@g@tmpa}
\def\bxjs@jafontsize@a#1{%
  \bxjs@parse@qh{#1}%
  \ifx\bxjs@tmpb\relax \def\bxjs@tmpb{#1}\fi
  \@defaultunits\@tempdima\bxjs@tmpb pt\relax\@nnil}
%    \end{macrocode}
% \end{macro}
%
% 続いて、和文間空白・和欧文間空白関連の命令を実装する。
% この実装はエンジンや和文処理パッケージに依存するが、
% ここでは共通の基盤となる部分を実装する。
%
%    \begin{macrocode}
\def\bxjs@let@lenexpr{\edef}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@kanjiskip}
% 和文間空白の量を表すテキスト。
%    \begin{macrocode}
\def\bxjs@kanjiskip{0pt}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jsSetKanjiSkip}
% 和文間空白の量を設定する。
% \Note |\setkanjiskip| の実体。
%    \begin{macrocode}
\DeclareRobustCommand*\jsSetKanjiSkip[1]{%
  \bxjs@let@lenexpr\bxjs@kanjiskip{#1}%
  \bxjs@reset@kanjiskip}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jsGetKanjiSkip}
% 和文間空白の量を表すテキストに展開する。
% \Note |\getkanjiskip| の実体。
%    \begin{macrocode}
\newcommand*\jsGetKanjiSkip{%
  \bxjs@kanjiskip}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@kanjiskip@enabled}
% 和文間空白の挿入が有効か。
% \Note エンジン側の機能で制御する場合は、
% このスイッチは常に真にしておく。
%    \begin{macrocode}
\newif\ifbxjs@kanjiskip@enabled \bxjs@kanjiskip@enabledtrue
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jsEnableKanjiSkip}
% \begin{macro}{\jsDisableKanjiSkip}
% 和文間空白の挿入を有効／無効にする。
% \Note {\pTeX}系のエンジンや |luatexja| のパッケージを使用する場合は
% それ自体がもつ制御機能を利用するため、これらの命令は使わない。
%    \begin{macrocode}
\bxjs@robust@def\jsEnableKanjiSkip{%
  \bxjs@kanjiskip@enabledtrue
  \bxjs@reset@kanjiskip}
\bxjs@robust@def\jsDisableKanjiSkip{%
  \bxjs@kanjiskip@enabledfalse
  \bxjs@reset@kanjiskip}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\bxjs@reset@kanjiskip}
% 現在の和文間空白の設定を実際に反映させる。
%    \begin{macrocode}
\bxjs@robust@def\bxjs@reset@kanjiskip{%
  \ifbxjs@kanjiskip@enabled
    \setlength{\@tempskipa}{\bxjs@kanjiskip}%
  \else \@tempskipa\z@
  \fi
  \jsApplyKanjiSkip\@tempskipa}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jsApplyKanjiSkip}
% |\jsApplyKanjiSkip{|\Meta{グルー値}|}|\Means
% 和文間空白を実際に設定するためのエンジン依存のコード。
%    \begin{macrocode}
\let\jsApplyKanjiSkip\@gobble
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@xkanjiskip}
% \begin{macro}{\jsSetXKanjiSkip}
% \begin{macro}{\jsGetXKanjiSkip}
% \begin{macro}{\ifbxjs@xkanjiskip@enabled}
% \begin{macro}{\jsEnableXKanjiSkip}
% \begin{macro}{\jsDisableXKanjiSkip}
% \begin{macro}{\bxjs@reset@xkanjiskip}
% \begin{macro}{\jsApplyXKanjiSkip}
% 和欧文間空白について同様のものを用意する。
%    \begin{macrocode}
\def\bxjs@xkanjiskip{0pt}
\DeclareRobustCommand*\jsSetXKanjiSkip[1]{%
  \bxjs@let@lenexpr\bxjs@xkanjiskip{#1}%
  \bxjs@reset@xkanjiskip}
\newcommand*\jsGetXKanjiSkip{%
  \bxjs@xkanjiskip}
\newif\ifbxjs@xkanjiskip@enabled \bxjs@xkanjiskip@enabledtrue
\bxjs@robust@def\jsEnableXKanjiSkip{%
  \bxjs@xkanjiskip@enabledtrue
  \bxjs@reset@xkanjiskip}
\bxjs@robust@def\jsDisableXKanjiSkip{%
  \bxjs@xkanjiskip@enabledfalse
  \bxjs@reset@xkanjiskip}
\bxjs@robust@def\bxjs@reset@xkanjiskip{%
  \ifbxjs@xkanjiskip@enabled
    \setlength{\@tempskipa}{\bxjs@xkanjiskip}%
  \else \@tempskipa\z@
  \fi
  \jsApplyXKanjiSkip\@tempskipa}
\let\jsApplyXKanjiSkip\@gobble
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% |\jsResetDimen| を用いて、フォントサイズが変更された時に
% 空白の量が追随するようにする。
%    \begin{macrocode}
\g@addto@macro\jsResetDimen{%
  \bxjs@reset@kanjiskip
  \bxjs@reset@xkanjiskip}
%    \end{macrocode}
%
% 和文・和欧文間空白の初期値。
%
%    \begin{macrocode}
\AtEndOfPackage{%
\jsSetKanjiSkip{0pt plus.1\jsZw minus.01\jsZw}%
\ifx\jsDocClass\jsSlide \jsSetXKanjiSkip{0.1em}%
\else \jsSetXKanjiSkip{0.25em plus 0.15em minus 0.06em}%
\fi
}
%    \end{macrocode}
%
% \paragraph{和文空白命令}
%    \begin{macrocode}
\ifbxjs@jaspace@cmd
%    \end{macrocode}
%
% \begin{macro}{\jaenspace}
% 半角幅の水平空き。
%    \begin{macrocode}
  \def\jaenspace{\hskip.5\jsZw\relax}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jathinspace}
% 和欧文間空白を入れるユーザ命令。
%    \begin{macrocode}
  \def\jathinspace{\hskip\bxjs@xkanjiskip\relax}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\＿}
% 全角空白文字1つからなる名前の制御綴。
% |\zwspace| と等価になる。
%    \begin{macrocode}
  \def\　{\zwspace}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\>}
% 非数式中では |\jathinspace| と等価になるように再定義する。
% \Note 数式中では従来通り（|\:| と等価）。
%    \begin{macrocode}
  \bxjs@protected\def\bxjs@choice@jathinspace{%
    \relax\ifmmode \mskip\medmuskip
    \else \jathinspace\ignorespaces
    \fi}
  \jsAtEndOfClass{%
    \ifjsWitheTeX \let\>\bxjs@choice@jathinspace
    \else \def\>{\protect\bxjs@choice@jathinspace}%
    \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jaspace}
% |jlreq| クラスと互換の命令。
%    \begin{macrocode}
  \DeclareRobustCommand*{\jaspace}[1]{%
    \expandafter\ifx\csname bxjs@jaspace@@#1\endcsname\relax
      \ClassError\bxjs@clsname
       {Unknown jaspace: #1}{\@eha}%
    \else
      \csname bxjs@jaspace@@#1\endcsname
    \fi}
  \def\bxjs@jaspace@@zenkaku{\hskip 1\jsZw\relax}
  \def\bxjs@jaspace@@nibu{\hskip .5\jsZw\relax}
  \def\bxjs@jaspace@@shibu{\hskip .25\jsZw\relax}
%    \end{macrocode}
% \end{macro}
%
% 終わり。
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
% \paragraph{和文ドライバ読込}
%
% フックを実行する。
%    \begin{macrocode}
\bxjs@pre@jadriver@hook
%    \end{macrocode}
% 和文ドライバのファイルを読み込む。
%    \begin{macrocode}
\input{bxjsja-\bxjs@jadriver.def}
%    \end{macrocode}
%
% おしまい。
%    \begin{macrocode}
%</class>
%    \end{macrocode}
%
%^^A////////////////////////////////////////////////////////
% \clearpage
% \appendix
%^^A========================================================
% \section{和文ドライバの仕様 \ZRX}
%
% 次の命令がBXJSクラス本体と和文ドライバの連携のために
% 用意されている。
% このうち、★印を付けたものは“書込”が許されるものである。
%
% \begin{itemize}
% \item |\jsDocClass| \zrNote{文字トークンの let}\quad
%   文書クラスの種類を示し、次のいずれかと一致する
%   （|\if| で判定可能）。
%   \begin{quote}\begin{tabular}{l@{\qquad}l}
%   |\jsArticle|   & |bxjsarticle| クラス\\
%   |\jsBook|      & |bxjsbook| クラス\\
%   |\jsReport|    & |bxjsreport| クラス\\
%   |\jsSlide|     & |bxjsslide| クラス
%   \end{tabular}\end{quote}
% \item |\jsEngine| \zrNote{文字トークンの let}\quad
%   使用されているエンジンの種別。
%   （|\if| で判定可能）。
%   \begin{quote}\begin{tabular}{l@{\qquad}l}
%   |p|   & {\pdfTeX}（DVIモードも含む）\\
%   |l|   & {\LuaTeX}（〃）\\
%   |x|   & {\XeTeX}\\
%   |j|   & {\pTeX}または{\upTeX}\\
%   |n|   & 以上の何れでもない
%   \end{tabular}\end{quote}
% \item |\ifjsWithupTeX| \zrNote{スイッチ}\quad
%   使用されているエンジンが{\upTeX}であるか。
% \item |\ifjsWitheTeX| \zrNote{スイッチ}\quad
%   使用されているエンジンが{\eTeX}拡張であるか。
% \item |\ifjsInPdfMode| \zrNote{スイッチ}\quad
%   使用されているエンジンが（{\pdfTeX}・{\LuaTeX}の）
%   PDFモードであるか。
% \item |\jsUnusualPtSize| \zrNote{整数定数を表す文字列のマクロ}\quad
%   基底フォントサイズが |10pt|、|11pt|、|12pt| のいずれでもない
%   場合の |\@ptsize| の値。
%   （|\@ptsize| 自体があまり有用でないと思われる。）
% \item |\jsScale| \zrNote{実数を表す文字列のマクロ}\quad
%   和文フォントサイズの要求サイズに対するスケール。
%   クラスオプション |scale| で指定される。
%   （既定値は0.924715。）
% \item |\jsJaFont| \zrNote{マクロ}\quad
%   和文フォント設定を表す文字列。
%   クラスオプション |jafont| で指定された値。
% \item |\jsJaParam| \zrNote{マクロ}\quad
%   和文モジュールに渡すパラメタを表す文字列。
%   この値が何を表すかは決まってなくて、各々の和文モジュールが
%   独自に解釈する。
%   クラスオプション |japaram| で指定された値。
% \item |\jsInhibitGlue| \zrNote{マクロ}\quad
%   |\inhibitglue| という命令が定義されていればそれを実行し、
%   そうでなければ何もしない。
%   JSクラスで |\inhibitglue| を用いている箇所は
%   全て |\jsInhibitGlue| に置き換えられている。
%   従って、|\inhibitglue| は未定義でも動作するが、その実装が
%   ある場合はBXJSクラスはそれを活用する。
% \item |\jsInhibitGlueAtParTop| \zrNote{マクロ}★\quad
%   段落先頭におけるカギ括弧の位置調整を行うマクロ。
%   全ての段落先頭で呼び出される。
% \item |\jsZw| \zrNote{内部寸法値}\quad
%   「現在の全角幅」を表す変数。
%   JSクラスでzw単位で設定されている長さパラメタはこの変数を単位と
%   して設定されている。
%   この変数の値は実際に用いられる「和文フォント」のメトリックに
%   基づくのではなく、機械的に\
%   |\jsScale| $\times$（フォントサイズ）
%   であると定められている
%   （フォントサイズ変更の度に再設定される）。
%   従って、「和文コンポーネント」はこの設定と辻褄が合うように
%   和文フォントサイズを調整する必要がある。
%   ほとんどの場合、和文フォントをNFSSで規定する際に |\jsScale|
%   の値をスケール値として与えれば上手くいく。
% \item |\jsFontSizeChanged| \zrNote{マクロ}\quad
%   フォントサイズが変更された時に必ず呼び出される（呼び出すべき）マクロ。
% \item |\jsResetDimen| \zrNote{マクロ}★\quad
%   上記 |\jsFontSizeChanged| の中で呼び出される、
%   ユーザ（和文モジュール）用のフック。
%   フォントサイズに依存するパラメタをここで設定することができる。
%   既定の定義は空。
% \end{itemize}
%
% 以下で標準で用意されている和文ドライバの実装を示す。
%    \begin{macrocode}
%<*drv>
%    \end{macrocode}
%
%^^A========================================================
% \section{和文ドライバ：minimal \ZRX}
%
% |ja| オプションの指定が無い場合に適用されるドライバ。
% また、standard ドライバはまずこのドライバファイルを
% 読み込んでいる。
%
% このドライバでは、各エンジンについての必要最低限の処理だけを
% 行っている。
% 日本語処理のためのパッケージ（xeCJK や {\LuaTeX}-ja 等）
% を自分で読み込んで適切な設定を行うという使用状況を想定している。
%
% ただし、(u){\pTeX}エンジンについては例外で、和文処理機構の
% 選択の余地がないため、このドライバにおいて、
% 「JSクラスと同等の指定」を完成させるためのコードを記述する。
%
% \TODO minimalのコード中に何を置くべきかについて検討する。
% 現状では、本来は「minimalにすら依存しない」
% はずのものがminimal中に置かれている。
% \TODO[3.0] とりあえず、新しい補助ファイルを導入する。
% 文書クラスや和文ドライバの種別に関わらず必ず読み込まれるもの。
%
%^^A----------------
% \subsection{準備}
%
%    \begin{macrocode}
%<*minimal>
%% このファイルは日本語文字を含みます
%    \end{macrocode}
%
% \paragraph{環境検査}
%
% minimal和文ドライバの処理系バージョン要件はクラス本体と同じとする。
% 
% ただし「公式にはサポート外」のエンジンが使われている場合は
% 強制終了させる。
% \Note NTT {\JTeX}とOmega系。
%    \begin{macrocode}
\let\bxjs@tmpa\relax
\ifx J\jsEngine \def\bxjs@tmpa{NTT-jTeX}\fi
\ifx O\jsEngine \def\bxjs@tmpa{Omega}\fi
\ifx\bxjs@tmpa\relax \expandafter\@gobble
\else
  \ClassError\bxjs@clsname
   {The engine in use (\bxjs@tmpa) is not supported}
   {It's a fatal error. I'll quit right now.}
  \expandafter\@firstofone
\fi{\endinput\@@end}
%    \end{macrocode}
%
% \paragraph{補助マクロ}
% \mbox{}
%
% \begin{macro}{\DeclareJaTextFontCommand}
% 和文書体のための、「余計なこと」をしない |\DeclareTextFontCommand|。
%    \begin{macrocode}
\def\DeclareJaTextFontCommand#1#2{%
  \DeclareRobustCommand#1[1]{%
    \relax
    \ifmmode \expandafter\nfss@text \fi
    {#2##1}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DeclareJaMathFontCommand}
% 和文数式フォントが無効な場合に、それをエミュレートするもの。
%    \begin{macrocode}
\def\DeclareJaMathFontCommand#1#2{%
  \DeclareRobustCommand#1[1]{%
    \relax
    \ifmmode\else \non@alpherr{#1\space}\fi
    \nfss@text{\fontfamily\familydefault
        \fontseries{m}\fontshape{n}\selectfont\relax
        #2##1}%
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@if@sf@default}
% |\familydefault| の定義が“|\sfdefault|”である場合に
% 引数のコードを実行する。
%    \begin{macrocode}
\long\def\bxjs@@CSsfdefault{\sfdefault}%
\@onlypreamble\bxjs@if@sf@default
\def\bxjs@if@sf@default#1{%
  \ifx\familydefault\bxjs@@CSsfdefault#1\fi
  \g@addto@macro\bxjs@begin@document@hook{%
    \ifx\familydefault\bxjs@@CSsfdefault#1\fi}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jsInverseScale}
% |\jsScale| の逆数。
% \Note |\CS=\jsInverseScale\CS| は |\bxjs@invscale\CS\jsScale|
% よりも精度が劣るが処理が軽い。
%    \begin{macrocode}
\@tempdima\p@ \bxjs@invscale\@tempdima\jsScale
\edef\jsInverseScale{\strip@pt\@tempdima}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jsLetHeadChar}
% |\jsLetHeadChar\CS{|\Meta{トークン列}|}|\Means
% トークン列の先頭の文字を抽出し、|\CS| をその文字トークン
% （に展開されるマクロ）として定義する。
% \Note 先頭にあるのが制御綴やグループである場合は |\CS| は |\relax|
% に等置される。
% \Note 文字トークンは“|\the|-文字列”のカテゴリコードをもつ。
% \Note 非Unicodeエンジンの場合は文字列がUTF-8で符号化されていると
% 見なし、先頭が高位バイトの場合は1文字分のバイト列（のトークン列）
% を抽出する。
% この場合は元のカテゴリコードが保持される。
%    \begin{macrocode}
\def\jsLetHeadChar#1#2{%
  \begingroup
    \escapechar=`\\ %
    \let\bxjs@tmpa={% brace-match-hack
    \bxjs@let@hchar@exp#2}%
  \endgroup
  \let#1\bxjs@g@tmpa}
\def\bxjs@let@hchar@exp{%
  \futurelet\@let@token\bxjs@let@hchar@exp@a}
\def\bxjs@let@hchar@exp@a{%
  \bxjs@cond\ifcat\noexpand\@let@token\bgroup\fi{% 波括弧
    \bxjs@let@hchar@out\let\relax
  }{\bxjs@cond\ifcat\noexpand\@let@token\@sptoken\fi{% 空白
    \bxjs@let@hchar@out\let\space%
  }{\bxjs@cond\if\noexpand\@let@token\@backslashchar\fi{% バックスラッシュ
    \bxjs@let@hchar@out\let\@backslashchar
  }{\bxjs@let@hchar@exp@b}}}}
\def\bxjs@let@hchar@exp@b#1{%
  \expandafter\bxjs@let@hchar@exp@c\string#1?\@nil#1}
\def\bxjs@let@hchar@exp@c#1#2\@nil{%
%\message{<#1#2>}%
  \bxjs@cond\if#1\@backslashchar\fi{% 制御綴
    \bxjs@cond\expandafter\ifx\noexpand\@let@token\@let@token\fi{%
      \bxjs@let@hchar@out\let\relax
    }{%else
      \expandafter\bxjs@let@hchar@exp
    }%
  }{%else
    \bxjs@let@hchar@chr#1%
  }}
\def\bxjs@let@hchar@chr#1{%
  \bxjs@let@hchar@out\def{{#1}}}
\def\bxjs@let@hchar@out#1#2{%
  \global#1\bxjs@g@tmpa#2\relax
  \toks@\bgroup}% skip to right brace
%    \end{macrocode}
% UTF-8のバイト列を扱うコード。
%    \begin{macrocode}
\chardef\bxjs@let@hchar@csta=128
\chardef\bxjs@let@hchar@cstb=192
\chardef\bxjs@let@hchar@cstc=224
\chardef\bxjs@let@hchar@cstd=240
\chardef\bxjs@let@hchar@cste=248
\let\bxjs@let@hchar@chr@ue@a\bxjs@let@hchar@chr
\def\bxjs@let@hchar@chr@ue#1{%
  \@tempcnta=`#1\relax
%\message{\the\@tempcnta}%
  \bxjs@cond\ifnum\@tempcnta<\bxjs@let@hchar@csta\fi{%
    \bxjs@let@hchar@chr@ue@a#1%
  }{\bxjs@cond\ifnum\@tempcnta<\bxjs@let@hchar@cstb\fi{%
    \bxjs@let@hchar@out\let\relax
  }{\bxjs@cond\ifnum\@tempcnta<\bxjs@let@hchar@cstc\fi{%
    \bxjs@let@hchar@chr@ue@b
  }{\bxjs@cond\ifnum\@tempcnta<\bxjs@let@hchar@cstd\fi{%
    \bxjs@let@hchar@chr@ue@c
  }{\bxjs@cond\ifnum\@tempcnta<\bxjs@let@hchar@cste\fi{%
    \bxjs@let@hchar@chr@ue@d
  }{%else
    \bxjs@let@hchar@out\let\relax
  }}}}}}
\def\bxjs@let@hchar@chr@ue@a#1{%
  \bxjs@let@hchar@out\def{{#1}}}
\def\bxjs@let@hchar@chr@ue@b#1#2{%
  \bxjs@let@hchar@out\def{{#1#2}}}
\def\bxjs@let@hchar@chr@ue@c#1#2#3{%
  \bxjs@let@hchar@out\def{{#1#2#3}}}
\def\bxjs@let@hchar@chr@ue@d#1#2#3#4{%
  \bxjs@let@hchar@out\def{{#1#2#3#4}}}
%    \end{macrocode}
% \end{macro}
%
%^^A----------------
% \subsection{(u){\pTeX}用の設定}
%
%    \begin{macrocode}
\ifx j\jsEngine
%    \end{macrocode}
%
% 基本的に、JSクラスのコードの中で、「和文コンポーネントの管轄」
% としてBXJSクラスで除外されている部分に相当するが、
% 若干の変更が加えられている。
%
% \paragraph{補助マクロ}
%
% |\jsLetHeadChar| をUTF-8バイト列と和文文字トークンに対応させる。
%    \begin{macrocode}
\def\bxjs@let@hchar@chr@pp#1#2{%
  \expandafter\bxjs@let@hchar@chr@pp@a\meaning#2\relax#1#2}
\def\bxjs@let@hchar@chr@pp@a#1#2\relax#3#4{%
%\message{(\meaning#3:\meaning#4)}%
  \bxjs@cond\if#1k\fi{%
    \bxjs@let@hchar@out\def{{#4}}%
  }{%else
    \bxjs@let@hchar@chr@ue#3#4%
  }}
\let\bxjs@let@hchar@chr\bxjs@let@hchar@chr@pp
%    \end{macrocode}
%
% \paragraph{エンジン依存の定義}
%
% 最初にエンジン（{\pTeX}かu{\pTeX}か）に依存する定義を行う。
% |\ifjsWithupTeX| はBXJSにおいて定義されているスイッチで、
% エンジンがu{\pTeX}であるかを表す。
%
% |\jsc@JYn| および |\jsc@JTn| は標準の和文横書きおよび縦書き用
% エンコーディングを表す。
%    \begin{macrocode}
\edef\jsc@JYn{\ifjsWithupTeX JY2\else JY1\fi}
\edef\jsc@JTn{\ifjsWithupTeX JT2\else JT1\fi}
\edef\jsc@pfx@{\ifjsWithupTeX u\fi}
%    \end{macrocode}
%
% |\bxjs@declarefontshape| は標準の和文フォント宣言である。
% 後で |\bxjs@scale| を求めるため一旦マクロにしておく。
% |\bxjs@sizereference| は全角幅を測定する時に参照するフォント。
%
% まずu{\pTeX}の場合の定義を示す。
% JSクラスの |uplatex| オプション指定時の定義と同じである。
%    \begin{macrocode}
\@onlypreamble\bxjs@declarefontshape
\ifjsWithupTeX
\def\bxjs@declarefontshape{%
\DeclareFontShape{JY2}{mc}{m}{n}{<->s*[\bxjs@scale]upjpnrm-h}{}%
\DeclareFontShape{JY2}{gt}{m}{n}{<->s*[\bxjs@scale]upjpngt-h}{}%
\DeclareFontShape{JT2}{mc}{m}{n}{<->s*[\bxjs@scale]upjpnrm-v}{}%
\DeclareFontShape{JT2}{gt}{m}{n}{<->s*[\bxjs@scale]upjpngt-v}{}%
}
\def\bxjs@sizereference{upjisr-h}
%    \end{macrocode}
%
% {\pTeX}の場合の定義を示す。
% JSクラスのフォント種別オプション非指定時の定義と同じである。
%    \begin{macrocode}
\else
\def\bxjs@declarefontshape{%
\DeclareFontShape{JY1}{mc}{m}{n}{<->s*[\bxjs@scale]jis}{}%
\DeclareFontShape{JY1}{gt}{m}{n}{<->s*[\bxjs@scale]jisg}{}%
\DeclareFontShape{JT1}{mc}{m}{n}{<->s*[\bxjs@scale]tmin10}{}%
\DeclareFontShape{JT1}{gt}{m}{n}{<->s*[\bxjs@scale]tgoth10}{}%
}
\def\bxjs@sizereference{jis}
\fi
%    \end{macrocode}
%
% 既に使用されている標準和文フォント定義がもしあれば取り消す。
%    \begin{macrocode}
\def\bxjs@next#1/#2/#3/#4/#5\relax{%
  \def\bxjs@tmpb{#5}}
\ifjsWithpTeXng \def\bxjs@tmpb{10}%
\else
\expandafter\expandafter\expandafter\bxjs@next
 \expandafter\string\the\jfont\relax
\fi
\@for\bxjs@tmpa:={\jsc@JYn/mc/m/n,\jsc@JYn/gt/m/n,%
               \jsc@JTn/mc/m/n,\jsc@JTn/gt/m/n}\do
  {\expandafter\let\csname\bxjs@tmpa/10\endcsname=\@undefined
   \expandafter\let\csname\bxjs@tmpa/\bxjs@tmpb\endcsname=\@undefined}
%    \end{macrocode}
%
% \paragraph{和文フォントスケールの補正}
%
% 実は、{\pTeX}の標準的な和文フォント（JFMのこと、例えば |jis|）
% では、指定された |\jsScale|（この値を $s$ とする）をそのまま
% 使って定義すると期待通りの大きさにならない。
% これらのJFMでは1\,zwの大きさが指定されたサイズではなく
% 既にスケール（この値を $f$ とする；|jis| では0.962216倍）
% が掛けられた値になっているからである。
% そのため、ここでは $s/f$ を求めてその値をマクロ |\bxjs@scale|
% に保存する。
%    \begin{macrocode}
\begingroup
% 参照用フォント(\bxjs@sizereference)の全角空白の幅を取得
  \font\bxjs@tmpa=\bxjs@sizereference\space at 10pt
  \setbox\z@\hbox{\bxjs@tmpa\char\jis"2121\relax}
% 幅が丁度10ptなら補正は不要
  \ifdim\wd\z@=10pt
    \global\let\bxjs@scale\jsScale
  \else
% (10*s)/(10*f)として計算、\bxjs@invscaleはBXJSで定義
    \edef\bxjs@tmpa{\strip@pt\wd\z@}
    \@tempdima=10pt \@tempdima=\jsScale\@tempdima
    \bxjs@invscale\@tempdima\bxjs@tmpa
    \xdef\bxjs@scale{\strip@pt\@tempdima}
  \fi
\endgroup
%\typeout{\string\bxjs@scale : \bxjs@scale}
%    \end{macrocode}
%
% \paragraph{和文フォント関連定義}
%
% |\bxjs@scale| が決まったので先に保存した標準和文フォント
% 宣言を実行する。
%    \begin{macrocode}
\bxjs@declarefontshape
%    \end{macrocode}
%
% フォント代替の明示的定義。
%    \begin{macrocode}
\DeclareFontShape{\jsc@JYn}{mc}{m}{it}{<->ssub*mc/m/n}{}
\DeclareFontShape{\jsc@JYn}{mc}{m}{sl}{<->ssub*mc/m/n}{}
\DeclareFontShape{\jsc@JYn}{mc}{m}{sc}{<->ssub*mc/m/n}{}
\DeclareFontShape{\jsc@JYn}{gt}{m}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JYn}{gt}{m}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JYn}{mc}{bx}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JYn}{mc}{bx}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JYn}{gt}{bx}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JYn}{gt}{bx}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JYn}{mc}{b}{n}{<->ssub*mc/bx/n}{}
\DeclareFontShape{\jsc@JYn}{mc}{b}{it}{<->ssub*mc/bx/n}{}
\DeclareFontShape{\jsc@JYn}{mc}{b}{sl}{<->ssub*mc/bx/n}{}
\DeclareFontShape{\jsc@JYn}{gt}{b}{n}{<->ssub*gt/bx/n}{}
\DeclareFontShape{\jsc@JYn}{gt}{b}{it}{<->ssub*gt/bx/n}{}
\DeclareFontShape{\jsc@JYn}{gt}{b}{sl}{<->ssub*gt/bx/n}{}
\DeclareFontShape{\jsc@JTn}{mc}{m}{it}{<->ssub*mc/m/n}{}
\DeclareFontShape{\jsc@JTn}{mc}{m}{sl}{<->ssub*mc/m/n}{}
\DeclareFontShape{\jsc@JTn}{mc}{m}{sc}{<->ssub*mc/m/n}{}
\DeclareFontShape{\jsc@JTn}{gt}{m}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JTn}{gt}{m}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JTn}{mc}{bx}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JTn}{mc}{bx}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JTn}{gt}{bx}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JTn}{gt}{bx}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{\jsc@JTn}{mc}{b}{n}{<->ssub*mc/bx/n}{}
\DeclareFontShape{\jsc@JTn}{mc}{b}{it}{<->ssub*mc/bx/n}{}
\DeclareFontShape{\jsc@JTn}{mc}{b}{sl}{<->ssub*mc/bx/n}{}
\DeclareFontShape{\jsc@JTn}{gt}{b}{n}{<->ssub*gt/bx/n}{}
\DeclareFontShape{\jsc@JTn}{gt}{b}{it}{<->ssub*gt/bx/n}{}
\DeclareFontShape{\jsc@JTn}{gt}{b}{sl}{<->ssub*gt/bx/n}{}
%    \end{macrocode}
%
% 欧文総称フォント命令で和文フォントが連動するように修正する。
% その他の和文フォント関係の定義を行う。
%
% \Note 2020/02/02のNFSSの改修に対する |jsclasses| の対策を
% 取り入れた。
%    \begin{macrocode}
\@ifl@t@r\fmtversion{2020/10/01}
    {\jsc@needsp@tchfalse}{\jsc@needsp@tchtrue}
\ifjsc@needsp@tch          % --- for 2020-02-02 or older BEGIN
\ifx\@rmfamilyhook\@undefined  % old
\DeclareRobustCommand\rmfamily
  {\not@math@alphabet\rmfamily\mathrm
   \romanfamily\rmdefault\kanjifamily\mcdefault\selectfont}
\DeclareRobustCommand\sffamily
  {\not@math@alphabet\sffamily\mathsf
   \romanfamily\sfdefault\kanjifamily\gtdefault\selectfont}
\DeclareRobustCommand\ttfamily
  {\not@math@alphabet\ttfamily\mathtt
   \romanfamily\ttdefault\kanjifamily\gtdefault\selectfont}
\g@addto@macro\bxjs@begin@document@hook{%
  \ifx\mweights@init\@undefined\else  % mweights.sty is loaded
    % my definitions above should have been overwritten, recover it!
    % \selectfont is executed twice but I don't care about speed...
    \expandafter\g@addto@macro\csname rmfamily \endcsname
      {\kanjifamily\mcdefault\selectfont}%
    \expandafter\g@addto@macro\csname sffamily \endcsname
      {\kanjifamily\gtdefault\selectfont}%
    \expandafter\g@addto@macro\csname ttfamily \endcsname
      {\kanjifamily\gtdefault\selectfont}%
  \fi}
\else                          % 2020-02-02
\g@addto@macro\@rmfamilyhook
  {\prepare@family@series@update@kanji{mc}\mcdefault}
\g@addto@macro\@sffamilyhook
  {\prepare@family@series@update@kanji{gt}\gtdefault}
\g@addto@macro\@ttfamilyhook
  {\prepare@family@series@update@kanji{gt}\gtdefault}
\fi
\else % --- for 2020-02-02 or older END & for 2020-10-01 BEGIN
\AddToHook{rmfamily}%
  {\prepare@family@series@update@kanji{mc}\mcdefault}
\AddToHook{sffamily}%
  {\prepare@family@series@update@kanji{gt}\gtdefault}
\AddToHook{ttfamily}%
  {\prepare@family@series@update@kanji{gt}\gtdefault}
\fi   % --- for 2020-10-01 END
\ifx\DeclareFixJFMCJKTextFontCommand\@undefined
\DeclareJaTextFontCommand{\textmc}{\mcfamily}
\DeclareJaTextFontCommand{\textgt}{\gtfamily}
\fi
\bxjs@if@sf@default{%
  \renewcommand\kanjifamilydefault{\gtdefault}}
%    \end{macrocode}
%
% 念のため。
%    \begin{macrocode}
\selectfont
%    \end{macrocode}
%
% これ以降では、
% |\bxjs@parse@qh| の処理は{\pTeX}系では不要になるので無効化する
% （つまり |\jsSetQHLength| は |\setlength| と等価になる）。
%    \begin{macrocode}
\def\bxjs@parse@qh#1{\let\bxjs@tmpb\relax}
\let\bxjs@parse@qh@a\@undefined
\let\bxjs@parse@qh@b\@undefined
%    \end{macrocode}
%
% \paragraph{パラメタの設定}
%
%    \begin{macrocode}
\prebreakpenalty\jis"2147=10000
\postbreakpenalty\jis"2148=10000
\prebreakpenalty\jis"2149=10000
\inhibitxspcode`！=1
\inhibitxspcode`〒=2
\xspcode`+=3
\xspcode`\%=3
%    \end{macrocode}
%
% |"80|\zrWDash|"FF| の範囲の |\spcode| を3に変更。
%    \begin{macrocode}
\@tempcnta="80 \@whilenum\@tempcnta<"100 \do{%
  \xspcode\@tempcnta=3\advance\@tempcnta\@ne}
%    \end{macrocode}
%
% |\jsInhibitGlueAtParTop| の定義。
% 「JSクラスでの定義」を利用する。
%    \begin{macrocode}
\let\jsInhibitGlueAtParTop\@inhibitglue
%    \end{macrocode}
%
% |\jsResetDimen| は空のままでよい。
%
% \paragraph{組方向依存の処理}
%
% 組方向判定のif-トークン（|\if?dir|）は{\pTeX}以外では未定義で
% あるため、そのままif文に入れることができない。
% これを回避するため部分的に|!|をエスケープ文字に使う。
%    \begin{macrocode}
\begingroup
\catcode`\!=0
%    \end{macrocode}
%
% \begin{macro}{\bxjs@ptex@dir}
% 現在の組方向： |t|=縦、|y|=横、|?|=その他。
%    \begin{macrocode}
\gdef\bxjs@ptex@dir{%
  !iftdir t%
  !else!ifydir y%
  !else ?%
  !fi!fi}
%    \end{macrocode}
% \end{macro}
%
% 新版の{\pTeX}で脚注番号の周囲の空きが過大になる現象への対処。
% \Note 現在の{p\LaTeX}カーネルでは対処が既に行われている。
% ここでは、|\@makefnmark| の定義が古いものであった場合に、
% 新しいものに置き換える。
%    \begin{macrocode}
% 古い \@makefnmark の定義
\long\def\bxjs@tmpa{\hbox{%
  !ifydir \@textsuperscript{\normalfont\@thefnmark}%
  !else\hbox{\yoko\@textsuperscript{\normalfont\@thefnmark}}!fi}}
\ifx\@makefnmark\bxjs@tmpa
\long\gdef\@makefnmark{%
  !ifydir \hbox{}\hbox{\@textsuperscript{\normalfont\@thefnmark}}\hbox{}%
  !else\hbox{\yoko\@textsuperscript{\normalfont\@thefnmark}}!fi}
\fi
%    \end{macrocode}
% エスケープ文字の変更はここまで。
%    \begin{macrocode}
\endgroup
%    \end{macrocode}
%
% \paragraph{minijsパッケージのブロック}
%
% やっておく。
%    \begin{macrocode}
\@namedef{ver@minijs.sty}{}
%    \end{macrocode}
%
%^^A----------------
% \subsection{{\pdfTeX}用の処理}
%
%    \begin{macrocode}
\else\if \if p\jsEngine T\else\if n\jsEngine T\else F\fi\fi T
%    \end{macrocode}
%
% |\jsLetHeadChar| をUTF-8バイト列に対応させる。
%    \begin{macrocode}
\let\bxjs@let@hchar@chr\bxjs@let@hchar@chr@ue
%    \end{macrocode}
%
% ムニャムニャ。
%    \begin{macrocode}
\@onlypreamble\bxjs@cjk@loaded
\def\bxjs@cjk@loaded{%
  \def\@footnotemark{%
    \leavevmode
    \ifhmode
      \edef\@x@sf{\the\spacefactor}%
      \ifdim\lastkern>\z@\ifdim\lastkern<5sp\relax
         \unkern\unkern
         \ifdim\lastskip>\z@ \unskip \fi
      \fi\fi
      \nobreak
    \fi
    \@makefnmark
    \ifhmode \spacefactor\@x@sf \fi
    \relax}%
  \let\bxjs@cjk@loaded\relax
}
\g@addto@macro\bxjs@begin@document@hook{%
  \@ifpackageloaded{CJK}{%
    \bxjs@cjk@loaded
  }{}%
}
%    \end{macrocode}
%
%^^A----------------
% \subsection{{\XeTeX}用の処理}
%
%    \begin{macrocode}
\else\ifx x\jsEngine
%    \end{macrocode}
%
% |\bxjs@let@hchar@chr| について、
% 「BMP外の文字の文字トークンに対して |\string| を適用すると
% サロゲートペアに分解される」という問題に対する応急措置を施す。
%    \begin{macrocode}
\def\bxjs@let@hchar@chr#1{%
  \@tempcnta`#1\relax \divide\@tempcnta"800\relax
  \bxjs@cond\ifnum\@tempcnta=27 \fi{%
    \bxjs@let@hchar@chr@xe
  }{\bxjs@let@hchar@out\def{{#1}}}}
\def\bxjs@let@hchar@chr@xe#1{%
  \lccode`0=`#1\relax
  \lowercase{\bxjs@let@hchar@out\def{{0}}}}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@do@precisetext}
% |precisetext| オプションの実際の処理内容。
%    \begin{macrocode}
\@onlypreamble\bxjs@do@precisetext
\ifx\XeTeXgenerateactualtext\@undefined\else
  \def\bxjs@do@precisetext{%
    \XeTeXgenerateactualtext=\@ne}
\fi
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@do@simplejasetup}
% |simplejasetup| オプションの実際の処理内容。
% \TODO[3.0] バージョン要件を見直して暫定措置を解除する。
%    \begin{macrocode}
\@onlypreamble\bxjs@do@simplejasetup
\def\bxjs@do@simplejasetup{%
  \@namedef{bxjs@zeroglue/0.0pt}{T}%
  \ifnum\XeTeXinterchartokenstate>\z@
  \else\expandafter\ifx\csname bxjs@zeroglue/\the\XeTeXlinebreakskip\endcsname\relax\else
    \jsSimpleJaSetup
    \ClassInfo\bxjs@clsname
     {'\string\jsSimpleJaSetup' is applied\@gobble}%
  \fi\fi}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\jsSimpleJaSetup}
% 日本語出力用の超簡易的な設定。
%    \begin{macrocode}
\newcommand*{\jsSimpleJaSetup}{%
  \XeTeXlinebreaklocale "ja"\relax
  \XeTeXlinebreakskip=0pt plus 1pt minus 0.1pt\relax
  \XeTeXlinebreakpenalty=0\relax}
%    \end{macrocode}
% \end{macro}
%
%^^A----------------
% \subsection{後処理（エンジン共通）}
%    \begin{macrocode}
\fi\fi\fi
%    \end{macrocode}
%
% |simplejasetup| オプションの処理。
%    \begin{macrocode}
\ifx\bxjs@do@simplejasetup\@undefined\else
  \g@addto@macro\bxjs@begin@document@hook{%
    \ifbxjs@simplejasetup
      \bxjs@do@simplejasetup
    \fi}
\fi
%    \end{macrocode}
%
% |precisetext| オプションの処理。
%    \begin{macrocode}
\ifbxjs@precisetext
  \ifx\bxjs@do@precisetext\@undefined
    \ClassWarning\bxjs@clsname
     {The current engine does not support the\MessageBreak
      'precise-text' option\@gobble}
  \else
    \bxjs@do@precisetext
  \fi
\fi
%    \end{macrocode}
%
% \paragraph{段落頭でのグルー挿入禁止}
%
% 本体開始時において |\everyparhook| を検査して、
% “結局何もしない”ことになっている場合は、
% 副作用を完全に無くすために |\everyparhook| を空にする。
%    \begin{macrocode}
\g@addto@macro\bxjs@begin@document@hook{%
  \ifx\jsInhibitGlueAtParTop\@empty
    \def\bxjs@tmpa{\jsInhibitGlueAtParTop}%
    \ifx\everyparhook\bxjs@tmpa
      \let\everyparhook\@empty
    \fi
  \fi}
%    \end{macrocode}
%
% |everyparhook=modern| の場合の、|\everyparhook| の有効化の実装。
% \Note 本体開始時ではなく最初から有効化していることに注意。
%    \begin{macrocode}
\ifnum\bxjs@everyparhook=\bxjs@everyparhook@@modern
%    \end{macrocode}
% まず |\everypar| を“乗っ取る”処理を行う。
%    \begin{macrocode}
  \let\bxjs@everypar\everypar
  \newtoks\everypar
  \everypar\bxjs@everypar
%    \end{macrocode}
% そして本物の |\everypar| では、最後で常に |\everyparhook| が実行される
% ようにする。
%    \begin{macrocode}
  \bxjs@everypar{\the\expandafter\everypar\everyparhook}%
\fi
%    \end{macrocode}
%
% \paragraph{fancyhdr対策}
% |fancyhdr| オプションの値が |true| であり、
% かつ |fancyhdr| が使用された場合に以下の対策を行う。
% \begin{itemize}
% \item デフォルトの書式設定に含まれる“二文字フォント命令”を除去する。
% \item |bxjsbook| においてヘッダ・フッタの横幅を |\fullwidth| に変える。
% \end{itemize}
%
%    \begin{macrocode}
\ifbxjs@fancyhdr
%    \end{macrocode}
%
% \begin{macro}{\bxjs@adjust@fancyhdr}
% |fancyhdr| の初期設定に関する改変の処理。
% |fancyhdr| 読込完了と |\pagestyle{fancy}| 実行の間で実行されるべき。
%    \begin{macrocode}
\@onlypreamble\bxjs@adjust@fancyhdr
\def\bxjs@adjust@fancyhdr{%
%    \end{macrocode}
% ヘッダ・フッタの要素の書式について、それが既定のままであれば、
% “二文字フォント命令”を除去したものに置き換える。
% \Note 和文なので |\sl| は無い方がよいはず。
%    \begin{macrocode}
  \def\bxjs@tmpa{\fancyplain{}{\sl\rightmark}\strut}%
  \def\bxjs@tmpb{\fancyplain{}{\rightmark}\strut}%
  \ifx\f@ncyelh\bxjs@tmpa \global\let\f@ncyelh\bxjs@tmpb \fi
  \ifx\f@ncyerh\bxjs@tmpa \global\let\f@ncyerh\bxjs@tmpb \fi
  \ifx\f@ncyolh\bxjs@tmpa \global\let\f@ncyolh\bxjs@tmpb \fi
  \ifx\f@ncyorh\bxjs@tmpa \global\let\f@ncyorh\bxjs@tmpb \fi
  \def\bxjs@tmpa{\fancyplain{}{\sl\leftmark}\strut}%
  \def\bxjs@tmpb{\fancyplain{}{\leftmark}\strut}%
  \ifx\f@ncyelh\bxjs@tmpa \global\let\f@ncyelh\bxjs@tmpb \fi
  \ifx\f@ncyerh\bxjs@tmpa \global\let\f@ncyerh\bxjs@tmpb \fi
  \ifx\f@ncyolh\bxjs@tmpa \global\let\f@ncyolh\bxjs@tmpb \fi
  \ifx\f@ncyorh\bxjs@tmpa \global\let\f@ncyorh\bxjs@tmpb \fi
  \def\bxjs@tmpa{\rm\thepage\strut}%
  \def\bxjs@tmpb{\thepage\strut}%
  \ifx\f@ncyecf\bxjs@tmpa \global\let\f@ncyecf\bxjs@tmpb \fi
  \ifx\f@ncyocf\bxjs@tmpa \global\let\f@ncyocf\bxjs@tmpb \fi
%    \end{macrocode}
% |\fullwidth| が（定義済で）|\textwidth| よりも大きい場合、
% ヘッダ・フッタの横幅を |\fullwidth| に合わせる。
%    \begin{macrocode}
  \ifx\fullwidth\@undefined\else \ifdim\textwidth<\fullwidth
    \setlength{\@tempdima}{\fullwidth-\textwidth}%
    \edef\bxjs@tmpa{\noexpand\fancyhfoffset[EL,OR]{\the\@tempdima}%
    }\bxjs@tmpa
  \fi\fi
  \PackageInfo\bxjs@clsname
   {Patch to fancyhdr is applied\@gobble}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@pagestyle@hook}
% |\pagestyle| へのフックの本体。
%    \begin{macrocode}
\def\bxjs@pagestyle@hook{%
  \@ifpackageloaded{fancyhdr}{%
    \bxjs@adjust@fancyhdr
    \global\let\bxjs@adjust@fancyhdr\relax
  }{}}
%    \end{macrocode}
% \end{macro}
%
% |\pagestyle| にフックを入れ込む。
%    \begin{macrocode}
\let\bxjs@org@pagestyle\pagestyle
\def\pagestyle{%
  \bxjs@pagestyle@hook \bxjs@org@pagestyle}
%    \end{macrocode}
%
% begin-document フック。
% \Note これ以降に |fancyhdr| が読み込まれることはあり得ない。
%    \begin{macrocode}
\g@addto@macro\bxjs@begin@document@hook{%
  \bxjs@pagestyle@hook
  \global\let\bxjs@pagestyle@hook\relax}
%    \end{macrocode}
%
% 終わり。
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
% 以上で終わり。
%    \begin{macrocode}
%</minimal>
%    \end{macrocode}
%
%^^A========================================================
% \section{和文ドライバ：standard \ZRX}
%
% 標準のドライバ。
%
% \begin{itemize}
% \item |\rmfamily|/|\sffamily|/|\ttfamily| での
%   和文ファミリ連動
% \item |\mcfamily|/|\gtfamily|
% \item |\textmc|/|\textgt|
% \item |\setkanjiskip|/|\getkanjiskip|
% \item |\setxkanjiskip|/|\getxkanjiskip|
% \item |\autospacing|/|\noautospacing|
% \item |\autoxspacing|/|\noautoxspacing|
% \end{itemize}
%
%^^A----------------
% \subsection{準備}
%
%    \begin{macrocode}
%<*standard>
%% このファイルは日本語文字を含みます
%    \end{macrocode}
%
% まずminimalドライバを読み込む。
%    \begin{macrocode}
\input{bxjsja-minimal.def}
%    \end{macrocode}
%
% |simplejasetup| はstandardでは無効になる。
%    \begin{macrocode}
\bxjs@simplejasetupfalse
%    \end{macrocode}
%
% \paragraph{環境検査}
% \mbox{}
% \TODO[3.0] 以下で3.0版でのバージョン要件の予定について述べておく。
%
% standard和文ドライバの処理系バージョン要件
% （minimalからの差分）
% は以下の通りである。
% \begin{itemize}
% \item \upTeX\Means  0.29版[2010/01]以上
% \item \LuaTeX\Means 0.85版[2015/11]以上
% \item \XeTeX\Means  0.9999版[2013/03]以上
% \end{itemize}
% 加えて、以下の要件を定める。
% \begin{itemize}
% \item {\pTeX}系以外のエンジンでは{\eTeX}拡張を必須とする。
%   \Note |bxcjkjatype| パッケージが{\eTeX}拡張を要求するため。
% \item {\LuaTeX}のDVIモードはサポートしない。
%   \Note {\LuaTeX-ja}パッケージがサポートしていないため。
% \end{itemize}
%
% \paragraph{パッケージ読込}
%
% 利用可能な場合は |etoolbox| パッケージを読み込む。
% \Note 1.3版は「etoolboxパッケージ」としての最古の版であるらしい。
% |\AtEndPreamble| はこの版で既に利用可能である。
%    \begin{macrocode}
\ifjsWitheTeX
  \IfFileExists{etoolbox.sty}{%
    \RequirePackage{etoolbox}[2007/10/08]% v1.3
  }{}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{和文ドライバパラメタ}
%
% |japaram| の値をkey-valueリストとして解釈する。
% keyvalのファミリは |bxjsStd| とする。
%
% \begin{macro}{\ifbxjs@jp@jismmiv}
% 2004JIS字形を優先させるか。
%    \begin{macrocode}
\newif\ifbxjs@jp@jismmiv
%    \end{macrocode}
% \end{macro}
%
% |jis2004| オプションの処理。
%    \begin{macrocode}
\bxjs@cslet{bxjs@kv@jis2004@true}\bxjs@jp@jismmivtrue
\bxjs@cslet{bxjs@kv@jis2004@false}\bxjs@jp@jismmivfalse
\define@key{bxjsStd}{jis2004}[true]{%
  \bxjs@set@keyval{jis2004}{#1}{}}
%    \end{macrocode}
%
% \begin{macro}{\ifbxjs@jp@units}
% 和文用単位（|zw|、|zh|、|(true)Q|、|(true)H|）を
% 使えるようにするか。
%    \begin{macrocode}
\newif\ifbxjs@jp@units
%    \end{macrocode}
% \end{macro}
%
% |units| オプションの処理。
%    \begin{macrocode}
\let\bxjs@kv@units@true\bxjs@jp@unitstrue
\let\bxjs@kv@units@false\bxjs@jp@unitsfalse
\define@key{bxjsStd}{units}[true]{%
  \bxjs@set@keyval{units}{#1}{}}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@jp@font}
% フォントパッケージの追加オプション。
%    \begin{macrocode}
\let\bxjs@jp@font\@empty
%    \end{macrocode}
% \end{macro}
%
% |font| オプションの処理。
% \Note 2.9版より、複数回指定した場合には累積させる。
%    \begin{macrocode}
\define@key{bxjsStd}{font}{%
  \edef\bxjs@jp@font{\bxjs@catopt\bxjs@jp@font{#1}}}
%    \end{macrocode}
%
% \begin{macro}{\ifbxjs@jp@strong@cmd}
% |\strong| 命令を補填するか。
%    \begin{macrocode}
\newif\ifbxjs@jp@strong@cmd \bxjs@jp@strong@cmdtrue
%    \end{macrocode}
%
% |strong-cmd| オプションの処理。
%    \begin{macrocode}
\let\bxjs@kv@strongcmd@true\bxjs@jp@strong@cmdtrue
\let\bxjs@kv@strongcmd@false\bxjs@jp@strong@cmdfalse
\define@key{bxjs}{strong-cmd}[true]{\bxjs@set@keyval{strongcmd}{#1}{}}
%    \end{macrocode}
% \end{macro}
%
% 実際の |japaram| の値を適用する。
%    \begin{macrocode}
\def\bxjs@next#1{\bxjs@safe@setkeys{bxjsStd}{#1}}
\expandafter\bxjs@next\expandafter{\jsJaParam}
%    \end{macrocode}
%
%^^A----------------
% \subsection{共通処理(1)}
%
%    \begin{macrocode}
\let\jafontsize\jsJaFontSize
%    \end{macrocode}
%
% \paragraph{jis2004パラメタ}
%
% |jis2004| パラメタが有効の場合は、グローバルオプションに |jis2004|
% を追加する。
% \Note |otf| や |luatexja-preset| 等のパッケージがこのオプションを
% 利用する。
%    \begin{macrocode}
\@onlypreamble\bxjs@apply@mmiv
\def\bxjs@apply@mmiv{%
  \g@addto@macro\@classoptionslist{,jis2004}
% \@ifpackagewith 判定への対策
  \PassOptionsToPackage{jis2004}{otf}
  \global\let\bxjs@apply@mmiv\relax}
\ifbxjs@jp@jismmiv \bxjs@apply@mmiv \fi
%    \end{macrocode}
%
% \paragraph{和文用単位のサポート}
%
% エンジンが{(u)\pTeX}の場合は |units| を無効にする。
%    \begin{macrocode}
\if j\jsEngine
  \bxjs@jp@unitsfalse
\fi
%    \end{macrocode}
%
% |units| パラメタが有効の場合は、|bxcalc| パッケージの |\usepTeXunits| 命令
% を実行して和文用単位を有効化する。
%    \begin{macrocode}
\ifbxjs@jp@units
  \IfFileExists{bxcalc.sty}{%
    \RequirePackage{bxcalc}[2018/01/28]%v1.0a
    \ifx\usepTeXunits\@undefined
      \PackageWarningNoLine\bxjs@clsname
       {Cannot support pTeX units (zw etc.), since\MessageBreak
        the package 'bxcalc' is too old}%
      \bxjs@jp@unitsfalse
    \else \usepTeXunits
    \fi
  }{%else
    \PackageWarningNoLine\bxjs@clsname
     {Cannot support pTeX units (zw etc.), since\MessageBreak
      the package 'bxcalc' is unavailable}%
    \bxjs@jp@unitsfalse
  }
\fi
%    \end{macrocode}
%
% |bxcalc| で和文用単位をサポートした場合は、|\bxjs@parse@qh| の処理は不要に
% なるので無効化する。
%    \begin{macrocode}
\ifbxjs@jp@units
\def\bxjs@parse@qh#1{\let\bxjs@tmpb\relax}
\let\bxjs@parse@qh@a\@undefined
\let\bxjs@parse@qh@b\@undefined
\fi
%    \end{macrocode}
%
% \begin{macro}{\bxjs@let@lenexpr}
% |\bxjs@let@lenexpr\CS{|\Meta{長さ式}|}|\Means
% 長さ式に |bxcalc| の展開を適用した結果のトークン列を |\CS| に代入する。
%    \begin{macrocode}
\ifbxjs@jp@units
  \def\bxjs@let@lenexpr#1#2{%
    \edef#1{#2}%
    \expandafter\CUXParseExpr\expandafter#1\expandafter{#1}}
\else
  \def\bxjs@let@lenexpr{\edef}
\fi
%    \end{macrocode}
% \end{macro}
%
% \paragraph{\textbackslash strong命令の補填}
%
% \begin{macro}{\strong}
% \begin{environment}{strongenv}
% 現在未定義（|fontspec| が未読込）である場合は、
% クラス本体で定義した |\jsStrongText| を利用して定義する。
%    \begin{macrocode}
\ifbxjs@jp@strong@cmd\jsAtEndOfClass{%
  \ifx\strong\@undefined\ifx\strongenv\@undefined
    \newcommand*{\strongenv}{\jsStrongText}%
    \DeclareTextFontCommand{\strong}{\jsStrongText}%
    \newcommand*{\strongfontdeclare}{\jsStrongDeclare}%
  \fi\fi
}\fi
%    \end{macrocode}
% \end{environment}
% \end{macro}
%
% \paragraph{和文フォント指定の扱い}
%
% standard和文ドライバでは |\jsJaFont| の値を和文フォントの
% “プリセット”の指定として用いる。
% プリセットの値は、{\TeX} Liveの |kanji-config-updmap| コマンドで
% 使う“ファミリ”と同じにすることを想定する。
% 特別な値として、|auto| は |kanji-config-updmap| で現在指定
% されているファミリを表す。
%
% \begin{macro}{\bxjs@adjust@jafont}
% |\jsJaFont| に入っている和文フォント設定の値を“調整”して、
% その結果を |\bxjs@tmpa| に返す。
% |#1| が |f| の場合は“非埋込（|noEmbed|）”の設定が禁止される。
% この禁止の場合も含め、何か異常がある場合は |\bxjs@tmpa| は空になる。
%    \begin{macrocode}
\@onlypreamble\bxjs@adjust@jafont
\def\bxjs@adjust@jafont#1{%
  \ifx\jsJaFont\bxjs@@auto
    \bxjs@get@kanjiEmbed
    \ifx\bxjs@jaEmbed\relax
      \let\bxjs@tmpa\@empty
    \else
      \let\bxjs@tmpa\bxjs@jaEmbed
      \ifx\bxjs@jaVariant\bxjs@@hziv
        \bxjs@apply@mmiv
      \fi
    \fi
  \else
    \let\bxjs@tmpa\jsJaFont
  \fi
  \if f#1\ifx\bxjs@tmpa\bxjs@@noEmbed
    \ClassWarningNoLine\bxjs@clsname
     {Option 'jafont=noEmbed' is ignored, because it is\MessageBreak
      not available on the current situation}%
    \let\bxjs@tmpa\@empty
  \fi\fi
}
\def\bxjs@@auto{auto}
\def\bxjs@@noEmbed{noEmbed}
\def\bxjs@@hziv{-04}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@jaEmbed}
% \begin{macro}{\bxjs@jaVariant}
% 現在の |updmap| の |jaEmbed|・|jaVariant| パラメタの値。
% |\bxjs@get@kanjiEmbed| により実際の設定値が取得されてここに設定される。
% \Note 古い版の |updmap| では |kanjiEmbed|・|kanjiVariant| であった。
%    \begin{macrocode}
\let\bxjs@jaEmbed\relax
\let\bxjs@jaVariant\relax
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\bxjs@get@kanjiEmbed}
% 現在の |updmap| の |jaEmbed|・|jaVariant| パラメタの値を取得する。
%    \begin{macrocode}
\@onlypreamble\bxjs@get@kanjiEmbed
\def\bxjs@get@kanjiEmbed{%
  \begingroup\setbox\z@=\hbox{%
    \global\let\bxjs@tmpdo\@empty
    \def\bxjs@next##1##2##3{%
      \def##1####1##3 ####2\@nil####3\@nnil{%
        \ifx$####1$\gdef##2{####2}\fi}%
      \g@addto@macro\bxjs@tmpdo{%
        \expandafter##1\bxjs@tmpa\@nil##3 \@nil\@nnil}}%
    \bxjs@next\bxjs@tmpdo@a\bxjs@g@tmpa{kanjiEmbed}%
    \bxjs@next\bxjs@tmpdo@b\bxjs@g@tmpa{jaEmbed}%
    \bxjs@next\bxjs@tmpdo@c\bxjs@g@tmpb{kanjiVariant}%
    \bxjs@next\bxjs@tmpdo@d\bxjs@g@tmpb{jaVariant}%
%
    \global\let\bxjs@g@tmpa\relax
    \global\let\bxjs@g@tmpb\relax
    \endlinechar\m@ne
    \let\do\@makeother\dospecials
    \catcode32=10 \catcode12=10 %form-feed
    \let\bxjs@tmpa\@empty
    \openin\@inputcheck="|kpsewhich updmap.cfg"\relax
    \ifeof\@inputcheck\else
      \read\@inputcheck to\bxjs@tmpa
      \closein\@inputcheck
    \fi
    \ifx\bxjs@tmpa\@empty\else
      \openin\@inputcheck="\bxjs@tmpa"\relax
      \@tempswatrue
      \loop\if@tempswa
        \read\@inputcheck to\bxjs@tmpa
        \bxjs@tmpdo
        \ifeof\@inputcheck \@tempswafalse \fi
      \repeat
    \fi
  }\endgroup
  \let\bxjs@jaEmbed\bxjs@g@tmpa
  \let\bxjs@jaVariant\bxjs@g@tmpb
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@resolve@jafont@paren}
% |jafont|パラメタ値内の|()|を解決する。
% |\bxjs@resolve@jafont@paren\CS| で、|\CS| の内容中の |(...)|
% を |\bxjs@jafont@paren{...}| に置き換える。
%    \begin{macrocode}
\@onlypreamble\bxjs@resolve@jafont@paren
\def\bxjs@resolve@jafont@paren#1{%
  \def\bxjs@tmpb{\let#1}%
  \expandafter\bxjs@resolve@jafont@paren@a#1\@nil()\@nil\@nnil#1}
\@onlypreamble\bxjs@resolve@jafont@paren@a
\def\bxjs@resolve@jafont@paren@a#1(#2)#3\@nil#4\@nnil#5{%
  \ifx\relax#4\relax \bxjs@tmpb#5%
  \else
    \edef\bxjs@tmpa{#1\bxjs@jafont@paren{#2}#3}%
    \bxjs@tmpb\bxjs@tmpa
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \paragraph{和文として出力}
%
% 「欧文扱い」となっている文字を和文として出力するための機能。
%
% \begin{macro}{\jachar}
% |\jachar{|\meta{文字}|}|\Means
% 和文文字として出力する。
%    \begin{macrocode}
\newcommand*\jachar[1]{%
  \begingroup
%    \end{macrocode}
% |\jsLetHeadChar| で先頭の“文字”を拾って
% それを |\bxjs@jachar| に渡す。
%    \begin{macrocode}
    \jsLetHeadChar\bxjs@tmpa{#1}%
    \ifx\bxjs@tmpa\relax
      \ClassWarningNoLine\bxjs@clsname
        {Illegal argument given to \string\jachar}%
    \else
      \expandafter\bxjs@jachar\expandafter{\bxjs@tmpa}%
    \fi
  \endgroup}
%    \end{macrocode}
% |\jsJaChar| を |\jachar| と等価にする。
%    \begin{macrocode}
\let\jsJaChar\jachar
%    \end{macrocode}
% 下請けの |\bxjs@jachar| の実装はエンジンにより異なる。
%    \begin{macrocode}
\let\bxjs@jachar\@firstofone
%    \end{macrocode}
% \end{macro}
%
% \paragraph{hyperref対策}
%
% 出力ページサイズに館する処理は |geometry| パッケージが行うので、
% |hyperref| 側の処理は無効にしておく。
%    \begin{macrocode}
\PassOptionsToPackage{setpagesize=false}{hyperref}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@fix@hyperref@unicode}
% |hyperref| の |unicode| オプションの値を固定する。
%    \begin{macrocode}
\@onlypreamble\bxjs@fix@hyperref@unicode
\def\bxjs@fix@hyperref@unicode#1{%
  \PassOptionsToPackage{bxjs/hook=#1}{hyperref}%
  \@namedef{KV@Hyp@bxjs/hook}##1{%
    \KV@Hyp@unicode{##1}%
    \def\KV@Hyp@unicode####1{%
      \expandafter\ifx\csname if##1\expandafter\endcsname
         \csname if####1\endcsname\else
        \ClassWarningNoLine\bxjs@clsname
        {Blcoked hyperref option 'unicode=####1'}%
      \fi
    }%
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\jsCheckHyperrefUnicode}
% 「|hyperref| の |unicode| オプションの値を検証する」ための
% 本体開始時のフック。
% \Note |pxjahyper-uni.def| はこのフックを |\relax| に上書きする
% ことで検証を無効化している。
%    \begin{macrocode}
\@onlypreamble\jsCheckHyperrefUnicode
\let\jsCheckHyperrefUnicode\@empty
\g@addto@macro\bxjs@begin@document@hook{\jsCheckHyperrefUnicode}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@check@hyperref@unicode}
% |hyperref| の |unicode| オプションの値を本体開始時に検証する。
%    \begin{macrocode}
\@onlypreamble\bxjs@check@hyperref@unicode
\def\bxjs@check@hyperref@unicode#1{%
  \g@addto@macro\jsCheckHyperrefUnicode{%
    \@tempswafalse
    \begingroup
      \expandafter\ifx\csname ifHy@unicode\endcsname\relax
        \aftergroup\@tempswatrue \fi
      \expandafter\ifx\csname ifHy@unicode\expandafter\endcsname
          \csname if#1\endcsname
        \aftergroup\@tempswatrue \fi
    \endgroup
    \if@tempswa\else
      \ClassError\bxjs@clsname
       {The value of hyperref 'unicode' key is not suitable\MessageBreak
        for the present engine (must be #1)}%
       {\@ehc}%
    \fi}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@urgent@special}
% DVIのなるべく早い位置にspecialを出力する。
%    \begin{macrocode}
\@onlypreamble\bxjs@urgent@special
\@onlypreamble\bxjs@urgent@special@a
%    \end{macrocode}
% {\LaTeX}カーネルの新フック管理が導入済かを調べる。
% 未導入の古い版である場合。
%    \begin{macrocode}
\ifbxjs@old@hook@system
\def\bxjs@urgent@special#1{%
  \AtBeginDvi{\special{#1}}%
  \g@addto@macro\bxjs@begin@document@hook{%
    \@ifpackageloaded{atbegshi}{%
      \begingroup
        \toks\z@{\special{#1}}%
        \toks\tw@\expandafter{\AtBegShi@HookFirst}%
        \xdef\AtBegShi@HookFirst{\the\toks@\the\toks\tw@}%
      \endgroup
    }{}%
  }%
}
%    \end{macrocode}
% 導入済の場合。
% \Note 自分が先行する必要がある対象のパッケージを適宜追加する。
% \Note |pxjahyper| パッケージの処理と合わせる。
%    \begin{macrocode}
\else
  \def\bxjs@urgent@special#1{%
    \bxjs@urgent@special@a
    \AddToHook{shipout/firstpage}[pxjahyper/enc]{\special{#1}}}
  \def\bxjs@urgent@special@a{%
    \DeclareHookRule{shipout/firstpage}{pxjahyper/enc}{<}{hyperref}%
    \global\let\bxjs@urgent@special@a\relax}
\fi
%    \end{macrocode}
% \end{macro}
%
% \paragraph{bmパッケージ対策}
%
% |\reDeclareMathAlphabet| を適用した数式英字フォント命令は
% 通常の場合とは定義文の形が異なる。
% このため |bm| パッケージを利用して |\bm{\mathrm{A}}| を
% 実行するとエラーが発生する。
% これを回避するため、
% 「|\bm| の引数中では数式英字フォントの和文連動を無効にする」
% ことにする。
%
% |\reDeclareMathAlphabet| の適用により例えば |\mathrm| は
% 以下のように変更される。
% \begin{itemize}
% \item 適用前は |\mathrm| の一回展開は %
%   |\protect\|[|mathrm|\verb*| |] である。
% \item 適用後は |\mathrm| の一回展開が %
%   |\protect\|[|mathrm|\verb*|  |] になる。
% \item |\|[|mathrm|\verb*|  |] の一回展開は以下のようになる。\\
%   |\DualLang@mathalph@bet{\RDMAorg@mathrm}{\RDMAorg@mathmc}|
% \item |\RDMAorg@mathrm| の一回展開は |\|[|mathrm|\verb*| |] になる。
% \end{itemize}
%
% \begin{macro}{\bxjs@patch@RDMA@for@bm}
% |\reDeclareMathAlphabet| の機能に対して |bm| パッケージ対策の
% パッチを当てる。
%    \begin{macrocode}
\@onlypreamble\bxjs@patch@RDMA@for@bm
\def\bxjs@patch@RDMA@for@bm{%
%    \end{macrocode}
% 実際に改変するのは |\DualLang@mathalph@bet| である。
%    \begin{macrocode}
  \let\bxjs@org@DualLang@mathalph@bet\DualLang@mathalph@bet
  \def\DualLang@mathalph@bet{%
%    \end{macrocode}
% |\bm| の引数の中
% （そこでは |\bm| が |\@firstofone| に等置されているので
% これを判定に利用する）
% では、|\DualLang@mathalph@bet| を |\@firstoftwo| の動作に変える。
% これにより、|\mathrm| の
% （|\protect| を無視する場合の）
% 先頭完全展開形が、「適用」前のものと一致する。
% このため |\bm| は「適用」の影響を受けずに正常動作できる。
%    \begin{macrocode}
    \ifx\bm\@firstofone \expandafter\@firstoftwo
    \else \expandafter\bxjs@org@DualLang@mathalph@bet
    \fi}%
}
%    \end{macrocode}
% \end{macro}
%
%^^A----------------
% \subsection{{\pTeX}用設定}
%
%    \begin{macrocode}
\if j\jsEngine
%    \end{macrocode}
%
% \paragraph{共通命令の実装}
%
%    \begin{macrocode}
\newcommand*{\setkanjiskip}{\jsSetKanjiSkip}
\newcommand*{\getkanjiskip}{\jsGetKanjiSkip}
\def\jsApplyKanjiSkip#1{%
  \kanjiskip=#1\relax}
\newcommand*{\setxkanjiskip}{\jsSetXKanjiSkip}
\newcommand*{\getxkanjiskip}{\jsGetXKanjiSkip}
\def\jsApplyXKanjiSkip#1{%
  \xkanjiskip=#1\relax}
%    \end{macrocode}
%
% |\jaJaChar| のサブマクロ。
%    \begin{macrocode}
\def\bxjs@jachar#1{%
  \bxjs@jachar@a#1....\@nil}
\def\bxjs@jachar@a#1#2#3#4#5\@nil{%
%    \end{macrocode}
% 引数が単一トークンなら和文文字トークンが得られたと
% 見なしてそれをそのまま出力する。
%    \begin{macrocode}
  \ifx.#2#1%
%    \end{macrocode}
% 引数が複数トークンの場合は、UTF-8のバイト列であると見なし、
% そのスカラー値を |\@tempcnta| に代入する。
%    \begin{macrocode}
  \else\ifx.#3%
    \@tempcnta`#1 \multiply\@tempcnta64
    \advance\@tempcnta`#2 \advance\@tempcnta-"3080
    \bxjs@jachar@b
  \else\ifx.#4%
    \@tempcnta`#1 \multiply\@tempcnta64
    \advance\@tempcnta`#2 \multiply\@tempcnta64
    \advance\@tempcnta`#3 \advance\@tempcnta-"E2080
    \bxjs@jachar@b
  \else
    \@tempcnta`#1 \multiply\@tempcnta64
    \advance\@tempcnta`#2 \multiply\@tempcnta64
    \advance\@tempcnta`#3 \multiply\@tempcnta64
    \advance\@tempcnta`#4 \advance\@tempcnta-"3C82080
    \bxjs@jachar@b
  \fi\fi\fi}
%    \end{macrocode}
% 符号値が |\@tempcnta| の和文文字を出力する処理。
%    \begin{macrocode}
\ifjsWithupTeX
  \def\bxjs@jachar@b{\kchar\@tempcnta}
\else
  \def\bxjs@jachar@b{%
    \ifx\bxUInt\@undefined\else
      \bxUInt{\@tempcnta}%
    \fi}
\fi
%    \end{macrocode}
%
% 和欧文間空白の命令 |\jathinspace| の実装。
%    \begin{macrocode}
\ifbxjs@jaspace@cmd
  \def\jathinspace{\hskip\xkanjiskip}
\fi
%    \end{macrocode}
%
% \paragraph{jis2004パラメタ}
%
% |pxchfon| と |pxbabel| では2004JISを指定するオプションの
% 名が |prefer2004jis| である。
%    \begin{macrocode}
\ifbxjs@jp@jismmiv
  \PassOptionsToPackage{prefer2004jis}{pxchfon}
  \PassOptionsToPackage{prefer2004jis}{pxbabel}
\fi
%    \end{macrocode}
%
% \paragraph{和文フォント指定の扱い}
%
% {\pTeX}は既定で |kanji-config-updmap| の設定に従うため、
% |\jsJaFont| が |auto| の場合は何もする必要がない。
% 無指定でも |auto| でもない場合は、|\jsJaFont| をオプションに
% して |pxchfon| パッケージを読み込む。
% ここで、和文ドライバパラメタ |font| が指定されいる場合は、
% その値を |pxchfon| のオプションに追加する。
%    \begin{macrocode}
\let\bxjs@jafont@paren\@firstofone
\let\bxjs@tmpa\jsJaFont
\ifx\bxjs@tmpa\bxjs@@auto
  \let\bxjs@tmpa\@empty
\else\ifx\bxjs@tmpa\bxjs@@noEmbed
  \def\bxjs@tmpa{noembed}
\fi\fi
\bxjs@resolve@jafont@paren\bxjs@tmpa
\edef\bxjs@tmpa{\bxjs@catopt\bxjs@tmpa\bxjs@jp@font}
\ifx\bxjs@tmpa\@empty\else
  \edef\bxjs@next{%
    \noexpand\RequirePackage[\bxjs@tmpa]{pxchfon}[2010/05/12]% v0.5
  }\bxjs@next
\fi
%    \end{macrocode}
%
% \paragraph{otfパッケージ対策}
%
% インストールされている |otf| パッケージが |scale| オプションに
% 対応している場合は |scale=(\jsScaleの値)| を事前に |otf| に渡す。
% \Note |scale| 対応は1.7b6版 [2013/11/17] から。
% \Note otf.sty の中に「|\RequirePackage{keyval}|」の行が存在する
% かにより判定している。
% （もっといい方法はないのか……。）
%
%    \begin{macrocode}
\begingroup
  \global\let\bxjs@g@tmpa\relax
  \catcode`\|=0 \catcode`\\=12
  |def|bxjs@tmpdo#1|@nil{%
    |bxjs@tmpdo@a#1|@nil\RequirePackage|@nnil}%
  |def|bxjs@tmpdo@a#1\RequirePackage#2|@nnil{%
    |ifx$#1$|bxjs@tmpdo@b#2|@nil keyval|@nnil |fi}%
  |catcode`|\=0 \catcode`\|=12
  \def\bxjs@tmpdo@b#1keyval#2\@nnil{%
    \ifx$#2$\else
      \xdef\bxjs@g@tmpa{%
        \noexpand\PassOptionsToPackage{scale=\jsScale}{otf}}%
    \fi}
\@firstofone{%
  \catcode10=12 \endlinechar\m@ne
  \let\do\@makeother \dospecials \catcode32=10
  \openin\@inputcheck=otf.sty\relax
  \@tempswatrue
  \loop\if@tempswa
    \ifeof\@inputcheck \@tempswafalse \fi
    \if@tempswa
      \read\@inputcheck to\bxjs@next
      \expandafter\bxjs@tmpdo\bxjs@next\@nil
    \fi
  \repeat
  \closein\@inputcheck
\endgroup}
\bxjs@g@tmpa
%    \end{macrocode}
%
% \paragraph{hyperref対策}
% |hyperref| の |unicode| オプションに対する調整を行う。
% \Note |pxjahyper| パッケージの「|unicode| 対応」サポートの履歴：
% \begin{itemize}
% \item 0.7版[2021-02-13]：{\upLaTeX}上に限り|unicode|対応。
% \item 0.9c版[2021-06-06]：|pxjahyper-uni.def| ファイルを追加。
% \item 1.0版[2022-04-01]：{\pLaTeX}上の|unicode|対応を試験的サポート。
% \item 1.3版[2023-03-01]：{\pLaTeX}上の|unicode|対応を正式サポート。
% \end{itemize}
%
%    \begin{macrocode}
\ifbxjs@hyperref@enc
%    \end{macrocode}
% |unicode| オプションが偽であることを検証する。
% ただし、|pxjahyper| パッケージまたは |pxjahyper-uni.def| が読み込まれて
% （前提条件を満たしていて）「|unicode| 対応」が行われた場合は
% 検証は無効化される。
%    \begin{macrocode}
  \bxjs@check@hyperref@unicode{false}
%    \end{macrocode}
% |\bxjs@plautopatch@new| は「|pxjahyper| の自動読込に対応した
% 版の |plautopatch| が読み込まれているか」のフラグ。
%    \begin{macrocode}
  \bxjs@if@package@at@least{plautopatch}{2020/05/25}{% v0.9g
    \let\bxjs@plautopatch@new=t}{}
%    \end{macrocode}
% 「|unicode| を有効にできるか」を判定する。
% まず必要条件として
% 「|pxjahyper-uni.def| が存在すること」
% 「|\bxjs@plautopatch@new| が真、または、ファイルフックが利用可能
% であること」
% を検査する。
% \Note |pxjahyper-uni.def| をもつ |pxjahyper| の版であれば、
% {\upLaTeX}上の |unicode| には対応していることに注意。
%    \begin{macrocode}
  \let\bxjs@avail@hy@unicode=f
  \if \ifx t\bxjs@plautopatch@new T%
      \else\ifbxjs@old@hook@system F\else T\fi\fi T%
    \IfFileExists{pxjahyper-uni.def}{\let\bxjs@avail@hy@unicode=t}{}
  \fi
  \if t\bxjs@avail@hy@unicode
    \ifjsWithupTeX
%    \end{macrocode}
% 必要条件が満たされていて、かつ{\upLaTeX}である場合の処理。
% もしファイルフックが利用可能ならば、|hyperref| が読み込まれた場合に
% その直後に |pxjahyper-uni.def| が読まれるようにする。
% \Note そうでないなら、前提条件より |pxjahyper| が読み込まれるはず
% なので何もしなくてよい。
%    \begin{macrocode}
      \ifbxjs@old@hook@system\else
        \AddToHook{\bxjs@CGHN{package/hyperref/after}}{%
          \input{pxjahyper-uni.def}}
      \fi
    \else
%    \end{macrocode}
% 必要条件が満たされていて、かつ{\pLaTeX}である場合の処理。
% |pxjahyper| が
% 「{\pLaTeX}上の |unicode| 対応をもつほど新しい版（1.3版以降）」
% であるかを判定する方法はない。
% しかし、新しい{\LaTeX}システムで |unicode| を無効にするのは
% 避けたいので、{\LaTeX}カーネルが2023/06/01版以降である場合に
% |pxjahyper| も十分に新しいと推定することにする。
% すなわち「|pxjahyper| が読み込まれるはず」かつ
% 「{\LaTeX}がカーネルが新しい」かを判定する。
%    \begin{macrocode}
      \let\bxjs@avail@hy@unicode=f
      \ifx t\bxjs@plautopatch@new
        \bxjs@if@format@at@least{2023/06/01}{\let\bxjs@avail@hy@unicode=t}{}
      \fi
    \fi
  \fi
%    \end{macrocode}
% この時点で「|unicode| を有効にできるか」の判定結果が
% フラグ |\bxjs@avail@hy@unicode| に入っている。
% |unicode| を有効にできない場合は |unicode| の既定値を
% 偽に設定する。
%    \begin{macrocode}
  \if f\bxjs@avail@hy@unicode
    \PassOptionsToPackage{unicode=false}{hyperref}
  \fi
\fi
%    \end{macrocode}
%
% |tounicode| special命令を出力する。
%    \begin{macrocode}
\if \ifx\bxjs@driver@given\bxjs@driver@@dvipdfmx T%
    \else\ifjsWithpTeXng T\else F\fi\fi T%
  \IfFileExists{pxjahyper-enc.sty}{\@tempswatrue}{\@tempswafalse}
  \if@tempswa
    \RequirePackage{pxjahyper-enc}[2020/10/05]%v0.6
    \ifbxjs@bigcode\else \suppressbigcode \fi
  \else
  \ifnum\jis"2121="A1A1 %euc
    \bxjs@urgent@special{pdf:tounicode EUC-UCS2}
  \else\ifnum\jis"2121="8140 %sjis
    \bxjs@urgent@special{pdf:tounicode 90ms-RKSJ-UCS2}
  \else\ifnum\jis"2121="3000 %uptex
    \ifbxjs@bigcode
      \bxjs@urgent@special{pdf:tounicode UTF8-UTF16}
      \PassOptionsToPackage{bigcode}{pxjahyper}
    \else
      \bxjs@urgent@special{pdf:tounicode UTF8-UCS2}
      \PassOptionsToPackage{nobigcode}{pxjahyper}
    \fi
  \fi\fi\fi
  \let\bxToUnicodeSpecialDone=t
  \fi
\fi
%    \end{macrocode}
%
% \paragraph{和文数式ファミリ}
%
% 和文数式ファミリは既定で有効とする。
% すなわち |enablejfam=false| 以外の場合は |@enablejfam| を真にする。
%    \begin{macrocode}
\ifx f\bxjs@enablejfam\else
  \@enablejfamtrue
\fi
%    \end{macrocode}
%
% 実際に和文用の数式ファミリの設定を行う。
%    \begin{macrocode}
\if@enablejfam
  \DeclareSymbolFont{mincho}{\jsc@JYn}{mc}{m}{n}
  \DeclareSymbolFontAlphabet{\mathmc}{mincho}
  \SetSymbolFont{mincho}{bold}{\jsc@JYn}{gt}{m}{n}
  \jfam\symmincho
  \DeclareMathAlphabet{\mathgt}{\jsc@JYn}{gt}{m}{n}
  \g@addto@macro\bxjs@begin@document@hook{%
    \ifx\reDeclareMathAlphabet\@undefined\else
%    \end{macrocode}
% |bm| パッケージが読込済であればパッチを適用する。
%    \begin{macrocode}
      \@ifpackageloaded{bm}{\bxjs@patch@RDMA@for@bm}{}%
      \reDeclareMathAlphabet{\mathrm}{\@mathrm}{\@mathmc}%
      \reDeclareMathAlphabet{\mathbf}{\@mathbf}{\@mathgt}%
      \reDeclareMathAlphabet{\mathsf}{\@mathsf}{\@mathgt}%
    \fi}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{{\pdfTeX}用設定： CJK + bxcjkjatype}
%
%    \begin{macrocode}
\else\if \if p\jsEngine T\else\if n\jsEngine T\else F\fi\fi T
%    \end{macrocode}
%
% \paragraph{bxcjkjatypeパッケージの読込}
%
% |\jsJaFont| が指定されている場合は、その値を |bxcjkjatype| の
% オプション（プリセット指定）に渡す。
% ここで値が |auto| である場合は |\bxjs@get@kanjiEmbed| を実行する。
% スケール値（|\jsScale|）の反映は bxcjkjatype の側で行われる。
% \Note Pandocモードでは |autotilde| を指定しない。
%    \begin{macrocode}
\bxjs@adjust@jafont{f}
\let\bxjs@jafont@paren\@firstofone
\bxjs@resolve@jafont@paren\bxjs@tmpa
\edef\bxjs@tmpa{\bxjs@catopt\bxjs@tmpa\bxjs@jp@font}
\edef\bxjs@tmpa{\bxjs@catopt\bxjs@tmpa{whole}}
\ifx\bxjs@jadriver\bxjs@@pandoc\else
  \edef\bxjs@tmpa{\bxjs@catopt\bxjs@tmpa{autotilde}}
\fi
\edef\bxjs@next{%
  \noexpand\RequirePackage[\bxjs@tmpa]{bxcjkjatype}[2013/10/15]% v0.2c
}\bxjs@next
\bxjs@cjk@loaded
%    \end{macrocode}
%
% \paragraph{hyperref対策}
%
% |bxcjkjatype| 使用時は |unicode| にするべき。
%    \begin{macrocode}
\ifbxjs@hyperref@enc
  \PassOptionsToPackage{unicode}{hyperref}
\fi
%    \end{macrocode}
%
% |\hypersetup| 命令で（|CJK*| 環境に入れなくても）日本語文字を
% 含む文書情報を設定できるようにするための細工。
% \Note bxcjkjatype を |whole| 付きで使っていることが前提。
% \Note パッケージオプションでの指定に対応するのは、
% 「アクティブな高位バイトトークンがその場で展開されてしまう」
% ため困難である。
%    \begin{macrocode}
\ifx\bxcjkjatypeHyperrefPatchDone\@undefined
\begingroup
  \CJK@input{UTF8.bdg}
\endgroup
\g@addto@macro\pdfstringdefPreHook{%
  \@nameuse{CJK@UTF8Binding}%
}
\fi
%    \end{macrocode}
%
% |~| が和欧文間空白である場合はPDF文字列中で空白文字で
% なく空に展開させる。
%    \begin{macrocode}
\ifx\bxcjkjatypeHyperrefPatchDone\@undefined
\g@addto@macro\pdfstringdefPreHook{%
  \ifx~\bxjs@@CJKtilde
    \let\bxjs@org@LetUnexpandableSpace\HyPsd@LetUnexpandableSpace
    \let\HyPsd@LetUnexpandableSpace\bxjs@LetUnexpandableSpace
    \let~\@empty
  \fi
}
\def\bxjs@@CJKtilde{\CJKecglue\ignorespaces}
\def\bxjs@@tildecmd{~}
\def\bxjs@LetUnexpandableSpace#1{%
  \def\bxjs@tmpa{#1}\ifx\bxjs@tmpa\bxjs@@tildecmd\else
    \bxjs@org@LetUnexpandableSpace#1%
  \fi}
\fi
%    \end{macrocode}
%
% \paragraph{共通命令の実装}
%
%    \begin{macrocode}
\newskip\jsKanjiSkip
\newskip\jsXKanjiSkip
\ifx\CJKecglue\@undefined
  \def\CJKtilde{\CJK@global\def~{\CJKecglue\ignorespaces}}
\fi
\newcommand*{\setkanjiskip}{\jsSetKanjiSkip}
\newcommand*{\getkanjiskip}{\jsGetKanjiSkip}
\newcommand*{\autospacing}{\jsEnableKanjiSkip}
\newcommand*{\noautospacing}{\jsDisableKanjiSkip}
\protected\def\bxjs@CJKglue{\hskip\jsKanjiSkip}
\def\jsApplyKanjiSkip#1{%
  \jsKanjiSkip=#1\relax
  \let\CJKglue\bxjs@CJKglue}
\newcommand*{\setxkanjiskip}{\jsSetXKanjiSkip}
\newcommand*{\getxkanjiskip}{\jsGetXKanjiSkip}
\newcommand*{\autoxspacing}{\jsEnableXKanjiSkip}
\newcommand*{\noautoxspacing}{\jsDisableXKanjiSkip}
\protected\def\bxjs@CJKecglue{\hskip\jsXKanjiSkip}
\def\jsApplyXKanjiSkip#1{%
  \jsXKanjiSkip=#1\relax
  \let\CJKecglue\bxjs@CJKecglue}
%    \end{macrocode}
%
% |\jachar| のサブマクロの実装。
%    \begin{macrocode}
\def\bxjs@jachar#1{%
  \CJKforced{#1}}
%    \end{macrocode}
%
% 和欧文間空白の命令 |\jathinspace| の実装。
%    \begin{macrocode}
\ifbxjs@jaspace@cmd
  \protected\def\jathinspace{\CJKecglue}
\fi
%    \end{macrocode}
%
% \paragraph{和文数式ファミリ}
%
% CJKパッケージは（恐らく）数式文字としてCJK文字をサポートしていない。
% 従って |@enablejfam| は常に偽になる。
%    \begin{macrocode}
\ifx t\bxjs@enablejfam
  \ClassWarningNoLine\bxjs@clsname
   {You cannot use 'enablejfam=true', since the\MessageBreak
    CJK package does not support Japanese math}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{{\XeTeX}用設定： xeCJK + zxjatype}
%
%    \begin{macrocode}
\else\if x\jsEngine
%    \end{macrocode}
%
% \paragraph{zxjatypeパッケージの読込}
%
% スケール値（|\jsScale|）の反映は zxjatype の側で行われる。
%    \begin{macrocode}
\RequirePackage{zxjatype}
\PassOptionsToPackage{no-math}{fontspec}%!
\PassOptionsToPackage{xetex}{graphicx}%!
\PassOptionsToPackage{xetex}{graphics}%!
\ifx\zxJaFamilyName\@undefined
  \ClassError\bxjs@clsname
  {xeCJK or zxjatype is too old}\@ehc
\fi
%    \end{macrocode}
%
% \paragraph{和文フォント定義}
%
% |\jsJaFont| が指定された場合は、その値をオプションと
% して |zxjafont| を読み込む。
% 非指定の場合は原ノ味フォントを使用する。
% \Note 2.0版より既定をIPAexから原ノ味に変更。
%    \begin{macrocode}
\bxjs@adjust@jafont{f}
\let\bxjs@jafont@paren\@gobble
\bxjs@resolve@jafont@paren\bxjs@tmpa
\edef\bxjs@tmpa{\bxjs@catopt\bxjs@tmpa\bxjs@jp@font}
\ifx\bxjs@tmpa\@empty
  \setCJKmainfont[BoldFont=HaranoAjiGothic-Medium.otf]{HaranoAjiMincho-Regular.otf}
  \setCJKsansfont[BoldFont=HaranoAjiGothic-Medium.otf]{HaranoAjiGothic-Medium.otf}
\else
  \edef\bxjs@next{%
    \noexpand\RequirePackage[\bxjs@tmpa]{zxjafont}[2013/01/28]% v0.2a
  }\bxjs@next
\fi
%    \end{macrocode}
%
% \paragraph{hyperref対策}
%
% |unicode| オプションの指定に関する話。
%
% {\XeTeX}の場合は、xdvipdfmxがUTF-8→UTF-16の変換を行う機能を
% 持っているため、本来はspecial命令の文字列の文字コード変換は不要である。
% ところが、|hyperref| での方針としては、{\XeTeX}の場合にも
% パッケージ側で文字コード変換を行う方が望ましいと考えている。
% 実際、|unicode| を無効にしていると警告が出て強制的に有効化される。
% 一方で、過去（r35125まで）^^A2014/09/20
% のxdvipdfmxでは、文字列をUTF-16に変換した状態で与えるのは不正と
% 見なしていて警告が発生する。
%
% これを踏まえて、ここでは、
% 「{\XeTeX}のバージョンが0.99992以上の場合に |unicode| を既定で
% 有効にする」
% ことにする。
% \Note {\TeX}の小数の精度は十進で4桁までしか保証されないので、
% |\strcmp| を利用して文字列で比較している。
% （整数部が多桁になっても大丈夫。）
% しかし実は、|\strcmp| プリミティブが追加されたのは
% 0.9994版（2009年6月）かららしい。
% \TODO[3.0] バージョン要件を見直して暫定措置を解除する。
%    \begin{macrocode}
\ifx\strcmp\@undefined\else %未定義なら条件を満たさない
\ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99992}>\m@ne
  \ifbxjs@hyperref@enc
    \PassOptionsToPackage{unicode}{hyperref}
  \fi
\fi
\fi
%    \end{macrocode}
%
% \paragraph{段落頭でのグルー挿入禁止}
%
% どうやら、\Pkg{zxjatype}の |\inhibitglue| の実装が極めて杜撰なため、
% 1.0版での実装では全く期待通りの動作をしていないし、
% そもそも（少なくとも現状の）\Pkg{xeCJK}では、
% 段落頭での |\inhibitglue| は実行しないほうがJSクラスの出力に
% 近いものが得られるらしい。
%
% 従って、|\jsInhibitGlueAtParTop| は結局何もしないことにする。
%
% 強制改行直後のグルー禁止処理、のような怪しげな何か。
%
%    \begin{macrocode}
\AtEndOfClass{%
\def\@gnewline #1{%
  \ifvmode \@nolnerr
  \else
    \unskip \reserved@e {\reserved@f#1}\nobreak \hfil \break \null
    \nobreak \hskip-1sp\hskip1sp\relax
    \ignorespaces
  \fi}
}
%    \end{macrocode}
%
% \paragraph{共通命令の実装}
%
%    \begin{macrocode}
\newskip\jsKanjiSkip
\newskip\jsXKanjiSkip
\ifx\CJKecglue\@undefined
  \def\CJKtilde{\CJK@global\def~{\CJKecglue\ignorespaces}}
\fi
\newcommand*{\setkanjiskip}{\jsSetKanjiSkip}
\newcommand*{\getkanjiskip}{\jsGetKanjiSkip}
\newcommand*{\autospacing}{\jsEnableKanjiSkip}
\newcommand*{\noautospacing}{\jsDisableKanjiSkip}
\protected\def\bxjs@CJKglue{\hskip\jsKanjiSkip}
\def\jsApplyKanjiSkip#1{%
  \jsKanjiSkip=#1\relax
  \xeCJKsetup{CJKglue={\bxjs@CJKglue}}}
\newcommand*{\setxkanjiskip}{\jsSetXKanjiSkip}
\newcommand*{\getxkanjiskip}{\jsGetXKanjiSkip}
\newcommand*{\autoxspacing}{\jsEnableXKanjiSkip}
\newcommand*{\noautoxspacing}{\jsDisableXKanjiSkip}
\protected\def\bxjs@CJKecglue{\hskip\jsXKanjiSkip}
\def\jsApplyXKanjiSkip#1{%
  \jsXKanjiSkip=#1\relax
  \xeCJKsetup{CJKecglue={\bxjs@CJKecglue}}}
%    \end{macrocode}
%
% |\mcfamily|、|\gtfamily| は本来は zxjatype の方で定義すべき
% であろうが、現状は暫定的にここで定義する。
%    \begin{macrocode}
\ifx\mcfamily\@undefined
  \protected\def\mcfamily{\CJKfamily{\CJKrmdefault}}
  \protected\def\gtfamily{\CJKfamily{\CJKsfdefault}}
\fi
%    \end{macrocode}
%
% |\jachar| のサブマクロの実装。
%    \begin{macrocode}
\def\bxjs@jachar#1{%
  \xeCJKDeclareCharClass{CJK}{`#1}\relax
  #1}
%    \end{macrocode}
%
% |\jathinspace| の実装。
%    \begin{macrocode}
\ifbxjs@jaspace@cmd
  \protected\def\jathinspace{\CJKecglue}
\fi
%    \end{macrocode}
%
% \paragraph{和文数式ファミリ}
%
% 和文数式ファミリは既定で無効とする。
% すなわち |enablejfam=true| の場合にのみ |@enablejfam| を真にする。
%    \begin{macrocode}
\ifx t\bxjs@enablejfam
  \@enablejfamtrue
\fi
%    \end{macrocode}
%
% 実際に和文用の数式ファミリの設定を行う。
% \Note FIXME: 要検討。
%    \begin{macrocode}
\if@enablejfam
  \xeCJKsetup{CJKmath=true}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{{\LuaTeX}用設定： {\LuaTeX}-ja}
%
%    \begin{macrocode}
\else\if l\jsEngine
%    \end{macrocode}
%
% \paragraph{{\LuaTeX}-jaパッケージの読込}
%
% |luatexja| とともに |luatexja-fontspec| パッケージを読み込む。
%
% |luatexja| は自前の |\zw|（これは実際の現在和文フォントに
% 基づく値を返す）を定義するので、|\zw| の定義を消しておく。
% なお、レイアウト定義の「全角幅」は「規定」に基づく |\jsZw| で
% あることに注意が必要。
%
% \Note 1.0b版から
% 「graphicsパッケージに |pdftex| オプションを渡す」
% 処理を行っていたが、1.4版で廃止された。
%
%    \begin{macrocode}
\let\zw\@undefined
\RequirePackage{luatexja}
\edef\bxjs@next{%
  \noexpand\RequirePackage[scale=\jsScale]{luatexja-fontspec}[2015/08/26]%
}\bxjs@next
%    \end{macrocode}
% |\set@fontsize| へのパッチ適用を再度行う。
%    \begin{macrocode}
\bxjs@patch@set@fontsize
%    \end{macrocode}
%
% フォント代替の明示的定義。
%    \begin{macrocode}
\DeclareFontShape{JY3}{mc}{m}{it}{<->ssub*mc/m/n}{}
\DeclareFontShape{JY3}{mc}{m}{sl}{<->ssub*mc/m/n}{}
\DeclareFontShape{JY3}{mc}{m}{sc}{<->ssub*mc/m/n}{}
\DeclareFontShape{JY3}{gt}{m}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{JY3}{gt}{m}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{JY3}{mc}{bx}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{JY3}{mc}{bx}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{JY3}{gt}{bx}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{JY3}{gt}{bx}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{JY3}{mc}{b}{n}{<->ssub*mc/bx/n}{}
\DeclareFontShape{JY3}{mc}{b}{it}{<->ssub*mc/bx/n}{}
\DeclareFontShape{JY3}{mc}{b}{sl}{<->ssub*mc/bx/n}{}
\DeclareFontShape{JY3}{gt}{b}{n}{<->ssub*gt/bx/n}{}
\DeclareFontShape{JY3}{gt}{b}{it}{<->ssub*gt/bx/n}{}
\DeclareFontShape{JY3}{gt}{b}{sl}{<->ssub*gt/bx/n}{}
\DeclareFontShape{JT3}{mc}{m}{it}{<->ssub*mc/m/n}{}
\DeclareFontShape{JT3}{mc}{m}{sl}{<->ssub*mc/m/n}{}
\DeclareFontShape{JT3}{mc}{m}{sc}{<->ssub*mc/m/n}{}
\DeclareFontShape{JT3}{gt}{m}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{JT3}{gt}{m}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{JT3}{mc}{bx}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{JT3}{mc}{bx}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{JT3}{gt}{bx}{it}{<->ssub*gt/m/n}{}
\DeclareFontShape{JT3}{gt}{bx}{sl}{<->ssub*gt/m/n}{}
\DeclareFontShape{JT3}{mc}{b}{n}{<->ssub*mc/bx/n}{}
\DeclareFontShape{JT3}{mc}{b}{it}{<->ssub*mc/bx/n}{}
\DeclareFontShape{JT3}{mc}{b}{sl}{<->ssub*mc/bx/n}{}
\DeclareFontShape{JT3}{gt}{b}{n}{<->ssub*gt/bx/n}{}
\DeclareFontShape{JT3}{gt}{b}{it}{<->ssub*gt/bx/n}{}
\DeclareFontShape{JT3}{gt}{b}{sl}{<->ssub*gt/bx/n}{}
%    \end{macrocode}
%
% \paragraph{和文フォント定義}
%
% |\jsJaFont| が指定された場合は、その値をオプションと
% して |luatexja-preset| を読み込む。
% 非指定の場合は原ノ味フォントを指定する
% （|luatexja-preset| は読み込まない）。
% \Note 2.0版より既定をIPAexから原ノ味に変更。
%    \begin{macrocode}
\bxjs@adjust@jafont{t}
\ifx\bxjs@tmpa\bxjs@@noEmbed
  \def\bxjs@tmpa{noembed}
\fi
\let\bxjs@jafont@paren\@gobble
\bxjs@resolve@jafont@paren\bxjs@tmpa
\edef\bxjs@tmpa{\bxjs@catopt\bxjs@tmpa\bxjs@jp@font}
\ifx\bxjs@tmpa\@empty
  \defaultjfontfeatures{ Kerning=Off }
  \setmainjfont[BoldFont=HaranoAjiGothic-Medium.otf,JFM=ujis]{HaranoAjiMincho-Regular.otf}
  \setsansjfont[BoldFont=HaranoAjiGothic-Medium.otf,JFM=ujis]{HaranoAjiGothic-Medium.otf}
\else
  \edef\bxjs@next{%
    \noexpand\RequirePackage[\bxjs@tmpa]{luatexja-preset}%
  }\bxjs@next
\fi
%    \end{macrocode}
%
% 欧文総称フォント命令で和文フォントが連動するように修正する。
% その他の和文フォント関係の定義を行う。
%    \begin{macrocode}
\@ifpackagelater{luatexja}{2016/03/31}{}{%else
\DeclareRobustCommand\rmfamily
  {\not@math@alphabet\rmfamily\mathrm
   \romanfamily\rmdefault\kanjifamily\mcdefault\selectfont}
\DeclareRobustCommand\sffamily
  {\not@math@alphabet\sffamily\mathsf
   \romanfamily\sfdefault\kanjifamily\gtdefault\selectfont}
\DeclareRobustCommand\ttfamily
  {\not@math@alphabet\ttfamily\mathtt
   \romanfamily\ttdefault\kanjifamily\gtdefault\selectfont}
}
\long\def\jttdefault{\gtdefault}
\unless\ifx\@ltj@match@familytrue\@undefined
  \@ltj@match@familytrue
\fi
\g@addto@macro\bxjs@begin@document@hook{%
  \@ifpackageloaded{bm}{\bxjs@patch@RDMA@for@bm}{}%
  \reDeclareMathAlphabet{\mathrm}{\mathrm}{\mathmc}%
  \reDeclareMathAlphabet{\mathbf}{\mathbf}{\mathgt}%
  \reDeclareMathAlphabet{\mathsf}{\mathsf}{\mathgt}}%
\bxjs@if@sf@default{%
  \renewcommand\kanjifamilydefault{\gtdefault}}
%    \end{macrocode}
%
% \paragraph{和文パラメタの設定}
%
%    \begin{macrocode}
% 次の3つは既定値の通り
%\ltjsetparameter{prebreakpenalty={`’,10000}}
%\ltjsetparameter{postbreakpenalty={`“,10000}}
%\ltjsetparameter{prebreakpenalty={`”,10000}}
\ltjsetparameter{jaxspmode={`！,1}}
\ltjsetparameter{jaxspmode={`〒,2}}
\ltjsetparameter{alxspmode={`+,3}}
\ltjsetparameter{alxspmode={`\%,3}}
%    \end{macrocode}
%
% \paragraph{段落頭でのグルー挿入禁止}
%
% 基本的に現状の |ltjs*| クラスの処理に合わせる。
% \Note |\jsInhibitGlueAtParTop| は使わない。
%
% \begin{macro}{\ltjfakeparbegin}
% 現在の{\LuaTeX-ja}で定義されているマクロで、
% 段落中で段落冒頭用の処理を発動する。
% 未定義である場合にに備えて同等のものを用意する。
%    \begin{macrocode}
\ifx\ltjfakeparbegin\@undefined
  \protected\def\ltjfakeparbegin{%
    \ifhmode
      \relax\directlua{%
        luatexja.jfmglue.create_beginpar_node()}}
    \fi}
\fi
%    \end{macrocode}
% \end{macro}
%
% |ltjs*| クラスの定義と同等になるようにパッチを当てる。
%    \begin{macrocode}
\unless\ifnum\bxjs@everyparhook=\bxjs@everyparhook@@none
\begingroup
  \let\%\@percentchar \def\@#1{[[\detokenize{#1}]]}
  \@gobble\if\def\bxjs@tmpa{\@{\everypar{}\fi}}
  \ifnum\bxjs@everyparhook=\bxjs@everyparhook@@compat
    \@gobble\if\def\bxjs@tmpa{\@{\everypar{\everyparhook}\fi}}\fi
  \directlua{
    local function patchcmd(cs, code, from, to)
      tex.sprint(code:gsub(from:gsub("\%W", "\%\%\%0"), "\%0"..to)
        :gsub("macro:", \@\gdef..cs, 1):gsub("->", "{", 1).."}")
    end
    patchcmd(\@\@xsect, [[\meaning\@xsect]],
      \@{\hskip-\@tempskipa}, \@\ltjfakeparbegin)
    patchcmd(\@\@item, [[\meaning\@item]],
      \bxjs@tmpa, \@\ltjfakeparbegin)}
\endgroup
\fi
%    \end{macrocode}
%
% \paragraph{hyperref対策}
%
% |unicode| にするべき。
% \Note 1.6c版より、固定ではなく既定設定＋検証に切り替えた。
%    \begin{macrocode}
\ifbxjs@hyperref@enc
  \PassOptionsToPackage{unicode}{hyperref}
  \bxjs@check@hyperref@unicode{true}
\fi
%    \end{macrocode}
%
% \paragraph{共通命令の実装}
%
%    \begin{macrocode}
\newcommand*{\setkanjiskip}{\jsSetKanjiSkip}
\newcommand*{\getkanjiskip}{\jsGetKanjiSkip}
\newcommand*{\setxkanjiskip}{\jsSetXKanjiSkip}
\newcommand*{\getxkanjiskip}{\jsGetXKanjiSkip}
\protected\def\autospacing{%
  \ltjsetparameter{autospacing=true}}
\protected\def\noautospacing{%
  \ltjsetparameter{autospacing=false}}
\protected\def\autoxspacing{%
  \ltjsetparameter{autoxspacing=true}}
\protected\def\noautoxspacing{%
  \ltjsetparameter{autoxspacing=false}}
\def\jsApplyKanjiSkip#1{%
  \ltjsetparameter{kanjiskip={#1}}}
\def\jsApplyXKanjiSkip#1{%
  \ltjsetparameter{xkanjiskip={#1}}}
%    \end{macrocode}
%
% |\jachar| のサブマクロの実装。
%    \begin{macrocode}
\def\bxjs@jachar#1{%
  \ltjjachar`#1\relax}
%    \end{macrocode}
%
% |\jathinspace| の実装。
%    \begin{macrocode}
\ifbxjs@jaspace@cmd
  \protected\def\jathinspace{%
    \hskip\ltjgetparameter{xkanjiskip}\relax}
\fi
%    \end{macrocode}
%
% \paragraph{和文数式ファミリ}
%
% {\LuaTeX}-jaでは和文数式ファミリは常に有効で、既にこの時点で必要な
% 設定は済んでいる。
% 従って |@enablejfam| は常に真になる。
%    \begin{macrocode}
\ifx f\bxjs@enablejfam
  \ClassWarningNoLine\bxjs@clsname
   {You cannot use 'enablejfam=false', since the\MessageBreak
    LuaTeX-ja always provides Japanese math families}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{共通処理(2)}
%
%    \begin{macrocode}
\fi\fi\fi\fi
%    \end{macrocode}
%
% \paragraph{共通命令の実装}
% \begin{macro}{\textmc}
% \begin{macro}{\textgt}
% minimal ドライバ実装中で定義した |\DeclareJaTextFontCommand|
% を利用する。
%    \begin{macrocode}
\ifx\DeclareFixJFMCJKTextFontCommand\@undefined
\DeclareJaTextFontCommand{\textmc}{\mcfamily}
\DeclareJaTextFontCommand{\textgt}{\gtfamily}
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\mathmc}
% \begin{macro}{\mathgt}
% この時点で未定義である場合に限り、
% |\DeclareJaMathFontCommand| を利用したフォールバックの定義を行う。
%    \begin{macrocode}
\ifx\mathmc\@undefined
  \DeclareJaMathFontCommand{\mathmc}{\mcfamily}
  \DeclareJaMathFontCommand{\mathgt}{\gtfamily}
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% 以上で終わり。
%
%    \begin{macrocode}
%</standard>
%    \end{macrocode}
%
%^^A========================================================
% \section{和文ドライバ：modern \ZRX}
%
% モダーンな設定。
%
% standardドライバの設定を引き継ぐ。
%    \begin{macrocode}
%<*modern>
\input{bxjsja-standard.def}
%    \end{macrocode}
%
%^^A----------------
% \subsection{フォント設定}
% 
% T1エンコーディングに変更する。
% \Note 以下のコードは |\usepackage[T1]{fontenc}| と同等。
%    \begin{macrocode}
\ifnum0\if x\jsEngine1\fi\if l\jsEngine1\fi=\z@
\def\encodingdefault{T1}%
\input{t1enc.def}%
\fontencoding\encodingdefault\selectfont
\fi
%    \end{macrocode}
%
% 基本フォントをLatin Modernフォントファミリに変更する。
% \Note 以下は |\usepackage[noamth]{lmodern}| と同じ。
% ユーザは後で |lmodern| を好きなオプションを付けて読み込む
% ことができる。
%    \begin{macrocode}
\ifnum0\if x\jsEngine1\fi\if l\jsEngine1\fi=\z@
\renewcommand{\rmdefault}{lmr}
\renewcommand{\sfdefault}{lmss}
\renewcommand{\ttdefault}{lmtt}
\fi
%    \end{macrocode}
%
% 大型演算子用の数式フォントの設定。
% \Note |amsfonts| パッケージと同等にする。
%    \begin{macrocode}
\DeclareFontShape{OMX}{cmex}{m}{n}{%
  <-7.5>cmex7<7.5-8.5>cmex8%
  <8.5-9.5>cmex9<9.5->cmex10}{}%
\expandafter\let\csname OMX/cmex/m/n/10\endcsname\relax
%    \end{macrocode}
% |amsmath| 読込時に上書きされるのを防ぐ。
%    \begin{macrocode}
\def\cmex@opt{10}
%    \end{macrocode}
%
%^^A----------------
% \subsection{fixltx2e読込}
%
% \Note |fixltx2e| 廃止前の{\LaTeX}カーネルの場合。
%    \begin{macrocode}
\ifx\@IncludeInRelease\@undefined
\RequirePackage{fixltx2e}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{和文カテゴリコード}
%
% 和文カテゴリコード設定のための補助パッケージを読みこむ。
%    \begin{macrocode}
\RequirePackage{bxjscjkcat}
%    \end{macrocode}
%
%^^A----------------
% \subsection{完了}
% おしまい。
%    \begin{macrocode}
%</modern>
%    \end{macrocode}
%
%^^A========================================================
% \section{和文ドライバ：pandoc \ZRX}
%
% 「Pandocモード」で使用される和文ドライバ。
% standardドライバの機能を継承するが、
% 「Pandocの既定のlatexテンプレート」が使われることを前提として、
% それとBXJSの設定を整合させるための措置を加えている。
%
%^^A----------------
% \subsection{準備}
%
%    \begin{macrocode}
%<*pandoc>
%    \end{macrocode}
%
% |xeCJK| で |space| が有効になるのを阻止する。
% \Note |bxjsja-standard.def| の中で |xeCJK| が読み込まれるため
% この位置に置いている。
%    \begin{macrocode}
\if x\jsEngine
  \PassOptionsToPackage{nospace}{xeCJK}
\fi
%    \end{macrocode}
%
% standardドライバの設定を引き継ぐ。
%    \begin{macrocode}
\input{bxjsja-standard.def}
%    \end{macrocode}
%
% \paragraph{環境検査}
% \mbox{}
% \TODO[3.0] 以下で3.0版でのバージョン要件の予定について述べておく。
%
% pandoc和文ドライバの処理系バージョン要件はstandardと同じとする。
% 加えて、以下の要件を定める。
% \begin{itemize}
% \item {\pTeX}系も含めて全てのエンジン種別で{\eTeX}拡張を要求する。
% \item 特に |etoolbox| の2.0版以上を要求する。
%   \Note もちろん他にも追加の依存パッケージがある。
% \end{itemize}
%
% \paragraph{パッケージ読込}
%
% |bxjspandoc| パッケージを読み込む。
%    \begin{macrocode}
\RequirePackage{bxjspandoc}
%    \end{macrocode}
%
% {\eTeX}ではない場合に警告を出す。
%    \begin{macrocode}
\ifjsWitheTeX\else
  \ClassWarningNoLine\bxjs@clsname
   {!!!!!!!! WARNING !!!!!!!!\MessageBreak
    This engine does not support e-TeX extension!\MessageBreak
    Some feature might not work properly}
\fi
%    \end{macrocode}
%
% \begin{macro}{\ifbxjs@bxghost@available}
% 〔スイッチ〕|bxghost| パッケージが利用できるか。
%    \begin{macrocode}
\newif\ifbxjs@bxghost@available
\ifjsWitheTeX
  \RequirePackage{pdftexcmds}[2009/09/22]% v0.5
  \IfFileExists{bxghost.sty}{%
    \bxjs@bxghost@availabletrue
    \@namedef{bxjs@bgbv/79E70A0991967E27981832C84DB5DF99}{1}%v0.2.0
    \ifx\pdf@filemdfivesum\@undefined\else
      \expandafter\ifx\csname bxjs@bgbv/\pdf@filemdfivesum{bxghost.sty}%
          \endcsname\relax\else \bxjs@bxghost@availablefalse \fi
    \fi
  }{}
\fi
%    \end{macrocode}
% \end{macro}
%
% その他の依存パッケージを読み込む。
%    \begin{macrocode}
\RequirePackage{iftex}[2013/04/04]% v0.2
\ifjsWitheTeX
  \RequirePackage{etoolbox}[2010/08/21]% v2.0
  \RequirePackage{filehook}[2011/10/12]% v0.5d
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{和文ドライバパラメタ}
%
% keyvalのファミリは |bxjsPan| とする。
%
% \begin{macro}{\ifbxjs@jp@fix@strong}
% 重要要素を補正するか。
%    \begin{macrocode}
\newif\ifbxjs@jp@fix@strong \bxjs@jp@fix@strongtrue
%    \end{macrocode}
% \end{macro}
%
% |fix-strong| オプションの処理。
%    \begin{macrocode}
\let\bxjs@kv@fixstrong@true\bxjs@jp@fix@strongtrue
\let\bxjs@kv@fixstrong@false\bxjs@jp@fix@strongfalse
\define@key{bxjsPan}{fix-strong}[true]{%
  \bxjs@set@keyval{fixstrong}{#1}{}}
%    \end{macrocode}
%
% \begin{macro}{\ifbxjs@jp@fix@code}
% インラインコード要素を補正するか。
%    \begin{macrocode}
\newif\ifbxjs@jp@fix@code \bxjs@jp@fix@codetrue
%    \end{macrocode}
% \end{macro}
%
% |fix-code| オプションの処理。
%    \begin{macrocode}
\let\bxjs@kv@fixcode@true\bxjs@jp@fix@codetrue
\let\bxjs@kv@fixcode@false\bxjs@jp@fix@codefalse
\define@key{bxjsPan}{fix-code}[true]{%
  \bxjs@set@keyval{fixcode}{#1}{}}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@jp@strong}
% 重要要素に適用される書体変更の種類。
%    \begin{macrocode}
\chardef\bxjs@jp@strong=0
%    \end{macrocode}
% \end{macro}
%
% |strong| オプションの処理。
%    \begin{macrocode}
\def\bxjs@kv@strong@bold{\chardef\bxjs@jp@strong=0 }
\def\bxjs@kv@strong@sans{\chardef\bxjs@jp@strong=1 }
\def\bxjs@kv@strong@boldsans{\chardef\bxjs@jp@strong=2 }
\define@key{bxjsPan}{strong}{%
  \bxjs@set@keyval{strong}{#1}{}}
%    \end{macrocode}
%
% \begin{macro}{\ifbxjs@jp@or@indent}
% \begin{macro}{\ifbxjs@jp@or@secnumdepth}
% \begin{macro}{\ifbxjs@jp@or@block@heading}
% プレアンブルでのレイアウト上書きを許可するか。
% 既定値は真。
%    \begin{macrocode}
\newif\ifbxjs@jp@or@indent \bxjs@jp@or@indenttrue
\newif\ifbxjs@jp@or@secnumdepth \bxjs@jp@or@secnumdepthtrue
\newif\ifbxjs@jp@or@block@heading \bxjs@jp@or@block@headingtrue
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% クラスで |pandoc+| が指定された場合、内部和文パラメタ |_plus| が
% 和文ドライバに渡される。
% この場合、レイアウト上書きを禁止する。
% \Note |_plus| は必ずパラメタ列の先頭にあるので、
% 個別のパラメタ設定の方が常に優先される。
%    \begin{macrocode}
\define@key{bxjsPan}{_plus}[]{%
  \bxjs@jp@or@indentfalse
  \bxjs@jp@or@secnumdepthfalse
  \bxjs@jp@or@block@headingfalse}
%    \end{macrocode}
%
% レイアウト上書き許可オプション
% （|or-indent|・|or-secnumdepth|・|or-block-heading|）の処理。
%    \begin{macrocode}
\let\bxjs@kv@orindent@true\bxjs@jp@or@indenttrue
\let\bxjs@kv@orindent@false\bxjs@jp@or@indentfalse
\define@key{bxjsPan}{or-indent}[true]{%
  \bxjs@set@keyval{orindent}{#1}{}}
\let\bxjs@kv@orsecnumdepth@true\bxjs@jp@or@secnumdepthtrue
\let\bxjs@kv@orsecnumdepth@false\bxjs@jp@or@secnumdepthfalse
\define@key{bxjsPan}{or-secnumdepth}[true]{%
  \bxjs@set@keyval{orsecnumdepth}{#1}{}}
\let\bxjs@kv@orblockheading@true\bxjs@jp@or@block@headingtrue
\let\bxjs@kv@orblockheading@false\bxjs@jp@or@block@headingfalse
\define@key{bxjsPan}{or-block-heading}[true]{%
  \bxjs@set@keyval{orblockheading}{#1}{}}
%    \end{macrocode}
%
% 実際の |japaram| の値を適用する。
%    \begin{macrocode}
\def\bxjs@next#1{\bxjs@safe@setkeys{bxjsPan}{#1}}
\expandafter\bxjs@next\expandafter{\jsJaParam}
%    \end{macrocode}
%
%^^A----------------
% \subsection{duploadシステム}
%
% \TODO 新しいカーネルで利用可能な機構での代替を検討する。
% カーネルへのパッチは排除したいので。
%
% パッケージが重複して読み込まれたときに“option clash”の
% 検査をスキップする。
% この時に何らかのコードを実行させることができる。
%
% \begin{macro}{\bxjs@set@dupload@proc}
% |\bxjs@set@dupload@proc{|\Meta{ファイル名}|}{|\Meta{定義本体}|}|\Means
% 指定の名前の特定のファイルの読込が |\@filewithoptions| で
% 指示されて、しかも
% そのファイルが読込済である場合に、オプション重複検査をスキップして、
% 代わりに\Meta{定義本体}のコードを実行する。
% このコード中で |#1| は渡されたオプション列のテキストに置換される。
%    \begin{macrocode}
\@onlypreamble\bxjs@set@dupload@proc
\def\bxjs@set@dupload@proc#1{%
  \expandafter\bxjs@set@dupload@proc@a\csname bxjs@dlp/#1\endcsname}
\@onlypreamble\bxjs@set@dupload@proc@a
\def\bxjs@set@dupload@proc@a#1{%
  \@onlypreamble#1\def#1##1}
\def\bxjs@unset@dupload@proc#1{%
  \bxjs@cslet{bxjs@dlp/#1}\@undefined}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@if@ptions}
% |\@if@ptions| の再定義。
%    \begin{macrocode}
\@onlypreamble\bxjs@org@if@ptions
\let\bxjs@org@if@ptions\@if@ptions
\@onlypreamble\bxjs@org@reset@ptions
\let\bxjs@org@reset@ptions\relax
\def\@if@ptions#1#2#3{%
  \let\bxjs@next\@secondoftwo
  \def\bxjs@tmpa{#1}\def\bxjs@tmpb{\@currext}%
  \ifx\bxjs@tmpa\bxjs@tmpb
    \expandafter\ifx\csname bxjs@dlp/#2.#1\endcsname\relax\else
      \let\bxjs@next\@firstoftwo \fi
  \fi
  \bxjs@next\bxjs@do@dupload@proc\bxjs@org@if@ptions{#1}{#2}{#3}}
\g@addto@macro\bxjs@begin@document@hook{%
  \let\@if@ptions\bxjs@org@if@ptions}
\@onlypreamble\bxjs@do@dupload@proc
\def\bxjs@do@dupload@proc#1#2#3{%
  \ifx\bxjs@org@reset@ptions\relax
    \let\bxjs@org@reset@ptions\@reset@ptions
  \fi
  \bxjs@csletcs{bxjs@next}{bxjs@dlp/#2.#1}%
  \def\@reset@ptions{%
    \let\@reset@ptions\bxjs@org@reset@ptions
    \@reset@ptions
    \bxjs@next{#3}}%
  \@firstoftwo}
%    \end{macrocode}
% \end{macro}
%
%^^A----------------
% \subsection{lang変数}
% |lang=ja| という言語指定が行われると、
% 2.12版より前のPandocはこれに対応していなかったため
% 不完全なBabelやPolyglossiaの設定を出力してしまっていた。
% 現在では |lang=ja| 指定について
% 正しく{\LaTeX}側の言語名 |japanese| に変換されるようになっているが、
% それでも日本語指定の場合は相変わらず調整処理が必要である。
% \Note そもそもBXJSクラスは日本語用の文書クラスであるため、
% もし言語設定が行われているのであれば
% 「メイン言語は日本語である」であるはずなので、
% 「サブ言語が日本語である」ことは考慮しない。
%
% \paragraph{Polyglossiaについて}
% 現在CTANに登録されている日本語用のglossファイルは超絶アレでかつ
% 有害な設定を行うため、これの読込を避ける必要がある。
% そのため、メイン言語が |japanese| である場合
% （古いPandocではこの場合に引数が空の |\setmainlanguage{}| が
% 実行されるがこのパターンも同様に扱う）
% には、Polyglossiaの処理を無効化してしまうことにする。
% つまり、Polyglossiaが提供する命令について、何もしないダミーの
% 定義を与える。
% \Note Polyglossiaは古いPandocのテンプレートにおいて、
% エンジンが{\XeTeX}か{\LuaTeX}の場合に利用されていた。
%
% \begin{macro}{\bxjs@polyglossia@options}
% Polyglossiaのオプション列のテキスト。
% “実際には読み込まれていない”場合は |\relax| になる。
%    \begin{macrocode}
\let\bxjs@polyglossia@options\relax
%    \end{macrocode}
% \end{macro}
%
% エンジンが{\XeTeX}か{\LuaTeX}の場合が対象になる。
% \Note この場合 |etoolbox| が使用可能になっている。
%    \begin{macrocode}
\ifnum0\if x\jsEngine1\fi\if l\jsEngine1\fi>0
%    \end{macrocode}
%
% パッケージの読込を検知するため読込済のマークを付けて
% duploadの処理を仕込む。
%    \begin{macrocode}
\pandocSkipLoadPackage{polyglossia}
\bxjs@set@dupload@proc{polyglossia.sty}{%
  \bxjs@unset@dupload@proc{polyglossia.sty}%
  \ClassWarning\bxjs@clsname
   {Package polyglossia is requested}%
  \def\bxjs@polyglossia@options{#1}%
%    \end{macrocode}
%
% |polyglossia| の読込が指示された場合、
% 直後に |\setmainlanguage| が実行されることを想定して、
% フック用の |\setmainlanguage| を定義する。
% \Note 最初に |\setmainlanguage| 以外が実行された場合はエラーになる。
%    \begin{macrocode}
  \newcommand*\setmainlanguage[2][]{%
%    \end{macrocode}
% もし、|\setmainlanguage| の引数が空または |japanese| だった
% 場合はメインが日本語である（|lang=ja| 指定）と見なす。
%    \begin{macrocode}
    \ifboolexpr{test{\ifblank{##2}}or test{\ifstrequal{##2}{japanese}}}{%
      \ClassWarning\bxjs@clsname
       {Main language is 'japanese', thus fallback\MessageBreak
        definitions will be employed}%
      \bxjs@pandoc@polyglossia@ja
%    \end{macrocode}
% それ以外は、改めて |polyglossia| を読み込んで、
% 本来の処理を実行する。
%    \begin{macrocode}
    }{%else
      \ClassWarning\bxjs@clsname
       {Main language is '##2',\MessageBreak
        thus polyglossia will be loaded}%
      \csundef{ver@polyglossia.sty}%
      \edef\bxjs@next{%
        \noexpand\RequirePackage[\bxjs@polyglossia@options]{polyglossia}[]%
      }\bxjs@next
      \setmainlanguage[##1]{##2}%
    }}}
%    \end{macrocode}
%
% プレアンブルで |polyglossia| の読込が指示されなかった場合、
% Polyglossiaと連携するパッケージの誤動作を防ぐため、
% （|\AtEndPreamble| において）読込済マークを外す。
%    \begin{macrocode}
\g@addto@macro\bxjs@endpreamble@hook{%
  \ifx\bxjs@polyglossia@options\relax
    \csundef{ver@polyglossia.sty}%
  \fi}
%    \end{macrocode}
%
% \begin{macro}{\bxjs@pandoc@polyglossia@ja}
% Pandoc側で |lang=ja| が指定されていた場合の処理。
% この場合はPolyglossiaの処理を無効化するためにダミーの定義を行う。
% すなわち、サブ言語 |xxx| の各々について、|xxx| 環境と |\textxxx|
% 命令を（特に何も加工しないものとして）定義する。
% この目的のため、|\setotherlanguage(s)| をダミーを定義する
% 命令として定義する。
%    \begin{macrocode}
\@onlypreamble\bxjs@pandoc@polyglossia@ja
\def\bxjs@pandoc@polyglossia@ja{%
  \renewcommand*\setmainlanguage[2][]{}%
  \newcommand*\setotherlanguage[2][]{%
    \ifblank{##2}{}{%else
      \cslet{##2}\@empty \cslet{end##2}\@empty
      \cslet{text##2}\@firstofone}}%
  \newcommand*\setotherlanguages[2][]{%
    \@for\bxjs@tmpa:={##2}\do{%
      \setotherlangauge{\bxjs@tmpa}}}%
%    \end{macrocode}
% Polyglossiaの読込済マークは外れるようにしておく。
%    \begin{macrocode}
  \let\bxjs@polyglossia@options\relax}%
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
% \paragraph{Babelについて}
% 現在のPandocでは、テンプレートで用いられる多言語パッケージとして
% エンジンの種別によらずにBabelが使われる。
% \Note {\XeTeX}では2.15版で、{\LuaTeX}は2.6版で
% PolyglossiaからBabelに変更されている。
%
% \begin{macro}{\bxjs@babel@options}
% Babelのオプション列のテキスト。
% “実際には読み込まれていない”場合は |\relax| になる。
%    \begin{macrocode}
\let\bxjs@babel@options\relax
%    \end{macrocode}
% \end{macro}
%
% パッケージの読込を検知するため読込済のマークを付けて
% duploadの処理を仕込む。
%    \begin{macrocode}
\pandocSkipLoadPackage{babel}
\bxjs@set@dupload@proc{babel.sty}{%
  \bxjs@unset@dupload@proc{babel.sty}%
  \ClassWarning\bxjs@clsname
   {Package babel is requested}%
%    \end{macrocode}
% パッケージオプションに言語名が空の |main=| がある場合は、
% |main=japanese| に置き換える。
%    \begin{macrocode}
  \@tempswafalse \let\bxjs@babel@options\@empty
  \def\bxjs@tmpb{main=}%
  \@for\bxjs@tmpa:=#1\do{%
    \ifx\bxjs@tmpa\bxjs@tmpb \def\bxjs@tmpa{main=japanese}\fi
    \edef\bxjs@babel@options{\bxjs@babel@options,\bxjs@tmpa}}%
  \bxjs@cslet{ver@babel.sty}\@undefined
  \edef\bxjs@next{%
    \noexpand\RequirePackage[\bxjs@babel@options]{babel}\relax
  }\bxjs@next
  \RequirePackage{bxorigcapt}\relax}
%    \end{macrocode}
%
% プレアンブルで |babel| の読込が指示されなかった場合、
% 読込済マークを外す。
%    \begin{macrocode}
\g@addto@macro\bxjs@endpreamble@hook{%
  \ifx\bxjs@babel@options\relax
    \bxjs@cslet{ver@babel.sty}\@undefined
  \fi}
%    \end{macrocode}
%
% 3.0版より前の |japanese.ldf| はサポート対象エンジンが限られていた。
% ここでは、エンジンの種類を問わず、「|japanese.ldf| が古い場合は
% 読込を回避してダミー定義で代替する」という対策を入れる。
% 実は |japanese.ldf| で行う定義は |bxorigcapt| の機能等により
% 実質的に全て無効化されている。
% 最新の環境においては
% 「|japanese| 指定のBabel＋|bxorigrcapt| パッケージ」
% の状態にしておきたい。
%
%    \begin{macrocode}
\ifjsWitheTeX
%    \end{macrocode}
% |filehook| の機能を用いて |japanese.ldf| の読込にフックを仕込む。
%    \begin{macrocode}
\AtBeginOfFile{japanese.ldf}{\bxjs@begin@japanese@ldf@hook}
\def\bxjs@begin@japanese@ldf@hook{%
  \let\bxjs@begin@japanese@ldf@hook\relax
  \let\bxjs@save@ProvidesLanguage\ProvidesLanguage
  \let\bxjs@save@LdfInit\LdfInit
  \def\ProvidesLanguage##1[##2]{\bxjs@do@japanese@ldf{##2}}%
  \def\LdfInit##1##2{\bxjs@do@japanese@ldf{0000/00/00}}}
%    \end{macrocode}
% バージョンを判定する部分。
% \Note |\LdfInit| にも細工を入れている理由は、初期の |japanese.ldf|
% には |\ProvidesLanguage| が記述されていないため。
%    \begin{macrocode}
\def\bxjs@do@japanese@ldf#1{\bxjs@do@japanese@ldf@a#1\@nil}
\def\bxjs@do@japanese@ldf@a#1/#2/#3#4#5\@nil{%
  \let\LdfInit\bxjs@save@LdfInit
  \ClassInfo\bxjs@clsname
   {Release date of japanese.ldf is:\MessageBreak
    \@spaces #1/#2/#3#4\@gobble}%
  \ifnum#1#2#3#4<20201206 % v3.0
    \let\bxjs@japanese@ldf@skipped=t\csuse{endinput}%
  \fi}
\AtEndOfFile{japanese.ldf}{\bxjs@end@japanese@ldf@hook}
\def\bxjs@end@japanese@ldf@hook{%
  \let\bxjs@end@japanese@ldf@hook\relax
  \let\ProvidesLanguage\bxjs@save@ProvidesLanguage
  \let\LdfInit\bxjs@save@LdfInit
  \ifx t\bxjs@japanese@ldf@skipped
    \ClassWarningNoLine\bxjs@clsname
     {Loading japanese.ldf is skipped}%
%    \end{macrocode}
% ダミーの言語定義。
%    \begin{macrocode}
    \ifundef\l@japanese{\chardef\l@japanese\z@}{}%
    \let\datejapanese\@empty\let\captionsjapanese\@empty
    \let\extrasjapanese\@empty\let\noextrasjapanese\@empty
    \main@language{japanese}%
  \fi}
\g@addto@macro\bxjs@begin@document@hook{%
  \let\bxjs@begin@japanese@ldf@hook\relax
  \let\bxjs@end@japanese@ldf@hook\relax}
\fi
%    \end{macrocode}
%
% lang対策はこれで終わり。
%
%^^A----------------
% \subsection{geometry変数}
% |geometry| を“再度読み込んだ”場合に、
% そのパラメタで |\setpagelayout*| が呼ばれるようにする。
%
%    \begin{macrocode}
\bxjs@set@dupload@proc{geometry.sty}{%
  \setpagelayout*{#1}}
%    \end{macrocode}
%
%^^A----------------
% \subsection{CJKmainfont変数}
% {\LuaTeX}（+ Lua{TeX}-ja）の場合に CJKmainfont 変数が
% 指定された場合は |\setmainjfont| の指定にまわす。
%    \begin{macrocode}
\if l\jsEngine
  \pandocSkipLoadPackage{xeCJK}
  \providecommand*{\setCJKmainfont}{\setmainjfont}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{Option clash対策}
%
% |xeCJK| パッケージについて。
% \Note |xeCJK| はクラス内で既に読み込まれているので、
% |space| は（意図通りに）無効になる。
% \Note v2.8～v2.9.2の間。
%    \begin{macrocode}
\if x\jsEngine
  \expandafter\g@addto@macro\csname opt@xeCJK.sty\endcsname{%
    ,space}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{レイアウト上書き禁止}
%
% レイアウト上書き禁止の実装は |etoolbox| の機能を使う。
%    \begin{macrocode}
\ifjsWitheTeX
\@onlypreamble\bxjs@info@or@ban
\def\bxjs@info@or@ban#1{%
  \PackageInfo\bxjs@clsname
   {Freeze layout on '#1',\MessageBreak reported}}
%    \end{macrocode}
%
% \paragraph{indentについて}
% indent変数を指定しない場合に
% 「段落表現形式をインデント方式に変更する」
% 動作を抑止する。
%    \begin{macrocode}
\unless\ifbxjs@jp@or@indent
  \bxjs@info@or@ban{indent}
%    \end{macrocode}
% |parskip| がある場合はそれを読み込もうとするため、
% |parskip| の読込をブロックする。
%    \begin{macrocode}
  \IfFileExists{parskip.sty}{%
    \pandocSkipLoadPackage{parskip}%
%    \end{macrocode}
% |parskip| がない場合はパラメタを変更しようとするため、
% 該当のパラメタを復帰させる。
%    \begin{macrocode}
  }{%else
    \eappto\bxjs@endpreamble@hook{%
      \parindent=\the\parindent\relax
      \parskip=\the\parskip\relax}}
\fi
%    \end{macrocode}
%
% \paragraph{secnumdepthについて}
% |secnumdepth| の値を決めるのはnumbersections変数
% （|-N|/|--number-sections| オプションに連動する）
% やsecnumdepth変数であるが、何れにしても |secnumdepth|
% の値は書き換えられる。
% そのため、|secnumdepth| を復帰させる。
%    \begin{macrocode}
\ifbxjs@jp@or@secnumdepth\else
  \bxjs@info@or@ban{secnumdepth}
  \eappto\bxjs@endpreamble@hook{%
    \c@secnumdepth=\the\c@secnumdepth\relax}
\fi
%    \end{macrocode}
%
% \paragraph{block-headingについて}
% |\paragraph|、|\subparagraph| を別行見出しに変える処理を抑止する。
% \Note 2.7.1版以前では別行見出し変更が既定で有効であった。
%    \begin{macrocode}
\ifbxjs@jp@or@block@heading\else
  \let\bxjs@frozen@paragraph\paragraph
  \let\bxjs@frozen@subparagraph\subparagraph
  \bxjs@info@or@ban{block-heading}
  \appto\bxjs@endpreamble@hook{%
  \let\oldparagraph\@undefined
  \let\paragraph\bxjs@frozen@paragraph
  \let\subparagraph\bxjs@frozen@subparagraph}
\fi
%    \end{macrocode}
%
% 以上。
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{paragraphのマーク}
%
% BXJSクラスでは |\paragraph| の見出しの前に |\jsParagraphMark|
% で指定したマークが付加され、既定ではこれは“■”である。
% しかし、この規定は |\paragraph| が本来のレイアウトを保っている、
% すなわち「行内見出しである」「節番号が付かない」ことが前提になって
% いると考えられる。
% Pandocはこの規定を変更することがある
% （特に既定で |\paragraph| を別行見出しに再定義する）
% ため、変更された場合は |\jsParagraphMark| の既定値を空にする。
%
% Pandocがプレアンブルで行う再定義の結果を調べるため、
% begin-documentフックを利用する。
%    \begin{macrocode}
\g@addto@macro\bxjs@begin@document@hook{%
  \@tempswafalse
%    \end{macrocode}
% まず、マーク変更が必要かを調べる。
% |\oldparagraph| という制御綴が定義済の場合、Pandocが |\paragraph|
% の様式を変更したということなので、マーク変更が必要である。
%    \begin{macrocode}
  \ifx\oldparagraph\@undefined\else
    \@tempswatrue
  \fi
%    \end{macrocode}
% |\paragraph| が番号付きの場合は、マーク変更が必要である。
%    \begin{macrocode}
  \ifnum\c@secnumdepth>3
    \@tempswatrue
  \fi
%    \end{macrocode}
% 「マーク変更が必要」である場合、|\jsParagraphMark| が既定値のままで
% あれば空に変更する。
%    \begin{macrocode}
  \if@tempswa\ifx\jsParagraphMark\bxjs@org@paragraph@mark
    \let\jsParagraphMark\@empty
  \fi\fi}
%    \end{macrocode}
%
%^^A----------------
% \subsection{全角空白文字}
%
% {\LaTeX}でない入力では、全角空きを入れるために全角空白文字
% （U+3000）が使われる可能性があるので、
% 全角空白文字を和文文字でなく空きとして扱うようにしておく。
% \Note {(u)\pLaTeX}では対応できないので対象外。
%
% \begin{macro}{\pandocZWSpace}
% 全角空白文字の入力で実行されるコード。
%    \begin{macrocode}
\def\pandocZWSpace{\zwspace}
%    \end{macrocode}
% \end{macro}
% 全角空白文字の入力で |\pandocZWSpace| が実行されるようにする。
%    \begin{macrocode}
\ifnum0\if x\jsEngine1\fi\if l\jsEngine1\fi>\z@
  \catcode"3000=\active
  \begingroup \catcode`\!=7
  \protected\gdef!!!!3000{\pandocZWSpace}
  \endgroup
\else\ifx\DeclareUnicodeCharacter\@undefined\else
  \DeclareUnicodeCharacter{3000}{\bxjs@zsp@char}
  \bxjs@protected\def\bxjs@zsp@char{\pandocZWSpace}
\fi\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{hyperref対策}
%
% |hyperref| の |unicode| オプションの固定を行う。
% \TODO |unicode| オプションの固定処理は可能なら廃止したい。
% |hyperref| の開発状況を鑑みる限り、固定処理は危険なので。
%    \begin{macrocode}
\if j\jsEngine
  \bxjs@fix@hyperref@unicode{false}
\else
  \bxjs@fix@hyperref@unicode{true}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{Pandoc要素に対する和文用の補正}
%
% \paragraph{重要要素}
% 重要(Strong)要素に対する{\LaTeX}出力は |\textbf| となるが、
% 代わりに |\strong| を使いたいため、
% |\textbf| を書き換えてしまう（うわぁ）。
%    \begin{macrocode}
\ifbxjs@jp@fix@strong\ifbxjs@jp@strong@cmd
  \let\orgtextbf\textbf
  \DeclareRobustCommand\pandocTextbf[1]{%
    \begingroup
      \let\textbf\orgtextbf
      \strong{#1}%
    \endgroup}%
  \g@addto@macro\bxjs@begin@document@hook{%
    \let\textbf\pandocTextbf}
\fi\fi
%    \end{macrocode}
%
% |\strong| の書体を設定する。
%    \begin{macrocode}
\jsAtEndOfClass{%
  \ifx\strongfontdeclare\@undefined\else
    \ifcase\bxjs@jp@strong
    \or \strongfontdeclare{\sffamily}%
    \or \strongfontdeclare{\sffamily\bfseries}%
    \fi
  \fi}
%    \end{macrocode}
%
% \paragraph{インラインコード要素}
%
% インラインコード(Code)要素に対する{\LaTeX}出力は |\texttt| となる。
% |\texttt| の両端に欧文ゴーストが入るようにする。
% さらに |\verb| の外側にも欧文ゴーストが入るようにする。
%
%    \begin{macrocode}
\ifbxjs@jp@fix@code
%    \end{macrocode}
% |bxghost| パッケージが利用できる場合はその機能を利用する。
% 使えない場合は自前実装を用いる。
%    \begin{macrocode}
  \ifbxjs@bxghost@available
    \RequirePackage[verb]{bxghost}[2020/01/31]% v0.3.0
    \let\bxjs@eghostguarded\eghostguarded
  \else
  \chardef\bxjs@eghost@c=23
  \ifx j\jsEngine \xspcode\bxjs@eghost@c=3
  \else\ifx l\jsEngine \ltjsetparameter{alxspmode={\bxjs@eghost@c,3}}
  \else\ifx x\jsEngine %no-op
  \else \let\bxjs@eghost@c\@undefined
  \fi\fi\fi
  \ifx\bxjs@eghost@c\@undefined\else
    \font\bxjs@eghost@f=ec-lmr10 at 1.23456pt
    \def\bxjs@pan@eghost{\bgroup\bxjs@eghost@f\bxjs@eghost@c\egroup}
    \def\bxjs@eghostguarded#1{%
      \bxjs@pan@eghost\null#1\null\bxjs@pan@eghost}
  \fi
  \fi
  \ifx\bxjs@eghostguarded\@undefined\else
    \let\orgtexttt\texttt
    \DeclareRobustCommand\pandocTexttt[1]{%
      \ifmmode \nfss@text{\ttfamily #1}%
      \else
        \ifvmode \leavevmode \fi
        \bxjs@eghostguarded{\begingroup\ttfamily#1\endgroup}%
      \fi}
    \g@addto@macro\bxjs@begin@document@hook{%
      \let\texttt\pandocTexttt}
%    \end{macrocode}
% |bxghost| を使わない場合の |\verb| の処理。
% \Note |bxghost| の実装を参考にした。
%    \begin{macrocode}
    \ifbxjs@bxghost@available\else
    \expandafter\def\expandafter\verb\expandafter{%
      \expandafter\bxjs@pan@eghost\verb}
    \g@addto@macro\verb@egroup{\bxjs@pan@eghost}
    \fi
  \fi
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{ifPDFTeXスイッチ}
%
% PandocモードではPandocの既定テンプレートを（無理やり）{(u)\pTeX}に
% 対応させることを目的にしている。
%
% 旧版のテンプレートでは|ifxetex|と|ifluatex|パッケージを読み込んだ
% 上で「{\XeTeX}でも{\LuaTeX}でもないものは{\pdfTeX}」という前提の
% 動作をしていた。
% よって、{(u)\pTeX}に対応させる際には「{\pdfTeX}用の処理が実行される」
% ことを前提にすればよかった。
%
% ところが、Pandocの2.12版では|iftex|パッケージが導入されて
% 「{\pdfTeX}の判定を直接 |\ifPDFTeX| で行う」ように改修された。
% このため、{(u)\pTeX}での実行でどのコードが実行されるかを予期する
% ことが困難になってしまった。
%
% これに対処するため、
% 「文書ファイルのプレアンブル実行中に限って |\ifPDFTeX| が
% （実際とは異なり）真になるようにする」
% という細工を施すことで、従来通り「{\pdfTeX}用の処理が実行される」
% 前提が維持されるようにする。
%
%    \begin{macrocode}
\if j\jsEngine
%    \end{macrocode}
% \begin{macro}{\bxjs@check@frontier}
% |\bxjs@check@frontier\CS| は現在のパッケージ読込ネストレベルが
% 丁度1であるときにのみ |\CS| を実行する。
%    \begin{macrocode}
  \def\bxjs@check@frontier{%
    \expandafter\bxjs@check@frontier@a\@currnamestack\noindent...\@nil}
  \def\bxjs@check@frontier@a#1#2#3#4#5\@nil#6{%
    \ifx\noindent#4#6\fi}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\bxjs@unforge@ifPDFTeX}
% |\ifPDFTeX| を偽（正しい値）にする。
%    \begin{macrocode}
  \@onlypreamble\bxjs@unforge@ifPDFTeX
  \def\bxjs@unforge@ifPDFTeX{\global\bxjs@csletcs{ifPDFTeX}{iffalse}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\bxjs@forge@ifPDFTeX}
% |\ifPDFTeX| を真（偽装した値）にする。
%    \begin{macrocode}
  \@onlypreamble\bxjs@forge@ifPDFTeX
  \def\bxjs@forge@ifPDFTeX{\global\bxjs@csletcs{ifPDFTeX}{iftrue}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\bxjs@unload@forge@ifPDFTeX}
% |\ifPDFTeX| に対する細工を無効化する。
%    \begin{macrocode}
  \def\bxjs@unload@forge@ifPDFTeX{%
    \bxjs@unforge@ifPDFTeX
    \global\let\bxjs@check@frontier\@gobble}
%    \end{macrocode}
% \end{macro}
% プレアンブル開始時は |\ifPDFTeX| は真で、終了時に偽装を無効化する。
% |filehook| のフックで「パッケージ読込中は偽装を解除する」ことを
% 実現している。
%    \begin{macrocode}
  \jsAtEndOfClass{\bxjs@forge@ifPDFTeX}
  \ifjsWitheTeX
    \AtBeginOfEveryFile{\bxjs@check@frontier\bxjs@unforge@ifPDFTeX}%
    \AtEndOfEveryFile{\bxjs@check@frontier\bxjs@forge@ifPDFTeX}%
    \g@addto@macro\bxjs@endpreamble@hook{\bxjs@unload@forge@ifPDFTeX}
  \else
    \g@addto@macro\bxjs@begin@document@hook{\bxjs@unload@forge@ifPDFTeX}
  \fi
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{完了}
% おしまい。
%    \begin{macrocode}
%</pandoc>
%    \end{macrocode}
%
% 和文ドライバ実装はここまで。
%    \begin{macrocode}
%</drv>
%    \end{macrocode}
%
%^^A========================================================
% \section{補助パッケージ一覧 \ZRX}
%
% BXJSクラスの機能を実現するために用意されたものだが、
% 他のクラスの文書で読み込んで利用することもできる。
%
% \begin{itemize}
% \item bxjscompat : 古いやつをどうにかするナニカ。
% \item bxjscjkcat： modernドライバ用の和文カテゴリを適用する。
% \item bxjspandoc : Pandoc用のナニカ。
% \end{itemize}
%
%    \begin{macrocode}
%<*anc>
%    \end{macrocode}
%
%^^A========================================================
% \section{補助パッケージ：bxjscompat \ZRX}
%
% 古いやつをどうにかするためのムニャムニャ。
%
% \Note すなわちBXJSクラスにおいては
% 「新しいシステムにおいてはbxjscompatがなくても正常に動作する」
% 状態を保つべき。
%
%^^A----------------
% \subsection{準備}
%
%    \begin{macrocode}
%<*compat>
\def\bxac@pkgname{bxjscompat}
%    \end{macrocode}
%
% \begin{macro}{\bxjx@engine}
% エンジンの種別。
%    \begin{macrocode}
\let\bxac@engine=n
\def\bxac@do#1#2{%
  \edef\bxac@tmpa{\string#1}%
  \edef\bxac@tmpb{\meaning#1}%
  \ifx\bxac@tmpa\bxac@tmpb #2\fi}
\bxac@do\kanjiskip{\let\bxac@engine=j}
\bxac@do\XeTeXversion{\let\bxac@engine=x}
\bxac@do\luatexversion{\let\bxac@engine=l}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxac@delayed@if@bxjs}
% もしBXJSクラスの読込中でこのパッケージが読み込まれているならば、
% BXJSのクラスの終わりまで実行を遅延する。
%    \begin{macrocode}
\ifx\jsAtEndOfClass\@undefined
  \let\bxac@delayed@if@bxjs\@firstofone
\else \let\bxac@delayed@if@bxjs\jsAtEndOfClass
\fi
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ImposeOldLuaTeXBehavior}
% \begin{macro}{\RevokeOldLuaTeXBehavior}
% |\ImposeOldLuaTeXBehavior| は0.85版以降の{\LuaTeX}を
% \textbf{一時的に}{\pdfTeX}と互換であるように見せかける。
% |\RevokeOldLuaTeXBehavior| で元に戻すことができる。
% \Note エンジンが{\LuaTeX}以外の場合は何もしない。
%    \begin{macrocode}
\newif\ifbxac@in@old@behavior
\let\ImposeOldLuaTeXBehavior\relax
\let\RevokeOldLuaTeXBehavior\relax
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%^^A----------------
% \subsection{8bit欧文{\TeX}}
%    \begin{macrocode}
\ifx n\bxac@engine
%    \end{macrocode}
%
% 和文を含むマクロ定義を通用させるため、
% 高位バイトをアクティブ化しておく。
%    \begin{macrocode}
\@tempcnta="80 \loop \ifnum\@tempcnta<"100
  \catcode\@tempcnta\active
  \advance\@tempcnta\@ne
\repeat
%    \end{macrocode}
%
% 以上。
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{\XeTeX}
%    \begin{macrocode}
\ifx x\bxac@engine
%    \end{macrocode}
%
% \paragraph{文字クラスの設定}
% {\XeTeX}の文字クラス（|\XeTeXcharclass|）のUnicode規定に基づく
% 設定は、初期の版ではフォーマットに組み込まれていたが、
% 2016/02/01以降の{\LaTeX}カーネルでは
% 「必要に応じて後から設定用のファイルを読み込む」
% 方式に変更された。
% ここでは「設定されている状態」を担保する。
% \Note ちなみに、{\XeTeX}に「文字間トークン挿入」の機能が導入された
% のは0.997版（2007年頃）からのようだ。
%
% ただし |xeCJK| が読込済ならば
% （そちらが適切に設定しているはずなので）何もしない。
%    \begin{macrocode}
\ifx\XeTeXcharclass\@undefined\else
\bxac@delayed@if@bxjs{%
  \@ifpackageloaded{xeCJK}{}{%else
%    \end{macrocode}
% 設定が未実行の状態ならば、設定用のファイルを読む。
%    \begin{macrocode}
    \ifx\xe@alloc@intercharclass\@undefined\else
        \ifnum\xe@alloc@intercharclass=\z@
      \PackageInfo\bxac@pkgname
        {Setting up interchar class for CJK...\@gobble}%
      \InputIfFileExists{load-unicode-xetex-classes.tex}{%
        \xe@alloc@intercharclass=3
      }{%else
        \PackageWarning\bxac@pkgname
          {Cannot find file 'load-unicode-xetex-classes.tex'%
           \@gobble}%
      }%
    \fi\fi
%    \end{macrocode}
% フォーマット組込だった時代の設定は不完全なところがあるので
% 補正する。
%    \begin{macrocode}
    \ifnum\XeTeXcharclass"3041=\z@
      \PackageInfo\bxac@pkgname
        {Adjusting interchar class for CJK...\@gobble}%
      \@for\bxac@tmpb:={%
        3041,3043,3045,3047,3049,3063,3083,3085,3087,308E,%
        3095,3096,30A1,30A3,30A5,30A7,30A9,30C3,30E3,30E5,%
        30E7,30EE,30F5,30F6,30FC,31F0,31F1,31F2,31F3,31F4,%
        31F5,31F6,31F7,31F8,31F9,31FA,31FB,31FC,31FD,31FE,%
        31FF%
      }\do{\XeTeXcharclass"\bxac@tmpb=\@ne}%
    \fi
  }%
}
\fi
%    \end{macrocode}
%
% 漢字および完成形ハングルのカテゴリコードが確実に11に
% なっているようにする。
%    \begin{macrocode}
\chardef\bxac@tmpb=11
\def\bxac@do#1#2{%
  \@tempcnta=#1\relax
  \unless\ifnum\catcode\@tempcnta=\bxac@tmpb
    \chardef\bxac@tmpa=#2\relax
    \@whilenum{\@tempcnta<\bxac@tmpa}\do{%
      \catcode\@tempcnta\bxac@tmpb \advance\@tempcnta\@ne}%
  \fi}
\bxac@do{"4E00}{"9FCD}
%    \end{macrocode}
%
% 以上。
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{\LuaTeX}
%    \begin{macrocode}
\ifx l\bxac@engine
%    \end{macrocode}
%
% 0.82～0.84版の{\LuaTeX}を（0.81版以前と同様に）
% 「{\pdfTeX}の拡張である」ように見せかける処理。
% \Note 恐らく必要な場面はなかったと思われるので、外しておく。
%    \begin{macrocode}
%\unless\ifnum\luatexversion<80 \ifnum\luatexversion<85
%  \chardef\pdftexversion=200
%  \def\pdftexrevision{0}
%  \let\pdftexbanner\luatexbanner
%\fi\fi
%    \end{macrocode}
%
% \begin{macro}{\ImposeOldLuaTeXBehavior}
% \begin{macro}{\RevokeOldLuaTeXBehavior}
% 0.85版以降であるかを検査する。
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname outputmode\endcsname\relax\else
%    \end{macrocode}
% 該当する場合、以下の5つの{\pdfTeX}拡張プリミティブを
% 復帰させることになる。
%    \begin{macrocode}
\def\bxac@ob@list{%
  \do{\let}\pdfoutput{\outputmode}%
  \do{\let}\pdfpagewidth{\pagewidth}%
  \do{\let}\pdfpageheight{\pageheight}%
  \do{\protected\edef}\pdfhorigin{{\pdfvariable horigin}}%
  \do{\protected\edef}\pdfvorigin{{\pdfvariable vorigin}}}
\def\bxac@ob@do#1#2{\begingroup
  \expandafter\bxac@ob@do@a\csname bxac@\string#2\endcsname{#1}#2}
\def\bxac@ob@do@a#1#2#3#4{\endgroup
  \ifbxac@in@old@behavior \let#1#3\relax #2#3#4\relax
  \else \let#3#1\relax \let#1\@undefined
  \fi}
\protected\def\ImposeOldLuaTeXBehavior{%
  \unless\ifbxac@in@old@behavior
    \bxac@in@old@behaviortrue
    \let\do\bxac@ob@do \bxac@ob@list
  \fi}
\protected\def\RevokeOldLuaTeXBehavior{%
  \ifbxac@in@old@behavior
    \bxac@in@old@behaviorfalse
    \let\do\bxac@ob@do \bxac@ob@list
  \fi}
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% 漢字および完成形ハングルのカテゴリコードが確実に11に
% なっているようにする。
%    \begin{macrocode}
  \directlua{
    local function range(cs, ce, cc, ff)
      if ff or not tex.getcatcode(cs) == cc then
        local setcc = tex.setcatcode
        for c = cs, ce do setcc(c, cc) end
      end
    end
    range(0x3400, 0x4DB5, 11, false)
    \ifnum\luatexversion>64
    range(0x4DB5, 0x4DBF, 11, true)
    range(0x4E00, 0x9FCC, 11, false)
    range(0x9FCD, 0x9FFF, 11, true)
    range(0xAC00, 0xD7A3, 11, false)
    range(0x20000, 0x2A6D6, 11, false)
    range(0x2A6D7, 0x2A6FF, 11, true)
    range(0x2A700, 0x2B734, 11, false)
    range(0x2B735, 0x2B73F, 11, true)
    range(0x2B740, 0x2B81D, 11, false)
    range(0x2B81E, 0x2B81F, 11, true)
    range(0x2B820, 0x2CEA1, 11, false)
    range(0x2CEA2, 0x2FFFD, 11, true)
    \fi
  }
%    \end{macrocode}
%
% 以上。
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{完了}
% おしまい。
%    \begin{macrocode}
%</compat>
%    \end{macrocode}
%
%^^A========================================================
% \section{補助パッケージ：bxjscjkcat \ZRX}
%
% modernドライバ用の和文カテゴリを適用する。
%
%^^A----------------
% \subsection{準備}
%
%    \begin{macrocode}
%<*cjkcat>
\def\bxjx@pkgname{bxjscjkcat}
\newcount\bxjx@cnta
\@onlypreamble\bxjx@tmpdo
\@onlypreamble\bxjx@tmpdo@a
\@onlypreamble\bxjx@tmpdo@b
%    \end{macrocode}
%
% \begin{macro}{\bxjx@engine}
% エンジンの種別。
%    \begin{macrocode}
\let\bxjx@engine=n
\def\bxjx@tmpdo#1#2{%
  \edef\bxjx@tmpa{\string#1}%
  \edef\bxjx@tmpb{\meaning#1}%
  \ifx\bxjx@tmpa\bxjx@tmpb #2\fi}
\bxjx@tmpdo\kanjiskip{\let\bxjx@engine=j}
\bxjx@tmpdo\enablecjktoken{%
  \ifx\ucs\@undefined\else \ifnum\ucs"3000="3000
    \let\bxjx@engine=u\fi\fi}
\bxjx@tmpdo\XeTeXversion{\let\bxjx@engine=x}
\bxjx@tmpdo\pdftexversion{\let\bxjx@engine=p}
\bxjx@tmpdo\luatexversion{\let\bxjx@engine=l}
%    \end{macrocode}
% \end{macro}
%
% それぞれのエンジンで、前提となる日本語処理パッケージが実際に
% 読み込まれているかを検査する。
%    \begin{macrocode}
\def\bxjx@tmpdo#1#2{%
  \if#1\bxjx@engine
    \@ifpackageloaded{#2}{}{%else
      \PackageError\bxjx@pkgname
       {Package '#2' must be loaded}%
       {Package loading is aborted.\MessageBreak\@ehc}%
      \endinput}
  \fi}
\bxjx@tmpdo{p}{bxcjkjatype}
\bxjx@tmpdo{x}{xeCJK}
\bxjx@tmpdo{l}{luatexja}
%    \end{macrocode}
%
% 古い{\LaTeX}の場合、|\TextOrMath| は |fixltx2e| パッケージで
% 提供される。
%    \begin{macrocode}
\ifx\TextOrMath\@undefined
  \RequirePackage{fixltx2e}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{和文カテゴリコードの設定}
%
% up{\LaTeX}の場合、和文カテゴリコードの設定を
% {\LuaTeX}-jaと（ほぼ）等価なものに変更する。
%
% \Note {\LuaTeX}-jaとの相違点：
% |A830|、|A960|、|1B000|。
%    \begin{macrocode}
\if u\bxjx@engine
\@for\bxjx@tmpa:={%
0080,0100,0180,0250,02B0,0300,0500,0530,0590,0600,%
0700,0750,0780,07C0,0800,0840,0860,08A0,0900,0980,%
0A00,0A80,0B00,0B80,0C00,0C80,0D00,0D80,0E00,0E80,%
0F00,1000,10A0,1200,1380,13A0,1400,1680,16A0,1700,%
1720,1740,1760,1780,1800,18B0,1900,1950,1980,19E0,%
1A00,1A20,1AB0,1B00,1B80,1BC0,1C00,1C50,1C80,1CC0,%
1CD0,1D00,1D80,1DC0,1E00,1F00,2440,27C0,27F0,2800,%
2A00,2C00,2C60,2C80,2D00,2D30,2D80,2DE0,2E00,4DC0,%
A4D0,A500,A640,A6A0,A700,A720,A800,A830,A840,A880,%
A8E0,A900,A930,A980,A9E0,AA00,AA60,AA80,AAE0,AB00,%
AB30,AB70,ABC0,D800,DB80,DC00,E000,FB00,FB50,FE00,%
FE70,FFF0,%
10000,10080,10100,10140,10190,101D0,10280,102A0,%
102E0,10300,10330,10350,10380,103A0,10400,10450,%
10480,104B0,10500,10530,10600,10800,10840,10860,%
10880,108E0,10900,10920,10980,109A0,10A00,10A60,%
10A80,10AC0,10B00,10B40,10B60,10B80,10C00,10C80,%
10E60,11000,11080,110D0,11100,11150,11180,111E0,%
11200,11280,112B0,11300,11400,11480,11580,11600,%
11660,11680,11700,118A0,11A00,11A50,11AC0,11C00,%
11C70,11D00,12000,12400,12480,13000,14400,16800,%
16A40,16AD0,16B00,16F00,1BC00,1BCA0,1D000,1D100,%
1D200,1D300,1D360,1D400,1D800,1E000,1E800,1E900,%
1EE00,1F000,1F030,1F0A0,1F300,1F600,1F650,1F680,%
1F700,1F780,1F800,1F900,E0000,E0100,F0000,100000,%
00C0%
}\do{%
\@tempcnta="\bxjx@tmpa\relax
\@tempcntb\@tempcnta \advance\@tempcntb\m@ne
\chardef\bxjx@tmpb\kcatcode\@tempcntb
\kcatcode\@tempcnta=15 \kcatcode\@tempcntb\bxjx@tmpb}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{ギリシャ・キリル文字の扱い}
%
% 「特定CJK曖昧文字」について、和文・欧文扱いを制御できるようにする。
% ここで\textbf{「特定CJK曖昧文字」}とは以下に該当する文字の集合を指す：
% \begin{itemize}
% \item UnicodeとJIS X~0213に共通して含まれるギリシャ文字・キリル文字。
% \item Latin-1の上位部分とJIS X~0208に共通して含まれる文字
%  （{\LuaTeX}-jaの定める“範囲8”）。
% \end{itemize}
%
% \begin{macro}{\bxjx@grkcyr@list}
% 「特定CJK曖昧文字」に関する情報をもつ\,|\do|-リスト。
% 各項目の形式は以下の通り：\\
% |\do{|\Meta{Unicode符号値}|}{|\Meta{対象fontenc}|}{|^^A
% \Meta{テキストLICR}|}{|\Meta{数式LICR}|}|
% \Note 数式で使わない文字は \Meta{数式LICR} を空にする。
%    \begin{macrocode}
\@onlypreamble\bxjx@grkcyr@list
\def\bxjx@grkcyr@list{%
\do{0391}{LGR}{\textAlpha}{A}%            % GR. C. L. ALPHA
\do{0392}{LGR}{\textBeta}{B}%             % GR. C. L. BETA
\do{0393}{LGR}{\textGamma}{\Gamma}%       % GR. C. L. GAMMA
\do{0394}{LGR}{\textDelta}{\Delta}%       % GR. C. L. DELTA
\do{0395}{LGR}{\textEpsilon}{E}%          % GR. C. L. EPSILON
\do{0396}{LGR}{\textZeta}{Z}%             % GR. C. L. ZETA
\do{0397}{LGR}{\textEta}{H}%              % GR. C. L. ETA
\do{0398}{LGR}{\textTheta}{\Theta}%       % GR. C. L. THETA
\do{0399}{LGR}{\textIota}{I}%             % GR. C. L. IOTA
\do{039A}{LGR}{\textKappa}{K}%            % GR. C. L. KAPPA
\do{039B}{LGR}{\textLambda}{\Lambda}%     % GR. C. L. LAMDA
\do{039C}{LGR}{\textMu}{M}%               % GR. C. L. MU
\do{039D}{LGR}{\textNu}{N}%               % GR. C. L. NU
\do{039E}{LGR}{\textXi}{\Xi}%             % GR. C. L. XI
\do{039F}{LGR}{\textOmicron}{O}%          % GR. C. L. OMICRON
\do{03A0}{LGR}{\textPi}{\Pi}%             % GR. C. L. PI
\do{03A1}{LGR}{\textRho}{P}%              % GR. C. L. RHO
\do{03A3}{LGR}{\textSigma}{\Sigma}%       % GR. C. L. SIGMA
\do{03A4}{LGR}{\textTau}{T}%              % GR. C. L. TAU
\do{03A5}{LGR}{\textUpsilon}{\Upsilon}%   % GR. C. L. UPSILON
\do{03A6}{LGR}{\textPhi}{\Phi}%           % GR. C. L. PHI
\do{03A7}{LGR}{\textChi}{X}%              % GR. C. L. CHI
\do{03A8}{LGR}{\textPsi}{\Psi}%           % GR. C. L. PSI
\do{03A9}{LGR}{\textOmega}{\Omega}%       % GR. C. L. OMEGA
\do{03B1}{LGR}{\textalpha}{\alpha}%       % GR. S. L. ALPHA
\do{03B2}{LGR}{\textbeta}{\beta}%         % GR. S. L. BETA
\do{03B3}{LGR}{\textgamma}{\gamma}%       % GR. S. L. GAMMA
\do{03B4}{LGR}{\textdelta}{\delta}%       % GR. S. L. DELTA
\do{03B5}{LGR}{\textepsilon}{\epsilon}%   % GR. S. L. EPSILON
\do{03B6}{LGR}{\textzeta}{\zeta}%         % GR. S. L. ZETA
\do{03B7}{LGR}{\texteta}{\eta}%           % GR. S. L. ETA
\do{03B8}{LGR}{\texttheta}{\theta}%       % GR. S. L. THETA
\do{03B9}{LGR}{\textiota}{\iota}%         % GR. S. L. IOTA
\do{03BA}{LGR}{\textkappa}{\kappa}%       % GR. S. L. KAPPA
\do{03BB}{LGR}{\textlambda}{\lambda}%     % GR. S. L. LAMDA
\do{03BC}{LGR}{\textmu}{\mu}%             % GR. S. L. MU
\do{03BD}{LGR}{\textnu}{\nu}%             % GR. S. L. NU
\do{03BE}{LGR}{\textxi}{\xi}%             % GR. S. L. XI
\do{03BF}{LGR}{\textomicron}{o}%          % GR. S. L. OMICRON
\do{03C0}{LGR}{\textpi}{\pi}%             % GR. S. L. PI
\do{03C1}{LGR}{\textrho}{\rho}%           % GR. S. L. RHO
\do{03C2}{LGR}{\textvarsigma}{\varsigma}% % GR. S. L. FINAL SIGMA
\do{03C3}{LGR}{\textsigma}{\sigma}%       % GR. S. L. SIGMA
\do{03C4}{LGR}{\texttau}{\tau}%           % GR. S. L. TAU
\do{03C5}{LGR}{\textupsilon}{\upsilon}%   % GR. S. L. UPSILON
\do{03C6}{LGR}{\textphi}{\phi}%           % GR. S. L. PHI
\do{03C7}{LGR}{\textchi}{\chi}%           % GR. S. L. CHI
\do{03C8}{LGR}{\textpsi}{\psi}%           % GR. S. L. PSI
\do{03C9}{LGR}{\textomega}{\omega}%       % GR. S. L. OMEGA
\do{0401}{T2A}{\CYRYO}{}%                 % CY. C. L. IO
\do{0410}{T2A}{\CYRA}{}%                  % CY. C. L. A
\do{0411}{T2A}{\CYRB}{}%                  % CY. C. L. BE
\do{0412}{T2A}{\CYRV}{}%                  % CY. C. L. VE
\do{0413}{T2A}{\CYRG}{}%                  % CY. C. L. GHE
\do{0414}{T2A}{\CYRD}{}%                  % CY. C. L. DE
\do{0415}{T2A}{\CYRE}{}%                  % CY. C. L. IE
\do{0416}{T2A}{\CYRZH}{}%                 % CY. C. L. ZHE
\do{0417}{T2A}{\CYRZ}{}%                  % CY. C. L. ZE
\do{0418}{T2A}{\CYRI}{}%                  % CY. C. L. I
\do{0419}{T2A}{\CYRISHRT}{}%              % CY. C. L. SHORT I
\do{041A}{T2A}{\CYRK}{}%                  % CY. C. L. KA
\do{041B}{T2A}{\CYRL}{}%                  % CY. C. L. EL
\do{041C}{T2A}{\CYRM}{}%                  % CY. C. L. EM
\do{041D}{T2A}{\CYRN}{}%                  % CY. C. L. EN
\do{041E}{T2A}{\CYRO}{}%                  % CY. C. L. O
\do{041F}{T2A}{\CYRP}{}%                  % CY. C. L. PE
\do{0420}{T2A}{\CYRR}{}%                  % CY. C. L. ER
\do{0421}{T2A}{\CYRS}{}%                  % CY. C. L. ES
\do{0422}{T2A}{\CYRT}{}%                  % CY. C. L. TE
\do{0423}{T2A}{\CYRU}{}%                  % CY. C. L. U
\do{0424}{T2A}{\CYRF}{}%                  % CY. C. L. EF
\do{0425}{T2A}{\CYRH}{}%                  % CY. C. L. HA
\do{0426}{T2A}{\CYRC}{}%                  % CY. C. L. TSE
\do{0427}{T2A}{\CYRCH}{}%                 % CY. C. L. CHE
\do{0428}{T2A}{\CYRSH}{}%                 % CY. C. L. SHA
\do{0429}{T2A}{\CYRSHCH}{}%               % CY. C. L. SHCHA
\do{042A}{T2A}{\CYRHRDSN}{}%              % CY. C. L. HARD SIGN
\do{042B}{T2A}{\CYRERY}{}%                % CY. C. L. YERU
\do{042C}{T2A}{\CYRSFTSN}{}%              % CY. C. L. SOFT SIGN
\do{042D}{T2A}{\CYREREV}{}%               % CY. C. L. E
\do{042E}{T2A}{\CYRYU}{}%                 % CY. C. L. YU
\do{042F}{T2A}{\CYRYA}{}%                 % CY. C. L. YA
\do{0430}{T2A}{\cyra}{}%                  % CY. S. L. A
\do{0431}{T2A}{\cyrb}{}%                  % CY. S. L. BE
\do{0432}{T2A}{\cyrv}{}%                  % CY. S. L. VE
\do{0433}{T2A}{\cyrg}{}%                  % CY. S. L. GHE
\do{0434}{T2A}{\cyrd}{}%                  % CY. S. L. DE
\do{0435}{T2A}{\cyre}{}%                  % CY. S. L. IE
\do{0436}{T2A}{\cyrzh}{}%                 % CY. S. L. ZHE
\do{0437}{T2A}{\cyrz}{}%                  % CY. S. L. ZE
\do{0438}{T2A}{\cyri}{}%                  % CY. S. L. I
\do{0439}{T2A}{\cyrishrt}{}%              % CY. S. L. SHORT I
\do{043A}{T2A}{\cyrk}{}%                  % CY. S. L. KA
\do{043B}{T2A}{\cyrl}{}%                  % CY. S. L. EL
\do{043C}{T2A}{\cyrm}{}%                  % CY. S. L. EM
\do{043D}{T2A}{\cyrn}{}%                  % CY. S. L. EN
\do{043E}{T2A}{\cyro}{}%                  % CY. S. L. O
\do{043F}{T2A}{\cyrp}{}%                  % CY. S. L. PE
\do{0440}{T2A}{\cyrr}{}%                  % CY. S. L. ER
\do{0441}{T2A}{\cyrs}{}%                  % CY. S. L. ES
\do{0442}{T2A}{\cyrt}{}%                  % CY. S. L. TE
\do{0443}{T2A}{\cyru}{}%                  % CY. S. L. U
\do{0444}{T2A}{\cyrf}{}%                  % CY. S. L. EF
\do{0445}{T2A}{\cyrh}{}%                  % CY. S. L. HA
\do{0446}{T2A}{\cyrc}{}%                  % CY. S. L. TSE
\do{0447}{T2A}{\cyrch}{}%                 % CY. S. L. CHE
\do{0448}{T2A}{\cyrsh}{}%                 % CY. S. L. SHA
\do{0449}{T2A}{\cyrshch}{}%               % CY. S. L. SHCHA
\do{044A}{T2A}{\cyrhrdsn}{}%              % CY. S. L. HARD SIGN
\do{044B}{T2A}{\cyrery}{}%                % CY. S. L. YERU
\do{044C}{T2A}{\cyrsftsn}{}%              % CY. S. L. SOFT SIGN
\do{044D}{T2A}{\cyrerev}{}%               % CY. S. L. E
\do{044E}{T2A}{\cyryu}{}%                 % CY. S. L. YU
\do{044F}{T2A}{\cyrya}{}%                 % CY. S. L. YA
\do{0451}{T2A}{\cyryo}{}%                 % CY. S. L. IO
\do{00A7}{TS1}{\textsection}{\mathsection}% SECTION SYMBOL
\do{00A8}{TS1}{\textasciidieresis}{}%      % DIAERESIS
\do{00B0}{TS1}{\textdegree}{\mathdegree}% % DEGREE SIGN
\do{00B1}{TS1}{\textpm}{\pm}%             % PLUS-MINUS SIGN
\do{00B4}{TS1}{\textasciiacute}{}%        % ACUTE ACCENT
\do{00B6}{TS1}{\textparagraph}{\mathparagraph}% PILCROW SIGN
\do{00D7}{TS1}{\texttimes}{\times}%       % MULTIPLICATION SIGN
\do{00F7}{TS1}{\textdiv}{\div}%           % DIVISION SIGN
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\mathdegree}
% 面倒なので補っておく。
%    \begin{macrocode}
\providecommand*{\mathdegree}{{}^{\circ}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjx@gcc@cjk}
% 〔スイッチ〕
% 「特定CJK曖昧文字」を和文扱いにするか。
%    \begin{macrocode}
\newif\ifbxjx@gcc@cjk
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\greekasCJK}
% 〔公開命令〕
% 「特定CJK曖昧文字」を和文扱いにする。
%    \begin{macrocode}
\newcommand*\greekasCJK{%
  \bxjx@gcc@cjktrue}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\nogreekasCJK}
% 〔公開命令〕
% 「特定CJK曖昧文字」を欧文扱いにする。
%    \begin{macrocode}
\newcommand*\nogreekasCJK{%
  \bxjx@gcc@cjkfalse}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjx@fake@grk}
% |\bxjx@fake@grk{|\Meta{出力文字}|}{|\Meta{基準文字}|}|\Means
% ラテン文字で代用される数式ギリシャ文字の出力を行う。
% \Meta{基準文字}（mathchardefの制御綴）の数式クラスと数式ファミリを
% 引き継いで、\Meta{出力文字}（ASCII文字トークン）の文字コードの
% 数式文字を出力する。
% 例えば、|\Pi| の意味が |\mathchar"7005| である場合、
% |\bxjx@fake@grk{B}{\Pi}| は |\mathchar"7042| を実行する。
% \Note フォントパッケージ使用時の再定義を考慮して、\Meta{基準文字}が
% mathchardefであるかを検査し、そうでない場合はフォールバックとして
% 単に\Meta{出力文字}を実行する。
%    \begin{macrocode}
\def\bxjx@tmpdo#1\relax{%
  \def\bxjx@fake@grk##1##2{%
    \expandafter\bxjx@fake@grk@a\meaning##2#1\@nil{##1}{##2}}%
  \def\bxjx@fake@grk@a##1#1##2\@nil##3##4{%
    \ifx\\##1\\%
      \bxjx@cnta##4\divide\bxjx@cnta\@cclvi
      \multiply\bxjx@cnta\@cclvi \advance\bxjx@cnta`##3\relax
      \mathchar\bxjx@cnta
    \else ##3\fi}
}\expandafter\bxjx@tmpdo\string\mathchar\relax
%    \end{macrocode}
% \end{macro}
%
% \paragraph{{\pdfTeX}・{\upTeX}の場合}
%    \begin{macrocode}
\ifnum0\if p\bxjx@engine1\fi\if u\bxjx@engine1\fi>0
%    \end{macrocode}
% \begin{itemize}
% \item |\|[|bxjx@KC/|\Meta{符号値}]\Means
% その文字が「特定曖昧CJK文字」に該当する場合に定義済になる。
% \end{itemize}
%
% まず |inputenc| を読み込んで入力エンコーディングを |utf8|
% に変更する。
% \Note 「既定UTF-8化」後の{\LaTeX}においても、必ず
% 「|inputenc| が明示的に読み込まれた」状態になる。
%    \begin{macrocode}
\@ifpackageloaded{inputenc}{}{%else
  \RequirePackage[utf8]{inputenc}}
\def\bxjx@tmpa{utf8}
\ifx\bxjx@tmpa\inputencdoingname
  \PackageWarningNoLine\bxjx@pkgname
   {Input encoding changed to utf8}%
  \inputencoding{utf8}%
\fi
%    \end{macrocode}
%
% {\upTeX}の場合に、「特定曖昧CJK文字」を含む
% ブロックの和文カテゴリコードを変更する。
%    \begin{macrocode}
\if u\bxjx@engine
\kcatcode"0370=15
\kcatcode"0400=15
\kcatcode"0500=15
\fi
%    \end{macrocode}
% 各文字について |\DeclareUnicodeCharacter| を実行する。
%    \begin{macrocode}
\def\bxjx@tmpdo#1{%
  \@tempcnta="#1\relax
  \expandafter\bxjx@tmpdo@a\csname bxjx@KC/\the\@tempcnta\endcsname{#1}}
\def\bxjx@tmpdo@a#1#2#3#4#5{%
%    \end{macrocode}
% 引数\,=\,|\|[|bxjx@KC/|\Meta{符号値}]|{|\Meta{符号値}|}{|^^A
% \Meta{fontenc}|}{|\Meta{LICR}|}{|\Meta{数式LICR}|}|
%
% “数式中の動作”を決定する。
% \Meta{数式LICR}が空（数式非対応）なら警告を出す。
%    \begin{macrocode}
  \ifx\\#5\\%
    \def\bxjx@tmpa{\@inmathwarn#4}%
%    \end{macrocode}
% \Meta{数式LICR}が英字である場合は |\bxjx@fake@grk| で出力する。
% 大文字なら |\Pi|、小文字なら |\pi| を基準文字にする。
%    \begin{macrocode}
  \else\ifcat A\noexpand#5%
    \edef\bxjx@tmpa{\noexpand\bxjx@fake@grk{#5}%
      {\ifnum\uccode`#5=`#5\noexpand\Pi\else\noexpand\pi\fi}}%
%    \end{macrocode}
% それ以外は\Meta{数式LICR}をそのまま実行する。
%    \begin{macrocode}
  \else \def\bxjx@tmpa{#5}%
  \fi\fi
  \def\bxjx@tmpb{\bxjx@tmpdo@b{#1}{#2}{#3}{#4}}%
  \expandafter\bxjx@tmpb\expandafter{\bxjx@tmpa}}
%    \end{macrocode}
% 以降はエンジン種別で分岐する。
% {\upTeX}の場合。
%    \begin{macrocode}
\if u\bxjx@engine
\def\bxjx@tmpdo@b#1#2#3#4#5{%
%    \end{macrocode}
% 引数\,=\,|\|[|bxjx@KC/|\Meta{符号値}]|{|\Meta{符号値}|}{|^^A
% \Meta{fontenc}|}{|\Meta{LICR}|}{|\Meta{数式中の動作}|}|
%
% 当該のUnicode文字の動作は「テキストでは\Meta{LICR}、数式では
% \Meta{数式中の動作}」となる。
% LICRは現在エンコーディングで有効な定義がある場合はそれが実行
% されるはずである。
% （つまり、現在がLGRである場合はギリシャ文字は常に欧文扱いになる。）
% それ以外の場合はLICRを |\bxjx@ja@or@not| に帰着させる。
% この際に、和文用の定義として当該のkchardefを使用し、その制御綴と
% して |\|[|bxjx@KC/...|] を流用している。
%    \begin{macrocode}
  \kchardef#1=\@tempcnta
  \DeclareTextCommandDefault{#4}{\bxjx@ja@or@not{#1}{#3}{#4}}%
  \DeclareUnicodeCharacter{#2}{\TextOrMath{#4}{#5}}}
%    \end{macrocode}
% {\pdfTeX}の場合も処理はほとんど同じ。
% ただし、和文用の定義として |\UTF{|\Meta{符号値}|}| を使う
% （|\UTF| は |bxcjkjatype| の命令）。
% |\|[|bxjx@KC/...|] は使わないが定義済にする必要がある。
%    \begin{macrocode}
\else\if p\bxjx@engine
\def\bxjx@tmpdo@b#1#2#3#4#5{%
  \mathchardef#1=\@tempcnta
  \DeclareTextCommandDefault{#4}{\bxjx@ja@or@not{\UTF{#2}}{#3}{#4}}%
  \DeclareUnicodeCharacter{#2}{\TextOrMath{#4}{#5}}}
\fi\fi
%    \end{macrocode}
% 以上の処理を「特定CJK曖昧文字」の各々に適用する。
%    \begin{macrocode}
\let\do\bxjx@tmpdo \bxjx@grkcyr@list
%    \end{macrocode}
%
% \begin{macro}{\bxjx@DeclareUnicodeCharacter}
% |\bxjx@DeclareUnicodeCharacter| を改変して、
% 「特定CJK曖昧文字」の場合に再定義を抑止したもの。
%    \begin{macrocode}
\@onlypreamble\bxjx@org@DeclareUnicodeCharacter
\let\bxjx@org@DeclareUnicodeCharacter\DeclareUnicodeCharacter
\@onlypreamble\bxjx@DeclareUnicodeCharacter
\def\bxjx@DeclareUnicodeCharacter#1#2{%
  \count@="#1\relax
  \expandafter\ifx\csname bxjx@KC/\the\count@\endcsname\relax
    \bxjx@org@DeclareUnicodeCharacter{#1}{#2}%
  \else
    \wlog{ \space\space skipped defining Unicode char U+#1}%
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjx@ja@or@not}
% |\bxjx@ja@or@not{|\Meta{和文用定義}|}{|\Meta{対象fontenc}|}{|^^A
% \Meta{LICR}|}|\Means
% |\|[|no|]|greekasCJK| の状態に応じて和文または欧文で文字を出力する。
%    \begin{macrocode}
\def\bxjx@ja@or@not#1#2#3{%
%    \end{macrocode}
% |\greekasCJK| の場合は、無条件に\Meta{和文用定義}を実行する。
%    \begin{macrocode}
  \ifbxjx@gcc@cjk #1%
%    \end{macrocode}
% |\nogreekasCJK| の場合は、対象のエンコーディングに変更してLICRを
% 実行するが、そのエンコーディングが未定義の場合は
% （フォールバックとして）和文用定義を使う。
%    \begin{macrocode}
  \else\expandafter\ifx\csname T@#2\endcsname\relax #1%
  \else \UseTextSymbol{#2}{#3}%
  \fi\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DeclareFontEncoding@}
% |\DeclareFontEncoding@| にパッチを当てて、
% |\DeclareFontEncoding| の実行中だけ
% 改変後の |\DeclareUnicodeCharacter| が使われるようにする。
%    \begin{macrocode}
\begingroup
\toks@\expandafter{\DeclareFontEncoding@{#1}{#2}{#3}}
\xdef\next{\def\noexpand\DeclareFontEncoding@##1##2##3{%
  \noexpand\bxjx@swap@DUC@cmd
  \the\toks@
  \noexpand\bxjx@swap@DUC@cmd}}
\endgroup\next
\def\bxjx@swap@DUC@cmd{%
  \let\bxjx@tmpa\DeclareUnicodeCharacter
  \let\DeclareUnicodeCharacter\bxjx@DeclareUnicodeCharacter
  \let\bxjx@DeclareUnicodeCharacter\bxjx@tmpa
  \let\bxjx@tmpa\relax}
%    \end{macrocode}
% \end{macro}
%
% 以上。
%
% \paragraph{{\XeTeX}・{\LuaTeX}の場合}
%    \begin{macrocode}
\else\ifnum0\if x\bxjx@engine1\fi\if l\bxjx@engine1\fi>0
%    \end{macrocode}
%
% 各文字について、数式中の動作を定義する。
%    \begin{macrocode}
\def\bxjx@tmpdo#1{%
  \bxjx@cnta="#1\relax
  \begingroup
    \lccode`~=\bxjx@cnta
  \lowercase{\endgroup
    \bxjx@tmpdo@a{~}}{#1}}
\def\bxjx@tmpdo@a#1#2#3#4#5{%
%    \end{macrocode}
% \Meta{数式LICR}が空なら何もしない。
% 空でない場合、{up\LaTeX}の場合と同じ方法で“数式中の動作”を決定し、
% 当該の文字をmath activeにしてその動作を設定する。
%    \begin{macrocode}
  \ifx\\#5\\\let\bxjx@tmpa\relax
  \else\ifcat A\noexpand#5%
    \edef\bxjx@tmpa{\noexpand\bxjx@fake@grk{#5}%
      {\ifnum\uccode`#5=`#5\noexpand\Pi\else\noexpand\pi\fi}}%
  \else \def\bxjx@tmpa{#5}%
  \fi\fi
  \ifx\bxjx@tmpa\relax\else
    \mathcode\bxjx@cnta"8000 \let#1\bxjx@tmpa
  \fi}
%    \end{macrocode}
% 「Unicodeな数式」の設定が行われているかを（簡易的に）検査して、
% そうでない場合にのみ、以上の処理を「特定CJK曖昧文字」の各々に適用する。
%    \begin{macrocode}
\mathchardef\bxjx@tmpa="119
\ifx\bxjx@tmpa\pi \let\do\bxjx@tmpdo \bxjx@grkcyr@list \fi
%    \end{macrocode}
%
% 次に、テキストにおいて「特定CJK曖昧文字」の扱いが |\|[|no|]|greekasCJK|
% で切り替わるようにする。
% 
% {\LuaTeX}の場合は、{\LuaTeX}-jaの |jacharrange| の設定を変更する。
% \Note “範囲2”がギリシャ・キリル文字、“範囲8”がLatin-1の記号。
%    \begin{macrocode}
\if l\bxjx@engine
  \protected\def\greekasCJK{%
    \bxjx@gcc@cjktrue
    \ltjsetparameter{jacharrange={+2, +8}}}
  \protected\def\nogreekasCJK{%
    \bxjx@gcc@cjkfalse
    \ltjsetparameter{jacharrange={-2, -8}}}
\fi
%    \end{macrocode}
%
% {\XeTeX}の場合、|xeCJK| は{\XeTeX}の文字クラス定義を参照して
% いるので、対象文字の文字クラスを変更する。
%    \begin{macrocode}
\if x\bxjx@engine
  \let\bxjx@gcc@cjk@list\@empty
  \def\do#1#2#3#4{%
    \edef\bxjx@gcc@cjk@list{\bxjx@gcc@cjk@list
      \noexpand\XeTeXcharclass"#1\bxjx@cnta}}
  \bxjx@grkcyr@list
  \protected\def\greekasCJK{%
    \bxjx@gcc@cjktrue
    \bxjx@cnta=\@ne \bxjx@gcc@cjk@list}
  \protected\def\nogreekasCJK{%
    \bxjx@gcc@cjkfalse
    \bxjx@cnta=\z@ \bxjx@gcc@cjk@list}
\fi
%    \end{macrocode}
%
% 以上。
%    \begin{macrocode}
\fi\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{初期設定}
% 「特定CJK曖昧文字」を欧文扱いにする。
%    \begin{macrocode}
\nogreekasCJK
%    \end{macrocode}
%
%^^A----------------
% \subsection{完了}
% おしまい。
%    \begin{macrocode}
%</cjkcat>
%    \end{macrocode}
%
%^^A========================================================
% \section{補助パッケージ：bxjspandoc \ZRX}
%
% Pandocの{\LaTeX}用標準テンプレートをより幸せに使うための設定。
% BXJSクラスのpandocドライバのコードの中の、“汎用的”に使える
% 部分を切り出したもの。
% つまり現在のpandocドライバはこのパッケージを読みこむ。
% \Note テンプレートの{\TeX}コードより前に読み込む必要があるため、
% 専ら文書クラス内での読込に限られる。
%
%^^A----------------
% \subsection{準備}
%
%    \begin{macrocode}
%<*ancpandoc>
%% このファイルは日本語文字を含みます.
\def\bxjsp@pkgname{bxjspandoc}
%    \end{macrocode}
%
% \begin{macro}{\bxjsp@engine}
% エンジンの種別。
%    \begin{macrocode}
\let\bxjsp@engine=n
\@onlypreamble\bxjsp@do
\def\bxjsp@do#1#2{%
  \edef\bxjsp@tmpa{\string#1}%
  \edef\bxjsp@tmpb{\meaning#1}%
  \ifx\bxjsp@tmpa\bxjsp@tmpb #2\fi}
\bxjsp@do\kanjiskip{\let\bxjsp@engine=j}
\bxjsp@do\XeTeXversion{\let\bxjsp@engine=x}
\bxjsp@do\pdftexversion{\let\bxjsp@engine=p}
\bxjsp@do\luatexversion{\let\bxjsp@engine=l}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjsp@begin@document@hook}
% 文書本体開始時フック。
%    \begin{macrocode}
\@onlypreamble\bxjsp@begin@document@hook
\let\bxjsp@begin@document@hook\@empty
\AtBeginDocument{\bxjsp@begin@document@hook}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjsp@babel@used}
% 〔スイッチ〕Babelが読み込まれたか。
%    \begin{macrocode}
\newif\ifbxjsp@babel@used
\g@addto@macro\bxjsp@begin@document@hook{%
  \@ifpackageloaded{babel}{\bxjsp@babel@usedtrue}{}}
%    \end{macrocode}
% \end{macro}
%
%^^A----------------
%\subsection{パッケージオプション}
%
% |english| オプションが指定されている場合、|\ldots| の調整を抑止する。
% \Note つまり、「グローバルの |english| オプション」が指定されている
% 場合も抑止の対象になる。
% BXJSクラスの英語モードを想定しているが、それ以外の場合でも、
% 一般的な{\LaTeX}の習慣として、グローバルの |english| は
% 「その文書の基底言語が英語である」ことを示す。
%    \begin{macrocode}
\newif\ifbxjsp@english
\DeclareOption{english}{\bxjsp@englishtrue}
%    \end{macrocode}
%
% オプション定義はおしまい。
%    \begin{macrocode}
\ProcessOptions*
%    \end{macrocode}
%
%^^A----------------
%\subsection{パッケージ読込の阻止}
%
% \begin{macro}{\pandocSkipLoadFile}
% |\pandocSkipLoadFile{|\Meta{ファイル名}|}|\Means
% 特定のファイルを（|\@filewithoptions| の処理に関して）
% 読込済であるとマークする。
%    \begin{macrocode}
\@onlypreamble\pandocSkipLoadFile
\newcommand*\pandocSkipLoadFile[1]{%
  \expandafter\bxjsp@skip@load@file@a\csname ver@#1\endcsname{#1}}
\def\bxjsp@skip@load@file@a#1#2{%
  \ifx#1\relax
    \def#1{2001/01/01}%
    \PackageInfo\bxjsp@pkgname
     {File '#2' marked as loaded\@gobble}%
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\pandocSkipLoadPackage}
% |\pandocSkipLoadPackage{|\Meta{パッケージ名}|}|\Means
% |\pandocSkipLoadFile| の機能を用いてパッケージの読込を阻止する。
%    \begin{macrocode}
\@onlypreamble\pandocSkipLoadPackage
\newcommand*\pandocSkipLoadPackage[1]{%
  \pandocSkipLoadFile{#1.sty}}
%    \end{macrocode}
% \end{macro}
%
%^^A----------------
%\subsection{fixltx2eパッケージ}
% テンプレートでは |fixltx2e| パッケージを読み込むが、
% 最近（2015年版以降）の{\LaTeX}ではこれで警告が出る。
% これを抑止する。
%
% {\LaTeX}カーネルが新しい場合は |fixltx2e| を
% 読込済にする。
%    \begin{macrocode}
\ifx\@IncludeInRelease\@undefined\else
  \pandocSkipLoadPackage{fixltx2e}
\fi
%    \end{macrocode}
%
%^^A----------------
%\subsection{cmapパッケージ}
% エンジンが{(u)\pLaTeX}のときに |cmap| パッケージが
% 読み込まれるのを阻止する。
% （実際は警告が出るだけで無害であるが。）
%
%    \begin{macrocode}
\if j\bxjsp@engine
  \pandocSkipLoadPackage{cmap}
\fi
%    \end{macrocode}
%
%^^A----------------
%\subsection{microtypeパッケージ}
% 警告が多すぎなので消す。
%
%    \begin{macrocode}
\if j\bxjsp@engine \else
  \PassOptionsToPackage{verbose=silent}{microtype}
\fi
%    \end{macrocode}
%
% エンジンが{(u)\pLaTeX}のときに |microtype| パッケージが
% 読み込まれるのを阻止し、さらにテンプレートで使われている命令を
% 通すためにダミーの定義を行う。
% \Note 昔はstandardドライバでこの処理を行っていたが、
% 元来はPandoc用の処理なので、1.5版でpandocに移動。
%    \begin{macrocode}
\if j\bxjsp@engine
  \pandocSkipLoadPackage{microtype}
  \newcommand*\UseMicrotypeSet[2][]{}
\fi
%    \end{macrocode}
%
%^^A----------------
%\subsection{Unicode文字変換対策}
%
% Pandocで{\LaTeX}形式に書き出す場合は、元データ中の一部のUnicode文字を
% 「{\LaTeX}の表記」に置き換える。
% その中には日本語文書で問題になるものが含まれる。
% \begin{quote}
% \mbox{…}→|\ldots{}|\quad
% \mbox{‘}→|`|\quad
% \mbox{’}→|'|\quad
% \mbox{“}→|``|\quad
% \mbox{”}→|''|\quad
% \end{quote}
% 日本語{\LaTeX}では「{\LaTeX}の表記」は欧文扱い、
% Unicode文字は和文扱いとして使い分ける習慣があるので、
% このような置換が行われるのは好ましくない。
%
% これらの置換のうち、後の4つはPandocの |--no-tex-ligatures| オプションを
% 指定すれば抑止できるが、「…」の置換を抑止する機能はないようである。
% そこで、「|\ldots| を『…』に戻す」という処置を行う。
%
% \begin{macro}{\pandocLdots}
% Pandoc用の |\ldots| の実装。
% 非数式である場合は代わりに |…| を実行する。
% \Note 以前は「Pandocが必ず |\ldots{}| の形で書き出す」ことを利用して
% 後続に |{}| があるかで「元が |…| であるか」を判断していた。
% ところが、Pandoc 2.7版で |{}| を必ずしも付けなくなったため、
% 1.9f版で非数式の |\ldots| を全て |…| に戻す動作に変更した。
%    \begin{macrocode}
\DeclareRobustCommand{\pandocLdots}{%
  \let\bxjsp@do\bxjsp@ja@ellipsis
  \ifmmode \let\bxjsp@do\bxjsp@org@ldots
  \else\ifbxjsp@babel@used
    \expandafter\ifx\csname bxjsp@ld/\languagename\endcsname\relax
      \let\bxjsp@do\bxjsp@org@ldots \fi
  \fi\fi \bxjsp@do}
\@namedef{bxjsp@ld/japanese}{1}
\def\bxjsp@ja@ellipsis{…}
\let\bxjsp@org@ldots\ldots
%    \end{macrocode}
% \end{macro}
%
% |\ldots| の実装を |\pandocLdots| に置き換える。
%    \begin{macrocode}
\g@addto@macro\bxjsp@begin@document@hook{%
  \let\bxjsp@org@ldots\ldots
%    \end{macrocode}
% もしここで |\newcommand\pandocLdots{\ldots}| という定義である場合は
% 置き換えない。
%    \begin{macrocode}
  \long\def\bxjsp@tmpa{\ldots}%
  \ifx\pandocLdots\bxjsp@tmpa\else
%    \end{macrocode}
% |english| オプションが指定されていてかつBabelが読み込まれていない場合も
% 置き換えない。
%    \begin{macrocode}
    \ifnum0\ifbxjsp@english\ifbxjsp@babel@used\else1\fi\fi=0
      \let\ldots\pandocLdots
    \fi
  \fi}
%    \end{macrocode}
%
% |\ldots| の直後の文字が非英字の場合、Pandocは「|\ldots。|」の
% ように空白を入れずに並べて出力する。
% 「Pandocは非英字と見なすが{\XeTeX}・{\LuaTeX}は英字と見なす
% （または将来その可能性がある）」文字で、特に日本語文書に現れる
% ものについて、非英字扱いにしておく。
% \Note Pandocは「Unicode 7.0でGCがLetter」な文字を英字と判定している。
%    \begin{macrocode}
\chardef\bxjsp@cc@other=12
\@onlypreamble\bxjsp@makeother@range
\def\bxjsp@makeother@range#1#2{%
  \@tempcnta"#1\relax \@tempcntb"#2\relax
  \loop\ifnum\@tempcnta<\@tempcntb
    \catcode\@tempcnta\bxjsp@cc@other
    \advance\@tempcnta\@ne
  \repeat}
\ifnum0\if x\bxjsp@engine1\fi\if l\bxjsp@engine1\fi>0
  \catcode"1F23B=\bxjsp@cc@other
  \bxjsp@makeother@range{9FCD}{A000}
  \bxjsp@makeother@range{1B002}{1B170}
  \bxjsp@makeother@range{2B820}{2EBF0}
\fi
%    \end{macrocode}
%
%^^A----------------
% \subsection{PandoLaモジュール}
% インストール済であれば読み込む。
%    \begin{macrocode}
\IfFileExists{bxpandola.sty}{%
  \RequirePackage{bxpandola}\relax
  \PackageInfo\bxjsp@pkgname
   {PandoLa module is loaded\@gobble}
}{}
%    \end{macrocode}
%
%^^A----------------
% \subsection{完了}
% おしまい。
%    \begin{macrocode}
%</ancpandoc>
%    \end{macrocode}
%
% 補助パッケージ実装はここまで。
%    \begin{macrocode}
%</anc>
%    \end{macrocode}
%
% \Finale
%
\endinput
