OSDN Git Service

listings 用に kmaeda さんのアイデアを採用.
[luatex-ja/luatexja.git] / src / patches / lltjp-listings.sty
1 %
2 % lltjp-listings.sty
3 %
4
5 \NeedsTeXFormat{LaTeX2e}
6 \def\filedate{2012/09/22}
7 \def\fileversion{0.6}
8 \ProvidesPackage{lltjp-listings}[\filedate\space\fileversion]
9 \RequirePackage{listings,luatexbase-cctb}
10
11 % lowest level
12 \def\lst@kanjitrue{\let\lst@ifkanji\iftrue}
13 \def\lst@kanjifalse{\let\lst@ifkanji\iffalse}
14 \lst@AddToHook{InitVars}{\lst@kanjifalse}
15
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@ProcessLetter#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@ProcessLetter}%"
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         if tex.getcatcode(utf.byte(c)) \string~= 13 then
126           ret = ret .. utf.char(1048575) % U+FFFFF
127         end
128         ret = ret .. c
129       end
130       return ret
131     end, 'ltj.listings_unicode', 1)}}
132 \lst@AddToHook{DeInit}{\directlua{luatexbase.remove_from_callback('process_input_buffer', 'ltj.listings_unicode')}}
133
134
135 % 白線対策
136 \def\lst@OutputToken{%
137     \lst@TrackNewLines \lst@OutputLostSpace
138     \lst@ifgobbledws
139         \lst@gobbledwhitespacefalse
140         \lst@@discretionary
141     \fi
142     \lst@CheckMerge
143     {\lst@thestyle{\lst@FontAdjust
144      \setbox\@tempboxa\lst@hbox
145         {\lsthk@OutputBox
146          \lst@lefthss
147          \expandafter\lst@FillOutputBox\the\lst@token\@empty
148          \lst@righthss}%
149      \ht\@tempboxa=0pt\dp\@tempboxa=0pt
150      \lst@CalcLostSpaceAndOutput}}%
151     \lst@ResetToken}
152
153
154 %    \begin{修正事項}{1.3} from jlisting.sty
155 % ちょっとした修正
156 \gdef\lst@breakProcessOther#1{\lst@ProcessOther#1}
157 % ソースコード目次における文字と番号の空き
158 \let \l@lstlisting = \l@figure
159 % キャプションとソースコード目次に対する日本語対応
160 \def\lstlistingname{ソースコード}
161 \def\lstlistlistingname{ソースコード目次}
162 %    \end{修正事項}
163 \endinput