5 \NeedsTeXFormat{LaTeX2e}
6 \ProvidesPackage{lltjp-listings}[2014/01/07 Patch to listings for LuaTeX-ja]
7 \RequirePackage{listings,luatexbase-cctb}
10 \def\lst@FillFixed@#1{%
11 \ifx\@empty#1\else\ltj@lst@hss#1#1\expandafter\lst@FillFixed@\fi}
12 % First #1 is read by token.get_next() in \ltj@lst@hss
16 local cat_str = luatexbase.catcodetables['string']
17 local cat_lp = luatexbase.catcodetables['latex-package']
18 local uchar = unicode.utf8.char
19 local t = token.get_next()
20 if (t[1]~=11 and t[1]~=12)
21 or (not (t[2]>=0xE0100 and t[2]<0xE01F0))
23 tex.sprint(cat_lp, string.char(0x5C) .. 'lst@hss ')
31 \def\lst@kanjitrue{\let\lst@ifkanji\iftrue}
32 \def\lst@kanjifalse{\let\lst@ifkanji\iffalse}
33 \lst@AddToHook{InitVars}{\lst@kanjifalse}
35 \def\lst@AppendLetter{%
36 \ltj@lst@setletterflag\lst@Append}
37 \def\lst@AppendOther{%
38 \lst@ifletter\lst@Output\lst@letterfalse\fi\lst@kanjifalse
39 \futurelet\lst@lastother\lst@Append}
41 \def\ltj@lst@setletterflag{%
43 \lst@ifkanji\lst@Output\lst@kanjifalse\fi
45 \lst@lettertrue\lst@ifkanji\lst@kanjifalse\else\lst@OutputOther\fi
48 \def\ltj@lst@setkanjiflag{%
52 \lst@ifkanji\else\lst@OutputOther\fi\lst@lettertrue
55 \def\ltj@lst@setopenflag{%
57 \lst@letterfalse\lst@Output
59 \lst@ifkanji\else\lst@OutputOther\fi
62 \def\ltj@lst@setcloseflag{%
63 \lst@ifletter\else\lst@lettertrue\fi\lst@kanjitrue}
65 \def\lst@ProcessJALetter#1{%
66 \ifnum`#1>"E00FF\relax
67 \ifnum`#1<"E01F0\relax
68 \lst@Append#1\advance\lst@length\m@ne
70 \lst@ProcessJALetter@aux#1%
73 \lst@ProcessJALetter@aux#1%
76 \def\lst@ProcessJALetter@aux#1{%
78 \ifnum\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{`#1}}=0
79 \ifnum\ltjgetparameter{postbreakpenalty}{`#1}>0
80 \ltj@lst@setopenflag % 開き括弧類
82 \ifnum\ltjgetparameter{prebreakpenalty}{`#1}>0
83 \ltj@lst@setcloseflag % 閉じ括弧類,句読点
85 \ltj@lst@setkanjiflag % 通常の和文文字
87 \advance\lst@length\@ne % 和文文字は通常の2倍の幅
89 \ltj@lst@setletterflag
92 %\let\lst@ProcessJALetter\lst@ProcessJALetter@aux
94 \def\lst@ProcessJALetterHalf#1{%
96 \ifnum\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{`#1}}=0
97 \ifnum\ltjgetparameter{postbreakpenalty}{`#1}>0
98 \ltj@lst@setopenflag % 開き括弧類
100 \ifnum\ltjgetparameter{prebreakpenalty}{`#1}>0
101 \ltj@lst@setcloseflag % 閉じ括弧類
103 \ltj@lst@setkanjiflag % 通常の和文文字
107 \ltj@lst@setletterflag
114 \def\ltj@@listing@jpsetN#1#2#3{% for (not large) range
115 \@tempcnta=#1 \@tempcntb=\numexpr 1+#2\relax \@temptokena{}%
116 \loop \global\advance\@tempcnta\@ne\ifnum\@tempcnta<\@tempcntb\relax
117 \ltj@@listing@jpsetN@{\@tempcnta}{#3}\repeat
118 \ltj@@listing@jpset@after{#1}
121 \def\ltj@@listing@jpset@after#1{%
122 \expandafter\edef\csname ltj@@listing@jpcmd@i#1\endcsname{\the\@temptokena}%
123 \toks@\expandafter\expandafter\expandafter\expandafter%
124 \expandafter\expandafter\expandafter{\expandafter\expandafter%
125 \expandafter\the\expandafter\toks@\csname ltj@@listing@jpcmd@i#1\endcsname}%
129 \def\ltj@@listing@jpsetN@#1#2{{%
130 \@tempcnta=#1 \lccode`\~=\@tempcnta \lccode`\/=\@tempcnta
131 \lowercase{\gdef\@temp{\gdef~{#2/}}}}%
132 \@temptokena\expandafter\expandafter\expandafter\expandafter%
133 \expandafter\expandafter\expandafter{\expandafter\expandafter%
134 \expandafter\the\expandafter\@temptokena\@temp}%
138 \ltj@@listing@jpsetN{65377}{65439}{\lst@ProcessJALetterHalf}
139 \edef\ltj@@listing@jpcmd{\the\toks@}\toks@{}
142 \newluatexcatcodetable\CatcodeTableLTJlistings
143 \setluatexcatcodetable\CatcodeTableLTJlistings{
144 \luatexcatcodetable\CatcodeTableLaTeXAtLetter
146 \SetCatcodeRange{"FF61}{"FF9F}{13}% 半角文字
150 \lst@AddToHook{Init}{
151 \luatexcatcodetable\CatcodeTableLTJlistings\ltj@@listing@jpcmd
152 \lccode`\~="FFFFF\lowercase{\let~\lst@ProcessJALetter}%"
153 \directlua{luatexbase.add_to_callback('process_input_buffer',
156 for i = 1, utf.len(buf) do
157 local c = utf.sub(buf, i, i)
158 local cu = utf.byte(c)
159 if cu > 0x80 and tex.getcatcode(cu) \string~= 13 then
160 ret = ret .. utf.char(1048575) % U+FFFFF
165 end, 'ltj.listings_unicode', 1)}}
166 \lst@AddToHook{ExitVars}{\directlua{luatexbase.remove_from_callback('process_input_buffer', 'ltj.listings_unicode')}}
170 \def\lst@OutputToken{%
171 \lst@TrackNewLines \lst@OutputLostSpace
173 \lst@gobbledwhitespacefalse
177 {\lst@thestyle{\lst@FontAdjust
178 \setbox\@tempboxa\lst@hbox
181 \expandafter\lst@FillOutputBox\the\lst@token\@empty
183 \ht\@tempboxa=0pt\dp\@tempboxa=0pt
184 \lst@CalcLostSpaceAndOutput}}%
188 \gdef\lst@Escape#1#2#3#4{%
189 \lst@CArgX #1\relax\lst@CDefX
191 {\lst@ifdropinput\else
192 \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken
194 \lst@EnterMode{\lst@TeXmode}{\lst@modetrue}%
196 \lst@CArg #2\relax\lst@ActiveCDefX
198 {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes}%
199 {\lst@MProcessListing}%
201 \lst@CArg #2\relax\lst@ActiveCDefX
203 {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes
204 \lst@newlines\z@ \lst@whitespacefalse}%
207 #3\catcode"FFFFF=9\lst@escapebegin
212 % \begin{修正事項}{1.3} from jlisting.sty
214 \gdef\lst@breakProcessOther#1{\lst@ProcessOther#1}
215 % ソースコード目次における文字と番号の空き
216 \let \l@lstlisting = \l@figure
217 % キャプションとソースコード目次に対する日本語対応
218 \def\lstlistingname{ソースコード}
219 \def\lstlistlistingname{ソースコード目次}