OSDN Git Service

Renamed \{k,a}char to \ltj{ja,al}char.
[luatex-ja/luatexja.git] / src / luatexja-fontspec.sty
1 %
2 % luatexja-fontspec.sty
3 %
4
5 \NeedsTeXFormat{LaTeX2e}
6 \ProvidesPackage{luatexja-fontspec}[2011/11/16 v0.3]
7
8 \def\UTFencname{EU2}\def\XeTeXpicfile{}
9 \RequirePackage{xunicode}
10 %% Patch for xunicode.sty
11 {\catcode`\"=12
12 \gdef\check@hexcom@digits@#1#2#3#4#5@!@#6#7#8{%
13  \ifx @#4\relax
14   \UTFacc@warning@{insufficient hex digits #7 for #6-\string#8}%
15  \else
16   \ifcat \active\noexpand#8%
17    \ifx\add@flag\@ne %
18     \expandafter\def\csname\UTFencname\string#8\endcsname{\ltjalchar"#1#2#3#4\relax}%
19     \ifx\unDeFiNed@#8%
20      \ifx\cf@encoding\UTFencname
21       \DeclareTextCommand{#8}{OT1}{\undefined}%
22      \else
23       \DeclareTextCommand{#8}{\cf@encoding}{\undefined}%
24      \fi
25     \else {% macro #8 exists already ...
26       \let\protect\noexpand
27       \edef\UTF@testi{#8}\def\UTF@testii{#8}%
28       \ifx\UTF@testi\UTF@testii\aftergroup\UTF@ignore
29       \else\aftergroup\UTF@doit\fi
30      }%
31      \iffalse
32       % ... but when it isn't robust, make it so
33       \expandafter\let\csname?-\string#8\endcsname#8\relax
34       \edef\next@UTF@{{\cf@encoding}%
35         {\expandafter\noexpand\csname?-\string#8\endcsname}}%
36       \expandafter\DeclareTextCommand\expandafter
37          {\expandafter#8\expandafter}\next@UTF@
38      \fi
39     \fi %
40    \else % \add@flag \z@
41     \expandafter\global\expandafter
42       \let\csname\UTFencname\string#8\endcsname\relax
43    \fi % end of \add@flag switch
44   \else % not active catcode --- shouldn't happen
45   % \typeout{*** did you really mean #8 ? ***}%
46    \ifx\add@flag\@ne %
47     \edef\tmp@name{\expandafter\string\csname\UTFencname\endcsname
48       \expandafter\string\csname#8\endcsname}%
49     \expandafter\def\csname\tmp@name\endcsname{\ltjalchar"#1#2#3#4\relax}%
50     \ifx\cf@encoding\UTFencname
51      \expandafter\DeclareTextCommand\expandafter
52        {\csname#8\endcsname}{OT1}{\undefined}%
53     \else
54      \expandafter\DeclareTextCommand\expandafter
55        {\csname#8\endcsname}{\cf@encoding}{\undefined}%
56     \fi
57    \else % \add@flag \z@
58     \expandafter\global\expandafter\let\csname#8\endcsname\relax
59    \fi % end of \add@flag switch
60   \fi % end of \ifcat
61  \fi}
62 \gdef\check@hex@digits@#1#2#3#4#5@!@#6#7#8#9{%
63  \ifx @#4\relax
64   \UTFacc@warning@{insufficient hex digits #7 for #6-\string#8#9}%
65  \else
66   \def\UTFchar{\ltjalchar"#1#2#3#4\relax}%
67   \expandafter\expandafter\expandafter\declare@utf@composite
68   \expandafter\expandafter\expandafter
69    {\expandafter\csname#6\endcsname}{\UTFchar}{#8}{#9}\relax
70  \fi}
71 %\gdef\add@UTF@accent#1#2#3{#2\ltjalchar"#1\relax}
72 \gdef\add@UTF@accent#1#2#3{\ifx\relax#2\relax\ltjalchar"#3\else
73  \ifx\ #2\relax\ltjalchar"#3\else
74  \expandafter\ifx\UTF@space#2\relax\ltjalchar"#3\else
75  \ifx~#2\ltjalchar"#3\else#2\ltjalchar"#1\fi\fi\fi\fi\relax}
76 \gdef\add@UTF@accents#1#2#3{#2\ltjalchar"#1\ltjalchar"#3\relax}
77 }
78 %% End of patch for xunicode.sty "
79
80 \RequirePackage{fontspec}
81 \RequirePackage{luatexja}
82
83 \ExplSyntaxOn
84
85 \cs_new:Npn \ltj_fontspec_warning:n   { \msg_warning:nn   {ltj-fontspec} }
86
87 \msg_new:nnn {ltj-fontspec} {addjfontfeatures-ignored}
88 {
89   \string\addjfontfeature (s)~ ignored;\\
90   it~ cannot~ be~ used~ with~ a~ font~ that~ wasn't~ selected~ by~ luatexja-fontspec.
91 }
92
93 \cs_generate_variant:Nn \prg_new_conditional:Nnn {Nnx}
94
95 \prg_new_conditional:Nnx \ltj_fontspec_if_liiikeys: {TF,F} {
96   \@ifpackagelater {fontspec} {2011/09/13}
97   { \exp_not:N \prg_return_true: }  % fontspec >= 2.2 (l3keys)
98   { \exp_not:N \prg_return_false: } % fontspec <  2.2 (xkeyval)
99 }
100
101 \cs_new:Nn \ltj_fontspec_define_option:nn {
102   \ltj_fontspec_if_liiikeys:TF {
103     \keys_define:nn {fontspec} { #1 .code:n = {#2}}
104   } {
105     \define@key[zf]{options}{#1}{#2}
106   }
107 }
108
109 \cs_new:Nn \ltj_fontspec_define_preparse_external:nn {
110   \ltj_fontspec_if_liiikeys:TF {
111     \keys_define:nn {fontspec-preparse-external} { #1 .code:n = {#2}}
112   } {
113     \define@key[zf]{preparse-external}{#1}{#2}
114   }
115 }
116
117 \cs_new:Nn \ltj_fontspec_select:nn {
118   \group_begin:
119   \ltj_fontspec_define_option:nn {JFM} {
120     \fontspec_update_fontid:n  {+jfm=##1}
121     \fontspec_update_featstr:n {jfm=##1}      
122   }
123   \ltj_fontspec_define_option:nn {JFM-var} {
124     \fontspec_update_fontid:n  {+jfmvar=##1}
125     \fontspec_update_featstr:n {jfmvar=##1}      
126   }
127   \ltj_fontspec_define_preparse_external:nn {NoEmbed} {
128     \cs_set:Nn \fontspec_namewrap:n {psft:####1}
129   }
130   %% Omit the warning message
131   %% "OpenType feature 'Kerning=Off' (-kern) not available ..."
132   \ltj_fontspec_define_option:nn {Kerning/Off} {
133     \fontspec_update_fontid:n  {-kern}
134     \fontspec_update_featstr:n {-kern}      
135   }  
136   \ltj_fontspec_if_liiikeys:TF {
137     \tl_set:Nn \g_fontspec_encoding_tl {JY3}
138   } {
139     \tl_set:Nn \zf@enc {JY3}
140   }
141   \tl_set:Nx \g_fontspec_default_fontopts_tl 
142              {JFM=ujis,Scale=0.962216,Kerning=Off,\g_ltj_fontspec_default_fontopts_tl}
143   \cs_set_eq:NN \DeclareFontFamily \DeclareKanjiFamily
144   \fontspec_select:nn{#1}{#2}
145   \group_end:
146   \ltj_fontspec_if_liiikeys:F {
147     \tl_set_eq:NN \l_fontspec_family_tl \zf@family
148   }
149 }
150
151 \cs_new:Nn \ltj_fontspec_set_family:Nnn {
152   \ltj_fontspec_select:nn{#2}{#3}
153   \tl_set_eq:NN #1 \l_fontspec_family_tl
154 }
155
156 \DeclareDocumentCommand \jfontspec { O{} m } {
157   \ltj_fontspec_set_family:Nnn \k@family {#1}{#2}
158   \selectfont
159   \ignorespaces
160 }
161
162 \DeclareDocumentCommand \setmainjfont { O{} m } {
163   \ltj_fontspec_set_family:Nnn \mcdefault {#1}{#2}
164   \normalfont
165 }
166
167 \DeclareDocumentCommand \setsansjfont { O{} m } {
168   \ltj_fontspec_set_family:Nnn \gtdefault {#1}{#2}
169   \normalfont
170 }
171
172 \DeclareDocumentCommand \newjfontfamily { m O{} m } {
173   \ltj_fontspec_select:nn{#2}{#3}
174   \use:x {
175     \exp_not:N \DeclareRobustCommand \exp_not:N #1 {
176       \exp_not:N \kanjifamily {\l_fontspec_family_tl} \exp_not:N \selectfont
177     }
178   }
179 }
180
181 \DeclareDocumentCommand \newjfontface { m O{} m } {
182   \newjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2 ] {#3}
183 }
184
185 \DeclareDocumentCommand \defaultjfontfeatures {m} {
186   \tl_set:Nn \g_ltj_fontspec_default_fontopts_tl {#1,}
187 }
188
189 \tl_clear:N \g_ltj_fontspec_default_fontopts_tl
190
191 \DeclareDocumentCommand \addjfontfeatures {m} {
192   \ifcsname zf@family@fontdef\k@family\endcsname
193     \group_begin:
194       \tl_clear:N \g_ltj_fontspec_default_fontopts_tl
195       \use:x {
196         \exp_not:N\ltj_fontspec_select:nn
197           {\csname zf@family@options\k@family\endcsname,#1}
198           {\csname zf@family@fontname\k@family\endcsname}
199       }
200     \group_end:
201     \fontfamily\l_fontspec_family_tl\selectfont
202   \else
203     \ltj_fontspec_warning:n {addjfontfeatures-ignored}
204   \fi
205   \ignorespaces
206 }
207
208 \cs_set_eq:NN \addjfontfeature \addjfontfeatures
209
210 % We reload xunicode package here.
211 \ExplSyntaxOff\ReloadXunicode{EU2}
212 \endinput
213
214 %% the following patch is needed to xunicode.sty:
215 %% 
216 --- /opt/texlive/2011/texmf-dist/tex/xelatex/xunicode/xunicode.sty      2011-09-12 08:31:47.000000000 +0900
217 +++ xunicode.sty        2011-11-16 22:06:17.061413113 +0900
218 @@ -1475,7 +1475,11 @@
219  
220  \newtoks\tipasavetokens
221  \newtoks\tipachecktokens
222 +
223 +\fi
224  \newif\iftipaonetoken
225 +\expandafter\ifx\csname ReloadXunicode\endcsname\relax
226 +
227  \def\tipalasttoken{!@! do nothing with this !@!}
228  \def\tipacatchonechar#1{\begingroup
229   \def\textipa##1{##1}% prevent recursion