You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
tex-compiler/texmf-dist/tex/xelatex/xecjk/xeCJK-listings.sty

372 lines
14 KiB

%%
%% This is file `xeCJK-listings.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% xeCJK.dtx (with options: `listings')
%%
%% Copyright (C) 2007--2010 by Wenchang Sun <sunwch@nankai.edu.cn>
%% Copyright (C) 2009--2020 by Leo Liu <leoliu.pku@gmail.com>
%% Copyright (C) 2012--2020 by Qing Lee <sobenlee@gmail.com>
%% ----------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
%% version 1.3c of this license or (at your option) any later
%% version. This version of this license is in
%% http://www.latex-project.org/lppl/lppl-1-3c.txt
%% and the latest version of this license is in
%% http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of
%% LaTeX version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status "maintained".
%%
%% The Current Maintainers of this work are Leo Liu and Qing Lee.
%%
%% ----------------------------------------------------------------------
%%
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
\GetIdInfo$Id: xeCJK.dtx 94baac7 2020-06-06 23:21:05 +0800 Qing Lee <sobenlee@gmail.com> $
{xeCJK patch file for listings}
\ProvidesExplPackage{xeCJK-listings}
{\ExplFileDate}{3.8.4}{\ExplFileDescription}
\DeclareOption* { \PassOptionsToPackage { \CurrentOption } { xeCJK } }
\ProcessOptions \scan_stop:
\RequirePackage { xeCJK }
\RequirePackage { listings }
\lst@AddToHook { Init } { \__xeCJK_listings_initial_hook: }
\lst@AddToHook { SelectCharTable } { \__xeCJK_listings_toks_hook: }
\lst@AddToHook { OutputBox }
{
\tl_set_eq:NN \l_xeCJK_punct_style_tl \c__xeCJK_punct_style_plain_tl
\l__xeCJK_restore_listings_toks_tl
\__xeCJK_listings_output_CM:
}
\lst@AddToHook { PreSet } { \bool_set_true:N \l__xeCJK_listings_env_bool }
\cs_new_protected:Npn \__xeCJK_listings_initial_hook:
{
\tex_noindent:D
\bool_gset_false:N \g__xeCJK_listings_CM_bool
\tl_put_left:Nn \lst@numberstyle { \l__xeCJK_restore_listings_toks_tl }
\xeCJK_add_to_shipout:n { \l__xeCJK_restore_listings_toks_tl }
\lst@ifbreaklines
\cs_set_eq:NN \__xeCJK_listings_CJK_toks_hook: \__xeCJK_listings_breaklines_toks:
\tl_if_empty:NF \lst@prebreak
{ \tl_put_left:Nn \lst@prebreak { \l__xeCJK_restore_listings_toks_tl } }
\tl_if_empty:NF \lst@postbreak
{ \tl_put_left:Nn \lst@postbreak { \l__xeCJK_restore_listings_toks_tl } }
\fi:
\int_set:Nn \l__xeCJK_listings_max_char_int
{ \lst@ifec 255 \else: 127 \fi: }
}
\int_new:N \l__xeCJK_listings_max_char_int
\cs_new_protected:Npn \__xeCJK_listings_toks_hook:
{
\tl_clear:N \l__xeCJK_restore_listings_toks_tl
\seq_map_function:NN
\g__xeCJK_class_seq \__xeCJK_backup_inter_class_toks:n
\seq_map_inline:Nn \g__xeCJK_non_CJK_class_seq
{
\str_if_eq:nnF { ##1 } { Boundary }
{
\xeCJK_inter_class_toks:nnn { Boundary } { ##1 }
{ \__xeCJK_listings_process_Default:nN { ##1 } }
}
}
\xeCJK_inter_class_toks:nnn { Boundary } { CM }
{ \__xeCJK_listings_process_CM:nN { 0 } }
\__xeCJK_listings_CJK_toks_hook:
}
\cs_new_protected:Npn \__xeCJK_backup_inter_class_toks:n #1
{
\tl_set:Nx \l__xeCJK_tmp_tl
{ \xeCJK_get_inter_class_toks:nn { Boundary } {#1} }
\tl_put_right:Nx \l__xeCJK_restore_listings_toks_tl
{
\xeCJK_inter_class_toks:nnn { Boundary } {#1}
{
\tl_if_empty:NTF \l__xeCJK_tmp_tl
{ \exp_not:N \prg_do_nothing: }
{ \exp_not:o \l__xeCJK_tmp_tl }
}
}
}
\tl_new:N \l__xeCJK_restore_listings_toks_tl
\cs_new_protected:Npn \__xeCJK_listings_CJK_toks_hook:
{
\xeCJK_inter_class_toks:nnn { Boundary } { CJK }
{ \__xeCJK_listings_process_CJK:nN { 2 } }
\xeCJK_inter_class_toks:nnn { Boundary } { FullLeft }
{ \__xeCJK_listings_process_CJK:nN { 2 } }
\xeCJK_inter_class_toks:nnn { Boundary } { FullRight }
{ \__xeCJK_listings_process_CJK:nN { 2 } }
\xeCJK_inter_class_toks:nnn { Boundary } { HangulJamo }
{ \__xeCJK_listings_process_CJK:nN { 2 } }
\seq_map_inline:Nn \g__xeCJK_CJK_sub_class_seq
{
\xeCJK_inter_class_toks:nnn { Boundary } { CJK/##1 }
{ \__xeCJK_listings_process_CJK:nN { 2 } }
}
}
\cs_new_protected:Npn \__xeCJK_listings_breaklines_toks:
{
\xeCJK_inter_class_toks:nnn { Boundary } { CJK }
{ \__xeCJK_listings_process_breaklines_CJK:nN { 2 } }
\xeCJK_inter_class_toks:nnn { Boundary } { HangulJamo }
{ \__xeCJK_listings_process_breaklines_CJK:nN { 2 } }
\xeCJK_inter_class_toks:nnn { Boundary } { FullLeft }
{ \__xeCJK_listings_process_FullLeft:nN { 2 } }
\xeCJK_inter_class_toks:nnn { Boundary } { FullRight }
{ \__xeCJK_listings_process_FullRight:nN { 2 } }
\seq_map_inline:Nn \g__xeCJK_CJK_sub_class_seq
{
\xeCJK_inter_class_toks:nnn { Boundary } { CJK/##1 }
{ \__xeCJK_listings_process_breaklines_CJK:nN { 2 } }
}
}
\cs_new_protected:Npn \__xeCJK_listings_process_Default:nN #1#2
{
\int_compare:nNnTF
{ \xeCJK_token_value_charcode:N #2 } > \l__xeCJK_listings_max_char_int
{
\token_if_letter:NTF #2
{ \lst@ProcessLetter #2 }
{ \lst@ProcessOther #2 }
}
{ \__xeCJK_listings_output_Default:nN {#1} #2 }
}
\cs_new_protected:Npn \__xeCJK_listings_output_Default:nN #1#2
{
\group_begin:
\xeCJK_clear_inter_class_toks:nn { Boundary } {#1}
\xeCJK_inter_class_toks:nnn {#1} { Boundary } { \group_end: }
#2
\scan_stop:
}
\cs_new_protected:Npn \__xeCJK_listings_process_CJK:nN #1#2
{
\token_if_letter:NTF #2
{ \__xeCJK_listings_process_letter:nN {#1} #2 }
{ \__xeCJK_listings_process_other:nN {#1} #2 }
}
\cs_new_protected:Npn \__xeCJK_listings_append:nN #1#2
{
\int_add:Nn \lst@length { #1 - 1 }
\lst@Append #2
}
\cs_new_protected:Npn \__xeCJK_listings_process_letter:nN
{
\lst@whitespacefalse
\bool_if:NTF \l__xeCJK_listings_letter_bool
{ \lst@lettertrue }
{
\lst@ifletter \lst@Output \else: \lst@OutputOther \lst@lettertrue \fi:
\bool_set_true:N \l__xeCJK_listings_letter_bool
}
\__xeCJK_listings_append:nN
}
\bool_new:N \l__xeCJK_listings_letter_bool
\cs_new_protected:Npn \__xeCJK_listings_process_other:nN #1#2
{
\lst@whitespacefalse
\bool_if:NTF \l__xeCJK_listings_letter_bool
{
\lst@Output \lst@letterfalse
\bool_set_false:N \l__xeCJK_listings_letter_bool
}
{ \lst@ifletter \lst@Output \lst@letterfalse \fi: }
\cs_set_eq:NN \lst@lastother #2
\__xeCJK_listings_append:nN {#1} #2
}
\cs_new_protected:Npn \__xeCJK_listings_process_breaklines_CJK:nN
{
\lst@whitespacefalse
\bool_if:NTF \l__xeCJK_listings_letter_bool
{
\int_compare:nNnF \l__xeCJK_listings_flag_int = 2 { \lst@Output }
\lst@lettertrue
}
{
\lst@ifletter \lst@Output \else: \lst@OutputOther \lst@lettertrue \fi:
\bool_set_true:N \l__xeCJK_listings_letter_bool
}
\int_set_eq:NN \l__xeCJK_listings_flag_int \c_one_int
\__xeCJK_listings_append:nN
}
\cs_new_protected:Npn \__xeCJK_listings_process_FullLeft:nN #1#2
{
\lst@whitespacefalse
\bool_if:NTF \l__xeCJK_listings_letter_bool
{
\int_compare:nNnF \l__xeCJK_listings_flag_int = 2
{
\int_compare:nNnTF \l__xeCJK_listings_flag_int = 3
{ \bool_if:NT \l__xeCJK_punct_breakable_bool { \lst@Output } }
{ \lst@Output }
}
\lst@lettertrue
}
{
\lst@ifletter \lst@Output \else: \lst@OutputOther \lst@lettertrue \fi:
\bool_set_true:N \l__xeCJK_listings_letter_bool
}
\int_set:Nn \l__xeCJK_listings_flag_int { 2 }
\__xeCJK_listings_append:nN {#1} #2
}
\cs_new_protected:Npn \__xeCJK_listings_process_FullRight:nN #1#2
{
\lst@whitespacefalse
\bool_if:NTF \l__xeCJK_listings_letter_bool
{
\int_compare:nNnT \l__xeCJK_listings_flag_int < 2
{ \__xeCJK_punct_if_long:NT #2 { \lst@Output } }
\lst@lettertrue
}
{
\lst@ifletter \lst@Output \else: \lst@OutputOther \lst@lettertrue \fi:
\bool_set_true:N \l__xeCJK_listings_letter_bool
}
\int_set:Nn \l__xeCJK_listings_flag_int { 3 }
\__xeCJK_listings_append:nN {#1} #2
}
\int_new:N \l__xeCJK_listings_flag_int
\cs_set_protected:Npn \lst@AppendLetter
{
\bool_if:NTF \l__xeCJK_listings_letter_bool
{
\lst@Output \lst@lettertrue
\bool_set_false:N \l__xeCJK_listings_letter_bool
}
{ \reverse_if:N \lst@ifletter \lst@OutputOther \lst@lettertrue \fi: }
\lst@ifbreaklines \int_zero:N \l__xeCJK_listings_flag_int \fi:
\lst@Append
}
\cs_set_protected:Npn \lst@AppendOther
{
\bool_if:NTF \l__xeCJK_listings_letter_bool
{
\lst@Output \lst@letterfalse
\bool_set_false:N \l__xeCJK_listings_letter_bool
}
{ \lst@ifletter \lst@Output \lst@letterfalse \fi: }
\lst@ifbreaklines \int_zero:N \l__xeCJK_listings_flag_int \fi:
\tex_futurelet:D \lst@lastother \lst@Append
}
\cs_new_protected:Npn \__xeCJK_listings_process_CM:nN
{
\reverse_if:N \lst@ifflexible
\bool_gset_true:N \g__xeCJK_listings_CM_bool
\fi:
\__xeCJK_listings_process_letter:nN
}
\cs_new_protected:Npn \__xeCJK_listings_output_CM:
{
\reverse_if:N \lst@ifflexible
\bool_if:NT \g__xeCJK_listings_CM_bool
{
\bool_gset_false:N \g__xeCJK_listings_CM_bool
\xeCJK_cs_clear:N \lst@FillOutputBox
\cs_set_eq:NN \CJKglue \tex_hss:D
}
\fi:
}
\bool_new:N \g__xeCJK_listings_CM_bool
\cs_new_protected:Npn \__xeCJK_listings_peek_active_loop:TF #1#2#3
{
\token_if_active:NTF #3
{ #1#3 }
{
\token_if_cs:NTF #3
{ #2#3 }
{
\int_compare:nNnTF { `#3 } > { \l__xeCJK_listings_max_char_int }
{ \__xeCJK_listings_peek_active_loop:TF { #1#3 } { #2#3 } }
{ #2#3 }
}
}
}
\cs_set_eq:NN \lst@IfNextCharActive \__xeCJK_listings_peek_active_loop:TF
\cs_new_protected:Npn \__xeCJK_listings_rescan:Nn #1#2
{
\__xeCJK_listings_set_escape:
\tl_set:Nn \l__xeCJK_tmp_tl {#2}
\__xeCJK_listings_escape_backslash:
\tl_set_rescan:Nno #1 { } { \l__xeCJK_tmp_tl }
}
\cs_new_protected:Npn \__xeCJK_listings_inside_convert:nw #1 ~ \@empty
{
\__xeCJK_listings_rescan:Nn \l__xeCJK_tmp_tl {#1}
\tl_put_right:No \lst@arg { \l__xeCJK_tmp_tl }
}
\cs_set_eq:NN \lst@InsideConvert@ \__xeCJK_listings_inside_convert:nw
\cs_new_protected:Npn \__xeCJK_listings_inline_group:w
{
\exp_after:wN \__xeCJK_listings_inline_group:n
\exp_after:wN { \if_int_compare:w `} = \c_zero_int \fi:
}
\cs_set_eq:NN \lst@InlineGJ \__xeCJK_listings_inline_group:w
\cs_new_protected:Npn \__xeCJK_listings_inline_group:n #1
{
\__xeCJK_listings_rescan:Nn \lst@arg {#1}
\lst@InlineGJEnd
}
\group_begin:
\cs_set:Npn \__xeCJK_tmp:w #1
{
\group_end:
\cs_new_protected:Npn \__xeCJK_listings_set_escape:
{ \xeCJK_swap_cs:NN #1 \__xeCJK_listings_escape:N }
\cs_new_protected:Npn \__xeCJK_listings_escape:N ##1
{ \cs_if_eq:NNTF #1 ##1 { \__xeCJK_listings_escape:N } {##1} }
}
\use:n
{
\char_set_catcode_active:N \\
\__xeCJK_tmp:w
}
{ \ }
\cs_new_protected:Npx \__xeCJK_listings_escape_backslash:
{
\tl_replace_all:Nnn \exp_not:N \l__xeCJK_tmp_tl
{ \c_backslash_str }
{ \c_backslash_str \c_backslash_str }
}
%%
%% This package consists of the files xeCJK.dtx,
%% full-stop.map,
%% fullwidth-stop.map,
%% han-simp.map,
%% han-trad.map,
%% and the derived files xeCJK.pdf,
%% xeCJK.sty,
%% xeCJK.cfg,
%% xeCJK.ins,
%% xeCJKfntef.sty,
%% xeCJK-listings.sty,
%% xunicode-addon.sty,
%% xunicode-extra.def,
%% xeCJK-example-autofake.tex,
%% xeCJK-example-fallback.tex,
%% xeCJK-example-subCJKblock.tex,
%% xeCJK-example-CJKecglue.tex,
%% xeCJK-example-checksingle.tex,
%% xeCJK-example-CJKfntef.tex,
%% xeCJK-example-punctstyle.tex,
%% xeCJK-example-verbatim.tex,
%% xeCJK-example-CM.tex,
%% xeCJK-example-listings.tex,
%% xeCJK-example-mathblock.tex,
%% xunicode-symbols.tex,
%% xunicode-commands.tex,
%% xunicode-combine-marks.tex,
%% xunicode-symbols.pdf,
%% full-stop.tec,
%% fullwidth-stop.tec,
%% han-simp.tec,
%% han-trad.tec, and
%% README.md.
%%
%% End of file `xeCJK-listings.sty'.