OSDN Git Service

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