OSDN Git Service

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