OSDN Git Service

sync with platex/38850f0e94b
[luatex-ja/luatexja.git] / src / patches / lltjfont.sty
1 %
2 % lltjfont.sty: derived from plfonts.dtx in pLaTeX.
3 %
4
5 \NeedsTeXFormat{LaTeX2e}
6 \ProvidesPackage{lltjfont}[2016/04/01 Patch to NFSS2 for LuaTeX-ja]
7
8 \def\ltj@chardef@text@cmd#1{%
9   \edef\ltj@chardef@text@cmd@name{\expandafter\@gobble\string#1}%
10   \afterassignment\ltj@chardef@text@cmd@\ltj@tempcnta
11 }
12 \def\ltj@chardef@text@cmd@{%
13   \ifnum\ltj@tempcnta>"7F
14     \expandafter\edef\csname \ltj@chardef@text@cmd@name\endcsname{%
15       \noexpand\ltjalchar\the\ltj@tempcnta\space
16     }%
17   \else
18     \expandafter\chardef\csname \ltj@chardef@text@cmd@name\endcsname\ltj@tempcnta
19   \fi
20 }
21 \def\DeclareTextSymbol#1#2#3{%
22   \@dec@text@cmd\ltj@chardef@text@cmd#1{#2}#3\relax
23 }
24
25 \ifdefined\UnicodeEncodingName
26   \input{tuenc.def}
27 \fi
28
29
30 \let\k@encoding\@empty
31 \let\ck@encoding\@empty
32 % LuaTeX-ja uses JY3 and JT3 encodings.
33 \def\cy@encoding{JY3}\def\ct@encoding{JT3}
34
35 \let\k@family\@empty
36 \let\k@series\@empty
37 \let\k@shape\@empty
38 \def\curr@kfontshape{\k@encoding/\k@family/\k@series/\k@shape}
39 \def\rel@fontshape{\f@encoding/\f@family/\f@series/\f@shape}
40 \ifdefined\Cht\else\newdimen\Cht\fi
41 \ifdefined\cht\else\newdimen\cht\fi
42 \ifdefined\Cdp\else\newdimen\Cdp\fi
43 \ifdefined\cdp\else\newdimen\cdp\fi
44 \ifdefined\Cwd\else\newdimen\Cwd\fi
45 \ifdefined\cwd\else\newdimen\cwd\fi
46 \ifdefined\Cvs\else\newdimen\Cvs\fi
47 \ifdefined\cvs\else\newdimen\cvs\fi
48 \ifdefined\Chs\else\newdimen\Chs\fi
49 \ifdefined\chs\else\newdimen\chs\fi
50 \ifdefined\cHT\else\newdimen\cHT\fi
51 %\let\afont\font
52
53 \let\ystrutbox\strutbox
54 \newbox\dstrutbox
55 \newbox\tstrutbox
56 \newbox\zstrutbox
57 \def\strutbox{\iftdir\tstrutbox\else\ystrutbox\fi}
58 \def\strut{\relax
59   \ifnum\ltjgetparameter{direction}=1 % dtou
60     \ifmmode\copy\dstrutbox\else\unhcopy\dstrutbox\fi
61   \else\ifnum\ltjgetparameter{direction}=4 % yoko
62     \ifmmode\copy\ystrutbox\else\unhcopy\ystrutbox\fi
63   \else % tate and utod
64     \ifmmode\copy\tstrutbox\else\unhcopy\tstrutbox\fi
65   \fi\fi
66 }
67
68 \def\ystrut{\relax\hbox{\yoko
69    \ifmmode\copy\ystrutbox\else\unhcopy\ystrutbox\fi}}
70 \def\tstrut{\relax\hbox{\tate
71    \ifmmode\copy\tstrutbox\else\unhcopy\tstrutbox\fi}}
72 \def\dstrut{\relax\hbox{\dtou
73    \ifmmode\copy\dstrutbox\else\unhcopy\dstrutbox\fi}}
74 \def\zstrut{\relax\hbox{\utod
75    \ifmmode\copy\zstrutbox\else\unhcopy\zstrutbox\fi}}
76
77 {%
78   \def\cdp@elt#1#2#3#4{%
79     \directlua{luatexja.jfont.add_fenc_list('\luatexluaescapestring{#1}')}}%
80   \cdp@list%
81 }
82
83 \def\DeclareFontEncoding{%
84   \begingroup
85   \nfss@catcodes
86   \expandafter\endgroup
87   \DeclareFontEncoding@}
88 \def\DeclareFontEncoding@#1#2#3{%
89   \expandafter
90   \ifx\csname T@#1\endcsname\relax
91      \def\cdp@elt{\noexpand\cdp@elt}%
92      \xdef\cdp@list{\cdp@list\cdp@elt{#1}%
93                     {\default@family}{\default@series}%
94                     {\default@shape}}%
95      \expandafter\let\csname#1-cmd\endcsname\@changed@cmd
96      \directlua{luatexja.jfont.add_fenc_list('\luatexluaescapestring{#1}')}%
97   \else
98      \@font@info{Redeclaring font encoding #1}%
99   \fi
100   \global\@namedef{T@#1}{#2}%
101   \global\@namedef{M@#1}{\default@M#3}%
102   \xdef\LastDeclaredEncoding{#1}%
103   }
104 \def\DeclareKanjiEncoding#1{%
105   \@latex@warning{%
106      The \string\DeclareKanjiEncoding\space is obsoleted command.  Please use
107      \MessageBreak
108      the \string\DeclareTateKanjiEncoding\space for `Tate-kumi' encoding, and
109      \MessageBreak
110      the \string\DeclareYokoKanjiEncoding\space for `Yoko-kumi' encoding.
111      \MessageBreak
112      I treat the `#1' encoding as `Yoko-kumi'.}
113   \DeclareYokoKanjiEncoding{#1}%
114 }
115 \def\DeclareYokoKanjiEncoding{%
116   \begingroup
117   \nfss@catcodes
118   \expandafter\endgroup
119   \DeclareYokoKanjiEncoding@}
120 \def\DeclareYokoKanjiEncoding@#1#2#3{%
121   \expandafter\ifx\csname T@#1\endcsname\relax
122     \def\cdp@elt{\noexpand\cdp@elt}%
123     \xdef\cdp@list{\cdp@list\cdp@elt{#1}%
124                     {\default@k@family}{\default@k@series}%
125                     {\default@k@shape}}%
126     \expandafter\let\csname#1-cmd\endcsname\@changed@kcmd
127     \directlua{luatexja.jfont.add_kyenc_list('\luatexluaescapestring{#1}')}%
128   \else
129     \@font@info{Redeclaring KANJI (yoko) font encoding #1}%
130   \fi
131   \global\@namedef{T@#1}{#2}%
132   \global\@namedef{M@#1}{\default@KM#3}%
133   }
134 \def\DeclareTateKanjiEncoding{%
135   \begingroup
136   \nfss@catcodes
137   \expandafter\endgroup
138   \DeclareTateKanjiEncoding@}
139 \def\DeclareTateKanjiEncoding@#1#2#3{%
140   \expandafter\ifx\csname T@#1\endcsname\relax
141     \def\cdp@elt{\noexpand\cdp@elt}%
142     \xdef\cdp@list{\cdp@list\cdp@elt{#1}%
143                     {\default@k@family}{\default@k@series}%
144                     {\default@k@shape}}%
145     \expandafter\let\csname#1-cmd\endcsname\@changed@kcmd
146     \directlua{luatexja.jfont.add_ktenc_list('\luatexluaescapestring{#1}')}%
147   \else
148     \@font@info{Redeclaring KANJI (tate) font encoding #1}%
149   \fi
150   \global\@namedef{T@#1}{#2}%
151   \global\@namedef{M@#1}{\default@KM#3}%
152   }
153 \@onlypreamble\DeclareKanjiEncoding
154 \@onlypreamble\DeclareYokoKanjiEncoding
155 \@onlypreamble\DeclareYokoKanjiEncoding@
156 \@onlypreamble\DeclareTateKanjiEncoding
157 \@onlypreamble\DeclareTateKanjiEncoding@
158 \def\DeclareKanjiEncodingDefaults#1#2{%
159   \ifx\relax#1\else
160     \ifx\default@KT\@empty\else
161       \@font@info{Overwriting KANJI encoding scheme text defaults}%
162     \fi
163     \gdef\default@KT{#1}%
164   \fi
165   \ifx\relax#2\else
166     \ifx\default@KM\@empty\else
167       \@font@info{Overwriting KANJI encoding scheme math defaults}%
168     \fi
169     \gdef\default@KM{#2}%
170   \fi}
171 \let\default@KT\@empty
172 \let\default@KM\@empty
173 \@onlypreamble\DeclareKanjiEncodingDefaults
174 \def\DeclareFontFamily#1#2#3{%
175  \@ifundefined{T@#1}%
176     {\@latex@error{Encoding scheme `#1' unknown}\@eha}%
177     {\def\reserved@a{#3}%
178      \global
179      \expandafter\let\csname #1+#2\expandafter\endcsname
180             \ifx \reserved@a\@empty
181               \@empty
182             \else \reserved@a
183             \fi
184      \directlua{luatexja.jfont.add_ffam('\luatexluaescapestring{#2}')}%
185     }%
186 }
187 \def\DeclareKanjiFamily#1#2#3{%
188  \@ifundefined{T@#1}%
189     {\@latex@error{KANJI Encoding scheme `#1' unknown}\@eha}%
190     {\def\reserved@a{#3}%
191      \global
192      \expandafter\let\csname #1+#2\expandafter\endcsname
193             \ifx \reserved@a\@empty
194               \@empty
195             \else \reserved@a
196             \fi
197      \directlua{luatexja.jfont.add_kfam('\luatexluaescapestring{#2}')}%
198      }%
199 }
200 \def\DeclareKanjiSubstitution#1#2#3#4{%
201   \expandafter\ifx\csname T@#1\endcsname\relax
202     \@latex@error{KANJI Encoding scheme `#1' unknown}\@eha
203   \else
204     \begingroup
205        \def\reserved@a{#1}%
206        \toks@{}%
207        \def\cdp@elt##1##2##3##4{%
208          \def\reserved@b{##1}%
209          \ifx\reserved@a\reserved@b
210            \addto@hook\toks@{\cdp@elt{#1}{#2}{#3}{#4}}%
211          \else
212            \addto@hook\toks@{\cdp@elt{##1}{##2}{##3}{##4}}%
213          \fi}%
214        \cdp@list
215        \xdef\cdp@list{\the\toks@}%
216     \endgroup
217     \global\@namedef{D@#1}{\def\default@family{#2}%
218                            \def\default@series{#3}%
219                            \def\default@shape{#4}}%
220   \fi}
221 \def\DeclareErrorKanjiFont#1#2#3#4#5{%
222    \xdef\error@kfontshape{%
223       \noexpand\expandafter\noexpand\split@name\noexpand\string
224       \expandafter\noexpand\csname#1/#2/#3/#4/#5\endcsname
225       \noexpand\@nil}%
226    \gdef\default@k@family{#2}%
227    \gdef\default@k@series{#3}%
228    \gdef\default@k@shape{#4}%
229    \global\let\k@family\default@k@family
230    \global\let\k@series\default@k@series
231    \global\let\k@shape\default@k@shape
232    \gdef\f@size{#5}%
233    \gdef\f@baselineskip{#5pt}}
234 \@onlypreamble\DeclareKanjiSubstitution
235 \@onlypreamble\DeclareErrorKanjiFont
236 \def\DeclareFixedFont#1#2#3#4#5#6{%
237    \begingroup
238       \math@fontsfalse
239       \every@math@size{}%
240       \fontsize{#6}\z@
241       \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{#2}')}\ifin@%
242         \usekanji{#2}{#3}{#4}{#5}%
243         \global\let#1\getjfont
244       \else
245         \directlua{luatexja.jfont.is_ktenc('\luatexluaescapestring{#2}')}\ifin@%
246           \usekanji{#2}{#3}{#4}{#5}%
247           \global\let#1\gettfont
248         \else
249           \useroman{#2}{#3}{#4}{#5}%
250           \global\expandafter\let\expandafter#1\the\font
251         \fi
252       \fi
253    \endgroup
254   }
255 \def\DLMfontsw@standard#1#2#3{#1{#2{#3}}}
256 \def\reDeclareMathAlphabet#1#2#3{%
257   \ifdefined#2
258     \@temptokena\expandafter{#2}%
259   \else
260     \@temptokena{#2}%
261   \fi
262   \ifdefined#3
263     \toks0\expandafter{#3}%
264   \else
265     \toks0{#3}%
266   \fi
267   \long\protected\edef#1{%
268     \noexpand\DLMfontsw@standard{\the\@temptokena}{\the\toks0}}%
269 }
270 \@onlypreamble\reDeclareMathAlphabet
271 \def\all@shape{all}%
272 \def\DeclareRelationFont#1#2#3#4#5#6#7#8{%
273   \def\rel@shape{#4}%
274   \ifx\rel@shape\@empty
275      \global
276      \expandafter\def\csname rel@#1/#2/#3/all\endcsname{%
277        \romanencoding{#5}\romanfamily{#6}%
278        \romanseries{#7}}%
279   \else
280      \global
281      \expandafter\def\csname rel@#1/#2/#3/#4\endcsname{%
282        \romanencoding{#5}\romanfamily{#6}%
283        \romanseries{#7}\romanshape{#8}}%
284   \fi
285 }
286 \def\SetRelationFont#1#2#3#4#5#6#7#8{%
287   \def\rel@shape{#4}%
288   \ifx\rel@shape\@empty
289      \expandafter\def\csname rel@#1/#2/#3/all\endcsname{%
290        \romanencoding{#5}\romanfamily{#6}%
291        \romanseries{#7}}%
292   \else
293      \expandafter\def\csname rel@#1/#2/#3/#4\endcsname{%
294        \romanencoding{#5}\romanfamily{#6}%
295        \romanseries{#7}\romanshape{#8}}%
296   \fi
297 }
298 \newif\if@knjcmd
299 \def\userelfont{\@knjcmdtrue}
300
301
302 \RequirePackage{everysel}
303 \let\ltj@@EverySelectfont@Init=\@EverySelectfont@Init
304 \expandafter\expandafter\expandafter\let
305 \expandafter\expandafter\csname ltj@@orig@selectfont\endcsname\csname selectfont\space\endcsname
306 \@EverySelectfont@Init
307 \def\@EverySelectfont@Init{%
308   \expandafter\let\csname selectfont\space \endcsname \ltj@@orig@selectfont
309   \ltj@@EverySelectfont@Init
310 }
311 \def\ltj@selectfont@patch{%
312  \directlua{luatexja.base.start_time_measure('selectfont')}%
313  \let\tmp@error@fontshape\error@fontshape
314   \let\error@fontshape\error@kfontshape
315   \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{\k@encoding}')}\ifin@%
316     \let\cy@encoding\k@encoding
317     \edef\ct@encoding{\csname t@enc@\k@encoding\endcsname}%
318   \else
319     \directlua{luatexja.jfont.is_ktenc('\luatexluaescapestring{\k@encoding}')}\ifin@%
320      \let\ct@encoding\k@encoding
321      \edef\cy@encoding{\csname y@enc@\k@encoding\endcsname}%
322     \else
323       \@latex@error{KANJI Encoding scheme `\k@encoding' unknown}\@eha
324     \fi
325   \fi
326 %
327   \let\k@encoding\ct@encoding
328   \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}%
329   \pickup@tfont
330   \font@name
331   \ltj@@does@alt@set{\curr@kfontshape}%
332     % alt fonts の定義
333     \directlua{luatexja.jfont.output_alt_font_cmd('t', '\luatexluaescapestring{\curr@kfontshape}')}%
334     % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする
335     \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}%
336   \fi
337 %
338   \let\k@encoding\cy@encoding
339   \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}%
340   \pickup@jfont
341   \font@name
342   \ltj@@does@alt@set{\curr@kfontshape}%
343     % alt fonts の定義
344     \directlua{luatexja.jfont.output_alt_font_cmd('y', '\luatexluaescapestring{\curr@kfontshape}')}%
345     % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする
346     \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}%
347   \fi
348 %
349   \edef\tmp@item{{\k@encoding}}\expandafter\def\expandafter\k@encoding\tmp@item
350   \kenc@update
351   \let\error@fontshape\tmp@error@fontshape
352 %
353   \if@knjcmd \@knjcmdfalse
354     \expandafter\ifx
355     \csname rel@\k@encoding/\k@family/\k@series/\k@shape\endcsname\relax
356       \expandafter\ifx
357          \csname rel@\k@encoding/\k@family/\k@series/all\endcsname\relax
358       \else
359          \csname rel@\k@encoding/\k@family/\k@series/all\endcsname\selectfont
360          % 警告: 再び \selectfont を呼んでいる.無限ループの可能性あり
361       \fi
362     \else
363        \csname rel@\k@encoding/\k@family/\k@series/\k@shape\endcsname\selectfont
364        % 警告: 再び \selectfont を呼んでいる.無限ループの可能性あり
365     \fi
366   \fi
367   \directlua{luatexja.base.stop_time_measure('selectfont')}%
368 }
369 \EverySelectfont{\ltj@selectfont@patch}
370
371 \def\KanjiEncodingPair#1#2{\@namedef{t@enc@#1}{#2}\@namedef{y@enc@#2}{#1}}
372 \def\set@fontsize#1#2#3{%
373     \@defaultunits\@tempdimb#2pt\relax\@nnil
374     \edef\f@size{\strip@pt\@tempdimb}%
375     \@defaultunits\@tempskipa#3pt\relax\@nnil
376     \edef\f@baselineskip{\the\@tempskipa}%
377     \edef\f@linespread{#1}%
378     \let\baselinestretch\f@linespread
379     \def\size@update{%
380       \baselineskip\f@baselineskip\relax
381       \baselineskip\f@linespread\baselineskip
382       \normalbaselineskip\baselineskip
383       \adjustbaseline
384       \setbox\ystrutbox\hbox{\yoko
385           \vrule\@width\z@
386                 \@height.7\baselineskip \@depth.3\baselineskip}%
387       \setbox\dstrutbox\hbox{\dtou
388           \vrule\@width\z@
389                 \@height.7\baselineskip \@depth.3\baselineskip}%
390       \setbox\tstrutbox\hbox{\tate
391           \vrule\@width\z@
392                 \@height.5\baselineskip \@depth.5\baselineskip}%
393       \setbox\zstrutbox\hbox{\tate
394           \vrule\@width\z@
395                 \@height.7\baselineskip \@depth.3\baselineskip}%
396      \let\size@update\relax}}
397
398 \ifdefined\newluafunction
399   \newluafunction\ltj@@adjust@baseline@inner
400   \begingroup\catcode`\~=12
401   \directlua{%
402     local nulltable = {}
403     local t = lua.get_functions_table()
404     local getfont, dir_tate = font.getfont, luatexja.dir_table.dir_tate
405     local fmt, get_attr = luatexja.jfont.font_metric_table, tex.getattribute
406     local setdimen, set_attr = tex.setdimen, tex.setattribute
407     local dir = luatexja.unary_pars.direction
408     t[\the\ltj@@adjust@baseline@inner] = function()
409       local ft = fmt[get_attr('ltj@curtfnt')] or nulltable
410       ft = ft and ft.char_type or nulltable
411       local fk = ft and ft[0] or nulltable
412       local ht, dp, wd = fk.height or 0, fk.depth or 0,
413                          fk.width or ft.zw or 0
414       local fm 
415         = ((getfont(font.current()) or nulltable)
416           .characters or nulltable)[77] or nulltable %% 'M'
417       set_attr('ltj@tablshift',
418         0.5*((fm.height or 0)- (fm.depth or 0) - ht+ dp))
419       if dir() ~= dir_tate then
420         ft = fmt[get_attr('ltj@curjfnt')] or nulltable
421         ft = ft and ft.char_type or nulltable
422         fk = ft and ft[0] or nulltable
423         ht, dp, wd = fk.height or 0, fk.depth or 0,
424                      fk.width or ft.zw or 0
425       end
426       setdimen('cht', ht); setdimen('cdp', dp)
427       setdimen('cwd', wd); setdimen('chs', wd)
428       setdimen('cHT', ht+dp)
429     end
430   }\endgroup
431   \def\adjustbaseline{\luafunction\ltj@@adjust@baseline@inner
432      \cvs\normalbaselineskip}
433 \else
434   \newbox\adjust@box
435   \newbox\adjust@box@aux
436   \newdimen\adjust@dimen
437   \def\adjustbaseline{%
438     \setbox\adjust@box\hbox{%
439       \ltj@ykblshift\z@\ltj@tkblshift\z@ 漢}%
440     \cht\ht\adjust@box
441     \cdp\dp\adjust@box
442     \cwd\wd\adjust@box
443     \cvs\normalbaselineskip
444     \chs\cwd
445     \cHT\cht \advance\cHT\cdp
446     \setbox\adjust@box@aux\hbox{\tate\ltj@tkblshift\z@ 漢}%
447     \setbox\adjust@box\hbox{\tate\ltj@tablshift\z@ M}%
448     \adjust@dimen\ht\adjust@box
449     \advance\adjust@dimen\dp\adjust@box
450     \advance\adjust@dimen-\ht\adjust@box@aux
451     \divide\adjust@dimen\tw@
452     \advance\adjust@dimen0.5\dp\adjust@box@aux
453     \advance\adjust@dimen-\dp\adjust@box
454     \ltj@tablshift=\adjust@dimen
455   }
456 \fi
457 \DeclareRobustCommand\romanencoding[1]{%
458     \expandafter\ifx\csname T@#1\endcsname\relax
459       \@latex@error{Encoding scheme `#1' unknown}\@eha
460     \else
461       \edef\f@encoding{#1}%
462       \ifx\cf@encoding\f@encoding
463         \let\enc@update\relax
464       \else
465         \let\enc@update\@@enc@update
466       \fi
467     \fi
468 }
469 \DeclareRobustCommand\kanjiencoding[1]{%
470     \expandafter\ifx\csname T@#1\endcsname\relax
471       \@latex@error{KANJI Encoding scheme `#1' unknown}\@eha
472     \else
473       \edef\k@encoding{#1}%
474       \ifx\ck@encoding\k@encoding
475          \let\kenc@update\relax
476       \else
477          \let\kenc@update\@@kenc@update
478       \fi
479     \fi
480 }
481 \DeclareRobustCommand\fontencoding[1]{%
482   \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{#1}')}\ifin@%
483   \kanjiencoding{#1}\else\romanencoding{#1}\fi}
484 \def\@@kenc@update{%
485   \default@KT
486   \csname T@\k@encoding\endcsname
487   \csname D@\k@encoding\endcsname
488   \let\kenc@update\relax
489   \let\ck@encoding\k@encoding
490   \edef\tmp@enc{'\luatexluaescapestring{\k@encoding}'}
491   \directlua{luatexja.jfont.is_kyenc(\tmp@enc)}\ifin@%
492     \let\cy@encoding\k@encoding
493   \else
494     \directlua{luatexja.jfont.is_ktenc(\tmp@enc)}\ifin@%
495       \let\ct@encoding\k@encoding
496     \else
497       \@latex@error{KANJI Encoding scheme `\k@encoding' unknown}\@eha
498     \fi
499   \fi
500 }
501 \let\kenc@update\relax
502 \def\@changed@kcmd#1#2{%
503    \ifx\protect\@typeset@protect
504       \@inmathwarn#1%
505       \expandafter\ifx\csname\ck@encoding\string#1\endcsname\relax
506          \expandafter\ifx\csname ?\string#1\endcsname\relax
507             \expandafter\def\csname ?\string#1\endcsname{%
508                \TextSymbolUnavailable#1%
509             }%
510          \fi
511          \global\expandafter\let
512                \csname\cf@encoding \string#1\expandafter\endcsname
513                \csname ?\string#1\endcsname
514       \fi
515       \csname\ck@encoding\string#1%
516          \expandafter\endcsname
517    \else
518       \noexpand#1%
519    \fi}
520 \newif\if@notkfam
521 \newif\if@notffam
522 \newif\if@tempswz
523 \def\@ltj@use@fd{true}
524 \DeclareRobustCommand\romanfamily[1]{\edef\f@family{#1}}
525 \DeclareRobustCommand\kanjifamily[1]{\edef\k@family{#1}}
526 \DeclareRobustCommand\fontfamily[1]{%
527   \@notkfamfalse\@notffamfalse
528   \edef\tmp@item{'\luatexluaescapestring{#1}'}%
529   %
530   \directlua{luatexja.jfont.search_kfam(\tmp@item, \@ltj@use@fd)}%
531   \ifin@\edef\k@family{#1}\else\@notkfamtrue\fi
532   %
533   % alphabetic fonts part
534   \directlua{luatexja.jfont.is_ffam(\tmp@item)}%
535   \ifin@\edef\f@family{#1}\else
536     % checking is_stored_ffam is not sufficient,
537     % since LuaTeX-ja doesn't know whats fonts are defined before LuaTeX-ja is loaded.
538     \ifcsname \f@encoding+#1\endcsname % easy case
539       \directlua{luatexja.jfont.add_ffam(\tmp@item)}\edef\f@family{#1}%
540     \else
541       \@tempswafalse
542       \def\cdp@elt##1{\ifcsname ##1+#1\endcsname\@tempswatrue\fi}%
543       \directlua{luatexja.jfont.search_ffam_declared()}%
544       \if@tempswz
545         \directlua{luatexja.jfont.add_ffam(\tmp@item)}\edef\f@family{#1}%
546       \else
547         % now we search Nffam_list and font definition files.
548         \directlua{luatexja.jfont.search_ffam_fd(\tmp@item)}%
549         \ifin@\edef\f@family{#1}\else\@notffamtrue\fi
550       \fi
551     \fi
552   \fi
553   %
554   \if@notkfam\if@notffam
555     \edef\k@family{#1}\edef\f@family{#1}%
556   \fi\fi
557 }
558 \DeclareRobustCommand\romanseries[1]{\edef\f@series{#1}}
559 \DeclareRobustCommand\kanjiseries[1]{\edef\k@series{#1}}
560 \DeclareRobustCommand\fontseries[1]{\kanjiseries{#1}\romanseries{#1}}
561 \DeclareRobustCommand\romanshape[1]{\edef\f@shape{#1}}
562 \DeclareRobustCommand\kanjishape[1]{\edef\k@shape{#1}}
563 \DeclareRobustCommand\fontshape[1]{\kanjishape{#1}\romanshape{#1}}
564 \def\usekanji#1#2#3#4{%
565     \kanjiencoding{#1}\kanjifamily{#2}\kanjiseries{#3}\kanjishape{#4}%
566     \selectfont\ignorespaces}
567 \def\useroman#1#2#3#4{%
568     \romanencoding{#1}\romanfamily{#2}\romanseries{#3}\romanshape{#4}%
569     \selectfont\ignorespaces}
570 \protected\def\usefont#1#2#3#4{%
571   \directlua{luatexja.jfont.is_kenc('\luatexluaescapestring{#1}')}\ifin@%
572   \usekanji{#1}{#2}{#3}{#4}%
573   \else\useroman{#1}{#2}{#3}{#4}%
574   \fi}
575 \DeclareRobustCommand\normalfont{%
576     \kanjiencoding{\kanjiencodingdefault}%
577     \kanjifamily{\kanjifamilydefault}%
578     \kanjiseries{\kanjiseriesdefault}%
579     \kanjishape{\kanjishapedefault}%
580     \romanencoding{\encodingdefault}%
581     \romanfamily{\familydefault}%
582     \romanseries{\seriesdefault}%
583     \romanshape{\shapedefault}%
584     \selectfont\ignorespaces}
585 \let\reset@font\normalfont
586 \DeclareRobustCommand\mcfamily
587         {\not@math@alphabet\mcfamily\mathmc
588          \kanjifamily\mcdefault\selectfont}
589 \DeclareRobustCommand\gtfamily
590         {\not@math@alphabet\gtfamily\mathgt
591          \kanjifamily\gtdefault\selectfont}
592 \let\romanprocess@table\process@table
593 \def\kanjiprocess@table{%
594   \kanjiencoding{\kanjiencodingdefault}%
595   \kanjifamily{\kanjifamilydefault}%
596   \kanjiseries{\kanjiseriesdefault}%
597   \kanjishape{\kanjishapedefault}%
598 }
599 \def\process@table{%
600   \romanprocess@table
601   \kanjiprocess@table
602 }
603 \@onlypreamble\romanprocess@table
604 \@onlypreamble\kanjiprocess@table
605 \DeclareTextCommandDefault{\textunderscore}{%
606   \leavevmode\kern.06em
607   \vbox{\hrule\@width.3em}}
608
609 %%%%%% LuaTeX-ja specific
610
611 % #1 の展開結果から encoding 部分をとりだし,それが和文用かどうかの結果を \ifin@ に代入
612 \def\ltj@@IsFontJapanese#1{%
613   \directlua{luatexja.jfont.is_kenc(string.match(
614       '\luatexluaescapestring{#1}', '[^/]+'))}}
615
616
617 \let\extract@afont\extract@font
618 \def\pickup@jfont{%
619     \expandafter \ifx \font@name \relax
620        \let\extract@font\extract@jfont
621        \define@newfont
622        \let\extract@font\extract@afont
623     \fi
624     \let\getjfont\font@name}
625 \def\pickup@tfont{%
626     \expandafter \ifx \font@name \relax
627        \let\extract@font\extract@tfont
628        \define@newfont
629        \let\extract@font\extract@afont
630     \fi
631     \let\gettfont\font@name}
632
633 % 異なる和文 enc/fam/ser/shape からは異なるフォント番号が振られるように
634 % わざと「ゴミをつける」
635 \def\ltj@@patch@external@font#1 at{%
636   #1\directlua{luatexja.jfont.print_aftl_address()}\space at%
637 }
638 \def\extract@jfont{%
639    \get@external@font
640     \ltj@@does@alt@set{\f@encoding/\f@family/\f@series/\f@shape}%
641       \edef\external@font{\expandafter\ltj@@patch@external@font\external@font}%
642     \fi
643     \expandafter\globaljfont\font@name\external@font\relax% ここで時間がかかる
644     \font@name%\global\zw=\zw\global\zh=\zh
645     \csname \f@encoding+\f@family\endcsname
646     \csname\curr@fontshape\endcsname}
647 \def\extract@tfont{%
648    \get@external@font
649     \ltj@@does@alt@set{\f@encoding/\f@family/\f@series/\f@shape}%
650       \edef\external@font{\expandafter\ltj@@patch@external@font\external@font}%
651     \fi
652     \expandafter\globaltfont\font@name\external@font\relax
653     \font@name%\global\zw=\zw\global\zh=\zh
654     \csname \f@encoding+\f@family\endcsname
655     \csname\curr@fontshape\endcsname}
656
657 \let\ltj@@al@do@subst@correction=\do@subst@correction
658 \def\ltj@@ja@do@subst@correction{%
659     \xdef\subst@correction{%
660       \font@name
661       \global\expandafter\let\csname \curr@fontshape/\f@size\endcsname\font@name%
662       \relax}%
663     \aftergroup\subst@correction
664 }
665 \def\do@subst@correction{%
666    \ltj@@IsFontJapanese{\curr@fontshape}\ifin@%
667      \ltj@@ja@do@subst@correction
668    \else
669      \ltj@@al@do@subst@correction
670    \fi
671 }
672 \let\@@italiccorr=\/
673
674 %%%%%% Japanese font for math mode
675
676 % \M@<enc> から その <enc> が和文用か調べる
677 {\catcode`M=12%
678 \gdef\ltj@@mathJapaneseFonts#1M#2#3\relax{\ltj@@IsFontJapanese{#3}}}
679
680 \let\ltj@@al@getanddefine@fonts=\getanddefine@fonts
681 \def\ltj@@ja@getanddefine@fonts#1#2{%
682   \xdef\font@name{\csname \string#2/\tf@size\endcsname}%
683   \pickup@jfont\let\textfont@name\font@name
684   \xdef\font@name{\csname \string#2/\sf@size\endcsname}%
685   \pickup@jfont\let\scriptfont@name\font@name
686   \xdef\font@name{\csname \string#2/\ssf@size\endcsname}%
687   \pickup@jfont
688   \edef\math@fonts{\math@fonts\ltj@setpar@global%
689     \ltj@@set@stackfont#1,\textfont@name:{MJT}%
690     \ltj@@set@stackfont#1,\scriptfont@name:{MJS}%
691     \ltj@@set@stackfont#1,\font@name:{MJSS}%
692   }%
693 }
694
695 \def\getanddefine@fonts#1#2{%
696   \ltj@tempcnta=#1\ltj@@IsFontJapanese{\string#2}%
697   \ifin@\let\ltj@temp=\ltj@@ja@getanddefine@fonts%
698   \else \let\ltj@temp=\ltj@@al@getanddefine@fonts\fi
699   \ltj@temp{#1}{#2}%
700 }
701 \def\use@mathgroup#1#2{\relax\ifmmode
702   \math@bgroup
703     \expandafter\ifx\csname M@\f@encoding\endcsname#1\else
704     #1\fi\ltj@tempcnta=#2 \expandafter\ltj@@mathJapaneseFonts\string#1\relax%
705     \ifin@\jfam#2\relax\else\mathgroup#2\relax\fi
706   \expandafter\math@egroup\fi}%
707
708 %%%%%% Alternate Japanese Fonts
709 %%%% \DeclareAlternateKanjiFont<Benc><Bfam><Bser><Bshape><Aenc><Afam><Aser><Ashape><range>
710 % いつも global
711 \def\DeclareAlternateKanjiFont#1#2#3#4#5#6#7#8#9{%
712   \edef\@temp{#9}%
713   \ifx\@temp\@empty\else
714     {\def\ltj@temp@bfont{#1/#2/#3/#4}\def\ltj@temp@afont{#5/#6/#7/#8}%
715      \expandafter\ltj@@altfont@latex#9,,}\ignorespaces
716   \fi}
717 \def\ltj@@altfont@latex#1,{\def\ltj@temp{#1}%
718   \ifx\ltj@temp\empty\let\@next=\relax\else
719   \ltj@@altfont@latexA{#1}\let\@next=\ltj@@altfont@latex\fi\@next}
720 \def\ltj@@altfont@latexA#1{\ltj@@altfont@latexB#1--\@nil}
721 \def\ltj@@altfont@latexB#1-#2-#3\@nil{\def\ltj@temp{#3}%
722   \ifx\ltj@temp\empty
723     \ltj@tempcnta=#1\relax\ltj@tempcntb=\ltj@tempcnta
724   \else
725     \def\ltj@temp{#1}%
726     \ifx\ltj@temp\empty\ltj@tempcnta='200\else\ltj@tempcnta=#1\fi\relax
727     \def\ltj@temp{#2}%
728     \ifx\ltj@temp\empty\ltj@tempcntb="10FFFF\else\ltj@tempcntb=#2\fi\relax%"
729   \fi
730   \directlua{luatexja.jfont.set_alt_font_latex(
731     \the\ltj@tempcnta,\the\ltj@tempcntb,
732     '\luatexluaescapestring{\ltj@temp@afont}',
733     '\luatexluaescapestring{\ltj@temp@bfont}')}%
734   }
735
736 %%%% \ClearAlternateKanjiFont<Benc><Bfam><Bser><Bshape>
737 % いつも global
738 \def\ClearAlternateKanjiFont#1#2#3#4{%
739    \directlua{luatexja.jfont.clear_alt_font_latex('\luatexluaescapestring{#1/#2/#3/#4}')}}
740
741 \def\ltj@pickup@altfont@auxy#1{%
742   \begingroup\edef\font@name{\csname #1/\f@size\endcsname}\pickup@jfont\endgroup%
743 }
744 \def\ltj@pickup@altfont@auxt#1{%
745   \begingroup\edef\font@name{\csname #1/\f@size\endcsname}\pickup@tfont\endgroup%
746 }
747 \def\ltj@pickup@altfont@copy#1#2{%
748   \ltj@@getjfontnumber#1%
749   \directlua{luatexja.jfont.pickup_alt_font_b(\the\ltj@tempcntc,'\luatexluaescapestring{#2}')}%
750 }
751
752 \def\ltj@@does@alt@set#1{%
753   \directlua{luatexja.jfont.does_alt_set'\luatexluaescapestring{#1}'}}
754
755 %%%% patch \@text@composite because of {y,t}albaselineshift
756
757 % %% \pltx@isletter from plfonts.dtx
758 % \def\pltx@mark{\pltx@mark@}
759 % \let\pltx@scanstop\relax
760 % \long\def\pltx@cond#1\fi{%
761 %   #1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
762 % \long\def\pltx@isletter#1{%
763 %   \expandafter\pltx@isletter@i#1\pltx@scanstop}
764 % \long\def\pltx@isletter@i#1\pltx@scanstop{%
765 %   \pltx@cond\ifx\pltx@mark#1\pltx@mark\fi{\@firstoftwo}%
766 %     {\pltx@isletter@ii\pltx@scanstop#1\pltx@scanstop{}#1\pltx@mark}}
767 % \long\def\pltx@isletter@ii#1\pltx@scanstop#{%
768 %   \pltx@cond\ifx\pltx@mark#1\pltx@mark\fi%
769 %     {\pltx@isletter@iii}{\pltx@isletter@iv}}
770 % \long\def\pltx@isletter@iii#1\pltx@mark{\@secondoftwo}
771 % \long\def\pltx@isletter@iv#1#2#3\pltx@mark{%
772 %   \pltx@cond\ifx\pltx@mark#3\pltx@mark\fi{%
773 %     \pltx@cond{\ifnum0\ifcat A\noexpand#21\fi\ifcat=\noexpand#21\fi>\z@}\fi
774 %       {\@firstoftwo}{\@secondoftwo}%
775 %   }{\@secondoftwo}}
776 %
777 % \def\@text@composite@x#1#2{%
778 %   \ifx#1\relax
779 %     #2%
780 %   \else\pltx@isletter{#1}{#1}{%
781 %     \begingroup
782 %     \setbox\z@\hbox\bgroup%
783 %       \ltj@yablshift\z@ \ltj@tablshift\z@
784 %       #1%
785 %       \@tempcntb\directlua{luatexja.pltx_composite_last_node_char()}%)
786 %       \xdef\pltx@composite@temp{\noexpand\@tempcntb=\the\@tempcntb\relax}%
787 %       \aftergroup\pltx@composite@temp
788 %     \egroup
789 %     \ifnum\ltjgetparameter{direction}=3 %
790 %       \@tempdima=\ltj@tablshift sp\else\@tempdima=\ltj@yablshift sp\fi
791 %     \ifnum\@tempcntb<\z@\@tempcnta\z@\else
792 %       \@tempcnta=\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{\@tempcntb}}\relax
793 %       \ifnum\@tempcnta=\z@\@tempdima\z@\fi
794 %     \fi
795 %     \ifnum\@tempcnta>\z@
796 %       \ifodd\ltjgetparameter{alxspmode}{\@tempcntb}\else\leavevmode\hbox{}\fi
797 %       \begingroup\mathsurround\z@$%
798 %         \hbox{\lower\@tempdima\box\z@}
799 %       $\endgroup%
800 %       \ifnum\ltjgetparameter{alxspmode}{\@tempcntb}<2\hbox{}\fi
801 %     \else
802 %       \ifdim\@tempdima=\z@{\ltj@yablshift\z@ \ltj@tablshift\z@#1}%
803 %       \else\lower\@tempdima\box\z@\fi
804 %     \fi
805 %     \endgroup}%
806 %   \fi
807 % }
808
809 \endinput