6 %% Avoid multiple loading.
7 \csname luatexjabaseLoaded\endcsname
9 \endlinechar=\the\endlinechar
12 \def\luatexjabaseLoaded{\endinput}
14 \ifltj@in@latex %<*LaTeX>
15 \NeedsTeXFormat{LaTeX2e}
16 \ProvidesPackage{ltj-base}[2016/05/15]
19 %%------------------ Tiny helpers
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
29 \countdef\ltj@@count@zero=0 %
30 \luatexattributedef\ltj@@attr@zero=0 %
31 \dimendef\ltj@@dimen@zero=0 %
32 \skipdef\ltj@@skip@zero=0 %
35 %! ただ expl3 の quark とは異なり展開されるとエラーになる.
37 \protected\def\ltj@q@stop{\ltj@q@stop@}
39 \protected\def\ltj@q@nil{\ltj@q@nil@}
41 \protected\def\ltj@q@mark{\ltj@q@mark@}
43 %! etoolbox の \letcs, \cslet, \csletcs.
45 \protected\def\ltj@letcs#1#2{
46 \expandafter\let\expandafter#1\csname#2\endcsname
50 \protected\def\ltj@cslet#1#2{
51 \expandafter\let\csname#1\endcsname#2
55 \protected\def\ltj@csletcs#1#2{
56 \expandafter\let\csname#1\expandafter\endcsname
60 %% \ltj@ifx{<sutff>}{<yes>}{<no>}
61 %! LaTeX 形式の \ifx. この形式の利点は自動的に条件ネストからの
63 % Does \ifx<stuff> test in LaTeX style.
65 \ifx#1\expandafter\ltx@firstoftwo
66 \else\expandafter\ltx@secondoftwo\fi
69 %% \ltj@if@empty{<stuff>}{<yes>}{<no>}
71 % Checks if <stuff> is empty.
72 \long\def\ltj@if@empty#1{
73 \ltj@ifx{\ltj@@q@empty#1\ltj@@q@empty}
75 \protected\def\ltj@@q@empty{\ltj@@q@empty@}
77 %% \ltj@if@blank{<stuff>}{<yes>}{<no>}
78 %! <stuff> が空または空白文字からなるか.
79 % Checks if <stuff> is either empty or consisting only of spaces.
81 \ltj@@if@blankA#1\ltj@@q@empty\ltj@@q@empty
82 \ltx@secondoftwo\ltx@firstoftwo\ltj@q@nil
84 \long\def\ltj@@if@blankA#1#2\ltj@@q@empty#3#4#5\ltj@q@nil{
88 %%------------------ LaTeX vs plain
89 \ifltj@in@latex %<*LaTeX>
93 %(Defined in luatexja-core.sty.)
97 \ltj@csletcs{ifltj@in@plain}{iffalse}
99 %% \ltj@require@package{<package>}{<date>}
100 %! サブパッケージを読み込む. LaTeX では \RequirePackage、それ以外では
101 %! \input を使う. <date> は必須だが空でもよい.
102 \def\ltj@require@package#1#2{
103 \RequirePackage{#1}[#2]
106 %% \ltj@print{<message>}
108 \let\ltj@print\typeout
113 \ifnum\pdf@strcmp{\fmtname}{plain}=0 %
114 \ltj@csletcs{ifltj@in@plain}{iftrue}
116 \ltj@csletcs{ifltj@in@plain}{iffalse}
119 %% \ltj@require@package{<package>}{<date>}
120 \def\ltj@require@package#1#2{
124 %% \ltj@print{<message>}
126 \immediate\write16{#1}
130 %%------------------ Value-token handling
134 %% \ltj@gobble@num <number>
135 %! 次に続く整数を(2 回展開で)読み捨てる.
137 \directlua{token.scan_int()}
140 %% \ltj@gobble@glue <glue>
141 %! 次に続くグルー値を(2 回展開で)読み捨てる.
142 \def\ltj@gobble@glue{
143 \directlua{token.scan_glue()}
146 %% \ltj@gobble@dimen <dimen>
147 %! 次に続く寸法値を(2 回展開で)読み捨てる.
148 \def\ltj@gobble@dimen{
149 \directlua{token.scan_dimen()}
152 %% \ltj@grab@num <number>
153 %! 次に続く整数を読み取って, それと等しい整数を表すトークン列
154 %! (必ずしも整数表記とは限らない)を { } に入れたものに(2 回で)
156 %! ただし, 整数は以下の形式のいずれかでなければならない.
157 %! - 整数表記(10 進, 8 進, 16 進, 文字)
159 %! - 内部整数パラメタ, countdef トークン
160 %! (command_name が "assign_int" であるトークン).
161 %! (注意: まだ文字表記(`A)に対応していません.)
163 \directlua{tex.sprint('{' .. token.scan_int() .. '}')}
166 %%------------------ Safe passing
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 にする.
173 \def\ltj@@safe@end{\noexpand\ltj@@safe@end}
174 % behaves same as \relax but is distinct from it
177 % The value passed to lua instead of malformed value tokens.
178 \def\ltj@safe@invalid{(nil)}
180 %% \ltj@safe@num{<number>}
182 % For a number (integer).
184 \ltj@safe@num@or\ltj@safe@invalid
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}
190 \def\ltj@@safe@numA#1\ltj@@safe@end#2#3{
198 %% \ltj@safe@dimen{<dimen>}
200 % For a dimension. The result is a scaled-point value.
202 \ltj@safe@dimen@or\ltj@safe@invalid
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}
208 \def\ltj@@safe@dimenA#1\ltj@@safe@end#2#3{
210 (\number\dimexpr#2\relax)
216 %% \ltj@safe@real{<real>}
218 % For a real number given in decimal notation or a macro that
219 % expands to such notation.
220 \def\ltj@safe@real#1{
221 (tonumber("\luatexluaescapestring{#1}"))
224 %% \ltj@val@counter{<counter>}
226 % For the current value of a LaTeX counter.
227 \def\ltj@val@counter#1{
228 (\expandafter\number\csname c@#1\endcsname)
231 %% \ltj@val@skip{<skip>}
232 % For the current value of a skip (or LaTeX-length) parameter.
233 %! グルーレジスタ(LaTeX 長さ変数).
236 (luatexja.base.to_skip("\the\glueexpr#1\relax"))
238 %! 整形式の整数 → 数値 : \number#1
239 %! 内部寸法 → 数値 : \number#1
240 %! 整形式の寸法 → 数値 : \number\dimexpr#1\relax
242 %% \ltj@safe@str{<text>}
243 %! 文字列. (トークン列を非トークン化)
244 % Converts a token sequence to Lua string notation.
246 "\luatexluaescapestring{\detokenize{#1}}"
249 %% \ltj@luaescape{<text>}
250 %! 非トークン化して Lua エスケープ.
251 \def\ltj@luaescape#1{
252 \luatexluaescapestring{\detokenize{#1}}
254 %% \ltj@luaxescape{<text>}
255 %! 非トークン化せずに(展開ありで) Lua エスケープ.
256 %! つまり単なる \luatexescape.
257 \let\ltj@luaxescape\luatexluaescapestring
259 %%------------------ Fully-expandable error messaging
261 %! ixerrtrick パッケージから移植.
262 %! 展開限定文脈でも使える \PackageError 等.
263 %! Lua 関数版(luatexja/base.lua 参照)もある.
265 %% \ltj@@error@message@a
268 \xdef\ltj@@error@message@a{%
269 Type~~H <return>~~for immediate help%
273 %%<+> \ltj@MessageBreak
274 % An analogue of \MessageBreak that is used in \ltj@GenericError, etc.
275 % (\MessageBreak cannot be used there.)
276 % NB: It is realized as a macro that expands to two instances
277 % of the character of code 127. This marker is later detected
278 % by the Lua process.
282 \gdef\ltj@MessageBreak{**}
284 luatexja.base._error_set_break("**")
289 %%<+> \ltj@GenericError{<cont>}{<msg-main>}{<msg-ref>}{<msg-help>}
290 % A variant of \GenericError that can be used in expansion-only
291 % situation. The meanings of arguments are the same as the original
293 %%<+> \ltj@PlainError{<msg-main>}{<msg-help>}
294 % A simpler error messenger available in expansion-only situations.
295 % It behaves similarly to:
296 % \errhelp{<msg-help}\errmessage{<msg-main>}
298 % with the same hack as in \GenericError...
303 \catcode`\ =11\relax%
306 \def\ltj@GenericError#1#2#3#4{% not protected
308 luatexja.base._error_set_message("\ltj@luaxescape{#1}",%
309 "\ltj@luaxescape{#2.^^J^^J#3^^J\ltj@@error@message@a}",%
310 "\ltj@luaxescape{#4}")%
312 \ % use csname with four spaces as last expander
314 \def\ {% csname with four spaces
316 luatexja.base._error_show(false)% and many spaces trail!
321 \def\ltj@PlainError#1#2{%
323 luatexja.base._error_set_message(" ",%
324 "\ltj@luaxescape{#1}",%
325 "\ltj@luaxescape{#2}")%
327 \error % again a weird name is used
329 \def\error {% csname with two trailing spaces
331 luatexja.base._error_show(true)% and many spaces trail!
338 %% \ltj@@error@on@line
339 \def\ltj@@error@on@line{
340 on input line \the \inputlineno
343 %% \ltj@generic@warn@info
344 \def\ltj@@generic@warn@info#1#2#3#4{
347 luatexja.base._generic_warn_info("\ltj@luaxescape{#3}",
348 "\ltj@luaxescape{#4}", (#1 > 0), (#2 > 0))
353 %% \ltj@GenericWarning{<cont>}{<msg-main>}
354 \def\ltj@GenericWarning{
355 \ltj@@generic@warn@info{1}{1}
357 %% \ltj@GenericWarningNoLine{<cont>}{<msg-main>}
358 \def\ltj@GenericWarningNoLine{
359 \ltj@@generic@warn@info{1}{0}
361 %% \ltj@GenericInfo{<cont>}{<msg-main>}
362 \def\ltj@GenericInfo{
363 \ltj@@generic@warn@info{0}{1}
365 %% \ltj@GenericInfoNoLine{<cont>}{<msg-main>}
366 \def\ltj@GenericInfoNoLine{
367 \ltj@@generic@warn@info{0}{0}
373 \xdef\ltj@@space@seq@a{~~~~~~~~~~~~~~~~}
374 \xdef\ltj@@space@seq@b{~~~~~~~~~~~~~}
377 %% \ltj@PackageError{<pkg-name>}{<msg-main>}{<msg-help>}
378 \def\ltj@PackageError#1#2#3{%
379 \ltj@GenericError{(#1)\ltj@@space@seq@a}%
380 {Package #1 Error: #2}%
381 {See the #1 package documentation for explanation.}%
384 %% \ltj@PackageWarning{<pkg-name>}{<msg-main>}
385 \def\ltj@PackageWarning#1#2{%
386 \ltj@GenericWarning{(#1)\ltj@@space@seq@a}%
387 {Package #1 Warning: #2}%
389 %% \ltj@PackageWarningNoLine{<pkg-name>}{<msg-main>}
390 \def\ltj@PackageWarningNoLine#1#2{%
391 \ltj@GenericWarningNoLine{(#1)\ltj@@space@seq@a}%
392 {Package #1 Warning: #2}%
394 %% \ltj@PackageInfo{<pkg-name>}{<msg-main>}
395 \def\ltj@PackageInfo#1#2{%
396 \ltj@GenericInfo{(#1)\ltj@@space@seq@b}%
397 {Package #1 Info: #2}%
399 %% \ltj@PackageInfoNoLine{<pkg-name>}{<msg-main>}
400 \def\ltj@PackageInfoNoLine#1#2{%
401 \ltj@GenericInfoNoLine{(#1)\ltj@@space@seq@b}%
402 {Package #1 Info: #2}%
405 %%------------------ debug logging
406 \ifdefined\LuaTeXjaDebugEnabled
409 \RequireLuaModule{luatexja.debug}
411 %% \ltj@debug{<format>}{<arg>,...}
414 luatexja.base.debug(\ltj@safe@str{#1}
415 \ltj@if@blank{#2}{}{, }
420 %% \ltj@package@debug{<package>}{<format>}{<arg>,...}
421 \def\ltj@package@debug#1#2#3{
423 luatexja.base.package_debug(\ltj@safe@str{#1},
425 \ltj@if@blank{#3}{}{, }
433 \def\ltj@package@debug#1#2#3{}
437 %% \ltj@debug@logger\CS{<package>}
438 \def\ltj@debug@logger#1#2{
439 \def#1{\ltj@package@debug{#2}}
442 %% \ltj@afterbox <token><box>
443 %% -> \setbox\ltj@afbox<box><token>
444 %% from Sonja Maus, ``Looking Ahead for a <box>'',
445 %% TUGBoat, 11, No. 4, 1990.
447 \protected\def\ltj@afterbox#1{%
448 \def\ltj@afb@xarg{#1}%
449 \afterassignment\ltj@afb@x
451 \def\ltj@afb@x{\futurelet\next\ltj@afb@xtest}
453 \ifcase\ifx\next\hbox\tw@\fi
454 \ifx\next\vbox\tw@\fi
455 \ifx\next\vtop\tw@\fi
457 \ifx\next\copy\@ne\fi
458 \ifx\next\vsplit\@ne\fi
459 \ifx\next\lastbox\@ne\fi
460 0% ``A <box> was ...'' error will be causes by \setbox later anyway.
461 \or\afterassignment\ltj@afb@xarg
462 \or\afterassignment\ltj@afb@xagarg
466 \def\ltj@afb@xagarg{\aftergroup\ltj@afb@xarg}
469 %%------------------ all done