OSDN Git Service

target release date: 2023-12-30
[luatex-ja/luatexja.git] / src / luatexja-core.sty
1 %
2 % luatexja-core.sty
3 %
4
5 %! 外から読まれるので仰々しくなってます
6 %% Avoid multiple loading.
7 \csname\if11luatexjacoreLoaded\fi\endcsname
8 \edef\x{%
9 \catcode32=\the\catcode32%
10 \catcode33=\the\catcode33%
11 \catcode35=\the\catcode35%
12 \catcode40=\the\catcode40%
13 \catcode41=\the\catcode41%
14 \catcode42=\the\catcode42%
15 \catcode43=\the\catcode43%
16 \catcode44=\the\catcode44%
17 \catcode45=\the\catcode45%
18 \catcode46=\the\catcode46%
19 \catcode58=\the\catcode58%
20 \catcode59=\the\catcode59%
21 \catcode60=\the\catcode60%
22 \catcode61=\the\catcode61%
23 \catcode62=\the\catcode62%
24 \catcode64=\the\catcode64%
25 \catcode91=\the\catcode91%
26 \catcode93=\the\catcode93%
27 \catcode94=\the\catcode94%
28 \catcode95=\the\catcode95%
29 \catcode126=\the\catcode126%
30 \endlinechar=\the\endlinechar
31 \relax}
32 \catcode32=10 %< >
33 \catcode33=12 %<">
34 \catcode35=6  %<#>
35 \catcode40=12 %<(>
36 \catcode41=12 %<)>
37 \catcode42=12 %<*>
38 \catcode43=12 %<+>
39 \catcode44=12 %<,>
40 \catcode45=12 %<->
41 \catcode46=12 %<.>
42 \catcode58=12 %<:>
43 \catcode59=12 %<;>
44 \catcode60=12 %<<>
45 \catcode61=12 %<=>
46 \catcode62=12 %<>>
47 \catcode64=11 %<@>
48 \catcode91=12 %<[>
49 \catcode93=12 %<]>
50 \catcode94=7  %<^>
51 \catcode95=8  %<_>
52 \catcode126=13 %<~>
53 \endlinechar=-1 %
54 %! なお, 上のcatcode設定はcoreとcompatで同一にしておく.
55 \edef\ltj@core@AtEnd{\x
56   \noexpand\let\noexpand\ltj@core@AtEnd\relax}
57 \def\luatexjacoreLoaded{\endinput}
58
59 %% Check if LaTeX is used.
60 \begingroup\expandafter\expandafter\expandafter\endgroup
61 \expandafter\ifx\csname RequirePackage\endcsname\relax %<*!LaTeX>
62   \expandafter\let\csname ifltj@in@latex\expandafter\endcsname
63     \csname iffalse\endcsname
64   \endlinechar=13 %
65   \input infwarerr.sty
66   \endlinechar=-1 %
67 \else                           %<*LaTeX>
68   \expandafter\let\csname ifltj@in@latex\expandafter\endcsname
69     \csname iftrue\endcsname
70   \NeedsTeXFormat{LaTeX2e}
71   \ProvidesPackage{luatexja-core}[2023-04-06 Core of LuaTeX-ja]
72   \endlinechar=13 %
73   \RequirePackage{infwarerr}
74   \endlinechar=-1 %
75 \fi                             %</LaTeX>
76
77 %% Check if LuaTeX is used
78 \expandafter\ifx\csname directlua\endcsname\relax
79   \@PackageError{luatexja-core}{This package requires Lua(HB)(La)TeX}{}
80 \expandafter\endinput\fi\relax
81
82 %% Load prerequisite packages.
83 \endlinechar=13 %
84 \newif\ifltj@everyhook@avail\ltj@everyhook@availfalse
85 %! 外部パッケージは普通の \endlinechar で読まないと危険.
86 \ifltj@in@latex                 %<*LaTeX>
87   \RequirePackage{luatexbase}
88   \RequirePackage{luaotfload}
89   \RequirePackage{ltxcmds}    [2011/11/09] % v1.22
90   \RequirePackage{pdftexcmds} [2011/11/29] % v0.20
91   \RequirePackage{xkeyval}    [2012/10/14] % v2.6b
92   \RequirePackage{etoolbox}
93   \IfFileExists{everyhook.sty}{\RequirePackage{everyhook}\ltj@everyhook@availtrue}{}
94 \else                           %<*!LaTeX>
95   \input luatexbase.sty
96   \input luaotfload.sty
97   \input ltxcmds.sty
98   \input pdftexcmds.sty
99   \input xkeyval
100 \fi                             %</LaTeX>
101 \endlinechar=-1 %
102
103 \directlua{require('ltj-unicode-ccfix.lua')}% catcode of ideographs
104
105 %% Check LuaTeX version.
106 \ifnum\luatexversion<110
107   \@PackageError{luatexja-core}
108     {This LuaTeX engine is too old for this package;\MessageBreak
109      at least 1.10.0 is needed}
110     {Package loading is aborted now.\MessageBreak}
111 \expandafter\endinput\fi\relax
112
113 %% \LuaTeXjaAvailable
114 %! 環境検査にパスした時に定義される.
115 \let\LuaTeXjaAvailable=t %
116
117 %%------------------
118 \endlinechar=13
119
120 %! ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
121 % LuaTeX-ja core TeX source
122
123 \newcount\ltjlineendcomment
124 \ltjlineendcomment="FFFFF
125 \catcode\ltjlineendcomment=14 %"
126
127 \def\ltj@loaded{hoge}
128
129 \newdimen\ltj@dimen@zw
130 \newdimen\ltj@dimen@zh
131 \newdimen\ltj@dimen@jQ \ltj@dimen@jQ=0.25mm
132 \let\jQ=\ltj@dimen@jQ \let\jH=\jQ
133
134 %%%%%%%% Attributes for Japanese typesetting.
135 \newattribute\ltj@icflag    % attribute for italic correction
136 \newattribute\ltj@curjfnt   % index for ``current horizontal Japanese font''
137 \newattribute\ltj@curtfnt   % index for ``current vertical Japanese font''
138 \newattribute\ltj@charclass %
139 \newattribute\ltj@charcode %
140 \newattribute\ltj@autospc   % attribute for autospacing
141 \newattribute\ltj@autoxspc  % attribute for autoxspacing
142 \newattribute\ltj@yablshift % attribute for yalbaselineshift
143 \newattribute\ltj@ykblshift % attribute for yjabaselineshift
144 \newattribute\ltj@tablshift % attribute for talbaselineshift
145 \newattribute\ltj@tkblshift % attribute for tjabaselineshift
146 \newattribute\jfam          % index for current jfam
147 \newattribute\ltj@vert@ori  % <=0: UAX#50, >0: always upright
148
149 \newattribute\ltj@dir
150 \newlanguage\ltj@@japanese
151 \ltj@dir\z@
152 \ltj@icflag\z@
153 \ltj@curjfnt\m@ne
154 \ltj@curtfnt\m@ne
155 \ltj@yablshift\z@
156 \ltj@ykblshift\z@
157 \ltj@tablshift\z@
158 \ltj@tkblshift\z@
159
160 \newcount\ltj@tempcnta\newdimen\ltj@tempdima
161 \newcount\ltj@@stack \newcount\ltj@@group@level
162 \ltj@@group@level\z@\ltj@@stack\z@
163
164 %%%%%%%% Attributes for character ranges
165 \ltj@tempcnta\z@
166 \loop\ifnum\ltj@tempcnta<7
167   \expandafter\newattribute%
168     \csname ltj@kcat\the\ltj@tempcnta\endcsname
169   \advance\ltj@tempcnta\@ne
170 \repeat
171 \csname ltj@kcat0\endcsname=\z@
172
173
174 %%%%%%%% Loading luatexja.lua
175 %% Quark tokens needed in ltj-base
176 \protected\def\ltj@@q@escape{\ltj@@q@escape@}
177 \protected\def\ltj@@q@escapenum{\ltj@@q@escapenum@}
178
179 \directlua{%
180   luatexja = {};
181   luatexja.lang_ja = \the\ltj@@japanese;
182   dofile(assert(kpse.find_file('luatexja.lua', 'tex'),
183       "File `luatexja.lua' not found"))
184 }
185
186 %% \RequireLuaTeXjaSubmodule{name}[date]
187 % A TeX version of luatexja.load_module(name)
188 % The second optional argument [date] is simply ignored.
189 \def\RequireLuaTeXjaSubmodule#1{%
190   \@ifnextchar[{\ltj@requirelua@submod{#1}}{\ltj@requirelua@submod{#1}[]}}
191 \def\ltj@requirelua@submod#1[#2]{%
192   \directlua{luatexja.load_module("\luatexluaescapestring{#1}")}}
193
194
195 %%%%%%%% Load all sub-packages.
196 \ifltj@in@latex                 %<*LaTeX>
197   \RequirePackage{ltj-base}
198 \else                           %<*!LaTeX>
199   \input ltj-base.sty %
200 \fi                             %</LaTeX>
201
202 %%%%%%%% \asluastring
203 \def\asluastring#1{'\luatexluaescapestring{\detokenize{#1}}'}
204
205 %%%%%%%% Redefine \/
206 \newluafunction\ltj@@italic@inner
207 \newluafunction\ltj@@start@time@measure@inner
208 \newluafunction\ltj@@stop@time@measure@inner
209 \directlua{
210   local t = lua.get_functions_table()
211   local start_time_measure = luatexja.base.start_time_measure
212   local stop_time_measure = luatexja.base.stop_time_measure
213   local scan_arg = token.scan_argument
214   t[\the\ltj@@italic@inner] = luatexja.jfont.append_italic
215   t[\the\ltj@@start@time@measure@inner] = function()
216     start_time_measure(scan_arg())
217   end
218   t[\the\ltj@@stop@time@measure@inner] = function()
219     stop_time_measure(scan_arg())
220   end
221 }
222 \begingroup\catcode`\/=11
223 \global\let\ltj@@orig@/=\/
224 \protected\gdef\ltj@@/{\relax\luafunction\ltj@@italic@inner}
225 \global\let\/\ltj@@/ %% PRIMITIVE
226 \endgroup
227 \luadef\ltj@@start@time@measure\ltj@@start@time@measure@inner
228 \luadef\ltj@@stop@time@measure\ltj@@stop@time@measure@inner
229
230 \let\ltj@@convert@input@path@to@lua\relax % defined in LaTeX only (ltj-latex.sty)
231
232 %%%%%%%% \jfont\CS={...:...;jfm=metric;...}, \globaljfont
233 %%%%%%%% \tfont\CS={...:...;jfm=metric;...}, \globaltfont
234 \begingroup
235 \def\ltj@@jfdef#1#2#3{%
236   \protected\gdef#1##1{%
237     \ltj@@convert@input@path@to@lua\def\ltj@temp{##1}%
238     \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(#2, '#3')}}}
239 \ltj@@jfdef\jfont{false}{yoko}\ltj@@jfdef\globaljfont{true}{yoko}
240 \ltj@@jfdef\tfont{false}{tate}\ltj@@jfdef\globaltfont{true}{tate}
241 \endgroup
242 \newluafunction\ltj@@jfont@inner
243 \directlua{
244   (lua.get_functions_table())[\the\ltj@@jfont@inner] = luatexja.jfont.jfontdefY
245 }
246 \def\ltj@@jfont{\expandafter\expandafter\expandafter\luafunction\expandafter\ltj@@jfont@inner\ltj@temp}
247
248
249 %%%%%%%% \zw, \zh
250 \newluafunction\ltj@zw@inner
251 \newluafunction\ltj@zh@inner
252 \directlua{
253   local t, setdimen, ltjf = lua.get_functions_table(), tex.setdimen, luatexja.jfont
254   t[\the\ltj@zw@inner] = function() setdimen('ltj@dimen@zw', ltjf.get_zw()) end
255   t[\the\ltj@zh@inner] = function() setdimen('ltj@dimen@zh', ltjf.get_zh()) end
256 }
257 \protected\def\ltj@zw{\luafunction\ltj@zw@inner\ltj@dimen@zw}
258 \protected\def\ltj@zh{\luafunction\ltj@zh@inner\ltj@dimen@zh}
259 \let\zw=\ltj@zw
260 \let\zh=\ltj@zh
261
262 %%%%%%%% \inhibitglue
263 \newluafunction\ltj@reset@globaldefs@inner
264 \newluafunction\ltj@restore@globaldefs@inner
265 \newluafunction\ltj@@disihb@inner
266 \newluafunction\ltj@@ihb@inner
267 \newluafunction\ltj@@fakeparbegin@inner
268 \newluafunction\ltj@@fakeboxbdd@inner
269 \newluafunction\ltj@@ins@xk@inner
270 \newluafunction\ltj@@ins@k@inner
271 \directlua{
272   local t, ltjj = lua.get_functions_table(), luatexja.jfmglue
273   t[\the\ltj@reset@globaldefs@inner] 
274      = function() luatexja.global_temp = tex.globaldefs; tex.globaldefs = 0 end
275   t[\the\ltj@restore@globaldefs@inner] 
276      = function() tex.globaldefs = luatexja.global_temp end
277   t[\the\ltj@@disihb@inner] = ltjj.create_disinhibitglue_node
278   t[\the\ltj@@ihb@inner] = ltjj.create_inhibitglue_node
279   t[\the\ltj@@fakeparbegin@inner] = ltjj.create_beginpar_node
280   t[\the\ltj@@fakeboxbdd@inner] = ltjj.create_boxbdd_node
281   t[\the\ltj@@ins@xk@inner] = ltjj.insert_xk_skip
282   t[\the\ltj@@ins@k@inner] = ltjj.insert_k_skip
283 }
284 \protected\luadef\ltj@reset@globaldefs  \ltj@reset@globaldefs@inner
285 \protected\luadef\ltj@restore@globaldefs\ltj@restore@globaldefs@inner
286 \protected\def\disinhibitglue{\ifhmode\relax\luafunction\ltj@@disihb@inner\fi}
287 \protected\def\inhibitglue{\ifhmode\relax\luafunction\ltj@@ihb@inner\fi}
288 \protected\def\ltjfakeparbegin{\ifhmode\relax\luafunction\ltj@@fakeparbegin@inner\fi}
289 \protected\def\ltjfakeboxbdd{\ifhmode\relax\luafunction\ltj@@fakeboxbdd@inner\fi}
290 \protected\luadef\insertxkanjiskip \ltj@@ins@xk@inner
291 \protected\luadef\insertkanjiskip  \ltj@@ins@k@inner
292
293
294 %%%%%%%% \ltjdefcharrange<name>{100-200,3000-,5000,...}
295 \protected\def\ltjdefcharrange#1#2{%
296   {\ltj@tempcntc=#1 \expandafter\ltj@@dcrange#2,,}\ignorespaces}
297 \def\ltj@@dcrange#1,{\def\ltj@temp{#1}%
298   \ifx\ltj@temp\empty\let\@next=\relax\else
299   \ltj@@dcrangeA{#1}\let\@next=\ltj@@dcrange\fi\@next}
300 \def\ltj@@dcrangeA#1{\ltj@@dcrangeB#1--\@nil}
301 \def\ltj@@dcrangeB#1-#2-#3\@nil{\def\ltj@temp{#3}%
302   \ifx\ltj@temp\empty
303     \ltj@tempcnta=#1 \ltj@tempcntb=\ltj@tempcnta
304   \else
305     \def\ltj@temp{#1}%
306     \ifx\ltj@temp\empty\ltj@tempcnta='200\else\ltj@tempcnta=#1\fi\relax
307     \def\ltj@temp{#2}%
308     \ifx\ltj@temp\empty\ltj@tempcntb="10FFFF\else\ltj@tempcntb=#2\fi\relax%"
309   \fi
310   \directlua{luatexja.charrange.add_char_range(\the\ltj@tempcnta,\the\ltj@tempcntb,
311     \the\ltj@tempcntc)}%
312   }
313
314 %%%%%%%% \ltjsetparameter
315 \setbox\z@\hbox{%
316   \directlua{% This value depends on the version of LuaTeX.
317     luatexja.stack.hmode = -tex.getnest().mode
318   }%
319 }
320 \setbox\z@\vbox{%
321   \directlua{% This value depends on the version of LuaTeX.
322     luatexja.stack.vmode = -tex.getnest().mode
323   }%
324 }
325 \setbox\z@\box\voidb@x
326
327 % prebreakpenalty = {<char_code>, <penalty>}
328 \define@key[ltj]{japaram}{kcatcode}{\ltj@@set@stack{KCAT}{0}{0x7FFFFFFF}#1\relax}
329 \define@key[ltj]{japaram}{prebreakpenalty}{\ltj@@set@stack{PRE}{-10000}{10000}#1\relax}
330 \define@key[ltj]{japaram}{postbreakpenalty}{\ltj@@set@stack{POST}{-10000}{10000}#1\relax}
331 \def\ltj@@set@stack#1#2#3{%
332   \directlua{luatexja.stack.set_stack_perchar(luatexja.stack_table_index.#1,#2,#3)}}
333
334 % jatextfont = {<char_code>, <font_cs>}
335 % only horizontal font is supported
336 \define@key[ltj]{japaram}{jatextfont}{%
337   \expandafter\ltj@@set@stackfont#1:{MJT}}
338 \define@key[ltj]{japaram}{jascriptfont}{%
339   \expandafter\ltj@@set@stackfont#1:{MJS}}
340 \define@key[ltj]{japaram}{jascriptscriptfont}{%
341   \expandafter\ltj@@set@stackfont#1:{MJSS}}
342 \protected\def\ltj@@set@stackfont#1,#2:#3{%
343   \ltj@reset@globaldefs
344   \ltj@tempcnta=\ltj@curjfnt\ltj@curjfnt\m@ne#2%
345   \ifnum\ltj@curjfnt=\m@ne
346     \@PackageError{luatexja-core}%
347     {\string#2 is not a control sequence that represents \MessageBreak
348      a Japanese font}{}%
349   \else
350     \directlua{luatexja.stack.set_stack_font(luatexja.stack_table_index.#3,
351     \ltj@safe@num@or{nil}{#1}, \the\ltj@curjfnt)}%
352   \fi
353   \ltj@curjfnt=\ltj@tempcnta
354   \ltj@restore@globaldefs
355   }
356
357 % {y,t}{ja,al}baselineshift = <dimen>
358 % yjabaselineshift = <dimen>
359 \def\ltj@set@blshift@#1{\directlua{%
360   local n = token.scan_dimen()
361   tex.setattribute(luatexja.isglobal,
362     luatexbase.attributes['#1'], (n==0) and 0 or n)
363   %次期バージョンで ... and -0x7FFFFFFF or ... に変える
364 }}
365 \define@key[ltj]{japaram}{yalbaselineshift}{\ltj@set@blshift@{ltj@yablshift}#1\relax}
366 \define@key[ltj]{japaram}{yjabaselineshift}{\ltj@set@blshift@{ltj@ykblshift}#1\relax}
367 \define@key[ltj]{japaram}{talbaselineshift}{\ltj@set@blshift@{ltj@tablshift}#1\relax}
368 \define@key[ltj]{japaram}{tjabaselineshift}{\ltj@set@blshift@{ltj@tkblshift}#1\relax}
369
370 % jaxspmode = {<char_code>, <mode>}
371 % mode: inhibit, preonly, postonly, allow
372 %    or       0        1         2      3
373 \define@key[ltj]{japaram}{jaxspmode}{%        \inhibitxspcode
374   \expandafter\ltj@set@jaxspmode#1:\relax}
375 \def\ltj@set@jaxspmode#1,#2:{%
376   \lowercase{\edef\ltj@temp{#2}}%
377   \def\ltj@tempa{inhibit}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{0}\fi
378   \def\ltj@tempa{preonly}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{1}\fi
379   \def\ltj@tempa{postonly}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{2}\fi
380   \def\ltj@tempa{allow}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{3}\fi
381   \ltj@@set@stack{XSP}03#1 \ltj@temp}
382
383 % alxspmode = {<char_code>, <mode>}
384 % mode: inhibit, preonly, postonly, allow
385 %    or       0        1         2      3
386 \define@key[ltj]{japaram}{alxspmode}{%        \inhibitxspcode
387   \expandafter\ltj@set@jaxspmode#1:\relax}% same code as jaxspmode
388
389 % autospacing = <bool> (default: true)
390 \define@boolkey[ltj]{japaram}{autospacing}[true]{%
391   \ifltj@japaram@autospacing
392     \directlua{luatexja.ext_print_global()}\unsetattribute\ltj@autospc
393   \else
394     \directlua{luatexja.ext_print_global()}\ltj@autospc\z@
395   \fi}
396
397 % autoxspacing = <bool> (default: true)
398 \define@boolkey[ltj]{japaram}{autoxspacing}[true]{%
399   \ifltj@japaram@autoxspacing
400     \directlua{luatexja.ext_print_global()}\unsetattribute\ltj@autoxspc
401   \else
402     \directlua{luatexja.ext_print_global()}\ltj@autoxspc\z@
403   \fi}
404
405 % [x]]kanjiskip = <skip>
406 \define@key[ltj]{japaram}{kanjiskip}{\ltjsetkanjiskip#1}
407 \define@key[ltj]{japaram}{xkanjiskip}{\ltjsetxkanjiskip#1}
408 \newluafunction\ltjsetkanjiskip@inner
409 \newluafunction\ltjsetxkanjiskip@inner
410 \directlua{
411   local t, scan_glue = lua.get_functions_table(), token.scan_glue
412   local sss, sti = luatexja.stack.set_stack_skip, luatexja.stack_table_index
413   t[\the\ltjsetkanjiskip@inner] = function()
414     local d = scan_glue(); sss(sti.KSK, d); node.free(d)
415   end
416   t[\the\ltjsetxkanjiskip@inner] = function()
417     local d = scan_glue(); sss(sti.XSK, d); node.free(d)
418   end
419 }
420 \protected\luadef\ltjsetkanjiskip \ltjsetkanjiskip@inner
421 \protected\luadef\ltjsetxkanjiskip\ltjsetxkanjiskip@inner
422
423 % jcharwidowpenalty = <count>
424 \define@key[ltj]{japaram}{jcharwidowpenalty}{%      %COUNT
425   \ltj@@set@stack{JWP}{-10000}{10000}\z@#1 }
426
427 % differentjfm = { large | small | average | pleft | pright | paverage | both}
428 \define@choicekey*+[ltj]{japaram}{differentjfm}[\ltj@temp\ltj@tempr]%
429   {large,small,average,pleft,pright,paverage,both}{%
430   \ifcase\ltj@tempr
431     \directlua{luatexja.jfmglue.diffmet_rule = math.max}\or
432     \directlua{luatexja.jfmglue.diffmet_rule = math.min}\or
433     \directlua{luatexja.jfmglue.diffmet_rule = math.two_average}\or
434     \directlua{luatexja.jfmglue.diffmet_rule = math.two_pleft}\or
435     \directlua{luatexja.jfmglue.diffmet_rule = math.two_pright}\or
436     \directlua{luatexja.jfmglue.diffmet_rule = math.two_paverage}\or
437     \directlua{luatexja.jfmglue.diffmet_rule = math.two_add}
438   \fi
439 }{\@PackageError{luatexja}{invalid argument `#1' for `differentjfm'}{%
440   Argument for `differentjfm' must be one of `large', `small', `average',^^J%
441   `pleft', `pright', 'paverage' or `both'. }}
442   % large, small, average, pleft, pright, paverage, both
443
444
445 % jacharrange = { +-<range_number> }
446 \define@key[ltj]{japaram}{jacharrange}{\expandafter\ltj@@scrange#1,,}
447 \def\ltj@@scrange#1,{%
448   \edef\ltj@temp{#1}%
449   \ifx\ltj@temp\empty\let\ltj@@next=\relax\else\let\ltj@@next=\ltj@@scrange
450     \directlua{luatexja.charrange.toggle_char_range(%
451       luatexja.is_global,\ltj@safe@num@or{nil}{#1})}%
452   \fi\ltj@@next
453 }
454
455 \protected\def\ltj@setpar@global{%
456   \relax\ifnum\globaldefs>0\directlua{luatexja.isglobal='global'}%
457     \else\directlua{luatexja.isglobal=''}\fi
458 }
459 \protected\def\ltjsetparameter#1{%
460   \ltj@@start@time@measure{set_par}%
461   \ltj@setpar@global\setkeys[ltj]{japaram}{#1}%
462   \ltj@@stop@time@measure{set_par}%
463   \ignorespaces}
464 \protected\def\ltjglobalsetparameter#1{%
465   \relax\ifnum\globaldefs<0\directlua{luatexja.isglobal=''}%
466     \else\directlua{luatexja.isglobal='global'}\fi%
467   \ltj@@start@time@measure{set_par}%
468   \setkeys[ltj]{japaram}{#1}%
469   \ltj@@stop@time@measure{set_par}%
470   \ignorespaces}
471
472 %%%%%%%% \ltjgetparameter
473 \def\ltj@@decl@array@param#1{%
474   \expandafter\let\csname ltj@@array@param/#1\endcsname=t%
475 }
476 \ltj@@decl@array@param{prebreakpenalty}
477 \ltj@@decl@array@param{postbreakpenalty}
478 \ltj@@decl@array@param{jaxspmode}
479 \ltj@@decl@array@param{alxspmode}
480 \ltj@@decl@array@param{kcatcode}
481 \ltj@@decl@array@param{jacharrange}
482 \ltj@@decl@array@param{chartorange}
483 \ltj@@decl@array@param{boxdir}
484 \def\ltjgetparameter#1{%
485   \ltj@@start@time@measure{get_par}%
486   % stop call is moved in luatexja.lua
487   \ifcsname ltj@@array@param/#1\endcsname
488     \expandafter\ltx@firstoftwo
489   \else
490     \expandafter\ltx@secondoftwo
491   \fi
492   {\ltj@@getparam@two{#1}}%
493   {\ltj@@getparam@one{#1}}%
494 }
495 \newluafunction\ltj@@getparam@one@inner
496 \directlua{
497   (lua.get_functions_table())[\the\ltj@@getparam@one@inner] = luatexja.ext_get_parameter_unary
498 }
499 \luadef\ltj@@getparam@one\ltj@@getparam@one@inner
500 \def\ltj@@getparam@two#1#2{%
501   \directlua{luatexja.ext_get_parameter_binary('#1', \ltj@safe@num@or{nil}{#2})}%
502 }
503
504 %%%%%%%% \ltjalchar<number>, \ltjjachar<number>
505 \let\ltj@@origchar=\char
506 \newluafunction\ltj@alljachar@inner
507 \directlua{
508   local t, set_attr = lua.get_functions_table(), tex.setattribute
509   local get_attr, floor = tex.getattribute, math.floor
510   local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
511   local lang_ja = luatexja.lang_ja
512   t[\the\ltj@alljachar@inner] = function()
513     font.current(get_attr(attr_curjfnt)); tex.language=lang_ja;
514     for i=0,6 do
515       set_attr(luatexbase.attributes['ltj@kcat' .. floor(i)], 0)
516     end
517   end
518 }
519 \protected\luadef\ltj@alljachar\ltj@alljachar@inner
520 \protected\def\ltj@allalchar{\relax
521     \csname ltj@kcat0\endcsname="7FFFFFFF %"
522     \csname ltj@kcat1\endcsname="7FFFFFFF %"
523     \csname ltj@kcat2\endcsname="7FFFFFFF %"
524     \csname ltj@kcat3\endcsname="7FFFFFFF %"
525     \csname ltj@kcat4\endcsname="7FFFFFFF %"
526     \csname ltj@kcat5\endcsname="7FFFFFFF %"
527     \csname ltj@kcat6\endcsname="7FFFFFFF }%"
528
529 \protected\def\ltjjachar{\leavevmode\afterassignment\ltj@@jachar\ltj@tempcnta}
530 \def\ltj@@jachar{{\directlua{tex.globaldefs=0}\ltj@alljachar\ltj@@origchar\ltj@tempcnta}}
531 \protected\def\ltjalchar{\leavevmode\afterassignment\ltj@@alchar\ltj@tempcnta}
532 \def\ltj@@alchar{{\directlua{tex.globaldefs=0}\ltj@allalchar\ltj@@origchar\ltj@tempcnta}}
533
534 %%%%%%%% \ltjsetmathletter<number>, \ltjunsetmathletter<number>
535 \protected\def\ltjsetmathletter#1{%
536   \directlua{luatexja.math.is_math_letters[token.scan_int()]=true}#1\relax
537 }
538 \protected\def\ltjunsetmathletter#1{%
539   \directlua{luatexja.math.is_math_letters[token.scan_int()]=false}#1\relax
540 }
541
542 %%%%%%%% \ltjdeclarealtfont<base_font_cs><alt_font_cs>{100-200,3000-,5000,...}
543 % <base_font_cs> の 第 3 引数の文字達は <alt_font_cs> で組む
544 % いつも global
545 \def\ltj@@getjfontnumber#1{% result in \ltj@tempcntc
546   \ltj@reset@globaldefs
547   \begingroup\ltj@curjfnt\m@ne\ltj@curtfnt\m@ne\relax
548   #1\directlua{luatexja.__temp = -(\the\ltj@curjfnt)*(\the\ltj@curtfnt)}\endgroup
549   \ltj@tempcntc=\directlua{tex.sprint(-2,luatexja.__temp)}\relax
550   \ifnum\ltj@tempcntc=\m@ne
551     \@PackageError{luatexja-core}%
552     {\string#1 is not a control sequence that represents \MessageBreak
553      a Japanese font}{I'll use the current horizontal Japanese font instead.^^J}%
554     \ltj@tempcntc=\ltj@curjfnt
555   \fi\ltj@restore@globaldefs}
556
557 \protected\def\ltjdeclarealtfont#1#2#3{%
558   {\ltj@@getjfontnumber#1\@tempcnta=\ltj@tempcntc% \@tempcnta: 基底フォント
559    \ltj@@getjfontnumber#2%
560    \expandafter\ltj@@altfont#3,,}\ignorespaces}
561 \def\ltj@@altfont#1,{\def\ltj@temp{#1}%
562   \ifx\ltj@temp\empty\let\@next=\relax\else
563   \ltj@@altfontA{#1}\let\@next=\ltj@@altfont\fi\@next}
564 \def\ltj@@altfontA#1{\ltj@@altfontB#1--\@nil}
565 \def\ltj@@altfontB#1-#2-#3\@nil{\def\ltj@temp{#3}%
566   \ifx\ltj@temp\empty
567     \ltj@tempcnta=#1 \ltj@tempcntb=\ltj@tempcnta
568   \else
569     \def\ltj@temp{#1}%
570     \ifx\ltj@temp\empty\ltj@tempcnta='200\else\ltj@tempcnta=#1\fi\relax
571     \def\ltj@temp{#2}%
572     \ifx\ltj@temp\empty\ltj@tempcntb="10FFFF\else\ltj@tempcntb=#2\fi\relax%"
573   \fi
574   \directlua{luatexja.jfont.set_alt_font(
575     \the\ltj@tempcnta,\the\ltj@tempcntb,
576     \the\ltj@tempcntc, \the\@tempcnta)}%
577   }
578
579 %%%%%%%% \ltjclearaltfont<font_cs>
580 % <font_cs> の文字は全部 <font_cs> 本来の文字で組む
581 \protected\def\ltjclearaltfont#1{%
582   {\ltj@@getjfontnumber#1%
583    \directlua{luatexja.jfont.clear_alt_font(\the\ltj@tempcntc)}}\ignorespaces}
584
585
586 %%%%%%%% \yoko, \tate,\dtou
587 \protected\def\tate{%
588   \directlua{luatexja.direction.set_list_direction(3, 'tate')}%
589 }
590 \protected\def\yoko{%
591   \directlua{luatexja.direction.set_list_direction(4, 'yoko')}%
592 }
593 \protected\def\dtou{%
594   \directlua{luatexja.direction.set_list_direction(1, 'dtou')}%
595 }
596 \protected\def\utod{% 「縦数式ディレクション」
597   \directlua{luatexja.direction.set_list_direction(11, 'utod')}%
598 }
599 \define@key[ltj]{japaram}{direction}{%% always local
600   \directlua{luatexja.direction.set_list_direction(1, 'ltjsetparameter')}%
601 }
602
603 \yoko
604
605 %%%% insert
606 \let\ltj@@orig@insert\insert
607 \newluafunction\ltj@@lua@populate@insertwhatsit@inner
608 \directlua{
609   (lua.get_functions_table())[\the\ltj@@lua@populate@insertwhatsit@inner]
610     = luatexja.direction.populate_insertion_dir_whatsit
611 }
612 \luadef\ltj@@lua@populate@insertwhatsit\ltj@@lua@populate@insertwhatsit@inner
613 \protected\def\ltj@@insert{\begingroup\afterassignment\ltj@@insert@A\ltj@tempcnta}
614 \let\insert\ltj@@insert %% PRIMITIVE
615 \protected\def\ltj@@insert@A{\ltj@@orig@insert\ltj@tempcnta\bgroup
616   \aftergroup\ltj@@insert@B\let\ltj@@next}
617 \protected\def\ltj@@insert@B{\ltj@@lua@populate@insertwhatsit\endgroup}
618
619 %%%% vadjust
620 \let\ltj@@orig@vadjust\vadjust
621 \newluafunction\ltj@@vadjust@begin@inner
622 \newluafunction\ltj@@vadjust@dirhook@inner
623 \newluafunction\ltj@@vadjust@check@dir@inner
624 \directlua{
625   local t = lua.get_functions_table()
626   t[\the\ltj@@vadjust@begin@inner] = luatexja.direction.adjust_begin
627   t[\the\ltj@@vadjust@dirhook@inner]
628     = function () luatexja.direction.set_list_direction_hook('adj') end
629   t[\the\ltj@@vadjust@check@dir@inner] = luatexja.direction.check_adjust_direction
630 }
631 \protected\luadef\ltj@@vadjust\ltj@@vadjust@begin@inner
632 \luadef\ltj@@vadjust@dirhook\ltj@@vadjust@dirhook@inner
633 \protected\luadef\ltj@@vadjust@check@dir\ltj@@vadjust@check@dir@inner
634 \def\ltj@@vadjust@pre{\ltj@@orig@vadjust pre\bgroup\ltj@@vadjust@dirhook
635   \aftergroup\ltj@@vadjust@check@dir\let\ltj@@next}
636 \def\ltj@@vadjust@post{\ltj@@orig@vadjust\bgroup\ltj@@vadjust@dirhook
637   \aftergroup\ltj@@vadjust@check@dir\let\ltj@@next}
638 \let\vadjust\ltj@@vadjust %% PRIMITIVE
639
640 %%%% \hbox, \vbox, \vtop
641 \setbox\z@\hbox{%
642   \primitive\everymath{}%
643   $\directlua{% This value depends on the version of LuaTeX.
644      luatexja.stack.mmode = -tex.getnest().mode
645   }$%
646 }
647 \setbox\z@\box\voidb@x
648 \newluafunction\ltj@@box@dirhook@inner
649 \newluafunction\ltj@@reset@badness@inner
650 \directlua{
651   local t, ltjd = lua.get_functions_table(), luatexja.direction
652   t[\the\ltj@@box@dirhook@inner]
653     = function() ltjd.set_list_direction_hook() end
654   t[\the\ltj@@reset@badness@inner] = function()
655     if luatexja.global_temp then
656       tex.hbadness= tex.hbadness or luatexja.hbadness_temp
657       tex.vbadness= tex.vbadness or luatexja.vbadness_temp
658       tex.globaldefs= luatexja.global_temp or tex.globaldefs
659     end
660   end
661 }
662 \luadef\ltj@@box@dirhook\ltj@@box@dirhook@inner
663 \ifltj@everyhook@avail% using everyhook package
664   \PushPreHook{hbox}{\ltj@@box@dirhook\aftergroup\ltj@@reset@badness}
665   \PushPreHook{vbox}{\ltj@@box@dirhook\aftergroup\ltj@@reset@badness}
666 \else
667   \let\ltj@@everyhbox\everyhbox\let\ltj@@everyvbox\everyvbox
668   \newtoks\ltj@@i@everyhbox\newtoks\ltj@@i@everyvbox
669   \let\everyhbox\ltj@@i@everyhbox\let\everyvbox\ltj@@i@everyvbox
670   \ltj@@everyhbox{\ltj@@box@dirhook
671     \aftergroup\ltj@@reset@badness\the\ltj@@i@everyhbox}
672   \ltj@@everyvbox{\ltj@@box@dirhook
673     \aftergroup\ltj@@reset@badness\the\ltj@@i@everyvbox}
674 \fi
675
676 \luadef\ltj@@reset@badness\ltj@@reset@badness@inner
677
678 %%%% \raise, \lower, \moveleft, \moveright
679 \newluafunction\ltj@@lua@raisebox@inner
680 \directlua{
681   (lua.get_functions_table())[\the\ltj@@lua@raisebox@inner]=luatexja.direction.raise_box
682 }
683 \protected\luadef\ltj@@lua@raisebox\ltj@@lua@raisebox@inner
684 \let\ltj@@orig@raise\raise
685 \let\ltj@@orig@lower\lower
686 \protected\def\ltj@@raise{\ltj@reset@globaldefs\afterassignment\ltj@@raise@\ltj@tempdima}
687 \protected\def\ltj@@lower{\ltj@reset@globaldefs\afterassignment\ltj@@raise@\ltj@tempdima-}
688 \protected\def\ltj@@raise@{%
689   \ltj@restore@globaldefs
690   \edef\ltj@@raise@a{%
691     \ltj@@lua@raisebox\ltj@@orig@raise\the\ltj@tempdima\noexpand\box\ltj@afbox
692   }\ltj@afterbox\ltj@@raise@a}
693 \let\ltj@@orig@moveleft\moveleft
694 \let\ltj@@orig@moveright\moveright
695 \protected\def\ltj@@moveleft{\ltj@reset@globaldefs\afterassignment\ltj@@moveleft@\ltj@tempdima}
696 \protected\def\ltj@@moveright{\ltj@reset@globaldefs\afterassignment\ltj@@moveleft@\ltj@tempdima-}
697 \protected\def\ltj@@moveleft@{%
698   \ltj@restore@globaldefs
699   \edef\ltj@@moveleft@a{%
700     \ltj@@lua@raisebox\ltj@@orig@moveleft\the\ltj@tempdima\noexpand\box\ltj@afbox
701   }\ltj@afterbox\ltj@@moveleft@a}
702 \let\raise\ltj@@raise %% PRIMITIVE
703 \let\lower\ltj@@lower %% PRIMITIVE
704 \let\moveleft\ltj@@moveleft %% PRIMITIVE
705 \let\moveright\ltj@@moveright %% PRIMITIVE
706
707 %%%%\vsplit
708 \newluafunction\ltj@@vsplit@inner
709 \directlua{
710   (lua.get_functions_table())[\the\ltj@@vsplit@inner]=luatexja.direction.vsplit
711 }
712 \let\ltj@@orig@vsplit\vsplit
713 \protected\def\ltj@@vsplit{\luafunction\ltj@@vsplit@inner}
714 \let\vsplit\ltj@@vsplit %% PRIMITIVE
715
716 %%%% \vcenter
717 \let\ltj@@orig@vcenter\vcenter
718 \protected\def\ltj@@vcenter{\ltj@afterbox\ltj@@vcenter@\vbox}
719 \protected\def\ltj@@vcenter@{%
720   \ltj@@lua@raisebox\ltj@@orig@vcenter{\box\ltj@afbox}%
721 }
722 \let\vcenter\ltj@@vcenter %% PRIMITIVE
723
724 %%%% \unhbox and \unvbox
725 \newluafunction\ltj@@lua@unboxcheckdir@inner
726 \newluafunction\ltj@@lua@uncopycheckdir@inner
727 \newluafunction\ltj@@lua@uncopy@restore@whatsit@inner
728 \directlua{
729   local t = lua.get_functions_table()
730   t[\the\ltj@@lua@unboxcheckdir@inner]=luatexja.direction.unbox_check_dir
731   t[\the\ltj@@lua@uncopycheckdir@inner]=luatexja.direction.uncopy_check_dir
732   t[\the\ltj@@lua@uncopy@restore@whatsit@inner]=luatexja.direction.uncopy_restore_whatsit
733 }
734 \luadef\ltj@@lua@unboxcheckdir\ltj@@lua@unboxcheckdir@inner
735 \luadef\ltj@@lua@uncopycheckdir\ltj@@lua@uncopycheckdir@inner
736 \luadef\ltj@@lua@uncopy@restore@whatsit\ltj@@lua@uncopy@restore@whatsit@inner
737 \long\def \@gobbletwo #1#2{}
738 \let\ltj@@orig@unhbox\unhbox
739 \let\ltj@@orig@unvbox\unvbox
740 \protected\def\ltj@@unhbox{\ltj@reset@globaldefs\afterassignment\ltj@@unhbox@\ltj@tempcnta}
741 \protected\def\ltj@@unvbox{\ltj@reset@globaldefs\afterassignment\ltj@@unvbox@\ltj@tempcnta}
742 \protected\def\ltj@@unhbox@{\ltj@@lua@unboxcheckdir\expandafter\ltj@@orig@unhbox\the\ltj@tempcnta\relax}
743 \protected\def\ltj@@unvbox@{\ltj@@lua@unboxcheckdir\expandafter\ltj@@orig@unvbox\the\ltj@tempcnta\relax}
744 \let\ltj@@orig@unhcopy\unhcopy
745 \let\ltj@@orig@unvcopy\unvcopy
746 \protected\def\ltj@@unhcopy{\ltj@reset@globaldefs\afterassignment\ltj@@unhcopy@\ltj@tempcnta}
747 \protected\def\ltj@@unvcopy{\ltj@reset@globaldefs\afterassignment\ltj@@unvcopy@\ltj@tempcnta}
748 \protected\def\ltj@@unhcopy@{%
749   \ltj@@lua@uncopycheckdir\expandafter\ltj@@orig@unhcopy\the\ltj@tempcnta\relax
750   \ltj@@lua@uncopy@restore@whatsit}%
751 \protected\def\ltj@@unvcopy@{%
752   \ltj@@lua@uncopycheckdir\expandafter\ltj@@orig@unvcopy\the\ltj@tempcnta\relax
753   \ltj@@lua@uncopy@restore@whatsit}%
754 \let\unhbox\ltj@@unhbox %% PRIMITIVE
755 \let\unvbox\ltj@@unvbox %% PRIMITIVE
756 \let\unhcopy\ltj@@unhcopy %% PRIMITIVE
757 \let\unvcopy\ltj@@unvcopy %% PRIMITIVE
758
759 %%%% lastbox
760 \let\ltj@@orig@lastbox=\lastbox
761 \protected\def\ltj@@lastbox{\directlua{luatexja.direction.lastbox_hook()}\ltj@@orig@lastbox}
762 \let\lastbox\ltj@@lastbox %% PRIMITIVE
763
764 %%%%%%%% \ltjgetwd<box_num> etc.
765 \def\ltj@@getwd{\directlua{luatexja.direction.get_box_dim('width', token.scan_int())}}
766 \def\ltj@@getht{\directlua{luatexja.direction.get_box_dim('height', token.scan_int())}}
767 \def\ltj@@getdp{\directlua{luatexja.direction.get_box_dim('depth', token.scan_int())}}
768 \let\ltjgetwd=\ltj@@getwd\let\ltjgetht=\ltj@@getht\let\ltjgetdp=\ltj@@getdp
769
770 %%%%%%%% \ltjsetwd<box_num>=<dimen> etc.
771 \protected\def\ltjsetwd{\directlua{luatexja.direction.set_box_dim('width')}}
772 \protected\def\ltjsetht{\directlua{luatexja.direction.set_box_dim('height')}}
773 \protected\def\ltjsetdp{\directlua{luatexja.direction.set_box_dim('depth')}}
774
775
776 %%------------------ Load module for the format
777
778 \directlua{luatexja.load_kinsoku()}
779 \ifltj@in@latex                 %<*LaTeX>
780   \RequirePackage{ltj-latex}
781 \else\ifltj@in@plain            %<*plain>
782   \input ltj-plain.sty %
783 \fi\fi                          %</LaTeX|plain>
784
785 \newcatcodetable\ltj@temp@cctb
786 \def\ltj@overwrite@catcodetable#1{%
787   \setluatexcatcodetable\ltj@temp@cctb{\luatexcatcodetable#1}%
788   \setluatexcatcodetable#1{\luatexcatcodetable\ltj@temp@cctb\catcode\ltjlineendcomment=14}%"
789 }
790 \ltj@overwrite@catcodetable\CatcodeTableLaTeX
791 \ltj@overwrite@catcodetable\CatcodeTableLaTeXAtLetter
792 \ltj@overwrite@catcodetable\CatcodeTableExpl
793
794
795 %%------------------ all done
796 \ltj@core@AtEnd
797 \endinput
798 %% EOF