-
Notifications
You must be signed in to change notification settings - Fork 8
/
bxjscls.dtx
13752 lines (13752 loc) · 457 KB
/
bxjscls.dtx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
% ^^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 開発コミュニティ版)
% 原作者:奥村晴彦 <[email protected]>
%
%---------------------------------------
%
% 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-2023 Japanese TeX Development Community
%
% Copyright 2013-2024 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>
[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 [email protected]\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\[email protected]@@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| で章番号が出ません。