OSDN Git Service

1c1880a5deeb874116a076a0ba6b64bf80a1d4b8
[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 xkeyval.tex
8 \input infwarerr.sty
9 \ifdefined\luatexja@loaded\endinput\fi
10 \def\luatexja@loaded{hoge}
11
12 \newcount\luatexja@tempcnta
13 \newcount\luatexja@tempcntb
14 \newcount\luatexja@tempcntc
15 \newdimen\luatexja@tempdima
16
17 \newcount\luatexja@autospc
18 \newcount\luatexja@autoxspc
19
20 \newcount\jcharwidowpenalty
21 \newskip\kanjiskip
22 \newskip\xkanjiskip
23 \newdimen\zw
24 \newdimen\zh
25 \newdimen\jQ \jQ=0.25mm
26 \newdimen\jH \jH=0.25mm
27
28 %%%%%%%% Attributes for Japanese typesetting.
29 \newluatexattribute\luatexja@curjfnt   % index for ``current Japanese font''
30 \newluatexattribute\luatexja@charclass % 
31 \newluatexattribute\luatexja@yablshift % attribute for \yabaselineshift
32 \newluatexattribute\luatexja@ykblshift % attribute for \ykbaselineshift
33 \newluatexattribute\luatexja@icflag    % attribute for italic correction
34 \newlanguage\luatexja@japanese
35
36 %%%%%%%% Loading lua files
37 \directlua{%
38   utf = unicode.utf8
39   ltj = {}
40   function ltj.loadlua(file)
41     local path = assert(kpse.find_file(file, 'tex'),
42       "File '"..file.."' not found")
43     texio.write_nl("("..path..")")
44     dofile(path)
45   end
46   require('lualibs')
47   ltj.loadlua('luatexja-rmlgbm.lua') 
48     % For Ryumin-Light and GothicBBB-Medium.
49   ltj.loadlua('luatexja-core.lua')
50   ltj.loadlua('luatexja-jfont.lua')
51   ltj.loadlua('luatexja-core-aux.lua')
52   ltj.ja_lang_number=\the\luatexja@japanese
53 }
54
55
56 %%%%%%%% Attributes for character ranges
57 \luatexja@tempcnta=0
58 \loop\ifnum\luatexja@tempcnta<7
59   \expandafter\newluatexattribute%
60     \csname luatexja@kcat\the\luatexja@tempcnta\endcsname
61   \csname luatexja@kcat\the\luatexja@tempcnta\endcsname=0
62   \advance\luatexja@tempcnta by1
63 \repeat
64
65 %%%%%%%% \asluastring
66 \def\asluastring#1{'\luaescapestring{\detokenize{#1}}'}
67
68 %%%%%%%% Redefine \/
69 \let\luatexja@ic=\/ \protected\def\/{{\luatexja@icflag=1\luatexja@ic}}
70
71 %%%%%%%% \jfont\CS={...:...;jfm=metric;...}, \gjfont
72 \def\jfont{\afterassignment\@jfont\directlua{ltj.jfontdefX('false')}}
73 \def\gjfont{\afterassignment\@jfont\directlua{ltj.jfontdefX('true')}}
74 \def\@jfont{\directlua{ltj.jfontdefY()}}
75
76 %%%%%%%% \inhibitglue
77 \def\inhibitglue{\directlua{ltj.create_ihb_node()}}
78
79 %%%%%%%% \defcharrange<name>{100-200,3000-,5000,...}
80 \def\defcharrange#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@@dcrange{#1}\let\@next=\ltj@dcrange\fi\@next}
85 \def\ltj@@dcrange#1{\ltj@enexist#1--\@nil}
86 \def\ltj@enexist#1-#2-#3\@nil{\def\ltj@temp{#3}%
87   \ifx\ltj@temp\empty
88     \luatexja@tempcnta=#1 \luatexja@tempcntb=\luatexja@tempcnta
89   \else
90     \def\ltj@temp{#1}%
91     \ifx\ltj@temp\empty\luatexja@tempcnta='200 \else\luatexja@tempcnta=#1 \fi
92     \def\ltj@temp{#2}%
93     \ifx\ltj@temp\empty\luatexja@tempcntb="10FFFF \else\luatexja@tempcntb=#2 \fi%"
94   \fi
95   \directlua{ltj.def_char_range(\the\luatexja@tempcnta,\the\luatexja@tempcntb,
96     \the\luatexja@tempcntc)}%
97   }
98
99 %%%%%%%% \setjaparameter
100 \newcount\ltj@stack@pbp\newcount\ltj@group@level@pbp
101 \ltj@group@level@pbp=0 \ltj@stack@pbp=0
102
103 % prebreakpenalty = {<char_code>, <penalty>}
104 \define@key[ltj]{japaram}{kcatcode}{%
105   \expandafter\luatexja@setbp#1:{kcat}{0}{0x7FFFFFFF}}
106 \define@key[ltj]{japaram}{prebreakpenalty}{%
107   \expandafter\luatexja@setbp#1:{pre}{-10000}{10000}}
108 \define@key[ltj]{japaram}{postbreakpenalty}{%
109   \expandafter\luatexja@setbp#1:{post}{-10000}{10000}}
110 \def\luatexja@setbp#1,#2:#3#4#5{
111   \luatexja@tempcnta=#1\relax
112   \luatexja@tempcntb=#2\relax
113   \directlua{ltj.set_ch_table(ltj.isglobal, \asluastring{#3},
114     tex.getcount('luatexja@tempcnta'),tex.getcount('luatexja@tempcntb'),#4,#5)}}
115
116 % yabaselineshift = <dimen>
117 \define@key[ltj]{japaram}{yabaselineshift}{%
118   \luatexja@tempdima=#1\relax%
119   \directlua{tex.setattribute(ltj.isglobal, 
120     luatexbase.attributes['luatexja@yablshift'],
121     tex.getdimen('luatexja@tempdima'))}}
122 \define@key[ltj]{japaram}{ykbaselineshift}{%
123   \luatexja@tempdima=#1\relax%
124   \directlua{tex.setattribute(ltj.isglobal, 
125     luatexbase.attributes['luatexja@ykblshift'],
126     tex.getdimen('luatexja@tempdima'))}}
127
128 % cjkxspmode = {<char_code>, <mode>}
129 % mode: inhibit, preonly, postonly, allow
130 %    or       0        2         1      3
131 \define@key[ltj]{japaram}{cjkxspmode}{%        \inhibitxspcode
132   \expandafter\luatexja@setjxspmode#1:\relax}
133 \def\luatexja@setjxspmode#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   \luatexja@tempcnta=#1\relax\luatexja@tempcntb=\ltj@temp\relax
140   \directlua{ltj.set_ch_table(ltj.isglobal, 'xsp', tex.getcount('luatexja@tempcnta'),
141     tex.getcount('luatexja@tempcntb'),0,3)}}
142
143 % asciixspmode = {<char_code>, <mode>}
144 % mode: inhibit, preonly, postonly, allow
145 %    or       0        1         2      3
146 \define@key[ltj]{japaram}{asciixspmode}{%        \inhibitxspcode
147   \expandafter\luatexja@setaxspmode#1:\relax}
148 \def\luatexja@setaxspmode#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   \luatexja@tempcnta=#1\relax\luatexja@tempcntb=\ltj@temp\relax
155   \directlua{ltj.set_ch_table(ltj.isglobal, 'xsp', tex.getcount('luatexja@tempcnta'),
156     tex.getcount('luatexja@tempcntb'),0,3)}}
157
158 % autospacing = <bool> (default: true)
159 \define@boolkey[ltj]{japaram}{autospacing}[true]{%
160   \ifltj@japaram@autospacing
161     \directlua{ltj.auto_spacing=true}%
162   \else
163     \directlua{ltj.auto_spacing=false}%
164   \fi
165   }
166
167 % autoxspacing = <bool> (default: true)
168 \define@boolkey[ltj]{japaram}{autoxspacing}[true]{%
169   \ifltj@japaram@autoxspacing
170     \directlua{ltj.auto_xspacing=true}%
171   \else
172     \directlua{ltj.auto_xspacing=false}%
173   \fi
174   }
175
176 \define@key[ltj]{japaram}{kanjiskip}{%              % SKIP
177   \directlua{ltj.print_global()}\kanjiskip=#1 }
178 \define@key[ltj]{japaram}{xkanjiskip}{%             % SKIP
179   \directlua{ltj.print_global()}\xkanjiskip=#1 }
180 \define@key[ltj]{japaram}{jcharwidowpenalty}{%      %COUNT
181   \directlua{ltj.print_global()}\jcharwidowpenalty=#1 }
182
183 % differentjfm = { large | small | average | both }
184 \define@choicekey*+[ltj]{japaram}{differentjfm}[\ltj@temp\ltj@result]%
185   {large,small,average,both}{%
186   \ifcase\ltj@result
187     \directlua{ltj.calc_between_two_jchar_aux=ltj.calc_between_two_jchar_aux_large}\or
188     \directlua{ltj.calc_between_two_jchar_aux=ltj.calc_between_two_jchar_aux_small}\or
189     \directlua{ltj.calc_between_two_jchar_aux=ltj.calc_between_two_jchar_aux_average}\or
190     \directlua{ltj.calc_between_two_jchar_aux=ltj.calc_between_two_jchar_aux_both}%
191   \fi
192 }{\@PackageWarning{luatexja}{ignored invalid argument '#1' for 'differentjfm'}}
193   % large, small, average, both
194
195
196 % jcharrange = { +-<range_number> }
197 \define@key[ltj]{japaram}{jcharrange}{\expandafter\@setjcharrange#1,,}
198 \def\@setjcharrange#1,{%
199   \edef\ltj@temp{#1}%
200   \ifx\ltj@temp\empty\let\next=\relax\else\let\next=\@setjcharrange
201     \luatexja@tempcnta=#1 \directlua{ltj.set_jchar_range(%
202       ltj.is_global,tex.getcount('luatexja@tempcnta'))}%
203   \fi\next
204 }
205
206
207
208
209
210 \def\setjaparameter#1{\directlua{ltj.isglobal=''}%
211   \setkeys[ltj]{japaram}{#1}\ignorespaces}
212 \def\globalsetjaparameter#1{\directlua{ltj.isglobal='global'}%
213   \setkeys[ltj]{japaram}{#1}\ignorespaces}
214
215 %%%%%%%% 
216 \def\getjaparameter#1{%
217   \lowercase{\edef\ltj@temp{#1}}\let\@next=\getjaparameter@one%
218   \def\ltj@tempa{prebreakpenalty}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
219   \def\ltj@tempa{postbreakpenalty}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
220   \def\ltj@tempa{cjkxspmode}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
221   \def\ltj@tempa{asciixspmode}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
222   \def\ltj@tempa{kcatcode}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
223   \def\ltj@tempa{jcharrange}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
224   \def\ltj@tempa{chartorange}\ifx\ltj@temp\ltj@tempa\let\@next=\getjaparameter@two\fi
225   \@next
226 }
227 \def\getjaparameter@one{\directlua{ltj.out_ja_parameter_one('\ltj@temp')}}
228 \def\getjaparameter@two#1{%
229   \luatexja@tempcnta=#1
230   \directlua{ltj.out_ja_parameter_two('\ltj@temp', tex.getcount('luatexja@tempcnta'))}
231 }
232
233
234
235 %%%%%%%% commands for ``compatibility''
236 % \def\setinhibitxspcode#1#2{\setjaparameter{cjkxspmode={#1,#2}}}
237 % \def\setxspcode#1#2{\setjaparameter{asciixspmode={#1,#2}}}
238 % \def\setprebreakpenalty#1#2{\setjaparameter{prebreakpenalty={#1,#2}}}
239 % \def\setpostbreakpenalty#1#2{\setjaparameter{prebreakpenalty={#1,#2}}}
240 % \def\getprebreakpenalty#1{\directlua{ltj.get_penalty_table('pre',#1)}\luatexja@tempcnta}
241 % \def\getpostbreakpenalty#1{\directlua{ltj.get_penalty_table('post',#1)}\luatexja@tempcnta}
242 % \def\autospacing{\luatexja@autospc=0 }
243 % \def\noautospacing{\luatexja@autospc=1 }
244 % \def\autoxspacing{\luatexja@autoxspc=0 }
245 % \def\noautoxspacing{\luatexja@autoxspc=1 }
246
247 \def\ltj@temp{plain}
248 \ifx\fmtname\ltj@temp
249   \message{plain format: loading luatexja-plain.tex}
250 \fi
251 \input luatexja-plain.tex
252 \catcode`\@=12
253 \endinput