OSDN Git Service

luatexja-preset: use CJKShape=NLC/JIS1990.
[luatex-ja/luatexja.git] / src / patches / lltjp-listings.sty
1 %
2 % lltjp-listings.sty
3 %
4
5 \NeedsTeXFormat{LaTeX2e}
6 \ProvidesPackage{lltjp-listings}[2013/05/14 Patch to listings for LuaTeX-ja]
7 \RequirePackage{listings,luatexbase-cctb}
8
9 % lowest level
10 \def\lst@kanjitrue{\let\lst@ifkanji\iftrue}
11 \def\lst@kanjifalse{\let\lst@ifkanji\iffalse}
12 \lst@AddToHook{InitVars}{\lst@kanjifalse}
13
14 \def\lst@AppendLetter{%
15     \ltj@lst@setletterflag\lst@Append}
16 \def\lst@AppendOther{%
17     \lst@ifletter\lst@Output\lst@letterfalse\fi\lst@kanjifalse
18     \futurelet\lst@lastother\lst@Append}
19
20 \def\ltj@lst@setletterflag{%
21   \lst@ifletter
22     \lst@ifkanji\lst@Output\lst@kanjifalse\fi
23   \else
24     \lst@lettertrue\lst@ifkanji\lst@kanjifalse\else\lst@OutputOther\fi
25   \fi}
26
27 \def\ltj@lst@setkanjiflag{%
28   \lst@ifletter
29     \lst@Output
30   \else
31     \lst@ifkanji\else\lst@OutputOther\fi\lst@lettertrue
32   \fi}
33
34 \def\ltj@lst@setopenflag{%
35   \lst@ifletter
36     \lst@letterfalse\lst@Output
37   \else
38     \lst@ifkanji\else\lst@OutputOther\fi
39   \fi\lst@kanjitrue}
40
41 \def\ltj@lst@setcloseflag{%
42   \lst@ifletter\else\lst@lettertrue\fi\lst@kanjitrue}
43
44 \def\lst@ProcessJALetter#1{%
45   \lst@whitespacefalse
46   \ifnum\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{`#1}}=0
47     \ifnum\ltjgetparameter{postbreakpenalty}{`#1}>0
48       \ltj@lst@setopenflag    % 開き括弧類
49     \else
50       \ifnum\ltjgetparameter{prebreakpenalty}{`#1}>0
51         \ltj@lst@setcloseflag % 閉じ括弧類,句読点
52       \else
53         \ltj@lst@setkanjiflag % 通常の和文文字
54     \fi\fi
55     \advance\lst@length\@ne   % 和文文字は通常の2倍の幅
56   \else
57     \ltj@lst@setletterflag
58   \fi
59   \lst@Append#1}
60
61 \def\lst@ProcessJALetterHalf#1{%
62   \lst@whitespacefalse
63   \ifnum\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{`#1}}=0
64     \ifnum\ltjgetparameter{postbreakpenalty}{`#1}>0
65       \ltj@lst@setopenflag    % 開き括弧類
66     \else
67       \ifnum\ltjgetparameter{prebreakpenalty}{`#1}>0
68         \ltj@lst@setcloseflag % 閉じ括弧類
69       \else
70         \ltj@lst@setkanjiflag % 通常の和文文字
71     \fi\fi
72     % 半角カナは欧文文字と同じ幅
73   \else
74     \ltj@lst@setletterflag
75   \fi
76   \lst@Append#1}
77
78
79 % 半角カナの扱い
80
81 \def\ltj@@listing@jpsetN#1#2#3{% for (not large) range
82   \@tempcnta=#1 \@tempcntb=\numexpr 1+#2\relax \@temptokena{}%
83   \loop \global\advance\@tempcnta\@ne\ifnum\@tempcnta<\@tempcntb\relax
84     \ltj@@listing@jpsetN@{\@tempcnta}{#3}\repeat
85   \ltj@@listing@jpset@after{#1}
86 }
87
88 \def\ltj@@listing@jpset@after#1{%
89   \expandafter\edef\csname ltj@@listing@jpcmd@i#1\endcsname{\the\@temptokena}%
90   \toks@\expandafter\expandafter\expandafter\expandafter%
91   \expandafter\expandafter\expandafter{\expandafter\expandafter%
92   \expandafter\the\expandafter\toks@\csname ltj@@listing@jpcmd@i#1\endcsname}%
93   \@temptokena{}%
94 }
95
96 \def\ltj@@listing@jpsetN@#1#2{{%
97     \@tempcnta=#1 \lccode`\~=\@tempcnta \lccode`\/=\@tempcnta
98     \lowercase{\gdef\@temp{\gdef~{#2/}}}}%
99   \@temptokena\expandafter\expandafter\expandafter\expandafter%
100   \expandafter\expandafter\expandafter{\expandafter\expandafter%
101   \expandafter\the\expandafter\@temptokena\@temp}%
102 }
103
104 \toks@{}
105 \ltj@@listing@jpsetN{65377}{65439}{\lst@ProcessJALetterHalf}
106 \edef\ltj@@listing@jpcmd{\the\toks@}\toks@{}
107
108 % catcode 対策
109 \newluatexcatcodetable\CatcodeTableLTJlistings
110 \setluatexcatcodetable\CatcodeTableLTJlistings{
111   \luatexcatcodetable\CatcodeTableLaTeXAtLetter
112   \catcode"FFFFF=13%"
113   \setcatcoderange{"FF61}{"FF9F}{13}%   半角文字
114 }
115
116 % hook!
117 \lst@AddToHook{Init}{
118   \luatexcatcodetable\CatcodeTableLTJlistings\ltj@@listing@jpcmd
119   \lccode`\~="FFFFF\lowercase{\let~\lst@ProcessJALetter}%"
120   \directlua{luatexbase.add_to_callback('process_input_buffer',
121     function(buf)
122       local ret = ''
123       for i = 1, utf.len(buf) do
124         local c = utf.sub(buf, i, i)
125         local cu = utf.byte(c)
126         if cu > 0x80 and tex.getcatcode(cu) \string~= 13 then
127           ret = ret .. utf.char(1048575) % U+FFFFF
128         end
129         ret = ret .. c
130       end
131       return ret
132     end, 'ltj.listings_unicode', 1)}}
133 \lst@AddToHook{ExitVars}{\directlua{luatexbase.remove_from_callback('process_input_buffer', 'ltj.listings_unicode')}}
134
135
136 % 白線対策
137 \def\lst@OutputToken{%
138     \lst@TrackNewLines \lst@OutputLostSpace
139     \lst@ifgobbledws
140         \lst@gobbledwhitespacefalse
141         \lst@@discretionary
142     \fi
143     \lst@CheckMerge
144     {\lst@thestyle{\lst@FontAdjust
145      \setbox\@tempboxa\lst@hbox
146         {\lsthk@OutputBox
147          \lst@lefthss
148          \expandafter\lst@FillOutputBox\the\lst@token\@empty
149          \lst@righthss}%
150      \ht\@tempboxa=0pt\dp\@tempboxa=0pt
151      \lst@CalcLostSpaceAndOutput}}%
152     \lst@ResetToken}
153
154
155 %    \begin{修正事項}{1.3} from jlisting.sty
156 % ちょっとした修正
157 \gdef\lst@breakProcessOther#1{\lst@ProcessOther#1}
158 % ソースコード目次における文字と番号の空き
159 \let \l@lstlisting = \l@figure
160 % キャプションとソースコード目次に対する日本語対応
161 \def\lstlistingname{ソースコード}
162 \def\lstlistlistingname{ソースコード目次}
163 %    \end{修正事項}
164 \endinput