summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2012-12-15 23:30:50 +0000
committerKarl Berry <karl@freefriends.org>2012-12-15 23:30:50 +0000
commit53c4b8c53ed95a842aac0efbedd7dc0a55ffa511 (patch)
tree00f4a6929dc2bf634f1969f1f0b55994eabcddaf /Master/texmf-dist/tex
parent73e38a04c88122b4157e1a4708fe7d4520b2ac41 (diff)
new zxjatype (15dec12)
git-svn-id: svn://tug.org/texlive/trunk@28541 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r--Master/texmf-dist/tex/latex/zxjatype/zxjatype.sty1036
1 files changed, 1036 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/zxjatype/zxjatype.sty b/Master/texmf-dist/tex/latex/zxjatype/zxjatype.sty
new file mode 100644
index 00000000000..b442aea4d8e
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/zxjatype/zxjatype.sty
@@ -0,0 +1,1036 @@
+%
+% zxjatype.sty
+%
+%% package declaration
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{zxjatype}[2012/09/09 v0.6 ZX Japanese typeset]
+\RequirePackage{ifxetex}\RequireXeTeX
+
+%% code guards
+\edef\zxjt@restore@codes{%
+ \catcode34=\the\catcode34%
+ \catcode39=\the\catcode39%
+ \catcode43=\the\catcode43%
+ \catcode45=\the\catcode45%
+ \catcode46=\the\catcode46%
+ \catcode47=\the\catcode47%
+ \catcode58=\the\catcode58%
+ \catcode60=\the\catcode60%
+ \catcode62=\the\catcode62%
+ \catcode63=\the\catcode63%
+ \catcode94=\the\catcode94%
+ \catcode96=\the\catcode96%
+ \endlinechar=\the\endlinechar%
+\relax}
+\catcode34=12 % <">
+\catcode39=12 % <'>
+\catcode43=12 % <+>
+\catcode45=12 % <->
+\catcode46=12 % <.>
+\catcode47=12 % </>
+\catcode58=12 % <:>
+\catcode60=12 % <<>
+\catcode62=12 % <>>
+\catcode63=12 % <?>
+\catcode94=7 % <^>
+\catcode96=12 % <`>
+\AtEndOfPackage{%
+ \zxjt@restore@codes
+ \let\zxjt@restore@codes\@undefined
+}
+\endlinechar=13 %
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% BOOTSTRAP CODE
+%
+
+%% definitions
+\def\zxjt@pkgname{zxjatype}
+\newif\ifzxjt@default
+\newif\ifzxjt@checksingle
+\newif\ifzxjt@adjustcharclass
+\providecommand*\bxDebug{\@gobble}
+
+%% process options
+\DeclareOption{default}{\zxjt@defaulttrue}
+\DeclareOption{nodefault}{\zxjt@defaultfalse}
+\DeclareOption{oldxetex}{% no longer supported
+ \PackageError\zxjt@pkgname
+ {'oldxetex' is no longer supported}\@ehc
+}
+\DeclareOption{CJKchecksingle}{\zxjt@checksingletrue}
+\DeclareOption{noCJKchecksingle}{\zxjt@checksinglefalse}
+% effective only in 'new-age' code
+\DeclareOption{adjustcharclass}{\zxjt@adjustcharclasstrue}
+\DeclareOption{noadjustcharclass}{\zxjt@adjustcharclassfalse}
+%
+\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{xeCJK}}
+\ExecuteOptions{default,CJKchecksingle,adjustcharclass}
+\ProcessOptions\relax
+
+%% load xeCJK package
+\@ifpackageloaded{xeCJK}{}{%
+ \RequirePackage{xeCJK}%
+}
+\@ifpackagelater{xeCJK}{2012/05/01}{%
+ \bxDebug{xeCJK v3.x found.}%
+ \let\zxjt@go@to@main\@empty
+}{%
+ \bxDebug{xeCJK v2.x found.}%
+ \long\def\zxjt@go@to@main#1\zxjt@begin@old@code{}%
+}
+
+%% jump to main code
+\zxjt@go@to@main
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% NEW-AGE CODE
+
+%% load packages
+\RequirePackage{xparse} % xeCJK has already done it...
+\ExplSyntaxOn
+
+%%-------------------------------------- transition
+
+%% \l__zxjt_default_bool
+\bool_new:N \l__zxjt_default_bool
+\ifzxjt@default
+ \bool_set_true:N \l__zxjt_default_bool
+\fi
+%% \l__zxjt_checksingle_bool
+\bool_new:N \l__zxjt_checksingle_bool
+\ifzxjt@checksingle
+ \bool_set_true:N \l__zxjt_checksingle_bool
+\fi
+%% \l__zxjt_adjustcharclass_bool
+\bool_new:N \l__zxjt_adjustcharclass_bool
+\ifzxjt@adjustcharclass
+ \bool_set_true:N \l__zxjt_adjustcharclass_bool
+\fi
+
+%%-------------------------------------- error messages
+
+%% \c__zxjt_pkgname_tl
+\tl_const:Nn \c__zxjt_pkgname_tl { zxjatype }
+%
+\cs_new:Npn \__zxjt_msg_new:nn
+ { \msg_new:nnn { \c__zxjt_pkgname_tl } }
+\cs_new:Npn \__zxjt_error:nx
+ { \msg_error:nnx { \c__zxjt_pkgname_tl } }
+\cs_new:Npn \__zxjt_error:n
+ { \msg_error:nn { \c__zxjt_pkgname_tl } }
+%
+\__zxjt_msg_new:nn { xeCJK-incompatible }
+ {
+ Some~incompatible~settings~used~inside~xeCJK.\\
+ This~command~will~not~work~properly.
+ }
+\__zxjt_msg_new:nn { jafamilyinverbatim-disabled }
+ {
+ \token_to_str:N \(no)jafamilyinverbatim \c_space_tl
+ ~is~disabled~in~this~version.
+ }
+\__zxjt_msg_new:nn { CJKfam-failed }
+ {
+ Cannot~switch~to~CJK~family,~since~fetching~the~information~for\\
+ the~current~family~has~failed~for~some~reason.\\
+ (family=#1)
+ }
+
+%%-------------------------------------- helper functions
+
+%% temporary variables
+\tl_new:N \g__zxjt_tmpa_tl
+\dim_new:N \l__zxjt_tmpa_dim
+\box_new:N \g__zxjt_tmpa_box
+
+%% \c__zxjt_Default_class_int
+%% \c__zxjt_CJK_class_int
+%% \c__zxjt_FullLeft_class_int
+% The integer constants for char-classes. These classes are predefined in
+% XeLaTeX kernel, and not likely to change in near future.
+\int_const:Nn \c__zxjt_Default_class_int { 0 }
+\int_const:Nn \c__zxjt_CJK_class_int { 1 }
+\int_const:Nn \c__zxjt_FullLeft_class_int { 2 }
+
+%% \__zxjt_boundary:
+% Invokes the interchar-tokens for transition to the boundary class (255).
+% (A mere \scan_stop: suffices?)
+\cs_new:Nn \__zxjt_boundary:
+ {
+ \ifhmode
+ \hbox:n {}
+ \fi
+ }
+
+%% \__zxjt_leavevmode:
+% The well-known \leavevmode.
+\cs_new:Nn \__zxjt_leavevmode:
+ { \hbox_unpack:N \c_empty_box }
+
+%% \__zxjt_swap_doccmd:NN \cmdA \cmdB
+% Swaps the meaning of two document commands \cmdA and \cmdB. Although \cmdA
+% could call its submacros (\[cmdA code] etc.) produced by xparse mechanism,
+% one only has to simply swap the meaning of macros \cmdA and \cmdB.
+\cs_new:Nn \__zxjt_swap_doccmd:NN
+ {
+ \cs_set_eq:NN \__zxjt_swap_tmp: #1
+ \cs_set_eq:NN #1 #2
+ \cs_set_eq:NN #2 \__zxjt_swap_tmp:
+ \cs_undefine:N \__zxjt_swap_tmp:
+ }
+
+%%-------------------------------------- font-declaration hooks
+
+% The \setCJKxxxfont commands of xeCJK are redefined so that a hook
+% \__zxjt_after_decl_CJKfam:n {<CJK_fam_name>} is invoked on each declration
+% of a CJK family, including a generic one (\CJKrmdefault etc.).
+% If the declaration is done in the preamble then the execution of hook will
+% be delayed until the beginning of the document.
+
+%% Adds a hook to \setCJKxxxfont commands.
+\NewDocumentCommand \__setCJKmainfont { O{} m }
+ {
+ \__setCJKmainfont [ \l__zxjt_scale_spec_tl #1 ] { #2 }
+ \exp_args:Nx \__zxjt_after_decl_CJKfam:n { \CJKrmdefault }
+ }
+\__zxjt_swap_doccmd:NN \__setCJKmainfont \setCJKmainfont
+\NewDocumentCommand \__setCJKsansfont { O{} m }
+ {
+ \__setCJKsansfont [ \l__zxjt_scale_spec_tl #1 ] { #2 }
+ \exp_args:Nx \__zxjt_after_decl_CJKfam:n { \CJKsfdefault }
+ }
+\__zxjt_swap_doccmd:NN \__setCJKsansfont \setCJKsansfont
+\NewDocumentCommand \__setCJKmonofont { O{} m }
+ {
+ \__setCJKmonofont [ \l__zxjt_scale_spec_tl #1 ] { #2 }
+ \exp_args:Nx \__zxjt_after_decl_CJKfam:n { \CJKttdefault }
+ }
+\__zxjt_swap_doccmd:NN \__setCJKmonofont \setCJKmonofont
+\NewDocumentCommand \__setCJKfamilyfont { m O{} m }
+ {
+ \__setCJKfamilyfont { #1 } [ \l__zxjt_scale_spec_tl #2 ] { #3 }
+ \__zxjt_after_decl_CJKfam:n { #1 }
+ }
+\__zxjt_swap_doccmd:NN \__setCJKfamilyfont \setCJKfamilyfont
+
+%% \g__zxjt_CJKfam_seq
+% The record of CJK-family names declared in the preamble.
+\seq_new:N \g__zxjt_CJKfam_seq
+%% \__zxjt_after_decl_CJKfam:n {<fam_name>}
+% The hook.
+% (in the preamble)
+\cs_new:Nn \__zxjt_after_decl_CJKfam:n
+ {
+ \seq_gput_right:Nn \g__zxjt_CJKfam_seq { #1 }
+ }
+% (in the document body)
+\cs_new:Nn \__zxjt_after_decl_CJKfam_db:n
+ {
+ \__zxjt_inspect_CJKfam_info:n { #1 }
+ \__zxjt_invoke_ext_hook:n { #1 }
+ }
+%% The begin-document hook.
+% Processes the entires in \g__zxjt_CJKfam_seq and alters the definition of
+% \__zxjt_after_decl_CJKfam:n.
+\AtBeginDocument
+ {
+ \cs_set_eq:NN \__zxjt_after_decl_CJKfam:n \__zxjt_after_decl_CJKfam_db:n
+ \seq_remove_duplicates:N \g__zxjt_CJKfam_seq
+ \seq_map_function:NN \g__zxjt_CJKfam_seq \__zxjt_after_decl_CJKfam:n
+ \seq_gclear:N \g__zxjt_CJKfam_seq
+ }
+
+%%-------------------------------------- font-selection hooks
+
+% The \CJKfamily of xeCJK is redefined so that a hook
+% \__zxjt_after_decl_CJKfam:n {<CJK_fam_name>} is invoked. The CJK-family
+% name given is recorded in \l__zxjt_CJKfam_tl.
+% NB. \l__zxjt_CJKfam_tl should be same as \xeCJK@family.
+
+%% Adds a hook to \CJKfamily command.
+\NewDocumentCommand \__CJKfamily { m }
+ {
+ \__CJKfamily { #1 }
+ \exp_args:Nx \__zxjt_after_sel_CJKfam:n { #1 }
+ }
+\__zxjt_swap_doccmd:NN \__CJKfamily \CJKfamily
+
+%% \__zxjt_after_decl_CJKfam:n {<fam_name>}
+% The hook.
+\cs_new:Nn \__zxjt_after_sel_CJKfam:n
+ {
+ \tl_set:Nn \l__zxjt_CJKfam_tl { #1 }
+ }
+
+%--------------------------------------- CJK-family inspection
+
+% \__zxjt_inspect_CJKfam_info:n tries to know the NFSS family correspoding to
+% the given CJK-family name (without hacking into xeCJK internal) in the
+% following way:
+% - A text including a CJK letter is typeset in an hbok with a "fresh"
+% CJK-family.
+% - This process would trigger the declaration of the fontspec family
+% corresponding to the CJk-family in issue.
+% - So a hook is attached in advance to \fontspec_set_family:Nnn; the hook
+% record the NFSS family into a temporary global variable.
+
+%% \g__zxjt_CJKfam_prop
+% The map from CJK-family names to NFSS family names.
+\prop_new:N \g__zxjt_CJKfam_prop
+%% \g__zxjt_onefam_info_tl
+\tl_new:N \g__zxjt_onefam_info_tl
+%% \l__zxjt_onefam_info_tl
+\tl_new:N \l__zxjt_onefam_info_tl
+%% \__zxjt_inspect_CJKfam_info:n {<CJK_fam_name>}
+% Tries to fetch the NFSS family name corresponding the given CJK family
+% name; if it succeeds, then the obtained name will be recorded in the map
+% \g__zxjt_CJKfam_prop.
+\cs_new:Nn \__zxjt_inspect_CJKfam_info:n
+ {
+ \prop_if_in:NnF \g__zxjt_CJKfam_prop { #1 }
+ { \__zxjt_inspect_CJKfam_info_aux_i:n { #1 } }
+ }
+\cs_new:Nn \__zxjt_inspect_CJKfam_info_aux_i:n
+ {
+ \tl_gclear:N \g__zxjt_onefam_info_tl
+ \int_compare:nNnT { \XeTeXcharclass "5B57 } = { \c__zxjt_CJK_class_int }
+ {
+ \group_begin:
+ \cs_set_eq:NN \__zxjt_org_set_family:Nnn \fontspec_set_family:Nnn
+ \cs_set:Nn \fontspec_set_family:Nnn {
+ \__zxjt_org_set_family:Nnn ##1 { ##2 } { ##3 }
+ \cs_gset_eq:NN \g__zxjt_onefam_info_tl ##1
+ }
+ \__CJKfamily { #1 }
+ \hbox_set:Nn \l_tmpa_box { ^^^^5b57 }
+ \group_end:
+ }
+ \bxDebug { family( #1 )~<=~ \g__zxjt_onefam_info_tl }
+ \tl_if_empty:NF \g__zxjt_onefam_info_tl
+ {
+ \prop_put:NnV \g__zxjt_CJKfam_prop { #1 } \g__zxjt_onefam_info_tl
+ }
+ }
+
+%--------------------------------------- external hook
+
+%%<+> \zxJaFamilyFontHook
+% The variable to store the hook code.
+\tl_clear_new:N \zxJaFamilyFontHook
+%%<+> \zxJaFamilyName
+% The variable holds the name of the declared CJK family name when the hook
+% is invoked.
+\tl_clear_new:N \zxJaFamilyName
+
+%% \__zxjt_invoke_ext_hook:n {<CJK_fam_name>}
+% Invokes the external hook code.
+\cs_new:Nn \__zxjt_invoke_ext_hook:n
+ {
+ \tl_set:Nn \zxJaFamilyName { #1 }
+ \zxJaFamilyFontHook
+ }
+
+%%-------------------------------------- switching to CJK-family
+
+%% \g__zxjt_encoding_tl
+% The encoding used for CJK-families.
+\tl_new:N \g__zxjt_encoding_tl
+\tl_gset:Nn \g__zxjt_encoding_tl { EU1 }
+
+%% \__zxjt_use_CJKfam:
+% Switches the NFSS family to the family corresponding to the current CJK-
+% family (designated by \CJKfamily etc.).
+\cs_new:Nn \__zxjt_use_CJKfam:
+ {
+ \exp_args:NNx
+ \prop_get:NnNTF \g__zxjt_CJKfam_prop { \l__zxjt_CJKfam_tl }
+ \l__zxjt_onefam_info_tl
+ {
+ \bxDebug { family(\l__zxjt_CJKfam_tl)~=>~\l__zxjt_onefam_info_tl }
+ \fontencoding { \g__zxjt_encoding_tl }
+ \fontfamily { \l__zxjt_onefam_info_tl }
+ \selectfont
+ }
+ {
+ \__zxjt_error:nx { CJKfam-failed } { \l__zxjt_CJKfam_tl }
+ }
+ }
+
+%%-------------------------------------- inhibitglue
+
+%%<*> \inhibitglue
+% Cancles adjustment glues around this command.
+% NB: This is different from suppressing all adjustment; only glues vanish,
+% so punctuation characters will have a truncated width.
+\bool_if:nT
+ % if \inhibitglue does not seem to have a valid definition, one is provided
+ % by this package.
+ { ( \cs_if_free_p:N \inhibitglue )
+ || ( \cs_if_eq:p:NN \inhibitglue \scan_stop: )
+ || ( \cs_if_eq:p:NN \inhibitglue \prg_do_nothing: ) }
+ {
+ \cs_undefine:N \inhibitglue
+ \NewDocumentCommand \inhibitglue {}
+ {
+ \scan_stop:
+ \__zxjt_leavevmode:
+ % cancels left-side glue
+ \unskip \unskip \unskip
+ % cancels right-side glue to come, which is tricky...
+ \__zxjt_cancel_postglue:
+ }
+ }
+
+%% \__zxjt_cancel_postglue:
+% Tries to cancel the right-side glue coming from adjustment process done
+% by xeCJK. This is implemented as follows:
+% - Peek the following token.
+% - If the token is a non-letter character and has the FullLeft char-class,
+% then proceed; otherwise stop here.
+% - Measure the left-side glue of the character.
+% - Put the negative of the measured glue.
+\cs_new:Nn \__zxjt_cancel_postglue:
+ {
+ \peek_after:Nw \__zxjt_cancel_postglue_aux_i:
+ }
+\cs_new:Nn \__zxjt_cancel_postglue_aux_i:
+ {
+ \token_if_other:NT \l_peek_token { \__zxjt_cancel_postglue_aux_ii:N }
+ }
+\cs_new:Nn \__zxjt_cancel_postglue_aux_ii:N
+ {
+ \bool_if:nT
+ { ! (\token_if_cs_p:N #1 )
+ && ( \int_compare_p:nNn
+ { \XeTeXcharclass `#1 } = \c__zxjt_FullLeft_class_int ) }
+ {
+ \__zxjt_measure_leftglue:N #1
+ \skip_horizontal:N \l__zxjt_leftglue_skip
+ }
+ #1
+ }
+
+%% \l__zxjt_leftglue_skip
+% The left-side cenceling glue resulted from the measurement.
+\skip_new:N \l__zxjt_leftglue_skip
+
+%% \__zxjt_measure_leftglue:N {<char>}
+\cs_new:Nn \__zxjt_measure_leftglue:N
+ {
+ \group_begin:
+ \hbox_set:Nn \l_tmpa_box { #1 }
+ \skip_set:Nn \l__zxjt_tmpa_dim { \box_wd:N \l_tmpa_box }
+ \vbox_set:Nn \l_tmpa_box
+ {
+ \dim_set:Nn \hsize { 2\l__zxjt_tmpa_dim }
+ \noindent
+ \hbox:n {} \newline
+ #1
+ }
+ \vbox_set:Nn \l_tmpb_box
+ {
+ \vbox_unpack:N \l_tmpa_box
+ \box_gset_to_last:N \g__zxjt_tmpa_box
+ }
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \hbox_unpack:N \g__zxjt_tmpa_box
+ \unskip \unskip
+ }
+ \dim_set:Nn \l__zxjt_tmpa_dim
+ { \l__zxjt_tmpa_dim - \box_wd:N \l_tmpa_box }
+ \dim_compare:nNnTF { \l__zxjt_tmpa_dim } > { \c_zero_dim }
+ {
+ \skip_set:Nn \l__zxjt_leftglue_skip
+ { -\l__zxjt_tmpa_dim minus -\l__zxjt_tmpa_dim }
+ }
+ { \skip_zero:N \l__zxjt_leftglue_skip }
+ \tl_gset:Nx \g__zxjt_tmpa_tl
+ { \skip_use:N \l__zxjt_leftglue_skip }
+ \group_end:
+ \skip_set:Nn \l__zxjt_leftglue_skip { \g__zxjt_tmpa_tl }
+ \bxDebug { postglue(#1)~=~\skip_use:N \l__zxjt_leftglue_skip }
+ }
+
+%%-------------------------------------- char-class adjustment
+
+%% \__zxjt_adjust_charclass:
+\cs_new:Nn \__zxjt_adjust_charclass:
+ {
+ \xeCJKDeclareCharClass { CJK }
+ {
+ % Assigning 'FullRight' to small kana letters enables kinsoku at
+ % the left side, but sometimes disrupts spacing around them
+ % (these letters must be behaved same as ordinary kana/kanji letters
+ % with respect to spacing). Moreover kinsoku before small kana
+ % is criticized as "too strong" to use as default by some experts.
+ % So they are treated as normal CJK letters.
+ "3041, "3043, "3045, "3047, "3049, "3063, "3083, "3085, "3087, "308E,
+ "309B, "309C, "309D, "309E, "30A1, "30A3, "30A5, "30A7, "30A9, "30C3,
+ "30E3, "30E5, "30E7, "30EE, "30F5, "30F6, "30FB, "30FC, "30FD, "30FE,
+ }
+ \xeCJKDeclareCharClass { FullRight }
+ {
+ % U+2015 is treated same as U+2014.
+ "2015,
+ }
+ }
+
+%% Dispatches adjustment if 'adjustcharclass' option is set.
+\bool_if:NT \l__zxjt_adjustcharclass_bool
+ {
+ \__zxjt_adjust_charclass:
+ \xeCJKsetup { LongPunct+ = { ^^^^2015 } }
+ }
+
+%%-------------------------------------- public commands
+
+%%<*> \setjamainfont / \setjasansfont / \setjamonofont
+%%<*> \setjafamilyfont / \jafamily
+% Now these are synonymous to corresponding \...CJK... commands.
+\NewDocumentCommand \setjamainfont {}
+ { \setCJKmainfont }
+\NewDocumentCommand \setjasansfont {}
+ { \setCJKsansfont }
+\NewDocumentCommand \setjamonofont {}
+ { \setCJKmonofont }
+\NewDocumentCommand \setjafamilyfont {}
+ { \setCJKfamilyfont }
+\NewDocumentCommand \jafamily {}
+ { \CJKfamily }
+
+%%<*> \zxjapanesestyle
+%% Switches to a setting suitable for Japanese typesetting.
+\NewDocumentCommand { \zxjapanesestyle } {}
+ {
+ \xeCJKsetup
+ {
+ AllowBreakBetweenPuncts = true,
+ PunctStyle = fullwidth,
+ }
+ \zxusejapaneseparameters
+ }
+
+%%<*> \zxusejapaneseparameters
+%% Sets some xeCJK parameters to values suiable for Japanese.
+\NewDocumentCommand { \zxusejapaneseparameters } {}
+ {
+ \xeCJKsetup
+ {
+ CJKglue =
+ { \hspace { 0pt plus .08\baselineskip minus .008\baselineskip } },
+ CJKecglue =
+ { \hspace { 0.25em plus 0.15em minus 0.05em } },
+ }
+ }
+%%<*> \zxuseoriginalparameters
+%% Reets some xeCJK parameters to their original values.
+\NewDocumentCommand { \zxuseoriginalparameters } {}
+ {
+ \xeCJKsetup
+ {
+ CJKglue =
+ { \hspace { 0pt plus .08\baselineskip } },
+ CJKecglue =
+ { \c_space_token },
+ }
+ }
+
+%% \__zxjt_scale_tl
+% The scale value to be applied to CJK fonts.
+\tl_new:N \__zxjt_scale_tl
+%% \l__zxjt_scale_spec_tl
+\tl_new:N \l__zxjt_scale_spec_tl
+
+%%<*> \setjafontscale{<real>}
+%% Sets the value of \__zxjt_scale_tl, which defaults to 1.
+\NewDocumentCommand \setjafontscale { m }
+ {
+ % NB: the argument is not expanded
+ \tl_set:Nn \__zxjt_scale_tl { #1 }
+ \tl_if_blank:VTF \__zxjt_scale_tl
+ { \tl_clear:N \l__zxjt_scale_spec_tl }
+ {
+ \tl_set:Nn \l__zxjt_scale_spec_tl
+ { Scale = \__zxjt_scale_tl , }
+ }
+ }
+
+%%<*> \[no]jafamilyinverbatim
+% NB: THESE COMMADS ARE DISABLED at the current version.
+\NewDocumentCommand \jafamilyinverbatim {}
+ { \__zxjt_error_jafamilyinverbatim: }
+\NewDocumentCommand \nojafamilyinverbatim {}
+ { \__zxjt_error_jafamilyinverbatim: }
+\cs_new:Nn \__zxjt_error_jafamilyinverbatim:
+ {
+ \__zxjt_error:n { jafamilyinverbatim-disabled }
+ \cs_set_eq:NN \__zxjt_error_jafamilyinverbatim: \prg_do_nothing:
+ }
+
+%% Shorthand commands \< and \>
+\AtBeginDocument
+ {
+ % \< is equated with \inhibitglue only if it is undefined.
+ \cs_if_free:NT \<
+ { \cs_set_eq:NN \< \inhibitglue }
+ % \> is redefined so it does \CJKecglue in text mode, only if it is
+ % not changed from the original LaTeX definition.
+ \tl_set:Nn \l_tmpa_tl { \mskip \medmuskip }
+ \token_if_eq_meaning:NNT \> \l_tmpa_tl
+ {
+ \cs_set:Npn \>
+ {
+ \ifmmode
+ \mskip \medmuskip
+ \else
+ \CJKecglue \scan_stop:
+ \fi
+ }
+ }
+ }
+
+%%<*> \textrawja {<text>}
+% Prints the text in the current CJK font, without xeCJK processing.
+\NewDocumentCommand \textrawja {}
+ { \__zxjt_text_raw:nn { \__zxjt_use_CJKfam: } }
+%%<*> \textrawen {<text>}
+% Prints the text in the current non-CJK font, without xeCJK processing.
+\NewDocumentCommand \textrawen {}
+ { \__zxjt_text_raw:nn { \prg_do_nothing: } }
+\cs_new:Nn \__zxjt_text_raw:nn
+ {
+ \__zxjt_leavevmode:
+ \__zxjt_boundary:
+ \group_begin:
+ \xeCJKsetup { xeCJKactive = false }
+ #1#2
+ \group_end:
+ \__zxjt_boundary:
+ }
+
+%%<*> rawjatext/rawentext environments
+\NewDocumentEnvironment { rawjatext } {}
+ { \__zxjt_raw_text:n { \__zxjt_use_CJKfam: } }
+ { \__zxjt_boundary: }
+\NewDocumentEnvironment { rawentext } {}
+ { \__zxjt_raw_text:n { \prg_do_nothing: } }
+ { \__zxjt_boundary: }
+\cs_new:Nn \__zxjt_raw_text:n
+ {
+ \__zxjt_leavevmode:
+ \__zxjt_boundary:
+ \xeCJKsetup { xeCJKactive = false }
+ #1
+ }
+
+%%-------------------------------------- initial settings
+
+%% cooperation with BXJS classes
+\setjafontscale { }
+\cs_if_exist:NT \jsDocClass
+ {
+ \setjafontscale { \jsScale }
+ }
+\cs_if_exist:NT \Cjascale
+ {
+ \setjafontscale { \Cjascale }
+ }
+
+%% drivers for \UI & \Ux
+\cs_set:Npn \zxjt@Ux
+ { \char \bxUcv }
+\cs_set:Npn \zxjt@Uxh #1
+ { \char "#1 \c_space_tl }
+\cs_set:Npn \zxjt@UI
+ {
+ \group_begin:
+ \__zxjt_use_CJKfam:
+ \char \bxUcv
+ \group_end:
+ }
+\cs_set:Npn \zxjt@UIh #1
+ {
+ \group_begin:
+ \__zxjt_use_CJKfam:
+ \char "#1 \c_space_tl
+ \group_end:
+ }
+
+%% when option 'checksingle' is set
+\bool_if:NT \l__zxjt_checksingle_bool
+ {
+ \xeCJKsetup
+ { CheckSingle = true }
+ }
+
+%% when option 'default' is set
+\bool_if:NT \l__zxjt_default_bool
+ { \zxjapanesestyle }
+
+%%-------------------------------------- all done
+\ExplSyntaxOff
+\endinput
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% NEW-AGE CODE
+\zxjt@begin@old@code
+
+%% load prerequisite packages
+\RequirePackage{etoolbox}
+\endlinechar=-1 %
+
+%%%% definitions
+%\def\zxjt@pkgname{zxjatype}
+\def\zxjt@error{\PackageError\zxjt@pkgname}
+\def\zxjt@warn{\PackageWarningNoLine\zxjt@pkgname}
+%
+\newcount\zxjt@olspc
+\newcount\zxjt@orspc
+\newcount\zxjt@lspc
+\newcount\zxjt@rspc
+\newcount\zxjt@lbspc
+\newcount\zxjt@raspc
+\newcount\zxjt@cnta
+\newcount\zxjt@cntb
+\newif\ifzxjt@jafamilyinverbatim
+\newif\ifzxjt@patch@success
+
+% make 'checksingle' effective
+\ifzxjt@checksingle
+ \let\xeCJK@i@i\xeCJK@checksingle
+\fi
+
+
+%%-------- Patches to xeCJK's internal macros
+
+\zxjt@patch@successtrue
+% \xeCJK@setkern
+\@gobble{\if}%if-match
+\patchcmd{\xeCJK@setkern}
+ {\fi\ifnum\xeCJK@cnta<0}
+ {\else\zxjt@patch@xeCJK@setkern#1#2\fi\ifnum\xeCJK@cnta<0}
+ {}{\zxjt@patch@successfalse}
+\@gobble{\fi}%if-match
+% \xeCJK@punctrule
+\@gobble{\if\if}%if-match
+\patchcmd{\xeCJK@punctrule}
+ {\fi\xeCJK@cntd=\xeCJK@cntc}
+ {\else\zxjt@patch@xeCJK@punctrule#1{#2}\fi\xeCJK@cntd=\xeCJK@cntc}
+ {}{\zxjt@patch@successfalse}
+%
+\ifzxjt@patch@success
+ \bxDebug{Patch applied to xeCJK.}
+\else
+ \zxjt@error{Failed in patching to xeCJK}
+ {Package loading is aborted right now.}
+ \zxjt@restore@codes
+\expandafter\endinput\fi\relax
+
+%%-------- User interface
+
+%%<*> \zxjapanesestyle
+%% Switches to a setting suitable for Japanese typesetting.
+\newcommand*\zxjapanesestyle{
+ \punctstyle{quasijis}
+ \xeCJKallowbreakbetweenpuncts
+ %\CJKaddspaces
+ \zxusejapaneseparameters
+}
+
+%%<*> \zxusejapaneseparameters
+%% Sets some xeCJK parameters to values suiable for Japanese.
+\newcommand*\zxusejapaneseparameters{
+\def\CJKglue{\hskip \z@ \@plus .08\baselineskip \@minus .008\baselineskip}
+\CJKsetecglue{\hskip 0.25em\@plus 0.15em\@minus 0.05em}
+}
+
+%%<*> \zxuseoriginalparameters
+%% Reets some xeCJK parameters to their original values.
+\newcommand*\zxuseoriginalparameters{
+\def\CJKglue{\hskip \z@ \@plus .08\baselineskip}
+\CJKsetecglue{ }
+}
+
+%%<*> \setjamainfont[<features>]{<font_name>}
+%%<*> \setjasansfont[<features>]{<font_name>}
+%%<*> \setjamonofont[<features>]{<font_name>}
+%%<*> \setjafamilyfont{<CJK_family_name>}[<features>]{<font_name>}
+%% Same as setCJK...font, except that 'Scale=\zxjt@scale' is specified as a feature.
+\def\setjamainfont{\zxjt@newfontfamily{rm}}
+\def\setjasansfont{\zxjt@newfontfamily{sf}}
+\def\setjamonofont{\zxjt@newfontfamily{tt}}
+\def\setjafamilyfont{\zxjt@newfontfamily}
+\def\zxjt@newfontfamily#1{
+ \@ifnextchar[{\zxjt@newfontfamily@a{#1}}
+ {\zxjt@newfontfamily@a{#1}[]}}
+\def\zxjt@newfontfamily@a#1[#2]{
+ \def\zxJaFamilyName{#1}\zxJaFamilyFontHook
+ \xeCJK@newfontfamily@{#1}[Scale=\zxjt@scale,#2]}
+
+%%<*> \jafamily{<CJK_family_name>}
+\let\jafamily\CJKfamily
+\let\zxjafamily\CJKfamily
+
+%%<+> \zxJaFamilyFontHook
+%% Hook set in \setja...font commands. The new family name is
+%% stored in \zxJaFamilyName.
+\let\zxJaFamilyFontHook\@empty
+
+%%<*> \setjafontscale{<real>}
+%% Sets the value of \zxjt@scale, which defaults to 1.
+\def\setjafontscale#1{\def\zxjt@scale{#1}}
+\setjafontscale{1}
+
+%% <*> \>
+\def\>{\ifmmode\mskip\medmuskip\else \CJKecglue\relax \fi}
+
+%%<*> \zxinhibitglue
+%% Removes a intercharacter glue inserted for space adjustment.
+\protected\def\inhibitglue{
+ \relax\leavevmode % build bounadry
+ \ifdim\lastskip=\zxjt@icgprobe@value\relax
+ \unskip\unskip\unskip % removes the adjuster skip plus probe skips
+ \bxDebug{cancel glue right}%
+ \fi
+ \kern-\zxjt@icgprobe@value\kern\zxjt@icgprobe@value % probe for forward check
+}
+\AtBeginDocument{
+ \ifx\<\@undefined \let\<\inhibitglue \fi
+}
+
+%%-------- Define a new punctrule 'quasijis'
+% The punctrule 'quasijis' is a spacing rule which roughly implements the rule
+% descrived in JIS X 4051 on the xeCJK system.
+
+%% \xeCJK@ps@quasijis
+% NB: The package should not depend on its value (10).
+\def\xeCJK@ps@quasijis{10}
+
+%% \zxjt@icgprobe@value
+\def\zxjt@icgprobe@value{10sp}
+
+%% \zxjt@cpar
+\def\zxjt@cpar#1#2{%
+ \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#1@#2\endcsname
+ \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#1@#2\endcsname
+ \else 0
+ \fi\relax
+}
+
+%% \zxjt@patch@xeCJK@setkern
+\def\zxjt@patch@xeCJK@setkern#1#2{
+ \ifnum\xeCJK@punctstyle=\xeCJK@ps@quasijis\relax
+ \zxjt@lbspc=\zxjt@cpar{loglue}{#1}
+ \zxjt@rspc=\zxjt@cpar{roglue}{#1}
+ \zxjt@lspc=\zxjt@cpar{loglue}{#2}
+ \zxjt@raspc=\zxjt@cpar{roglue}{#2}
+ \ifnum\zxjt@lspc=25
+ \xeCJK@cnta=25\relax
+ \else\ifnum\zxjt@rspc=25
+ \xeCJK@cnta=25\relax
+ \else\ifnum\numexpr\zxjt@lbspc+\zxjt@rspc=0\relax
+ \xeCJK@cnta=\numexpr\zxjt@rspc+\zxjt@lspc\relax
+ \else\ifnum\numexpr\zxjt@lspc+\zxjt@raspc=0\relax
+ \xeCJK@cnta=\numexpr\zxjt@rspc+\zxjt@lspc\relax
+ \else
+ \xeCJK@cnta=\numexpr\zxjt@rspc+\zxjt@lspc-50\relax
+ \ifnum\xeCJK@cnta<0 \xeCJK@cnta=0 \fi
+ \fi\fi\fi\fi
+ \bxDebug{<#1>\the\zxjt@rspc+<#2>\the\zxjt@lspc::\the\xeCJK@cnta}
+ \fi
+}
+
+%% \zxjt@patch@xeCJK@punctrule
+\def\zxjt@patch@xeCJK@punctrule#1#2{
+ \ifnum\xeCJK@punctstyle=\xeCJK@ps@quasijis\relax
+ \zxjt@olspc=\csname xeCJK@\xeCJK@bboxname @lspace@#1\endcsname\relax
+ \zxjt@orspc=\csname xeCJK@\xeCJK@bboxname @rspace@#1\endcsname\relax
+ % limit sum of both side-bearings to either 0 or 50
+ \zxjt@lspc=0 \zxjt@rspc=0\relax
+ \ifcsname zxjt@jisfullwidth@#1\endcsname
+ \else\ifnum\zxjt@olspc>40\relax
+ \zxjt@lspc=50\relax
+ \else\ifnum\zxjt@orspc>40\relax
+ \zxjt@rspc=50\relax
+ \else
+ \ifnum\zxjt@olspc>15 \ifnum\zxjt@orspc>15\relax
+ \zxjt@lspc=25 \zxjt@rspc=25\relax
+ \fi\fi
+ \fi\fi\fi
+ \xeCJK@cnta=\csname zxjt@#2spc\endcsname
+ \xeCJK@cntc=\xeCJK@cnta
+ \xeCJK@cntd=\xeCJK@cnta
+ \bxDebug{<#1>:\the\zxjt@lspc/\the\zxjt@rspc}
+ \fi
+}
+
+%% \zxjt@jis@fullwidth{<char>}
+\def\zxjt@jis@fullwidth#1{
+ \expandafter\def\csname zxjt@jisfullwidth@#1\endcsname{}
+}
+\zxjt@jis@fullwidth{^^^^ff01}% FULLWIDTH EXCLAMATION MARK
+
+%%------ adjustment for Japanese font scaling
+
+%% \zxjt@lettodimenx{<CSname>}
+\def\zxjt@lettodimenx#1{
+ \expandafter\let\expandafter\zxjt@dimenx\csname#1\endcsname
+}
+
+%% \zxjt@outputglue
+\def\zxjt@outputglue{
+ \ifnum\xeCJK@punctstyle=\xeCJK@ps@quasijis\relax
+ \ifdim\lastkern=\zxjt@icgprobe@value\relax
+ \unkern\unkern
+ \bxDebug{cancel glue left}%
+ \else
+ {\xeCJK@setfont % switch to CJK font
+ \hskip\zxjt@dimenx\space\@minus\zxjt@dimenx
+ \hskip-\zxjt@icgprobe@value\hskip\zxjt@icgprobe@value}
+ \fi
+ \else
+ \hskip\zxjt@dimenx\space\@plus0.1em \@minus0.1em\relax
+ \fi
+}
+
+%% REVISE: \xeCJK@i@ii
+\def\xeCJK@i@ii#1{
+ \xeCJK@punctrule{#1}{l}
+ \zxjt@lettodimenx{xeCJK\xeCJK@punctstyle\xeCJK@bboxname @lglue@#1}
+ \zxjt@outputglue
+ \xeCJK@setprepunct{#1}}
+
+%% REVISE: \xeCJK@afterpostpunct
+\def\xeCJK@afterpostpunct{
+ \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname
+ @rrule@\xeCJK@lastpunct\endcsname depth \z@ height \z@
+ \zxjt@lettodimenx{xeCJK\xeCJK@punctstyle\xeCJK@bboxname @rglue@\xeCJK@lastpunct}
+ \zxjt@outputglue}
+
+%%------ add hook to \verbatim@font
+
+%%<*> \[no]jafamilyinverbatim
+\let\jafamilyinverbatim\zxjt@jafamilyinverbatimtrue
+\let\nojafamilyinverbatim\zxjt@jafamilyinverbatimfalse
+
+%% \zxjt@verbatim@font
+\def\zxjt@verbatim@font{
+ \ifnum\XeTeXinterchartokenstate>\z@
+ \XeTeXinterchartokenstate\z@
+ \ifzxjt@jafamilyinverbatim
+ \CJKfamily{tt}\xeCJK@setfont
+ \fi
+ \fi}
+\AtBeginDocument{
+ \g@addto@macro\verbatim@font{\zxjt@verbatim@font}
+}
+
+%%------ raw input
+
+%%<*> \textrawja/\textrawen
+\DeclareRobustCommand\textrawja{
+ \zxjt@text@raw{\zxjt@setCJKfont}}
+\DeclareRobustCommand\textrawen{
+ \zxjt@text@raw{\relax}}
+\def\zxjt@text@raw#1#2{
+ \leavevmode\zxjt@boundary{\XeTeXinterchartokenstate\z@#1#2}
+ \zxjt@boundary}
+
+%%<*> rawjatext/rawentext (environment)
+\newenvironment{rawjatext}
+ {\zxjt@raw@text{\zxjt@setCJKfont}}{\zxjt@boundary}
+\newenvironment{rawentext}
+ {\zxjt@raw@text{\relax}}{\zxjt@boundary}
+\def\zxjt@raw@text#1{
+ \zxjt@boundary\XeTeXinterchartokenstate\z@#1}
+
+%% \zxjt@boundary
+\def\zxjt@boundary{\ifhmode\hbox{}\fi}
+
+%% \zxjt@setCJKfont
+% Sometimes needed instead of \xeCJK@setfont.
+\def\zxjt@setCJKfont{
+ \csname xeCJK@font@\xeCJK@family\endcsname}
+
+%%------ other adaptations
+
+% make U+2015 behave similarly as U+2014
+\xeCJK@postPunct{20}{15}
+\expandafter\def\csname xeCJK@specialpunct^^^^2015\endcsname{}
+
+%% fix to \xeCJK@@checksingle
+\def\zxjt@xeCJK@@checksingle{%
+ \ifcat ^^^^3002\@let@token \expandafter\xeCJK@@@checksingle
+ \else \expandafter\xeCJK@setcurrentchar@i \fi}
+\ifx\xeCJK@@checksingle\zxjt@xeCJK@@checksingle
+\def\xeCJK@@checksingle{%
+ \ifcat ^^^^3002\noexpand\@let@token \expandafter\xeCJK@@@checksingle
+ \else \expandafter\xeCJK@setcurrentchar@i \fi}
+\fi
+\let\zxjt@xeCJK@@checksingle\@undefined
+
+%%------ initial settings
+
+% cooperation with BXJS classes
+\ifx\jsDocClass\@undefined\else
+\edef\zxjt@scale{\jsScale}
+%\let\jsInhibitGlue\inhibitglue
+\fi
+
+% drivers for \UI & \Ux
+\def\zxjt@Ux{\char\bxUcv}
+\def\zxjt@Uxh#1{\char"#1 }
+\def\zxjt@UI{{\xeCJK@setfont\char\bxUcv}}
+\def\zxjt@UIh#1{{\xeCJK@setfont\char"#1 }}
+
+% when option 'default' is set
+\ifzxjt@default
+ \zxjapanesestyle
+\fi
+
+% verbatim font
+\jafamilyinverbatim
+
+%%------ backward compatibility
+
+\def\zxjt@compat#1#2{\ifx#1\@undefined \let#1#2\fi}
+\zxjt@compat\xeCJKjapanesestyle\zxjapanesestyle
+\zxjt@compat\xeCJKusejapaneseparameters\zxusejapaneseparameters
+\zxjt@compat\xeCJKuseoriginalparameters\zxuseoriginalparameters
+\zxjt@compat\CJKinhibitglue\inhibitglue
+
+%%------ all done
+\endlinechar `\^^M
+\endinput
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\iffalse%%
+
+\cs_new:Nn \zxjt_get_CJKfont_info:
+ {
+ \tl_clear:N \l_CJKfont_info_tl
+ \int_compare:nNnT { \XeTeXcharclass "5B57 } = { \c_zxjt_CJK_class_int }
+ {
+ \group_begin:
+ \int_set:Nn \XeTeXinterchartokenstate { 1 }
+ \XeTeXcharclass `\? = \c_zxjt_Default_class_int
+ \XeTeXinterchartoks \c_zxjt_CJK_class_int
+ \c_zxjt_Default_class_int = { \scan_stop: }
+ \XeTeXinterchartoks \c_zxjt_Default_class_int
+ \c_zxjt_CJK_class_int = { \scan_stop: }
+ \cs_show:c { xeCJK@rm/m/n/10 }
+ \hbox_set:Nn \l_tmpa_box
+ {
+ ^^^^5b57 ?\bxDebug{\the\font/\f@family}
+ \cs_gset:Npn \g_zxjt_tmpa_tl
+ { { \f@encoding } { \f@family } }
+ ? ^^^^5b57
+ }\box_show:N \l_tmpa_box
+ \group_end:
+ \cs_set_eq:NN \l_zxjt_CJKfont_info_tl \g_zxjt_tmpa_tl
+ }
+ }
+
+\fi%%
+%% EOF