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.
717 lines
26 KiB
717 lines
26 KiB
%%
|
|
%% This is file `xunicode-addon.sty',
|
|
%% generated with the docstrip utility.
|
|
%%
|
|
%% The original source files were:
|
|
%%
|
|
%% xeCJK.dtx (with options: `xunicode')
|
|
%%
|
|
%% 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> $
|
|
{addon file for xunicode}
|
|
\ProvidesExplPackage{xunicode-addon}
|
|
{\ExplFileDate}{3.8.4}{\ExplFileDescription}
|
|
\bool_lazy_or:nnF
|
|
{ \sys_if_engine_xetex_p: }
|
|
{ \sys_if_engine_luatex_p: }
|
|
{
|
|
\msg_new:nnnn { xunicode-addon } { xetex-luatex }
|
|
{ This~package~requires~either~XeTeX~or~LuaTeX~to~function.}
|
|
{
|
|
You~must~change~your~typesetting~engine~to,~e.g.,\\
|
|
"xelatex"~or~"lualatex"~instead~of~plain~"latex"~or~"pdflatex".
|
|
}
|
|
\msg_critical:nn { xunicode-addon } { xetex-luatex }
|
|
}
|
|
\RequirePackage { xparse }
|
|
\clist_new:N \g__xunadd_encname_clist
|
|
\tl_if_exist:NT \UTFencname
|
|
{ \clist_gput_right:Nx \g__xunadd_encname_clist { \UTFencname } }
|
|
\DeclareOption*
|
|
{ \clist_gput_right:NV \g__xunadd_encname_clist \CurrentOption }
|
|
\ProcessOptions \scan_stop:
|
|
\@ifpackageloaded { xunicode } { }
|
|
{
|
|
\clist_get:NNF \g__xunadd_encname_clist \UTFencname
|
|
{
|
|
\cs_if_exist:NTF \UnicodeEncodingName
|
|
{ \tl_set:Nx \UTFencname { \UnicodeEncodingName } }
|
|
{
|
|
\sys_if_engine_xetex:TF
|
|
{ \tl_set:Nn \UTFencname { EU1 } }
|
|
{ \tl_set:Nn \UTFencname { EU2 } }
|
|
}
|
|
\clist_gset_eq:NN \g__xunadd_encname_clist \UTFencname
|
|
}
|
|
\sys_if_engine_xetex:TF
|
|
{ \RequirePackage { xunicode } }
|
|
{
|
|
\cs_set_eq:NN \__xunadd_tmp:w \XeTeXpicfile
|
|
\cs_set_eq:NN \XeTeXpicfile \prg_do_nothing:
|
|
\RequirePackage { xunicode }
|
|
\cs_set_eq:NN \XeTeXpicfile \__xunadd_tmp:w
|
|
}
|
|
}
|
|
\AtEndOfPackage { \__xunadd_reload:N \g__xunadd_encname_clist }
|
|
\RenewDocumentCommand \ReloadXunicode { m }
|
|
{
|
|
\clist_set:Nx \l__xunadd_encname_clist {#1}
|
|
\__xunadd_reload:N \l__xunadd_encname_clist
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_reload:N #1
|
|
{
|
|
\cs_set_eq:NN \__xunadd_tmp:w \iftipaonetoken
|
|
\cs_set_eq:NN \iftipaonetoken \scan_stop:
|
|
\use:x
|
|
{
|
|
\ExplSyntaxOff
|
|
\char_set_catcode_letter:n { 64 }
|
|
\exp_not:N \clist_map_function:NN \exp_not:N #1 \__xunadd_reload_aux:n
|
|
\bool_if:NTF \l__kernel_expl_bool
|
|
{ \ExplSyntaxOn }
|
|
{ \ExplSyntaxOff }
|
|
\char_set_catcode:nn { 64 } { \char_value_catcode:n { 64 } }
|
|
}
|
|
\cs_set_eq:NN \iftipaonetoken \__xunadd_tmp:w
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_reload_aux:n #1
|
|
{
|
|
\cs_if_exist:cTF { T@ #1 }
|
|
{
|
|
\tl_set:Nn \UTFencname {#1}
|
|
\clist_if_in:NnF \g__xunadd_encname_clist {#1}
|
|
{ \clist_gput_right:Nn \g__xunadd_encname_clist {#1} }
|
|
\file_input:n { xunicode.sty }
|
|
\file_input:n { xunicode-extra.def }
|
|
}
|
|
{ \msg_error:nnn { xunicode-addon } { encoding-unknown } {#1} }
|
|
}
|
|
\clist_new:N \l__xunadd_encname_clist
|
|
\msg_new:nnnn { xunicode-addon } { encoding-unknown }
|
|
{ Encoding~scheme~"#1"~unknown. }
|
|
{
|
|
You~may~use \\\\
|
|
\token_to_str:N \usepackage [ #1 , \encodingdefault ] \{fontenc\} \\\\
|
|
before~xunicode-addon~or~xunicode.
|
|
}
|
|
\RenewDocumentCommand \DeclareUTFmathsymbols { m }
|
|
{
|
|
\bool_if:NT \l__xunadd_math_as_UTF_text_bool
|
|
{
|
|
\seq_map_inline:Nn \l__xunadd_math_as_UTF_text_seq
|
|
{ \__xunadd_declare_math_as_UTF_text:n {##1} }
|
|
\bool_set_false:N \l__xunadd_math_as_UTF_text_bool
|
|
}
|
|
}
|
|
\seq_new:N \l__xunadd_math_as_UTF_text_seq
|
|
\seq_set_from_clist:Nn \l__xunadd_math_as_UTF_text_seq
|
|
{ hbar , Finv , aleph , beth , gimel , daleth , Game }
|
|
\bool_new:N \l__xunadd_math_as_UTF_text_bool
|
|
\RenewDocumentCommand \UseMathAsText { }
|
|
{
|
|
\math@s@text@true
|
|
\bool_set_true:N \l__xunadd_math_as_UTF_text_bool
|
|
}
|
|
\@onlypreamble \UseMathAsText
|
|
\cs_new_protected:Npn \__xunadd_declare_math_as_UTF_text:n #1
|
|
{
|
|
\cs_if_exist:cTF {#1}
|
|
{
|
|
\cs_new_eq:cc { keepmathUTF #1 } {#1}
|
|
\cs_gset_protected:cpx {#1}
|
|
{
|
|
\exp_not:N \mode_if_math:TF
|
|
{ \exp_not:c { keepmathUTF #1 } }
|
|
{ \exp_not:c { text #1 } }
|
|
}
|
|
\tl_put_right:Nx \l__xunadd_hyperref_hook_tl
|
|
{ \cs_set_eq:NN \exp_not:c {#1} \exp_not:c { text #1 } }
|
|
}
|
|
{ \cs_new:cpx {#1} { \exp_not:c { text #1 } } }
|
|
}
|
|
\tl_new:N \l__xunadd_hyperref_hook_tl
|
|
\AtBeginDocument
|
|
{
|
|
\cs_if_free:NF \pdfstringdefDisableCommands
|
|
{ \pdfstringdefDisableCommands { \l__xunadd_hyperref_hook_tl } }
|
|
}
|
|
\prg_new_conditional:Npnn \__xunadd_glyph_if_exist:n #1 { p , T , F , TF }
|
|
{
|
|
\tex_iffontchar:D \tex_font:D \tex_numexpr:D #1 \scan_stop:
|
|
\prg_return_true: \else: \prg_return_false: \fi:
|
|
}
|
|
\RenewDocumentCommand \UndeclareUTFcharacter { O { \UTFencname } m m }
|
|
{
|
|
\__xunadd_if_csname:nTF {#3}
|
|
{ \UndeclareTextCommand {#3} }
|
|
{ \exp_args:Nc \UndeclareTextCommand { \tl_to_str:n {#3} } }
|
|
{#1}
|
|
}
|
|
\RenewDocumentCommand \UndeclareUTFcomposite { O { \UTFencname } m m m }
|
|
{
|
|
\__xunadd_if_csname:nTF {#3}
|
|
{ \__xunadd_undeclare_composite:Nnnn #3 }
|
|
{ \exp_args:Nc \__xunadd_undeclare_composite:Nnnn { \tl_to_str:n {#3} } }
|
|
{#1} {#4} {#2}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_undeclare_composite:Nnnn #1#2#3#4
|
|
{ \cs_undefine:c { \__xunadd_composite_cs:Nnn #1 {#2} {#3} } }
|
|
\cs_new:Npx \__xunadd_composite_cs:Nnn #1#2#3
|
|
{ \c_backslash_str #2 \exp_not:N \token_to_str:N #1 - \exp_not:N \tl_to_str:n {#3} }
|
|
\cs_new:Npx \__xunadd_composite_cs:nnn #1#2#3
|
|
{ \c_backslash_str #2 #1 - \exp_not:N \tl_to_str:n {#3} }
|
|
\prg_new_conditional:Npnn \__xunadd_if_csname:n #1 { TF }
|
|
{
|
|
\tl_if_single_token:nTF {#1}
|
|
{
|
|
\token_if_cs:NTF #1
|
|
{ \prg_return_true: }
|
|
{
|
|
\token_if_active:NTF #1
|
|
{ \prg_return_true: }
|
|
{ \prg_return_false: }
|
|
}
|
|
}
|
|
{ \prg_return_false: }
|
|
}
|
|
\RenewDocumentCommand \DeclareUTFcharacter { O { \UTFencname } m m }
|
|
{
|
|
\cs_if_exist_use:cF
|
|
{ __xunadd_restore_ \tl_to_str:n {#3} : }
|
|
{
|
|
\__xunadd_if_csname:nTF {#3}
|
|
{ \__xunadd_declare_character:Nnn #3 }
|
|
{ \__xunadd_declare_character:cnn { \tl_to_str:n {#3} } }
|
|
{#1} {#2}
|
|
}
|
|
}
|
|
\cs_new_protected:cpn
|
|
{ __xunadd_restore_ \tl_to_str:n { \hbar } : }
|
|
{ \__xunadd_restore_cmd:N \hbar }
|
|
\cs_new_protected:cpn
|
|
{ __xunadd_restore_ \tl_to_str:n { \nobreakspace } : }
|
|
{ \__xunadd_restore_cmd:N \nobreakspace }
|
|
\cs_new_protected:Npn \__xunadd_restore_cmd:N #1
|
|
{ \__xunadd_restore_cmd:Nx #1 { ? - \token_to_str:N #1 } }
|
|
\cs_new_protected:Npn \__xunadd_restore_cmd:Nn #1#2
|
|
{
|
|
\cs_if_free:cF {#2}
|
|
{ \__xunadd_restore_cmd:Nc #1 {#2} }
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_restore_cmd:NN #1#2
|
|
{
|
|
\cs_gset_eq:NN #1 #2
|
|
\cs_undefine:N #2
|
|
}
|
|
\cs_generate_variant:Nn \__xunadd_restore_cmd:Nn { Nx }
|
|
\cs_generate_variant:Nn \__xunadd_restore_cmd:NN { Nc }
|
|
\cs_new_protected:Npn \__xunadd_declare_character:Nnn #1#2#3
|
|
{
|
|
\__xunadd_provide_text_command_default:N #1
|
|
\exp_after:wN \__xunadd_declare_character:NNxn
|
|
\tex_Uchar:D \__xunadd_check_slot:n {#3} \exp_stop_f:
|
|
#1 { \token_to_str:N #1 } {#2}
|
|
}
|
|
\cs_generate_variant:Nn \__xunadd_declare_character:Nnn { c }
|
|
\NewDocumentCommand \DeclareUTFSymbol { m O { \UTFencname } m }
|
|
{ \__xunadd_declare_character:Nnn #1 {#2} {#3} }
|
|
\NewDocumentCommand \DeclareUTFCommand { m O { \UTFencname } m }
|
|
{ \__xunadd_text_command:Nonn #1 { \token_to_str:N #1 } {#2} {#3} }
|
|
\cs_new_protected:Npn \__xunadd_text_command:Nnnn #1#2#3#4
|
|
{ \DeclareTextCommand #1 {#3} { \__xunadd_text_command:nn {#2} {#4} } }
|
|
\cs_generate_variant:Nn \__xunadd_text_command:Nnnn { No }
|
|
\cs_new_protected:Npn \__xunadd_text_command:nn #1#2
|
|
{
|
|
\__xunadd_begin_hook:nn {#1} {#2}
|
|
#2
|
|
\__xunadd_end_hook:nn {#1} {#2}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_provide_text_command_default:N #1
|
|
{
|
|
\cs_if_exist:cF { ? \token_to_str:N #1 }
|
|
{
|
|
\cs_if_free:cF { ? - \token_to_str:N #1 }
|
|
{
|
|
\exp_args:NNv \ProvideTextCommandDefault #1
|
|
{ ? - \token_to_str:N #1 }
|
|
}
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_declare_character:NNnn #1#2#3#4
|
|
{ \DeclareTextCommand #2 {#4} { \__xunadd_text_character:nN {#3} {#1} } }
|
|
\cs_new_protected:Npn \__xunadd_text_character:nN #1#2
|
|
{
|
|
\__xunadd_begin_hook:nn {#1} {#2}
|
|
\__xunadd_glyph_if_exist:nTF { `#2 }
|
|
{#2} { \cs_if_exist_use:cF { ? #1 } {#2} }
|
|
\__xunadd_end_hook:nn {#1} {#2}
|
|
}
|
|
\cs_generate_variant:Nn \__xunadd_declare_character:NNnn { NNx }
|
|
\cs_new:Npn \__xunadd_check_slot:n #1
|
|
{
|
|
\int_eval:n
|
|
{
|
|
\tl_if_head_eq_charcode:nNTF {#1} x
|
|
{ " \use_none:n #1 } {#1}
|
|
}
|
|
}
|
|
\RenewDocumentCommand \DeclareUTFcomposite { O { \UTFencname } m m m }
|
|
{
|
|
\__xunadd_if_csname:nTF {#3}
|
|
{ \__xunadd_declare_composite:Nnnn #3 }
|
|
{ \__xunadd_declare_composite:cnnn { \tl_to_str:n {#3} } }
|
|
{#1} {#4} {#2}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_declare_composite:Nnnn #1#2#3#4
|
|
{
|
|
\tex_afterassignment:D \use_none_delimit_by_q_stop:w
|
|
\__xunadd_chardef:cn { \__xunadd_composite_cs:Nnn #1 {#2} {#3} }
|
|
{ \__xunadd_check_slot:n {#4} }
|
|
\q_stop
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_chardef:Nn #1#2
|
|
{ \tex_chardef:D #1 = \tex_numexpr:D #2 \scan_stop: }
|
|
\cs_generate_variant:Nn \__xunadd_chardef:Nn { c }
|
|
\cs_generate_variant:Nn \__xunadd_declare_composite:Nnnn { c }
|
|
\NewDocumentCommand \DeclareUTFCompositeCommand { m O { \UTFencname } m m }
|
|
{ \cs_set_protected:cpn { \__xunadd_composite_cs:Nnn #1 {#2} {#3} } {#4} }
|
|
\NewDocumentCommand \DeclareUTFCompositeSymbol { m O { \UTFencname } m m }
|
|
{
|
|
\__xunadd_chardef:cn { \__xunadd_composite_cs:Nnn #1 {#2} {#3} }
|
|
{ \__xunadd_check_slot:n {#4} }
|
|
}
|
|
\NewDocumentCommand \DeclareUTFComposite { m O { \UTFencname } }
|
|
{ \use:x { \__xunadd_declare_composite:Nnn \exp_not:N #1 { \token_to_str:N #1 } {#2} } }
|
|
\NewDocumentCommand \DeclareUTFEncodedAccent { m O { \UTFencname } m m }
|
|
{ \__xunadd_declare_encoded:NNnnn \__xunadd_combine_accent:nnNNn #1 {#2} {#3} {#4} }
|
|
\NewDocumentCommand \DeclareUTFEncodedAccents { m O { \UTFencname } m m }
|
|
{ \__xunadd_declare_encoded:NNnnn \__xunadd_combine_accents:nnNNn #1 {#2} {#3} {#4} }
|
|
\NewDocumentCommand \DeclareUTFEncodedSymbol { m O { \UTFencname } m m }
|
|
{ \__xunadd_declare_encoded:NNnnn \__xunadd_combine_symbol:nnNNn #1 {#2} {#3} {#4} }
|
|
\NewDocumentCommand \DeclareUTFEncodedCircle { m O { \UTFencname } m m }
|
|
{ \__xunadd_declare_encoded:NNnnn \__xunadd_combine_circle:nnNNn #1 {#2} {#3} {#4} }
|
|
\RenewDocumentCommand \DeclareEncodedCompositeCharacter { m m m m }
|
|
{ \DeclareUTFEncodedSymbol #2 [#1] { "#3 } { "0#4 } }
|
|
\RenewDocumentCommand \DeclareEncodedCompositeAccents { m m m m }
|
|
{ \DeclareUTFEncodedAccents #2 [#1] { "#4 } { "#3 } }
|
|
\NewDocumentCommand \DeclareUTFDoubleEncodedAccent { m O { \UTFencname } m m }
|
|
{ \__xunadd_declare_encoded:NNnnn \__xunadd_combine_double_accent:nnNNn #1 {#2} {#3} {#4} }
|
|
\NewDocumentCommand \DeclareUTFDoubleEncodedSymbol { m O { \UTFencname } m m }
|
|
{ \__xunadd_declare_encoded:NNnnn \__xunadd_combine_double_symbol:nnNNn #1 {#2} {#3} {#4} }
|
|
\cs_new_protected:Npn \__xunadd_declare_composite:Nnn #1#2#3
|
|
{ \DeclareTextCommand #1 {#3} { \__xunadd_text_composite:nnn {#2} {#3} } }
|
|
\cs_new_protected:Npn \__xunadd_text_composite:nnn #1#2#3
|
|
{
|
|
\__xunadd_begin_hook:nn {#1} {#3}
|
|
\cs_if_exist:cTF { \__xunadd_composite_cs:nnn {#1} {#2} {#3} }
|
|
{
|
|
\__xunadd_text_composite:cnn
|
|
{ \__xunadd_composite_cs:nnn {#1} {#2} {#3} } {#1} {#3}
|
|
}
|
|
{ \cs_if_exist_use:cTF { ? #1 } { {#3} } {#3} }
|
|
\__xunadd_end_hook:nn {#1} {#3}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_text_composite:Nnn #1#2#3
|
|
{
|
|
\token_if_chardef:NTF #1
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF {#1}
|
|
{#1} { \cs_if_exist_use:cTF { ? #2 } { {#3} } {#3} }
|
|
}
|
|
{#1}
|
|
}
|
|
\cs_generate_variant:Nn \__xunadd_text_composite:Nnn { c }
|
|
\cs_new_protected:Npn \__xunadd_declare_encoded:NNnnn #1#2#3#4#5
|
|
{
|
|
\exp_after:wN \__xunadd_declare_encoded:NNNNxx
|
|
\tex_Uchar:D \__xunadd_check_slot:n {#4} \exp_after:wN \exp_stop_f:
|
|
\tex_Uchar:D \__xunadd_check_slot:n {#5} \exp_stop_f:
|
|
#1 #2 { \token_to_str:N #2 } {#3}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_declare_encoded:NNNNnn #1#2#3#4#5#6
|
|
{ \DeclareTextCommand #4 {#6} { #3 {#5} {#6} {#1} {#2} } }
|
|
\cs_generate_variant:Nn \__xunadd_declare_encoded:NNnnn { c }
|
|
\cs_generate_variant:Nn \__xunadd_declare_encoded:NNNNnn { NNNNxx }
|
|
\cs_new_protected:Npn \__xunadd_text_combine:NnnNNn #1#2#3#4#5#6
|
|
{
|
|
\__xunadd_begin_hook:nn {#2} {#6}
|
|
\cs_if_exist:cTF { \__xunadd_composite_cs:nnn {#2} {#3} {#6} }
|
|
{
|
|
\__xunadd_text_combine:cNnNNn
|
|
{ \__xunadd_composite_cs:nnn {#2} {#3} {#6} } #1 {#2} {#4} {#5} {#6}
|
|
}
|
|
{ #1 {#6} {#2} {#4} {#5} }
|
|
\__xunadd_end_hook:nn {#2} {#6}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_text_combine:NNnNNn #1#2#3#4#5#6
|
|
{
|
|
\token_if_chardef:NTF #1
|
|
{ \__xunadd_glyph_if_exist:nTF {#1} {#1} { #2 {#6} {#3} {#4} {#5} } }
|
|
{#1}
|
|
}
|
|
\cs_generate_variant:Nn \__xunadd_text_combine:NNnNNn { c }
|
|
\cs_new_protected:Npn \__xunadd_combine_symbol:nnNNn
|
|
{ \__xunadd_text_combine:NnnNNn \__xunadd_add_symbol:nnNN }
|
|
\cs_new_protected:Npn \__xunadd_add_symbol:nnNN #1#2#3#4
|
|
{
|
|
\tl_if_blank:nTF {#1}
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#4 }
|
|
{#4}
|
|
{ \cs_if_exist_use:cTF { ? #2 } { {#1} } {#4} }
|
|
}
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#3 }
|
|
{ #1#3 }
|
|
{ \cs_if_exist_use:cTF { ? #2 } { {#1} } { #1#3 } }
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_combine_accent:nnNNn
|
|
{ \__xunadd_text_combine:NnnNNn \__xunadd_add_accent:nnNN }
|
|
\cs_new_protected:Npn \__xunadd_add_accent:nnNN #1#2#3#4
|
|
{
|
|
\tl_if_blank:nTF {#1}
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#4 }
|
|
{#4}
|
|
{ \cs_if_exist_use:cTF { ? #2 } { {#1} } {#4} }
|
|
}
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#3 }
|
|
{ #1#3 }
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#4 }
|
|
{ \add@accent { `#4 } {#1} }
|
|
{ \cs_if_exist_use:cTF { ? #2 } { {#1} } { #1#3 } }
|
|
}
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_combine_accents:nnNNn
|
|
{ \__xunadd_text_combine:NnnNNn \__xunadd_add_accents:nnNN }
|
|
\cs_new_protected:Npn \__xunadd_add_accents:nnNN #1#2#3#4
|
|
{
|
|
\tl_if_blank:nTF {#1}
|
|
{ \cs_if_exist_use:cTF { ? #2 } { {#1} } {#1} }
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#3 }
|
|
{ \__xunadd_glyph_if_exist:nTF { `#4 } }
|
|
{ \use_ii:nn }
|
|
{ #1#3#4 }
|
|
{ \cs_if_exist_use:cTF { ? #2 } { {#1} } { #1#3#4 } }
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_combine_circle:nnNNn
|
|
{ \__xunadd_text_combine:NnnNNn \__xunadd_add_circle:nnNN }
|
|
\cs_new_protected:Npn \__xunadd_add_circle:nnNN #1#2#3#4
|
|
{
|
|
\tl_if_blank:nTF {#1}
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#4 }
|
|
{#4}
|
|
{ \cs_if_exist_use:cTF { ? #2 } { {#1} } {#4} }
|
|
}
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#4 }
|
|
{ \__xunadd_add_circle:nN {#1} #4 }
|
|
{ \cs_if_exist_use:cTF { ? #2 } { {#1} } {#1} }
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_add_circle:nN #1#2
|
|
{
|
|
\hcoffin_set:Nn \l__xunadd_tmp_coffin {#1}
|
|
\hcoffin_set:Nn \l__xunadd_circle_coffin {#2}
|
|
\fp_set:Nn \l__xunadd_circle_scale_fp
|
|
{
|
|
\dim_to_decimal_in_unit:nn
|
|
{
|
|
\fp_use:N \l__xunadd_circle_ratio_fp
|
|
\coffin_wd:N \l__xunadd_circle_coffin
|
|
}
|
|
{ \coffin_wd:N \l__xunadd_tmp_coffin }
|
|
}
|
|
\coffin_scale:Nnn \l__xunadd_tmp_coffin
|
|
{ \l__xunadd_circle_scale_fp } { \l__xunadd_circle_scale_fp }
|
|
\coffin_attach:NnnNnnnn
|
|
\l__xunadd_circle_coffin { hc } { vc }
|
|
\l__xunadd_tmp_coffin { hc } { vc } { \c_zero_dim } { \c_zero_dim }
|
|
\coffin_typeset:Nnnnn \l__xunadd_circle_coffin
|
|
{ H } { l } { \c_zero_dim } { \c_zero_dim }
|
|
}
|
|
\fp_new:N \l__xunadd_circle_scale_fp
|
|
\coffin_new:N \l__xunadd_tmp_coffin
|
|
\coffin_new:N \l__xunadd_circle_coffin
|
|
\NewDocumentCommand \settextcircledratio { m }
|
|
{ \fp_set:Nn \l__xunadd_circle_ratio_fp {#1} }
|
|
\fp_new:N \l__xunadd_circle_ratio_fp
|
|
\settextcircledratio { 0.7 }
|
|
\cs_new_protected:Npn \__xunadd_combine_double_accent:nnNNn
|
|
{ \__xunadd_text_combine:NnnNNn \__xunadd_add_double_accent:nnNN }
|
|
\cs_new_protected:Npn \__xunadd_add_double_accent:nnNN #1#2#3#4
|
|
{
|
|
\tl_if_blank:nTF {#1}
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#4 }
|
|
{#4}
|
|
{ \cs_if_exist_use:cTF { ? #2 } { {#1} } {#4} }
|
|
}
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#3 }
|
|
{ \__xunadd_add_double_symbol:nN {#1} #3 }
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#4 }
|
|
{ \add@accent { `#4 } {#1} }
|
|
{ \cs_if_exist_use:cTF { ? #2 } { {#1} } { #1#3 } }
|
|
}
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_combine_double_symbol:nnNNn
|
|
{ \__xunadd_text_combine:NnnNNn \__xunadd_add_double_symbol:nnNN }
|
|
\cs_new_protected:Npn \__xunadd_add_double_symbol:nnNN #1#2#3#4
|
|
{
|
|
\tl_if_blank:nTF {#1}
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#4 }
|
|
{#4}
|
|
{ \cs_if_exist_use:cTF { ? #2 } { {#1} } {#4} }
|
|
}
|
|
{
|
|
\__xunadd_glyph_if_exist:nTF { `#3 }
|
|
{ \__xunadd_add_double_symbol:nN {#1} #3 }
|
|
{ \cs_if_exist_use:cTF { ? #2 } { {#1} } { #1#3 } }
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_add_double_symbol:nN #1#2
|
|
{
|
|
\tl_if_head_is_N_type:nTF {#1}
|
|
{
|
|
\exp_after:wN \exp_after:wN \exp_after:wN
|
|
\__xunadd_add_double_symbol_aux:NnN \exp_after:wN \exp_after:wN
|
|
\tl_head:w #1 \q_stop \exp_after:wN { \use_none:n #1 } #2
|
|
}
|
|
{ #1#2 }
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_add_double_symbol_aux:NnN #1#2#3
|
|
{
|
|
\bool_lazy_any:nTF
|
|
{
|
|
{ \token_if_letter_p:N #1 }
|
|
{ \token_if_other_p:N #1 }
|
|
{ \token_if_chardef_p:N #1 }
|
|
}
|
|
{ #1#3#2 }
|
|
{ #1#2#3 }
|
|
}
|
|
\NewDocumentCommand \AtBeginUTFCommand { s O { } +m }
|
|
{
|
|
\tl_if_blank:nTF {#2}
|
|
{
|
|
\IfBooleanTF {#1}
|
|
{ \xunadd_set_begin_hook:n }
|
|
{ \xunadd_append_begin_hook:n }
|
|
}
|
|
{ \xunadd_set_begin_hook:nn {#2} }
|
|
{#3}
|
|
}
|
|
\NewDocumentCommand \AtEndUTFCommand { s O { } +m }
|
|
{
|
|
\tl_if_blank:nTF {#2}
|
|
{
|
|
\IfBooleanTF {#1}
|
|
{ \xunadd_set_end_hook:n }
|
|
{ \xunadd_append_end_hook:n }
|
|
}
|
|
{ \xunadd_set_end_hook:nn {#2} }
|
|
{#3}
|
|
}
|
|
\cs_new_protected:Npn \xunadd_set_begin_hook:n
|
|
{ \tl_set:Nn \l__xunadd_begin_hook_tl }
|
|
\cs_new_protected:Npn \xunadd_append_begin_hook:n
|
|
{ \tl_put_right:Nn \l__xunadd_begin_hook_tl }
|
|
\cs_new_protected:Npn \xunadd_set_end_hook:n
|
|
{ \tl_set:Nn \l__xunadd_end_hook_tl }
|
|
\cs_new_protected:Npn \xunadd_append_end_hook:n
|
|
{ \tl_put_right:Nn \l__xunadd_end_hook_tl }
|
|
\cs_new_protected:Npn \xunadd_set_begin_hook:nn
|
|
{ \__xunadd_set_cmd_hook:nnn { begin } }
|
|
\cs_new_protected:Npn \xunadd_set_end_hook:nn
|
|
{ \__xunadd_set_cmd_hook:nnn { end } }
|
|
\cs_new_protected:Npn \__xunadd_set_cmd_hook:nnn #1#2#3
|
|
{
|
|
\cs_set_protected:cpn
|
|
{
|
|
\tl_if_single:nTF {#2}
|
|
{ \use:c { __xunadd_#1_csname:n } { \token_to_str:N #2 } }
|
|
{ \__xunadd_set_cmd_hook_aux:Nnwn #2 \q_stop {#1} }
|
|
} ##1
|
|
{#3}
|
|
}
|
|
\cs_new:Npn \__xunadd_set_cmd_hook_aux:Nnwn #1#2 \q_stop #3
|
|
{ \use:c { __xunadd_#3_csname:n } { \token_to_str:N #1 - \tl_to_str:n {#2} } }
|
|
\cs_new:Npn \__xunadd_begin_csname:n #1 { __xunadd_begin_#1_hook:n }
|
|
\cs_new:Npn \__xunadd_end_csname:n #1 { __xunadd_end_#1_hook:n }
|
|
\tl_new:N \l__xunadd_begin_hook_tl
|
|
\tl_new:N \l__xunadd_end_hook_tl
|
|
\cs_new_protected:Npn \__xunadd_begin_hook:nn #1#2
|
|
{
|
|
\tl_use:N \l__xunadd_begin_hook_tl
|
|
\cs_if_exist_use:cF { \__xunadd_begin_csname:n { #1 - \tl_to_str:n {#2} } }
|
|
{ \cs_if_exist_use:cF { \__xunadd_begin_csname:n {#1} } { \use_none:n } }
|
|
{#2}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_end_hook:nn #1#2
|
|
{
|
|
\cs_if_exist_use:cF { \__xunadd_end_csname:n { #1 - \tl_to_str:n {#2} } }
|
|
{ \cs_if_exist_use:cF { \__xunadd_end_csname:n {#1} } { \use_none:n } }
|
|
{#2}
|
|
\tl_use:N \l__xunadd_end_hook_tl
|
|
}
|
|
\NewDocumentCommand \DeclareUTFTIPACommand { O { \UTFencname } m }
|
|
{ \use:x { \__xunadd_text_tipa_command:Nnn \exp_not:N #2 { \token_to_str:N #2 } {#1} } }
|
|
\cs_new_protected:Npn \__xunadd_text_tipa_command:Nnn #1#2#3
|
|
{
|
|
\cs_set_eq:cc { UTF/#3#2 } { #3#2 }
|
|
\DeclareTextCommand #1 {#3} { \__xunadd_text_tipa_command:nnn {#3} {#2} }
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_text_tipa_command:nnn #1#2#3
|
|
{
|
|
\exp_args:Ncc \__xunadd_check_for_tipa:NNn
|
|
{ \use_none:n #2 } { UTF/#1#2 } {#3}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_check_for_tipa:NNn #1#2#3
|
|
{
|
|
\tl_if_head_eq_meaning:nNTF {#3} \textipa
|
|
{
|
|
\exp_after:wN \tipacatchonechar \exp_after:wN
|
|
{ \exp_after:wN #1 \use_none:n #3 }
|
|
}
|
|
{ #2 {#3} }
|
|
}
|
|
\cs_new_protected:Npn \xunadd_get_slot:nn #1#2
|
|
{ \__xunadd_get_slot:wn #2 \q_nil \q_stop {#1} }
|
|
\cs_new_protected:Npn \__xunadd_get_slot:wn #1#2#3 \q_stop #4
|
|
{
|
|
\int_set:Nn \l_xunadd_slot_int { -1 }
|
|
\bool_set_false:N \l_xunadd_rest_bool
|
|
\group_begin: \exp_args:Nccc \group_end:
|
|
{ __xunadd_get_slot:NNnn }
|
|
{ #4 \token_to_str:N #1 }
|
|
{ \__xunadd_composite_cs:Nnn #1 {#4} {#2} }
|
|
{#2}
|
|
{#3}
|
|
}
|
|
\int_new:N \l_xunadd_slot_int
|
|
\bool_new:N \l_xunadd_rest_bool
|
|
\cs_new_protected:Npn \__xunadd_get_slot:NNnn #1#2#3#4
|
|
{
|
|
\cs_if_free:NF #1
|
|
{
|
|
\cs_if_exist:NTF #2
|
|
{ \__xunadd_get_composite_slot:Nn #2 {#4} }
|
|
{ \__xunadd_get_character_slot:Nn #1 { #3 #4 } }
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_get_composite_slot:Nn #1#2
|
|
{
|
|
\token_if_chardef:NT #1
|
|
{
|
|
\int_set:Nn \l_xunadd_slot_int {#1}
|
|
\quark_if_nil:nF {#2}
|
|
{ \bool_set_true:N \l_xunadd_rest_bool }
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_get_character_slot:Nn #1
|
|
{
|
|
\exp_after:wN \__xunadd_get_character_slot_aux:wn #1
|
|
\__xunadd_text_character:nN \q_nil \q_nil \q_stop
|
|
}
|
|
\cs_new_protected:Npn \__xunadd_get_character_slot_aux:wn
|
|
#1 \__xunadd_text_character:nN #2#3#4 \q_stop #5
|
|
{
|
|
\quark_if_nil:nF {#2}
|
|
{
|
|
\int_set:Nn \l_xunadd_slot_int { `#3 }
|
|
\quark_if_nil:nF {#5}
|
|
{ \bool_set_true:N \l_xunadd_rest_bool }
|
|
}
|
|
}
|
|
\cs_new_protected_nopar:Npn \xunadd@microtype@is@charx #1 \relax
|
|
{
|
|
\use:x
|
|
{ \xunadd_get_slot:nn { \MT@encoding } { \tex_the:D \MT@toks } }
|
|
\int_compare:nNnTF \l_xunadd_slot_int < \c_zero_int
|
|
{ \xunadd@original@is@charx #1 \relax }
|
|
{
|
|
\cs_set_nopar:Npx \MT@char@ { \int_use:N \l_xunadd_slot_int }
|
|
\bool_if:NT \l_xunadd_rest_bool { \MT@norestfalse }
|
|
}
|
|
}
|
|
\cs_new_protected_nopar:Npn \xunadd@microtype@hook
|
|
{
|
|
\cs_if_free:NF \MT@is@charx
|
|
{
|
|
\cs_new_eq:NN \xunadd@original@is@charx \MT@is@charx
|
|
\cs_set_eq:NN \MT@is@charx \xunadd@microtype@is@charx
|
|
\cs_set_eq:NN \MT@warn@unknown@once \use_none:n
|
|
}
|
|
}
|
|
\@ifpackageloaded { microtype }
|
|
{ \use:n } { \AtBeginDocument }
|
|
{ \xunadd@microtype@hook }
|
|
%%
|
|
%% 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 `xunicode-addon.sty'.
|
|
|