OSDN Git Service

Fixed bug #25121 (I hope) and check_box.
[luatex-ja/luatexja.git] / src / luatexja-core.sty
1 % LuaTeX-ja core TeX source
2
3 \catcode`\@=11
4 \catcode"FFFFF=14 %"
5
6 \input luaotfload.sty
7 \input ltxcmds.sty
8 \input xkeyval.tex
9 \input infwarerr.sty
10 \ifdefined\ltj@loaded\endinput\fi
11 \def\ltj@loaded{hoge}
12
13 \newcount\ltj@tempcnta
14 \newcount\ltj@tempcntb
15 \newcount\ltj@tempcntc
16 \newdimen\ltj@tempdima
17 \newskip\ltj@tempskipa
18
19 \newdimen\zw
20 \newdimen\zh
21 \newdimen\jQ \jQ=0.25mm
22 \newdimen\jH \jH=0.25mm
23
24 %%%%%%%% Attributes for Japanese typesetting.
25 \newluatexattribute\ltj@curjfnt   % index for ``current Japanese font''
26 \newluatexattribute\ltj@charclass % 
27 \newluatexattribute\ltj@yablshift % attribute for \yabaselineshift
28 \newluatexattribute\ltj@ykblshift % attribute for \ykbaselineshift
29 \newluatexattribute\ltj@autospc   % attribute for autospacing
30 \newluatexattribute\ltj@autoxspc  % attribute for autoxspacing
31 \newluatexattribute\ltj@icflag    % attribute for italic correction
32 \newlanguage\ltj@japanese
33
34 %%%%%%%% Loading lua files
35 \directlua{%
36   utf = unicode.utf8
37   ltj = {}
38   function ltj.loadlua(file)
39     local path = assert(kpse.find_file(file, 'tex'),
40       "File '"..file.."' not found")
41     texio.write_nl("("..path..")")
42     dofile(path)
43   end
44   require('lualibs')
45   ltj.loadlua('luatexja-rmlgbm.lua') 
46     % For Ryumin-Light and GothicBBB-Medium.
47   ltj.loadlua('luatexja-jfont.lua')
48   ltj.loadlua('luatexja-core.lua')
49   ltj.loadlua('luatexja-jfmglue.lua')
50   ltj.loadlua('luatexja-xkanji.lua')
51 }
52
53
54 %%%%%%%% Attributes for character ranges
55 \ltj@tempcnta=0
56 \loop\ifnum\ltj@tempcnta<7
57   \expandafter\newluatexattribute%
58     \csname ltj@kcat\the\ltj@tempcnta\endcsname
59   \csname ltj@kcat\the\ltj@tempcnta\endcsname=0
60   \advance\ltj@tempcnta by1
61 \repeat
62
63 %%%%%%%% \asluastring
64 \def\asluastring#1{'\luaescapestring{\detokenize{#1}}'}
65
66 %%%%%%%% Redefine \/
67 %\let\ltj@ic=\/ \protected\def\/{{\ltj@icflag=1\ltj@ic}}
68 \protected\def\/{\directlua{ltj.ext_append_italic()}}
69
70 %%%%%%%% \jfont\CS={...:...;jfm=metric;...}, \globaljfont
71 \protected\def\jfont{\afterassignment\ltj@@jfont\directlua{ltj.ext_jfontdefX(false)}}
72 \protected\def\globaljfont{%
73   \afterassignment\ltj@@jfont\directlua{ltj.ext_jfontdefX(true)}}
74 \def\ltj@@jfont{\directlua{ltj.ext_jfontdefY()}}
75
76 %%%%%%%% \inhibitglue
77 \protected\def\inhibitglue{\directlua{ltj.ext_create_inhibitglue_node()}}
78
79 %%%%%%%% \ltjdefcharrange<name>{100-200,3000-,5000,...}
80 \protected\def\ltjdefcharrange#1#2{%
81   \ltj@tempcntc=#1 \expandafter\ltj@@dcrange#2,,\ignorespaces}
82 \def\ltj@@dcrange#1,{\def\ltj@temp{#1}%
83   \ifx\ltj@temp\empty\let\@next=\relax\else
84   \ltj@@dcrangeA{#1}\let\@next=\ltj@@dcrange\fi\@next}
85 \def\ltj@@dcrangeA#1{\ltj@@dcrangeB#1--\@nil}
86 \def\ltj@@dcrangeB#1-#2-#3\@nil{\def\ltj@temp{#3}%
87   \ifx\ltj@temp\empty
88     \ltj@tempcnta=#1 \ltj@tempcntb=\ltj@tempcnta
89   \else
90     \def\ltj@temp{#1}%
91     \ifx\ltj@temp\empty\ltj@tempcnta='200 \else\ltj@tempcnta=#1 \fi
92     \def\ltj@temp{#2}%
93     \ifx\ltj@temp\empty\ltj@tempcntb="10FFFF \else\ltj@tempcntb=#2 \fi%"
94   \fi
95   \directlua{ltj.ext_add_char_range(\the\ltj@tempcnta,\the\ltj@tempcntb,
96     \the\ltj@tempcntc)}%
97   }
98
99 %%%%%%%% \ltjsetparameter
100 \newcount\ltj@@stack \newcount\ltj@@group@level
101 \ltj@@group@level=0 \ltj@@stack=0
102
103 % prebreakpenalty = {<char_code>, <penalty>}
104 \define@key[ltj]{japaram}{kcatcode}{%
105   \expandafter\ltj@@set@stack#1:{kcat}{0}{0x7FFFFFFF}}
106 \define@key[ltj]{japaram}{prebreakpenalty}{%
107   \expandafter\ltj@@set@stack#1:{pre}{-10000}{10000}}
108 \define@key[ltj]{japaram}{postbreakpenalty}{%
109   \expandafter\ltj@@set@stack#1:{post}{-10000}{10000}}
110 \def\ltj@@set@stack#1,#2:#3#4#5{%
111   \ltj@tempcnta=#1\relax \ltj@tempcntb=#2\relax
112   \directlua{ltj.ext_set_stack_table(ltj.isglobal, \asluastring{#3},
113     \the\ltj@tempcnta,tex.getcount('ltj@tempcntb'),#4,#5)}}
114
115 % yalbaselineshift = <dimen>
116 % yjabaselineshift = <dimen>
117 \define@key[ltj]{japaram}{yalbaselineshift}{%
118   \ltj@tempdima=#1\relax%
119   \directlua{tex.setattribute(ltj.isglobal, 
120     luatexbase.attributes['ltj@yablshift'],
121     tex.getdimen('ltj@tempdima'))}}
122 \define@key[ltj]{japaram}{yjabaselineshift}{%
123   \ltj@tempdima=#1\relax%
124   \directlua{tex.setattribute(ltj.isglobal, 
125     luatexbase.attributes['ltj@ykblshift'],
126     tex.getdimen('ltj@tempdima'))}}
127
128 % jaxspmode = {<char_code>, <mode>}
129 % mode: inhibit, preonly, postonly, allow
130 %    or       0        2         1      3
131 \define@key[ltj]{japaram}{jaxspmode}{%        \inhibitxspcode
132   \expandafter\ltj@set@jaxspmode#1:\relax}
133 \def\ltj@set@jaxspmode#1,#2:{%
134   \lowercase{\edef\ltj@temp{#2}}%
135   \def\ltj@tempa{inhibit}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{0}\fi
136   \def\ltj@tempa{preonly}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{2}\fi
137   \def\ltj@tempa{postonly}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{1}\fi
138   \def\ltj@tempa{allow}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{3}\fi
139   \ltj@tempcnta=#1\relax\ltj@tempcntb=\ltj@temp\relax
140   \directlua{ltj.ext_set_stack_table(ltj.isglobal, 'xsp', \the\ltj@tempcnta,
141     \the\ltj@tempcntb,0,3)}}
142
143 % alxspmode = {<char_code>, <mode>}
144 % mode: inhibit, preonly, postonly, allow
145 %    or       0        1         2      3
146 \define@key[ltj]{japaram}{alxspmode}{%        \inhibitxspcode
147   \expandafter\ltj@set@alxspmode#1:\relax}
148 \def\ltj@set@alxspmode#1,#2:{%
149   \lowercase{\edef\ltj@temp{#2}}%
150   \def\ltj@tempa{inhibit}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{0}\fi
151   \def\ltj@tempa{preonly}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{1}\fi
152   \def\ltj@tempa{postonly}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{2}\fi
153   \def\ltj@tempa{allow}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{3}\fi
154   \ltj@tempcnta=#1\relax\ltj@tempcntb=\ltj@temp\relax
155   \directlua{ltj.ext_set_stack_table(ltj.isglobal, 'xsp', \the\ltj@tempcnta,
156     \the\ltj@tempcntb,0,3)}}
157
158 % autospacing = <bool> (default: true)
159 \define@boolkey[ltj]{japaram}{autospacing}[true]{%
160   \ifltj@japaram@autospacing
161     \directlua{ltj.ext_print_global()}\ltj@autospc=1
162   \else
163     \directlua{ltj.ext_print_global()}\ltj@autospc=0
164   \fi}
165
166 % autoxspacing = <bool> (default: true)
167 \define@boolkey[ltj]{japaram}{autoxspacing}[true]{%
168   \ifltj@japaram@autoxspacing
169     \directlua{ltj.ext_print_global()}\ltj@autoxspc=1
170   \else
171     \directlua{ltj.ext_print_global()}\ltj@autoxspc=0
172   \fi}
173
174 \define@key[ltj]{japaram}{kanjiskip}{%              % SKIP
175   \ltj@tempskipa=#1\relax
176   \directlua{ltj.ext_set_stack_skip(ltj.isglobal, 'kanjiskip')}}
177 \define@key[ltj]{japaram}{xkanjiskip}{%              % SKIP
178   \ltj@tempskipa=#1\relax
179   \directlua{ltj.ext_set_stack_skip(ltj.isglobal, 'xkanjiskip')}}
180 \define@key[ltj]{japaram}{jcharwidowpenalty}{%      %COUNT
181   \ltj@tempcnta=#1 
182   \directlua{ltj.ext_set_stack_table(ltj.isglobal, 'jwp', 0,
183     \the\ltj@tempcnta, -10000, 10000)}}
184
185 % differentjfm = { large | small | average | both }
186 \define@choicekey*+[ltj]{japaram}{differentjfm}[\ltj@temp\ltj@tempr]%
187   {large,small,average,both}{%
188   \ifcase\ltj@tempr
189     \directlua{ltj.ja_diffmet_rule = math.max}\or
190     \directlua{ltj.ja_diffmet_rule = math.min}\or
191     \directlua{ltj.ja_diffmet_rule = math.two_average}\or
192     \directlua{ltj.ja_diffmet_rule = math.two_add}
193   \fi
194 }{\@PackageWarning{luatexja}{ignored invalid argument '#1' for 'differentjfm'}}
195   % large, small, average, both
196
197
198 % jacharrange = { +-<range_number> }
199 \define@key[ltj]{japaram}{jacharrange}{\expandafter\ltj@@scrange#1,,}
200 \def\ltj@@scrange#1,{%
201   \edef\ltj@temp{#1}%
202   \ifx\ltj@temp\empty\let\next=\relax\else\let\next=\ltj@@scrange
203     \ltj@tempcnta=#1 \directlua{ltj.ext_toggle_char_range(%
204       ltj.is_global,\the\ltj@tempcnta)}%
205   \fi\next
206 }
207
208 \protected\def\ltjsetparameter#1{\directlua{ltj.isglobal=''}%
209   \setkeys[ltj]{japaram}{#1}\ignorespaces}
210 \protected\def\ltjglobalsetparameter#1{\directlua{ltj.isglobal='global'}%
211   \setkeys[ltj]{japaram}{#1}\ignorespaces}
212
213 %%%%%%%% 
214 \def\ltj@@decl@array@param#1{%
215   \expandafter\let\csname ltj@@array@param/#1\endcsname=t%
216 }
217 \ltj@@decl@array@param{prebreakpenalty}
218 \ltj@@decl@array@param{postbreakpenalty}
219 \ltj@@decl@array@param{jaxspmode}
220 \ltj@@decl@array@param{alxspmode}
221 \ltj@@decl@array@param{kcatcode}
222 \ltj@@decl@array@param{jacharrange}
223 \ltj@@decl@array@param{chartorange}
224 \def\ltjgetparameter#1{%
225   \ifcsname ltj@@array@param/#1\endcsname
226     \expandafter\ltx@firstoftwo
227   \else
228     \expandafter\ltx@secondoftwo
229   \fi
230   {\ltj@@getparam@two{#1}}%
231   {\ltj@@getparam@one{#1}}%
232 }
233 \def\ltj@@getparam@one#1{%
234   \directlua{ltj.ext_get_parameter_unary('#1')}}%
235 \def\ltj@@getparam@two#1#2{\ltj@tempcnta=#2
236   \directlua{ltj.ext_get_parameter_binary('#1', \the\ltj@tempcnta)}%
237 }
238
239
240
241 \def\ltj@temp{plain}
242 \ifx\fmtname\ltj@temp
243   \message{plain format: loading luatexja-plain.tex}
244 \fi
245 \input luatexja-plain.tex
246 \catcode`\@=12
247 \endinput