OSDN Git Service

ltjs*.cls: added option "xreal" (patch NTSS for "better" optical scaling)
[luatex-ja/luatexja.git] / src / ltj-base.sty
1 %
2 % ltj-base.sty
3 %
4
5 %! これは外から読まれない
6 %% Avoid multiple loading.
7 \csname luatexjabaseLoaded\endcsname
8 \edef\ltj@base@AtEnd{%
9 \endlinechar=\the\endlinechar
10 \relax}
11 \endlinechar=-1 %
12 \def\luatexjabaseLoaded{\endinput}
13
14 \ifltj@in@latex                 %<*LaTeX>
15   \NeedsTeXFormat{LaTeX2e}
16   \ProvidesPackage{ltj-base}[2014/07/18]
17 \fi                             %</LaTeX>
18
19 %%------------------ Tiny helpers
20
21 %% Registers
22 %\newcount\ltj@tempcnta % defined at luatexja-core.sty
23 \newcount\ltj@tempcntb
24 \newcount\ltj@tempcntc
25 \newdimen\ltj@tempdima
26 % \newskip\ltj@tempskipa unused
27 % \newtoks\ltj@temptoks unused
28
29 \countdef\ltj@@count@zero=0 %
30 \luatexattributedef\ltj@@attr@zero=0 %
31 \dimendef\ltj@@dimen@zero=0 %
32 \skipdef\ltj@@skip@zero=0 %
33
34 %% Quarks
35 %! ただ expl3 の quark とは異なり展開されるとエラーになる.
36 %% \ltj@q@stop
37 \protected\def\ltj@q@stop{\ltj@q@stop@}
38 %% \ltj@q@nil
39 \protected\def\ltj@q@nil{\ltj@q@nil@}
40 %% \ltj@q@mark
41 \protected\def\ltj@q@mark{\ltj@q@mark@}
42
43 %! etoolbox の \letcs, \cslet, \csletcs.
44 %% \ltj@letcs
45 \protected\def\ltj@letcs#1#2{
46   \expandafter\let\expandafter#1\csname#2\endcsname
47 }
48
49 %% \ltj@cslet
50 \protected\def\ltj@cslet#1#2{
51   \expandafter\let\csname#1\endcsname#2
52 }
53
54 %% \ltj@csletcs
55 \protected\def\ltj@csletcs#1#2{
56   \expandafter\let\csname#1\expandafter\endcsname
57   \csname#2\endcsname
58 }
59
60 %% \ltj@ifx{<sutff>}{<yes>}{<no>}
61 %! LaTeX 形式の \ifx. この形式の利点は自動的に条件ネストからの
62 %! 脱出が可能であること.
63 % Does \ifx<stuff> test in LaTeX style.
64 \long\def\ltj@ifx#1{
65   \ifx#1\expandafter\ltx@firstoftwo
66   \else\expandafter\ltx@secondoftwo\fi
67 }
68
69 %% \ltj@if@empty{<stuff>}{<yes>}{<no>}
70 %! <stuff> が空であるか.
71 % Checks if <stuff> is empty.
72 \long\def\ltj@if@empty#1{
73   \ltj@ifx{\ltj@@q@empty#1\ltj@@q@empty}
74 }
75 \protected\def\ltj@@q@empty{\ltj@@q@empty@}
76
77 %% \ltj@if@blank{<stuff>}{<yes>}{<no>}
78 %! <stuff> が空または空白文字からなるか.
79 % Checks if <stuff> is either empty or consisting only of spaces.
80 \def\ltj@if@blank#1{
81   \ltj@@if@blankA#1\ltj@@q@empty\ltj@@q@empty
82    \ltx@secondoftwo\ltx@firstoftwo\ltj@q@nil
83 }
84 \long\def\ltj@@if@blankA#1#2\ltj@@q@empty#3#4#5\ltj@q@nil{
85   #4
86 }
87
88 %%------------------ LaTeX vs plain
89 \ifltj@in@latex            %<*LaTeX>
90
91 %% \ifltj@in@latex
92 %! LaTeX であるか.
93 %(Defined in luatexja-core.sty.)
94
95 %% \ifltj@in@plain
96 %! plain であるか.
97 \ltj@csletcs{ifltj@in@plain}{iffalse}
98
99 %% \ltj@require@package{<package>}{<date>}
100 %! サブパッケージを読み込む. LaTeX では \RequirePackage、それ以外では
101 %! \input を使う. <date> は必須だが空でもよい.
102 \def\ltj@require@package#1#2{
103   \RequirePackage{#1}[#2]
104 }
105
106 %% \ltj@print{<message>}
107 %! 端末への出力.
108 \let\ltj@print\typeout
109
110 \else                           %<*!LaTeX>
111
112 %% \ifltj@in@plain
113 \ifnum\pdf@strcmp{\fmtname}{plain}=0 %
114   \ltj@csletcs{ifltj@in@plain}{iftrue}
115 \else
116   \ltj@csletcs{ifltj@in@plain}{iffalse}
117 \fi
118
119 %% \ltj@require@package{<package>}{<date>}
120 \def\ltj@require@package#1#2{
121   \input #1.sty\relax
122 }
123
124 %% \ltj@print{<message>}
125 \def\ltj@print#1{
126   \immediate\write16{#1}
127 }
128
129 \fi                             %</LaTeX>
130 %%------------------ Value-token handling
131
132 %% helper stuffs
133
134 %% \ltj@gobble@num <number>
135 %! 次に続く整数を(2 回展開で)読み捨てる. 
136 \def\ltj@gobble@num{
137   \directlua{luatexja.token.scan_int()}
138 }
139
140 %% \ltj@gobble@glue <glue>
141 %! 次に続くグルー値を(2 回展開で)読み捨てる. 
142 \def\ltj@gobble@glue{
143   \directlua{luatexja.token.scan_glue()}
144 }
145
146 %% \ltj@gobble@dimen <dimen>
147 %! 次に続く寸法値を(2 回展開で)読み捨てる. 
148 \def\ltj@gobble@dimen{
149   \directlua{luatexja.token.scan_dimen()}
150 }
151
152 %% \ltj@grab@num <number>
153 %! 次に続く整数を読み取って, それと等しい整数を表すトークン列
154 %! (必ずしも整数表記とは限らない)を { } に入れたものに(2 回で)
155 %! 展開する.
156 %! ただし, 整数は以下の形式のいずれかでなければならない.
157 %! - 整数表記(10 進, 8 進, 16 進, 文字)
158 %! - chardef トークン
159 %! - 内部整数パラメタ, countdef トークン
160 %!   (command_name が "assign_int" であるトークン).
161 %! (注意: まだ文字表記(`A)に対応していません.)
162 \def\ltj@grab@num{
163   \directlua{tex.sprint('{' .. luatexja.token.scan_int() .. '}')}
164 }
165
166 %%------------------ Safe passing
167
168 % These macros convert a token sequence denoting a TeX value to its
169 % suitable notation in Lua, and when the argument is malformed then
170 % 'nil' is returned. They are all fully-expandable.
171 %! TeX の値を Lua 上の表記に変換する. 不正形式だと nil にする.
172
173 \def\ltj@@safe@end{\noexpand\ltj@@safe@end}
174   % behaves same as \relax but is distinct from it
175
176 %% \ltj@safe@invalid
177 % The value passed to lua instead of malformed value tokens.
178 \def\ltj@safe@invalid{(nil)}
179
180 %% \ltj@safe@num{<number>}
181 %! 整数.
182 % For a number (integer).
183 \def\ltj@safe@num{
184   \ltj@safe@num@or\ltj@safe@invalid
185 }
186 \def\ltj@safe@num@or#1#2{
187   \expandafter\expandafter\expandafter\ltj@@safe@numA
188    \ltj@gobble@num#2\ltj@@safe@end{#2}{#1}
189 }
190 \def\ltj@@safe@numA#1\ltj@@safe@end#2#3{
191   \ltj@if@blank{#1}{
192     (\number#2)
193   }{
194     #3
195   }
196 }
197
198 %% \ltj@safe@dimen{<dimen>}
199 %! 寸法値.
200 % For a dimension. The result is a scaled-point value.
201 \def\ltj@safe@dimen{
202   \ltj@safe@dimen@or\ltj@safe@invalid
203 }
204 \def\ltj@safe@dimen@or#1#2{
205   \expandafter\expandafter\expandafter\ltj@@safe@dimenA
206    \ltj@gobble@dimen#2\ltj@@safe@end{#2}{#1}
207 }
208 \def\ltj@@safe@dimenA#1\ltj@@safe@end#2#3{
209   \ltj@if@blank{#1}{
210     (\number\dimexpr#2\relax)
211   }{
212     #3
213   }
214 }
215
216 %% \ltj@safe@glue{<glue>}
217 %! グルー値.
218 % For a glue. The result is a gluespec object.
219 \def\ltj@safe@glue{
220   \ltj@safe@glue@or\ltj@safe@invalid
221 }
222 \def\ltj@safe@glue@or#1#2{
223   \expandafter\expandafter\expandafter\ltj@@safe@glueA
224    \ltj@gobble@glue#2\ltj@@safe@end{#2}{#1}
225 }
226 \def\ltj@@safe@glueA#1\ltj@@safe@end#2#3{
227   \ltj@if@blank{#1}{
228     (luatexja.base.to_skip("\the\glueexpr#2\relax"))
229   }{
230     #3
231   }
232 }
233
234 %% \ltj@safe@real{<real>}
235 %! 実数. これは十進表記に限る.
236 % For a real number given in decimal notation or a macro that
237 % expands to such notation.
238 \def\ltj@safe@real#1{
239   (tonumber("\luatexluaescapestring{#1}"))
240 }
241
242 %% \ltj@val@counter{<counter>}
243 %! LaTeX カウンタの現在値.
244 % For the current value of a LaTeX counter.
245 \def\ltj@val@counter#1{
246   (\expandafter\number\csname c@#1\endcsname)
247 }
248
249 %% \ltj@val@skip{<skip>}
250 % For the current value of a skip (or LaTeX-length) parameter.
251 %! グルーレジスタ(LaTeX 長さ変数).
252 %! 整形式のグルー値にも使える.
253 \def\ltj@val@skip#1{
254   (luatexja.base.to_skip("\the\glueexpr#1\relax"))
255 }
256 %! 整形式の整数 → 数値 : \number#1
257 %! 内部寸法 → 数値 : \number#1
258 %! 整形式の寸法 → 数値 : \number\dimexpr#1\relax
259
260 %% \ltj@safe@str{<text>}
261 %! 文字列. (トークン列を非トークン化)
262 % Converts a token sequence to Lua string notation.
263 \def\ltj@safe@str#1{
264   "\luatexluaescapestring{\detokenize{#1}}"
265 }
266
267 %% \ltj@luaescape{<text>}
268 %! 非トークン化して Lua エスケープ.
269 \def\ltj@luaescape#1{
270   \luatexluaescapestring{\detokenize{#1}}
271 }
272 %% \ltj@luaxescape{<text>}
273 %! 非トークン化せずに(展開ありで) Lua エスケープ.
274 %! つまり単なる \luatexescape.
275 \let\ltj@luaxescape\luatexluaescapestring
276
277 %%------------------ Fully-expandable error messaging
278
279 %! ixerrtrick パッケージから移植.
280 %! 展開限定文脈でも使える \PackageError 等.
281 %! Lua 関数版(luatexja/base.lua 参照)もある.
282
283 %% \ltj@@error@message@a
284 \begingroup
285 \def~{ }
286 \xdef\ltj@@error@message@a{%
287   Type~~H <return>~~for immediate help%
288 }%
289 \endgroup
290
291 %%<+> \ltj@MessageBreak
292 % An analogue of \MessageBreak that is used in \ltj@GenericError, etc.
293 % (\MessageBreak cannot be used there.)
294 % NB: It is realized as a macro that expands to two instances
295 % of the character of code 127. This marker is later detected
296 % by the Lua process.
297 \begingroup
298 \lccode42=127
299 \lowercase{
300   \gdef\ltj@MessageBreak{**}
301   \directlua{
302     luatexja.base._error_set_break("**")
303   }
304 }
305 \endgroup
306
307 %%<+> \ltj@GenericError{<cont>}{<msg-main>}{<msg-ref>}{<msg-help>}
308 % A variant of \GenericError that can be used in expansion-only
309 % situation. The meanings of arguments are the same as the original
310 % \GenericError.
311 %%<+> \ltj@PlainError{<msg-main>}{<msg-help>}
312 % A simpler error messenger available in expansion-only situations.
313 % It behaves similarly to:
314 %   \errhelp{<msg-help}\errmessage{<msg-main>}
315 \begingroup
316 % with the same hack as in \GenericError...
317 \lccode`\@=`\ %
318 \lccode`\~=`\ %
319 \lccode`\}=`\ %
320 \lccode`\{=`\ %
321 \catcode`\ =11\relax%
322 \lowercase{%
323 \endgroup%
324 \def\ltj@GenericError#1#2#3#4{% not protected
325 \directlua{%
326 luatexja.base._error_set_message("\ltj@luaxescape{#1}",%
327 "\ltj@luaxescape{#2.^^J^^J#3^^J\ltj@@error@message@a}",%
328 "\ltj@luaxescape{#4}")%
329 }%
330 \    % use csname with four spaces as last expander
331 }
332 \def\    {% csname with four spaces
333 \directlua{%
334 luatexja.base._error_show(false)% and many spaces trail!
335                                         %
336                                         %
337 }%
338 }%
339 \def\ltj@PlainError#1#2{%
340 \directlua{%
341 luatexja.base._error_set_message("  ",%
342 "\ltj@luaxescape{#1}",%
343 "\ltj@luaxescape{#2}")%
344 }%
345 \error  % again a weird name is used
346 }
347 \def\error  {% csname with two trailing spaces
348 \directlua{%
349 luatexja.base._error_show(true)% and many spaces trail!
350                                         %
351                                         %
352 }%
353 }%
354 }
355
356 %% \ltj@@error@on@line
357 \def\ltj@@error@on@line{
358   on input line \the \inputlineno
359 }
360
361 %% \ltj@generic@warn@info
362 \def\ltj@@generic@warn@info#1#2#3#4{
363   \begingroup
364     \directlua{
365       luatexja.base._generic_warn_info("\ltj@luaxescape{#3}",
366         "\ltj@luaxescape{#4}", (#1 > 0), (#2 > 0))
367     }
368   \endgroup
369 }
370
371 %% \ltj@GenericWarning{<cont>}{<msg-main>}
372 \def\ltj@GenericWarning{
373   \ltj@@generic@warn@info{1}{1}
374 }
375 %% \ltj@GenericWarningNoLine{<cont>}{<msg-main>}
376 \def\ltj@GenericWarningNoLine{
377   \ltj@@generic@warn@info{1}{0}
378 }
379 %% \ltj@GenericInfo{<cont>}{<msg-main>}
380 \def\ltj@GenericInfo{
381   \ltj@@generic@warn@info{0}{1}
382 }
383 %% \ltj@GenericInfoNoLine{<cont>}{<msg-main>}
384 \def\ltj@GenericInfoNoLine{
385   \ltj@@generic@warn@info{0}{0}
386 }
387
388 %% \ltj@@space@seq@a
389 \begingroup
390 \def~{ }
391 \xdef\ltj@@space@seq@a{~~~~~~~~~~~~~~~~}
392 \xdef\ltj@@space@seq@b{~~~~~~~~~~~~~}
393 \endgroup
394
395 %% \ltj@PackageError{<pkg-name>}{<msg-main>}{<msg-help>}
396 \def\ltj@PackageError#1#2#3{%
397   \ltj@GenericError{(#1)\ltj@@space@seq@a}%
398    {Package #1 Error: #2}%
399    {See the #1 package documentation for explanation.}%
400    {#3}%
401 }
402 %% \ltj@PackageWarning{<pkg-name>}{<msg-main>}
403 \def\ltj@PackageWarning#1#2{%
404   \ltj@GenericWarning{(#1)\ltj@@space@seq@a}%
405    {Package #1 Warning: #2}%
406 }
407 %% \ltj@PackageWarningNoLine{<pkg-name>}{<msg-main>}
408 \def\ltj@PackageWarningNoLine#1#2{%
409   \ltj@GenericWarningNoLine{(#1)\ltj@@space@seq@a}%
410    {Package #1 Warning: #2}%
411 }
412 %% \ltj@PackageInfo{<pkg-name>}{<msg-main>}
413 \def\ltj@PackageInfo#1#2{%
414   \ltj@GenericInfo{(#1)\ltj@@space@seq@b}%
415    {Package #1 Info: #2}%
416 }
417 %% \ltj@PackageInfoNoLine{<pkg-name>}{<msg-main>}
418 \def\ltj@PackageInfoNoLine#1#2{%
419   \ltj@GenericInfoNoLine{(#1)\ltj@@space@seq@b}%
420    {Package #1 Info: #2}%
421 }
422
423 %%------------------ debug logging
424 \ifdefined\LuaTeXjaDebugEnabled
425
426 %% Load Lua module
427 \RequireLuaModule{luatexja.debug}
428
429 %% \ltj@debug{<format>}{<arg>,...}
430 \def\ltj@debug#1#2{
431   \directlua{
432     luatexja.base.debug(\ltj@safe@str{#1}
433       \ltj@if@blank{#2}{}{, }
434       #2)
435   }
436 }
437
438 %% \ltj@package@debug{<package>}{<format>}{<arg>,...}
439 \def\ltj@package@debug#1#2#3{
440   \directlua{
441     luatexja.base.package_debug(\ltj@safe@str{#1},
442       \ltj@safe@str{#2}
443       \ltj@if@blank{#3}{}{, }
444       #3)
445   }
446 }
447
448 \else
449
450 \def\ltj@debug#1#2{}
451 \def\ltj@package@debug#1#2#3{}
452
453 \fi
454
455 %% \ltj@debug@logger\CS{<package>}
456 \def\ltj@debug@logger#1#2{
457   \def#1{\ltj@package@debug{#2}}
458 }
459
460 %% \ltj@afterbox <token><box>
461 %% -> \setbox\ltj@afbox<box><token>
462 %% from Sonja Maus, ``Looking Ahead for a <box>'',
463 %%      TUGBoat, 11, No. 4, 1990.
464 \newbox\ltj@afbox
465 \protected\def\ltj@afterbox#1{%
466   \def\ltj@afb@xarg{#1}%
467   \afterassignment\ltj@afb@x
468   \chardef\next`.}
469 \def\ltj@afb@x{\futurelet\next\ltj@afb@xtest}
470 \def\ltj@afb@xtest{%
471   \ifcase\ifx\next\hbox\tw@\fi
472          \ifx\next\vbox\tw@\fi
473          \ifx\next\vtop\tw@\fi
474          \ifx\next\box\@ne\fi
475          \ifx\next\copy\@ne\fi
476          \ifx\next\vsplit\@ne\fi
477          \ifx\next\lastbox\@ne\fi
478          0% ``A <box> was ...'' error will be causes by \setbox later anyway.
479   \or\afterassignment\ltj@afb@xarg
480   \or\afterassignment\ltj@afb@xagarg
481   \fi
482   \setbox\ltj@afbox
483 }
484 \def\ltj@afb@xagarg{\aftergroup\ltj@afb@xarg}
485
486
487 %%------------------ all done
488 \ltj@base@AtEnd
489 \endinput
490 %% EOF