OSDN Git Service

lltjp-listings.sty: support IVS (ugly hack)
[luatex-ja/luatexja.git] / src / patches / lltjp-listings.sty
1 %
2 % lltjp-listings.sty
3 %
4
5 \NeedsTeXFormat{LaTeX2e}
6 \ProvidesPackage{lltjp-listings}[2014/01/07 Patch to listings for LuaTeX-ja]
7 \RequirePackage{listings,luatexbase-cctb}
8
9 % override
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
13 {\catcode`\~=12
14   \gdef\ltj@lst@hss{%
15     \directlua{
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)) 
22       then
23         tex.sprint(cat_lp, string.char(0x5C) .. 'lst@hss ')
24       end
25     }%
26   }
27 }
28
29
30 % lowest level
31 \def\lst@kanjitrue{\let\lst@ifkanji\iftrue}
32 \def\lst@kanjifalse{\let\lst@ifkanji\iffalse}
33 \lst@AddToHook{InitVars}{\lst@kanjifalse}
34
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}
40
41 \def\ltj@lst@setletterflag{%
42   \lst@ifletter
43     \lst@ifkanji\lst@Output\lst@kanjifalse\fi
44   \else
45     \lst@lettertrue\lst@ifkanji\lst@kanjifalse\else\lst@OutputOther\fi
46   \fi}
47
48 \def\ltj@lst@setkanjiflag{%
49   \lst@ifletter
50     \lst@Output
51   \else
52     \lst@ifkanji\else\lst@OutputOther\fi\lst@lettertrue
53   \fi}
54
55 \def\ltj@lst@setopenflag{%
56   \lst@ifletter
57     \lst@letterfalse\lst@Output
58   \else
59     \lst@ifkanji\else\lst@OutputOther\fi
60   \fi\lst@kanjitrue}
61
62 \def\ltj@lst@setcloseflag{%
63   \lst@ifletter\else\lst@lettertrue\fi\lst@kanjitrue}
64
65 \def\lst@ProcessJALetter#1{%
66   \ifnum`#1>"E00FF\relax
67     \ifnum`#1<"E01F0\relax
68       \lst@Append#1\advance\lst@length\m@ne
69     \else
70       \lst@ProcessJALetter@aux#1%
71     \fi
72   \else
73     \lst@ProcessJALetter@aux#1%
74   \fi
75 }
76 \def\lst@ProcessJALetter@aux#1{%
77   \lst@whitespacefalse
78   \ifnum\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{`#1}}=0
79     \ifnum\ltjgetparameter{postbreakpenalty}{`#1}>0
80       \ltj@lst@setopenflag    % 開き括弧類
81     \else
82       \ifnum\ltjgetparameter{prebreakpenalty}{`#1}>0
83         \ltj@lst@setcloseflag % 閉じ括弧類,句読点
84       \else
85         \ltj@lst@setkanjiflag % 通常の和文文字
86     \fi\fi
87     \advance\lst@length\@ne   % 和文文字は通常の2倍の幅
88   \else
89     \ltj@lst@setletterflag
90   \fi
91   \lst@Append#1}
92 %\let\lst@ProcessJALetter\lst@ProcessJALetter@aux
93
94 \def\lst@ProcessJALetterHalf#1{%
95   \lst@whitespacefalse
96   \ifnum\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{`#1}}=0
97     \ifnum\ltjgetparameter{postbreakpenalty}{`#1}>0
98       \ltj@lst@setopenflag    % 開き括弧類
99     \else
100       \ifnum\ltjgetparameter{prebreakpenalty}{`#1}>0
101         \ltj@lst@setcloseflag % 閉じ括弧類
102       \else
103         \ltj@lst@setkanjiflag % 通常の和文文字
104     \fi\fi
105     % 半角カナは欧文文字と同じ幅
106   \else
107     \ltj@lst@setletterflag
108   \fi
109   \lst@Append#1}
110
111
112 % 半角カナの扱い
113
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}
119 }
120
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}%
126   \@temptokena{}%
127 }
128
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}%
135 }
136
137 \toks@{}
138 \ltj@@listing@jpsetN{65377}{65439}{\lst@ProcessJALetterHalf}
139 \edef\ltj@@listing@jpcmd{\the\toks@}\toks@{}
140
141 % catcode 対策
142 \newluatexcatcodetable\CatcodeTableLTJlistings
143 \setluatexcatcodetable\CatcodeTableLTJlistings{
144   \luatexcatcodetable\CatcodeTableLaTeXAtLetter
145   \catcode"FFFFF=13%"
146   \SetCatcodeRange{"FF61}{"FF9F}{13}%   半角文字
147 }
148
149 % hook!
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',
154     function(buf)
155       local ret = ''
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
161         end
162         ret = ret .. c
163       end
164       return ret
165     end, 'ltj.listings_unicode', 1)}}
166 \lst@AddToHook{ExitVars}{\directlua{luatexbase.remove_from_callback('process_input_buffer', 'ltj.listings_unicode')}}
167
168
169 % 白線対策
170 \def\lst@OutputToken{%
171     \lst@TrackNewLines \lst@OutputLostSpace
172     \lst@ifgobbledws
173         \lst@gobbledwhitespacefalse
174         \lst@@discretionary
175     \fi
176     \lst@CheckMerge
177     {\lst@thestyle{\lst@FontAdjust
178      \setbox\@tempboxa\lst@hbox
179         {\lsthk@OutputBox
180          \lst@lefthss
181          \expandafter\lst@FillOutputBox\the\lst@token\@empty
182          \lst@righthss}%
183      \ht\@tempboxa=0pt\dp\@tempboxa=0pt
184      \lst@CalcLostSpaceAndOutput}}%
185     \lst@ResetToken}
186
187 %
188 \gdef\lst@Escape#1#2#3#4{%
189     \lst@CArgX #1\relax\lst@CDefX
190         {}%
191         {\lst@ifdropinput\else
192          \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken
193          \lst@InterruptModes
194          \lst@EnterMode{\lst@TeXmode}{\lst@modetrue}%
195          \ifx\^^M#2%
196              \lst@CArg #2\relax\lst@ActiveCDefX
197                  {}%
198                  {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes}%
199                  {\lst@MProcessListing}%
200          \else
201              \lst@CArg #2\relax\lst@ActiveCDefX
202                  {}%
203                  {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes
204                   \lst@newlines\z@ \lst@whitespacefalse}%
205                  {}%
206          \fi
207          #3\catcode"FFFFF=9\lst@escapebegin
208          \fi}%
209         {}}
210
211
212 %    \begin{修正事項}{1.3} from jlisting.sty
213 % ちょっとした修正
214 \gdef\lst@breakProcessOther#1{\lst@ProcessOther#1}
215 % ソースコード目次における文字と番号の空き
216 \let \l@lstlisting = \l@figure
217 % キャプションとソースコード目次に対する日本語対応
218 \def\lstlistingname{ソースコード}
219 \def\lstlistlistingname{ソースコード目次}
220 %    \end{修正事項}
221 \endinput