1 % LuaTeX-ja core TeX source
10 \ifdefined\ltj@loaded\endinput\fi
13 \newcount\ltj@tempcnta
14 \newcount\ltj@tempcntb
15 \newcount\ltj@tempcntc
16 \newdimen\ltj@tempdima
19 \newcount\ltj@autoxspc
21 \newcount\jcharwidowpenalty
26 \newdimen\jQ \jQ=0.25mm
27 \newdimen\jH \jH=0.25mm
29 %%%%%%%% Attributes for Japanese typesetting.
30 \newluatexattribute\ltj@curjfnt % index for ``current Japanese font''
31 \newluatexattribute\ltj@charclass %
32 \newluatexattribute\ltj@yablshift % attribute for \yabaselineshift
33 \newluatexattribute\ltj@ykblshift % attribute for \ykbaselineshift
34 \newluatexattribute\ltj@icflag % attribute for italic correction
35 \newlanguage\ltj@japanese
37 %%%%%%%% Loading lua files
41 function ltj.loadlua(file)
42 local path = assert(kpse.find_file(file, 'tex'),
43 "File '"..file.."' not found")
44 texio.write_nl("("..path..")")
48 ltj.loadlua('luatexja-rmlgbm.lua')
49 % For Ryumin-Light and GothicBBB-Medium.
50 ltj.loadlua('luatexja-jfont.lua')
51 ltj.loadlua('luatexja-core.lua')
52 ltj.loadlua('luatexja-xkanji.lua')
53 ltj.loadlua('luatexja-core-aux.lua')
57 %%%%%%%% Attributes for character ranges
59 \loop\ifnum\ltj@tempcnta<7
60 \expandafter\newluatexattribute%
61 \csname ltj@kcat\the\ltj@tempcnta\endcsname
62 \csname ltj@kcat\the\ltj@tempcnta\endcsname=0
63 \advance\ltj@tempcnta by1
67 \def\asluastring#1{'\luaescapestring{\detokenize{#1}}'}
70 %\let\ltj@ic=\/ \protected\def\/{{\ltj@icflag=1\ltj@ic}}
71 \protected\def\/{\directlua{ltj.ext_append_italic()}}
73 %%%%%%%% \jfont\CS={...:...;jfm=metric;...}, \globaljfont
74 \protected\def\jfont{\afterassignment\ltj@@jfont\directlua{ltj.ext_jfontdefX(false)}}
75 \protected\def\globaljfont{%
76 \afterassignment\ltj@@jfont\directlua{ltj.ext_jfontdefX(true)}}
77 \def\ltj@@jfont{\directlua{ltj.ext_jfontdefY()}}
80 \protected\def\inhibitglue{\directlua{ltj.ext_create_inhibitglue_node()}}
82 %%%%%%%% \ltjdefcharrange<name>{100-200,3000-,5000,...}
83 \protected\def\ltjdefcharrange#1#2{%
84 \ltj@tempcntc=#1 \expandafter\ltj@@dcrange#2,,\ignorespaces}
85 \def\ltj@@dcrange#1,{\def\ltj@temp{#1}%
86 \ifx\ltj@temp\empty\let\@next=\relax\else
87 \ltj@@dcrangeA{#1}\let\@next=\ltj@@dcrange\fi\@next}
88 \def\ltj@@dcrangeA#1{\ltj@@dcrangeB#1--\@nil}
89 \def\ltj@@dcrangeB#1-#2-#3\@nil{\def\ltj@temp{#3}%
91 \ltj@tempcnta=#1 \ltj@tempcntb=\ltj@tempcnta
94 \ifx\ltj@temp\empty\ltj@tempcnta='200 \else\ltj@tempcnta=#1 \fi
96 \ifx\ltj@temp\empty\ltj@tempcntb="10FFFF \else\ltj@tempcntb=#2 \fi%"
98 \directlua{ltj.ext_add_char_range(\the\ltj@tempcnta,\the\ltj@tempcntb,
102 %%%%%%%% \ltjsetparameter
103 \newcount\ltj@@stack \newcount\ltj@@group@level
104 \ltj@@group@level=0 \ltj@@stack=0
106 % prebreakpenalty = {<char_code>, <penalty>}
107 \define@key[ltj]{japaram}{kcatcode}{%
108 \expandafter\ltj@@set@stack#1:{kcat}{0}{0x7FFFFFFF}}
109 \define@key[ltj]{japaram}{prebreakpenalty}{%
110 \expandafter\ltj@@set@stack#1:{pre}{-10000}{10000}}
111 \define@key[ltj]{japaram}{postbreakpenalty}{%
112 \expandafter\ltj@@set@stack#1:{post}{-10000}{10000}}
113 \def\ltj@@set@stack#1,#2:#3#4#5{%
114 \ltj@tempcnta=#1\relax \ltj@tempcntb=#2\relax
115 \directlua{ltj.ext_set_stack_table(ltj.isglobal, \asluastring{#3},
116 \the\ltj@tempcnta,tex.getcount('ltj@tempcntb'),#4,#5)}}
118 % yalbaselineshift = <dimen>
119 % yjabaselineshift = <dimen>
120 \define@key[ltj]{japaram}{yalbaselineshift}{%
121 \ltj@tempdima=#1\relax%
122 \directlua{tex.setattribute(ltj.isglobal,
123 luatexbase.attributes['ltj@yablshift'],
124 tex.getdimen('ltj@tempdima'))}}
125 \define@key[ltj]{japaram}{yjabaselineshift}{%
126 \ltj@tempdima=#1\relax%
127 \directlua{tex.setattribute(ltj.isglobal,
128 luatexbase.attributes['ltj@ykblshift'],
129 tex.getdimen('ltj@tempdima'))}}
131 % jaxspmode = {<char_code>, <mode>}
132 % mode: inhibit, preonly, postonly, allow
134 \define@key[ltj]{japaram}{jaxspmode}{% \inhibitxspcode
135 \expandafter\ltj@set@jaxspmode#1:\relax}
136 \def\ltj@set@jaxspmode#1,#2:{%
137 \lowercase{\edef\ltj@temp{#2}}%
138 \def\ltj@tempa{inhibit}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{0}\fi
139 \def\ltj@tempa{preonly}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{2}\fi
140 \def\ltj@tempa{postonly}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{1}\fi
141 \def\ltj@tempa{allow}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{3}\fi
142 \ltj@tempcnta=#1\relax\ltj@tempcntb=\ltj@temp\relax
143 \directlua{ltj.ext_set_stack_table(ltj.isglobal, 'xsp', \the\ltj@tempcnta,
144 \the\ltj@tempcntb,0,3)}}
146 % alxspmode = {<char_code>, <mode>}
147 % mode: inhibit, preonly, postonly, allow
149 \define@key[ltj]{japaram}{alxspmode}{% \inhibitxspcode
150 \expandafter\ltj@set@alxspmode#1:\relax}
151 \def\ltj@set@alxspmode#1,#2:{%
152 \lowercase{\edef\ltj@temp{#2}}%
153 \def\ltj@tempa{inhibit}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{0}\fi
154 \def\ltj@tempa{preonly}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{1}\fi
155 \def\ltj@tempa{postonly}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{2}\fi
156 \def\ltj@tempa{allow}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{3}\fi
157 \ltj@tempcnta=#1\relax\ltj@tempcntb=\ltj@temp\relax
158 \directlua{ltj.ext_set_stack_table(ltj.isglobal, 'xsp', \the\ltj@tempcnta,
159 \the\ltj@tempcntb,0,3)}}
161 % autospacing = <bool> (default: true)
162 \define@boolkey[ltj]{japaram}{autospacing}[true]{%
163 \ifltj@japaram@autospacing
164 \directlua{ltj.auto_spacing=true}%
166 \directlua{ltj.auto_spacing=false}%
170 % autoxspacing = <bool> (default: true)
171 \define@boolkey[ltj]{japaram}{autoxspacing}[true]{%
172 \ifltj@japaram@autoxspacing
173 \directlua{ltj.auto_xspacing=true}%
175 \directlua{ltj.auto_xspacing=false}%
179 \define@key[ltj]{japaram}{kanjiskip}{% % SKIP
180 \directlua{ltj.ext_print_global()}\kanjiskip=#1 }
181 \define@key[ltj]{japaram}{xkanjiskip}{% % SKIP
182 \directlua{ltj.ext_print_global()}\xkanjiskip=#1 }
183 \define@key[ltj]{japaram}{jcharwidowpenalty}{% %COUNT
184 \directlua{ltj.ext_print_global()}\jcharwidowpenalty=#1 }
186 % differentjfm = { large | small | average | both }
187 \define@choicekey*+[ltj]{japaram}{differentjfm}[\ltj@temp\ltj@tempr]%
188 {large,small,average,both}{%
190 \directlua{ltj.calc_between_two_jchar_aux=ltj.calc_between_two_jchar_aux_large}\or
191 \directlua{ltj.calc_between_two_jchar_aux=ltj.calc_between_two_jchar_aux_small}\or
192 \directlua{ltj.calc_between_two_jchar_aux=ltj.calc_between_two_jchar_aux_average}\or
193 \directlua{ltj.calc_between_two_jchar_aux=ltj.calc_between_two_jchar_aux_both}%
195 }{\@PackageWarning{luatexja}{ignored invalid argument '#1' for 'differentjfm'}}
196 % large, small, average, both
199 % jacharrange = { +-<range_number> }
200 \define@key[ltj]{japaram}{jacharrange}{\expandafter\ltj@@scrange#1,,}
201 \def\ltj@@scrange#1,{%
203 \ifx\ltj@temp\empty\let\next=\relax\else\let\next=\ltj@@scrange
204 \ltj@tempcnta=#1 \directlua{ltj.ext_toggle_char_range(%
205 ltj.is_global,\the\ltj@tempcnta)}%
209 \protected\def\ltjsetparameter#1{\directlua{ltj.isglobal=''}%
210 \setkeys[ltj]{japaram}{#1}\ignorespaces}
211 \protected\def\ltjglobalsetparameter#1{\directlua{ltj.isglobal='global'}%
212 \setkeys[ltj]{japaram}{#1}\ignorespaces}
215 \def\ltj@@decl@array@param#1{%
216 \expandafter\let\csname ltj@@array@param/#1\endcsname=t%
218 \ltj@@decl@array@param{prebreakpenalty}
219 \ltj@@decl@array@param{postbreakpenalty}
220 \ltj@@decl@array@param{jaxspmode}
221 \ltj@@decl@array@param{alxspmode}
222 \ltj@@decl@array@param{kcatcode}
223 \ltj@@decl@array@param{jacharrange}
224 \ltj@@decl@array@param{chartorange}
225 \def\ltjgetparameter#1{%
226 \ifcsname ltj@@array@param/#1\endcsname
227 \expandafter\ltx@firstoftwo
229 \expandafter\ltx@secondoftwo
231 {\ltj@@getparam@two{#1}}%
232 {\ltj@@getparam@one{#1}}%
234 \def\ltj@@getparam@one#1{%
235 \directlua{ltj.ext_get_parameter_unary('#1')}}
236 \def\ltj@@getparam@two#1#2{\ltj@tempcnta=#2
237 \directlua{ltj.ext_get_parameter_binary('#1', \the\ltj@tempcnta)}
243 \ifx\fmtname\ltj@temp
244 \message{plain format: loading luatexja-plain.tex}
246 \input luatexja-plain.tex