diff options
author | Karl Berry <karl@freefriends.org> | 2009-07-21 00:15:15 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2009-07-21 00:15:15 +0000 |
commit | 1bbc54e16e5508665f03fa07135d4eb1abf087da (patch) | |
tree | cf31fb7e93ac439443c1bd484dff03775e992571 /Master/texmf-dist | |
parent | c575a3e01c48c6807ff66e39df09c16ece08af60 (diff) |
new cjk/xetex package zhspacing (20jul09)
git-svn-id: svn://tug.org/texlive/trunk@14357 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r-- | Master/texmf-dist/doc/latex/zhspacing/README | 11 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/zhspacing/zhs-man.pdf | bin | 0 -> 192721 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/zhspacing/zhs-man.tex | 514 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/zhspacing/zhspacing-context-test.tex | 45 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xetex/zhspacing/context/t-zhspacing.tex | 117 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xetex/zhspacing/latex/zhfont.sty | 143 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xetex/zhspacing/latex/zhulem.sty | 18 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xetex/zhspacing/plain/zhmath.sty | 156 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xetex/zhspacing/plain/zhsmyclass.sty | 150 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xetex/zhspacing/plain/zhspacing.sty | 818 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xetex/zhspacing/plain/zhsusefulmacros.sty | 97 |
11 files changed, 2069 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/zhspacing/README b/Master/texmf-dist/doc/latex/zhspacing/README new file mode 100644 index 00000000000..be0359202ab --- /dev/null +++ b/Master/texmf-dist/doc/latex/zhspacing/README @@ -0,0 +1,11 @@ +zhspacing is a package for typesetting CJK documents in XeTeX +for plain TeX, LaTeX and ConTeXt. + +This package is licensed in LPPL. + +If you are interested in the process of development you +may observe + + http://code.google.com/p/ctex-kit/updates/list + +- Yin Dian (yindian@gmail.com) diff --git a/Master/texmf-dist/doc/latex/zhspacing/zhs-man.pdf b/Master/texmf-dist/doc/latex/zhspacing/zhs-man.pdf Binary files differnew file mode 100644 index 00000000000..c0a828fb9f3 --- /dev/null +++ b/Master/texmf-dist/doc/latex/zhspacing/zhs-man.pdf diff --git a/Master/texmf-dist/doc/latex/zhspacing/zhs-man.tex b/Master/texmf-dist/doc/latex/zhspacing/zhs-man.tex new file mode 100644 index 00000000000..0ec7e478aba --- /dev/null +++ b/Master/texmf-dist/doc/latex/zhspacing/zhs-man.tex @@ -0,0 +1,514 @@ +% Hist: 070824 First document out. All but Implementation written. +% In the evening fixed some typos. +\documentclass[12pt]{ltxdoc} +%\usepackage[margin=1.5in]{geometry} +\usepackage{fontspec} +\defaultfontfeatures{Mapping=tex-text} +\usepackage[no-sscript]{xltxtra} +\usepackage{zhspacing} +\usepackage[fakebold]{zhfont} +\usepackage[noactive]{zhmath} +\usepackage[dvipdfmx]{hyperref} +\newfontfamily\zhcjkextafont{Sun-ExtA} +\newfontfamily\zhcjkextbfont{Sun-ExtB} +\zhspacing +\usepackage{fancyvrb} +\DefineVerbatimEnvironment{verbatim}{Verbatim}{baselinestretch=0.9}%,fontsize=\footnotesize} +\usepackage{pst-all} +\setlength\parskip{0.5em plus 0.5em minus 0.5em} +\newcommand\q[1]{``\hbox spread -0.2em{#1}''} +\newcommand\name[1]{\hbox{#1}} +\newcommand\fntname[1]{\texttt{#1}} +\newcommand\NFSS{\textsf{NFSS}} +\newcommand\mymacro[1]{\ifvmode\noindent\else\setbox0=\lastbox\fi\llap{$\bullet$}\cmd#1\\\indent} +\makeatletter +\@addtoreset{section}{part} +\makeatother +\begin{document} +\title{Typesetting Chinese in \XeTeX: |zhspacing| user's +manual\footnote{Revision: \zhspacingrevision.}} +\author{\textsc{Yin} Dian\footnote{Lab.\ of Network Comm. System \& +Control, Univ.\ of Sci.\ \& Tech.\ of China.}} +\date{2007.12.11.} +\maketitle +\tableofcontents +\newpage + +\part{zhspacing.sty} +\section{Introduction} +\XeTeX\ is a new \TeX\ engine by Jonathan Kew and SIL International, which combines +\eTeX\ with pervasive Unicode support and advanced font support\footnote{Words +copied from the ConTeXt Wiki.}. Using \XeTeX, it is possible to typeset scripts +of any languages whose glyphs are contained in the font in use, without the +help of any extra packages, such as |CJK|\footnote{|CJK| is a LaTeX 2e macro +package which enables the use of CJK scripts (Chinese/Japanese/Korean) in +various encodings, written by Werner Lemberg.}. + +However, \XeTeX\ itself does not solve all the problems. Some details in +Chinese typesetting have not been dealt with by \XeTeX, such as the automatic +font switch between Chinese and Western characters, the skip adjustment of +fullwidth punctuations, the automatic skip insertion between Chinese and +Western characters or math formulas, etc. + +To meet the need of easy and high quality typesetting of Chinese documents +using \XeTeX, the package |zhspacing| is coded, utilizing the new primitive of +\cs{XeTeXinterchartoks} provided in \XeTeX\ version 0.997. + +\section{Getting Started} +|zhspacing| can be used in both plain \XeTeX\ or \XeLaTeX. The usage is quite +straightforward. For instance, in plain \XeTeX, +{\emptyskipscheme +\begin{verbatim} + \input zhspacing.sty + \zhspacing + 这是中文测 试。中文和English的混排。中 + 文和$E=mc^2$的混排。 + \bye +\end{verbatim} +} +And in \XeLaTeX, +{\emptyskipscheme +\begin{verbatim} + \documentclass{article} + \usepackage{zhspacing} + \zhspacing + \begin{document} + 这是中文测 试。中文和English的混排。中 + 文和$E=mc^2$的混排。 + \end{document} +\end{verbatim} +} +Both of the examples above produce the same result as follows, +\begin{center} +这是中文测 试。中文和English的混排。中 +文和$E=mc^2$的混排。 +\end{center} + +As you can see, spaces after Chinese characters are always ignored. Moreover, a +noticable skip is inserted between Chinese characters and English characters as +well as math formulas. In fact, all of the following inputs can produce mixed +langauge output with skip automatically inserted between Chinese and English +characters, +\begin{center} +\emptyskipscheme |中Eng文|,\quad |中 Eng文|,\quad |中Eng 文|\quad and\quad |中 Eng 文|. +\end{center} +And their corresponding output is, +\begin{center} +中Eng文,\quad 中 Eng文,\quad 中Eng 文\quad and\quad 中 Eng 文. +\end{center} + +Look close and you'll find, that the first and second input generates exactly +the same output, and so does the third and fourth. However, the skip between +|Eng| and |文| in the last two cases is wider than the skip between |中| and +|Eng|. That is because the space is produced by the space token after the +letter |g|, not the skip automatically inserted by |zhspacing|'s skip +mechanism. + +The space ignoring and skip auto-inserting ability of |zhspacing| can make +writing documents much comfortable. You don't need to worry about the manual +insertion of skips such as adding the annoying |~| in |CJK|. + +Now come to the topic of punctuation skip adjustment. Proper Chinese +typesetting requires consecutive fullwidth punctuations be compressed, and a +linebreak before or after a fullwidth punctuation will cut off the blank spaces +of this punctuation, making it align to the margin. |zhspacing| does have +solved these problems, as well as proper prohibitions(禁则). Here's an example. +\begin{center} +\begin{minipage}{21em} +他强调,“三个代表”重要思想是在新的历史条件下运用马克思主义的立场、观点和方法的 +典范,是我们学习马克思主义的立场、观点和方法最现实、最生动的教材。“三个代表” +重要思想是与时俱进的理论。 +\end{minipage} +\end{center} + +\section{Advanced Usage} +\subsection{Fonts} +|zhspacing| uses an extensible way of selecting fonts. The rules can be +summarized as follows, +\begin{itemize} + \item Western characters, i.e.\ those that are not CJKV ideographies nor + CJKV punctuations, use the same font as default. + \item Chinese characters use seperate fonts. Font changes in the + document does not affect the font used to display Chinese, + unless you are using \NFSS\ and change the font series or shape. + \item On displaying basic Chinese ideographies, execute the command + \cs{zhfont}. + \item On displaying Chinese punctuations, execute the command + \cs{zhpunctfont}. + \item On displaying CJK Ext-A characters, execute the command + \cs{zhcjkextafont}. + \item On displaying CJK Ext-B characters, execute the command + \cs{zhcjkextbfont}. + \item When switching from non-Chinese characters to Chinese characters, + execute \cs{zhs@savefont}. When switching back, execute + \cs{zhs@restorefont}. +\end{itemize} + +When importing |zhspacing| from plain \XeTeX, the default definitions of the +above commands are, +\begin{verbatim} + \font\zhfont="SimSun" at 10pt + \font\zhpunctfont="SimSun" at 10pt + \def\zhcjkextafont{\message{CJK Ext-A}} + \def\zhcjkextbfont{\message{CJK Ext-B}} + \let\zhs@savefont=\begingroup + \let\zhs@restorefont=\endgroup +\end{verbatim} + +When imported from \XeLaTeX, the defaults are, +\begin{verbatim} + \newfontfamily\zhfont[BoldFont=SimHei]{SimSun} + \newfontfamily\zhpunctfont{SimSun} + \def\zhcjkextafont{\message{CJK Ext-A}} + \def\zhcjkextbfont{\message{CJK Ext-B}} + \def\zhs@savefont{\zhs@savef@nt{old}} + \def\zhs@restorefont{\zhs@restoref@nt{old}} +\end{verbatim} +Here \cs{zhs@savef@nt} and \cs{zhs@restoref@nt} are internal macros to save and +restore the \NFSS\ info of the current font to specified places. + +CJK Ext-A/B fonts have not been defined by default in consideration that not +every user has installed the particular fonts. I recommend to use +\fntname{Sun-ExtA} and \fntname{Sun-ExtB} as the corresponding fonts. You can +define the ext-font macros manually in a similar way to the definition of +\cs{zhfont}. + +An example of mixed typesetting of various classes of characters is as follows, +cited from \emph{The Tale of Kiều}\footnote{《金云翘传》,or \emph{Truyện Kiều}, +a Vietnamese \emph{lục bát} poem written in \emph{chữ Nôm}. \emph{Chữ Nôm} is +a system of ideographies created by the Vietnamese laboring people, most of +which are encoded in CJK Ext-A\hskip -0.2em/B area, or not even included in +Unicode.}. +\begin{center} +\parbox{21em}{ +\fontspec{Times New Roman} +𤾓𢆥𥪝𡎝𠊛些 +Trăm năm, trong cõi người ta, +𡨸才𡨸命𡑛罗恄𠑬 +Chữ tài, chữ mệnh, khéo là ghét nhau. +𣦆戈𠬠局𣷭橷 +Trải qua một cuộc bể dâu, +仍條𥉩𧡊𦓡𤴬疸𢚸 +Những điều trông thấy mà đau đớn lòng. +\footnotemark +} +\end{center} +\footnotetext{Some of the ideographies are replaced by similar characters due +to the limitation of character set. A picture of the original manuscript can be found at +\href{http://bbs.gophor.cn/cjkv/attachment/14_2_b44e05d28a68271.jpg}{\emph{this +link}}.}% or Fig.~\ref{fig:kieu}.} +\subsection{More on Fonts} +Sometimes it may be desirable to use different Chinese fonts for different +\NFSS\ font families in \LaTeX. This can be done by changing the definition of +\cs{zhs@savefont} and \cs{zhfont}, without modifying the |zhspacing| source. + +Here is the way to do it.\footnote{See zhfont.sty later for convenient ways.} +\begin{verbatim} +\makeatletter +\g@addto@macro\zhs@savefont{% + \long\edef\zhs@tmpmacro{\f@family}% + \def\zhs@curr@fam{0}% + \ifx\zhs@tmpmacro\sfdefault + \def\zhs@curr@fam{1}% + \else\ifx\zhs@tmpmacro\ttdefault + \def\zhs@curr@fam{2}% + \fi\fi + \edef\zhs@tmpmacro{\f@family}% + \ifx\zhs@tmpmacro\sfdefault + \def\zhs@curr@fam{1}% + \else\ifx\zhs@tmpmacro\ttdefault + \def\zhs@curr@fam{2}% + \fi\fi +} +\newfontfamily\zhrmfont[BoldFont=SimHei, + ItalicFont=KaiTi_GB2312]{SimSun} +\newfontfamily\zhsffont{SimHei} +\newfontfamily\zhttfont[BoldFont=SimHei]{KaiTi_GB2312} +\def\zhfont{\ifcase\zhs@curr@fam\zhrmfont\or\zhsffont + \or\zhttfont\else\zhrmfont\fi} +\end{verbatim} +\subsection{Skips} +The skip mechanism in |zhspacing| is also flexible. |zhspacing| utilizes the +following skip commands. Note that they are defined as macros instead of skip +register values, in order that the skip varies according to font size changes. +\begin{description} + \item[\mdseries\cs{skipzh}] + Skip between adjacent Chinese characters. + \item[\mdseries\cs{skipenzh}] + Skip between a Chinese character and a Western character or a + math formula. + \item[\mdseries\cs{skipzhopen}] + Skip before fullwidth opening punctuations, such as \q{“}, + \q{(}, \q{《}, etc. + \item[\mdseries\cs{skipzhinteropen}] + Skip before a fullwidth opening punctuation when preceded by + another fullwidth punctuation. + \item[\mdseries\cs{skipzhlinestartopen}] + Skip before a fullwidth opening punctuation when it occurs at + the start of a line. + \item[\mdseries\cs{skipzhclose}] + Skip after fullwidth closing punctuations, such as \q{”}, + \q{)}, \q{》}, etc. + \item[\mdseries\cs{skipzhinterclose}] + Skip after a fullwidth closing punctuation when followed by + another fullwidth punctuation. + \item[\mdseries\cs{skipzhlineendclose}] + Skip after a fullwidth closing punctuation when it occurs at + the end of a line. + \item[\mdseries\cs{skipzhfullstop}] + Skip after fullwidth fullstop punctuations, such as \q{;}, + \q{.}, \q{。}, etc. + \item[\mdseries\cs{skipzhinterfullstop}] + Skip after a fullwidth fullstop punctuation when followed by + another fullwidth punctuation. + \item[\mdseries\cs{skipzhlineendfullstop}] + Skip after a fullwidth fullstop punctuation when it occurs at + the end of a line. + \item[\mdseries\cs{skipzhhalfstop}] + Skip after fullwidth halfstop punctuations, such as \q{、}, + \q{,}, \q{:}, etc. + \item[\mdseries\cs{skipzhinterhalfstop}] + Skip after a fullwidth halfstop punctuation when followed by + another fullwidth punctuation. + \item[\mdseries\cs{skipzhlineendhalfstop}] + Skip after a fullwidth halfstop punctuation when it occurs at + the end of a line. + \item[\mdseries\cs{skipnegzhlinestartopen}] + Negative skip to \cs{skipzhlinestartopen}. + \item[\mdseries\cs{skipnegzhlineendclose}] + Negative skip to \cs{skipzhlineendclose}. + \item[\mdseries\cs{skipnegzhlineendfullstop}] + Negative skip to \cs{skipzhlineendfullstop}. + \item[\mdseries\cs{skipnegzhlineendhalfstop}] + Negative skip to \cs{skipzhlineendhalfstop}. +\end{description} + +All of the skip commands above are defined in the pattern \\ +\vadjust{}\hfil |\def\skipxxx{\hskip xxxxx}|. + +|zhspacing| comes with three pre-defined skip schemes, namely +\cs{simsunskipscheme}, \cs{emptyskipscheme} and \cs{haltskipscheme}. The +first scheme should be suitable for font \fntname{SimSun} and other popular +Chinese fonts used in China, which does not support OpenType features of +|halt|, and needs negative spaces be inserted before opening punctuations and +after closing or judou punctuations. The second scheme simply addes zero +length. And the last one should be fit for OpenType Chinese fonts supporting +|halt| feature such as Adobe Song Std, where positive spaces should be inserted +before or after certain punctuations. You can define your own skip schemes for +customization, of course. +\subsection{Vertical Chinese} +Vertical Chinese can be achieved by adding raw feature |vertical| to the +specified font. An example could be, \hfil +\setbox0=\hbox to 0pt{\vbox{\noindent +\newfontfamily\zhfont[RawFeature={vertical:},BoldFont=SimHei]{SimSun} +\newfontfamily\zhpunctfont[RawFeature={vertical:+vert:+vhal}]{[AdobeSongStd-Light.otf]} +\haltskipscheme +\rotatebox{-90}{\fbox{\raise 0.8em\hbox{我是中国人,我爱自己的祖国。}}} +}\hss} +\dp0=0pt \raise 0.8em\box0 + +\begin{verbatim} + \documentclass[12pt]{article} + \usepackage[dvipdfm]{graphicx} + \usepackage{zhspacing} + \zhspacing + \begin{document} + \newfontfamily\zhfont[RawFeature={vertical:}]{SimSun} + \newfontfamily\zhpunctfont[RawFeature={vertical: + +vert:+vhal}]{[AdobeSongStd-Light.otf]} + \haltskipscheme + \rotatebox{-90}{我是中国人,我爱自己的祖国。} + \end{document} +\end{verbatim} + +Note that in this example, in order to have proper vertical punctuations, we +set \cs{zhpunctfont} to use the Adobe one supporting |vert| feature, and change +the skip scheme to \cs{haltskipscheme} to match the |vhal| feature specified. + +However, there exists some bug in typesetting vertical Chinese containing +punctuations using some fonts such as \fntname{KaiTi\_GB2312} etc. I've told +this bug to \name{jjgod} in May, but it seems that he hasn't solved the problem +yet. Moreover, the baseline of vertical Chinese is not correct, so mixed +typesetting of Chinese and English in vertical mode generates ugly results, and +thus should be avoided. +\subsection{Compatibility} +Theoretically, |zhspacing| should be compatible with all macro packages, except +those who change the definition of \cs{hskip} and \cs{penalty}, in which case +special treatment should be applied. I haven't found any conflict when using +common packages such as |hyperref| and |fancyhdr|. However, |ulem| redefineds +\cs{hskip} and \cs{penalty}, and causes unexpected output\footnote{I was using +\cs{begingroup} and \cs{endgroup} as the font saving/restoring commands. +However, I found |ulem| redefines \cs{hskip} and \cs{penalty} to end the +current hbox group and start a new hbox, and thus group mismatch occurs. So I +changed the font saving/restoring commands when used in \LaTeX, using \NFSS\ info +instead of groups. But in the new hbox group, no Chinese font is applied by +default so the Chinese characters disappears. Therefore I changed the +definitions of |ulem|'s new \cs{hskip} and \cs{penalty} in |zhulem|, and advice +users to use this modified one.}. Use |zhulem| provided along with +|zhspacing| instead. + +\subsection{Working with the \texttt{ctex} package} +The |ctex| package, made by \href{http://www.ctex.org}{|ctex.org|}, is a widely +used Chinese document framework which hides the underlying Chinese processing +details to the user, which enables portability between different Chinese +processing packages or systems, such as |CCT| and |CJK|. \name{Jjgod} has made +a \XeTeX\ port of the |ctex| package, named |cxetex|, which can be found at +\url{http://www.newsmth.net/att.php?s.460.257121.452.bz2}. + +To use |zhspacing| in |cxetex|, a slight modification of the file |ctexcjk.clo| +should be made. Change the corresponding lines to the followes (\% means the +original lines). +\begin{verbatim} +%\XeTeXlinebreaklocale "zh" +%\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt +%\setmainfont[BoldFont={cwTeXHeiBold}, +% ItalicFont={cwTeXKaiItalic}, +% Mapping=tex-text]{cwTeXMing} +%\setsansfont[BoldFont={cwTeXHeiBold},Mapping=tex-text]{cwTeXYen} +%\setmonofont{cwTeXFangSongTT} +\usepackage{zhspacing} +\newfontfamily\zhfont[BoldFont=SimHei]{SimSun} +\newfontfamily\zhcjkextafont{Sun-ExtA} +\newfontfamily\zhcjkextbfont{Sun-ExtB} +\zhspacing +\end{verbatim} + +You can surely change these lines to your own taste. + +\section{Getting \texttt{zhspacing}} +|zhspacing| is hosted on an open-source project at googlecode. The project +homepage is \url{http://code.google.com/p/zhspacing/}. You can get the lastest +source from the download page or via SVN. + +\goodbreak +\part{zhfont.sty} +\section{Introduction} +To simplify the complex font setting to use \NFSS\ in \LaTeX, the package +|zhfont| is coded. It also adds simple interface to define fonts with fake +slant, and also supports fake bold. +\section{Package Options} +|zhfont| currently has only one option --- |fakebold|. This option sets +Chinese show fake boldface when the current series is bold. +\section{Provided Macros} +\mymacro\zhrmfont +\mymacro\zhsffont +\mymacro\zhttfont +The font commands to be executed according to the current font family. +You can redefine them to customize your fonts. + +\mymacro\setzhmainfont +\mymacro\setzhsansfont +\mymacro\setzhmonofont +Simply macro to set \cs{zh\{rm/sf/tt\}font} using \cs{newfontfamily}. + +\mymacro\newfontfamilywithslant +Create a font family with fake slant. Take one argument as the font name. + +Example: |\newfontfamilywithslant\zhrmfont{SimSun}| + +\mymacro\newfontfamilywithslantandbold +Create a font family with fake slant, and specify another font for its +boldface. Take two arguments as the font name and bold font name. + +Example:\\\quad |\newfontfamilywithslantandbold\zhrmfont{SimSun}{SimHei}| +\section{Examples} +The following example is generated with |zhfont| loaded with option +|fakebold|. + +{\emptyskipscheme +\begin{verbatim} +\newfontfamilywithslant\zhrmfont{SimSun} +中文\textbf{测试}。\textit{中文\textbf{测试}。} +\newfontfamilywithslant\zhrmfont{FangSong_GB2312} +中文\textbf{测试}。\textit{中文\textbf{测试}。} +\end{verbatim} +} +\nobreak +{ +\newfontfamilywithslant\zhrmfont{SimSun} +中文\textbf{测试}。\textit{中文\textbf{测试}。} +\newfontfamilywithslant\zhrmfont{FangSong_GB2312} +中文\textbf{测试}。\textit{中文\textbf{测试}。} +} +\goodbreak + +\part{zhmath.sty} +\section{Introduction} +|zhmath| is a generic package which allows the Chinese characters to be +displayed in math formulas. It also allows changing the math font for alphas +and numbers. + +|zhmath| only sets the basic Chinese characters to be displayable, not CJK +Ext-A/B ones, as they are seldom used and discouraged in math. You can use +\cs{hbox} to let |zhspacing| display them, however. +\section{Package Options} +In \LaTeX, |zhmath| has two options --- |active| and |noactive|. They set the +method to implement Chinese character displaying in math. The default is +|noactive|. + +When |active| is set, the Chinese characters in math formulas are set to +active, which, when executed, display the corresponding characters in +\cs{zhmathfont}. This behavior is much like that of the package |mathcjk|. The +font size in different styles are also set in \cs{mathcjksizea}/|b|/|c|/|d|. + +When |noactive| is set, the mathcodes of Chinese characters are set to use a +special math font family to display them. This way is more native than to use +active characters. + +Both |active| and |noactive| have disadvantages. In |active| mode the Chinese +math font sizes are determined by \cs{mathcjksizea}/|b|/|c|/|d|, so they are +somewhat independent with the main text size, which means their size cannot +change when the main font size changes, which gives ugly results. However, in +|noactive| mode, although Chinese math font size varies with the main font +size, Chinese inside \cs{mathrm} etc cannot be displayed, because the math +font family are set to \cs{mathrm}'s. So choose the option to your own need. + +In plain \TeX\ no package options are available. +\section{Provided Macros} +\mymacro\setzhmathfont +Set the math font used to display Chinese. Take one argument as the font +command. Preamble only. + +\mymacro\zhmathfont +The font command which determines the math font for Chinese. However, if you +use |noactive| option in \LaTeX, or you're in plain \TeX, they are not +executed when Chinese in math occur, but when \cs{setzhmathfont} is invoked. +So you should always call |\setzhmathfont\zhmathfont| after the change. + +\mymacro\usecustommathfonts +Enable the use of custom math fonts for alphas and numbers. The default is +Times New Roman. + +\mymacro\setalphanummathfonts +Set the math font used to display alphas and numbers. Preamble only. Take one +argument as the font family in \LaTeX, and two argument as the font command +for alphas and numbers accordingly in plain \TeX. + +\mymacro\zhmathalphanumfont +The font command which determines the math font for alphas and numbers in +\LaTeX. Should always call |\setalphanummathfonts\zhmathalphanumfont| after +it changes. + +\mymacro\zhmathletterfont +\mymacro\zhmathnumberfont +The font command which determines the math font for alphas and numbers in plain +\TeX. After their change \cs{setalphanummathfonts} with corresponding +arguments should be called. +\section{Examples} +{\emptyskipscheme +\begin{verbatim} +{ +$中文 in math 测_试$ +\usecustommathfonts +\Large $能量E = mc^2$, $s_总 = {1 \over 2} at^2$ +} +\end{verbatim} +} +\nobreak +{ +$中文 in math 测_试$ +\usecustommathfonts +\Large $能量E = mc^2$, $s_总 = {1 \over 2} at^2$ +} +\goodbreak +\end{document} diff --git a/Master/texmf-dist/doc/latex/zhspacing/zhspacing-context-test.tex b/Master/texmf-dist/doc/latex/zhspacing/zhspacing-context-test.tex new file mode 100644 index 00000000000..1f6c528d25c --- /dev/null +++ b/Master/texmf-dist/doc/latex/zhspacing/zhspacing-context-test.tex @@ -0,0 +1,45 @@ +\usemodule[zhspacing] + + +这是中文测试。中文和English的混排。中 +文和$E=mc^2$的混排。 + +九齿钉耙学名上宝沁晶耙,是俺的武器。九齿钉耙并非普通的农具,而是由 +太上老君\footnote{太上老君,三清之第三位。又称“道德天尊”、 +“混元老君”、“降生天尊”、“太清大帝”等。}用神冰铁亲自锤炼,借五方五 +帝、六丁六甲之力锻造而成,有诗为证: + +九齿钉耙学名上宝沁晶耙,是俺的武器。九齿钉耙并非普通的农具,而是由 +太上老君\footnote{太上老君,三清之第三位。又称“道德天尊”、 +“混元老君”、“降生天尊”、“太清大帝”等。}用神冰铁亲自锤炼,借五方五 +帝、六丁六甲之力锻造而成,有诗为证: + +\rm\tf roman \it italic \bf bold \bi bolditalic \sc smallcaps + +\ss\tf roman \it italic \bf bold \bi bolditalic \sc smallcaps + +\tt\tf roman \it italic \bf bold \bi bolditalic \sc smallcaps + +\blank + +\rm\tf 兡也包因沘氓侷柵苗孫孫財 text 兡也包因沘氓侷柵苗孫孫財\par +\rm\it 兡也包因沘氓侷柵苗孫孫財 text 兡也包因沘氓侷柵苗孫孫財\par +\rm\bf 兡也包因沘氓侷柵苗孫孫財 text 兡也包因沘氓侷柵苗孫孫財\par +\rm\bi 兡也包因沘氓侷柵苗孫孫財 text 兡也包因沘氓侷柵苗孫孫財\par + +\blank + +\ss\tf 兡也包因沘氓侷柵苗孫孫財 text 兡也包因沘氓侷柵苗孫孫財\par +\ss\it 兡也包因沘氓侷柵苗孫孫財 text 兡也包因沘氓侷柵苗孫孫財\par +\ss\bf 兡也包因沘氓侷柵苗孫孫財 text 兡也包因沘氓侷柵苗孫孫財\par +\ss\bi 兡也包因沘氓侷柵苗孫孫財 text 兡也包因沘氓侷柵苗孫孫財\par + +\blank + +\tt\tf 兡也包因沘氓侷柵苗孫孫財 text 兡也包因沘氓侷柵苗孫孫財\par +\tt\it 兡也包因沘氓侷柵苗孫孫財 text 兡也包因沘氓侷柵苗孫孫財\par +\tt\bf 兡也包因沘氓侷柵苗孫孫財 text 兡也包因沘氓侷柵苗孫孫財\par +\tt\bi 兡也包因沘氓侷柵苗孫孫財 text 兡也包因沘氓侷柵苗孫孫財\par + + +\bye
\ No newline at end of file diff --git a/Master/texmf-dist/tex/xetex/zhspacing/context/t-zhspacing.tex b/Master/texmf-dist/tex/xetex/zhspacing/context/t-zhspacing.tex new file mode 100644 index 00000000000..ce91f7ab9af --- /dev/null +++ b/Master/texmf-dist/tex/xetex/zhspacing/context/t-zhspacing.tex @@ -0,0 +1,117 @@ +%D \module +%D [ file=t-zhspacing, +%D version=2009.05.11, +%D title=\CONTEXT\ User Module, +%D subtitle=Zh-Spacing, +%D author=Yue Wang, +%D date=\currentdate, +%D copyright=Yue Wang +%D email=yuleopen@gmail.com, +%D license=BSD] + +\writestatus{loading}{Context User Module / Zh-Spacing} +\unprotect + +%D Macro package \type{zhspacing} was written by Yin Dian in order to +%D typeset Simplified Chinese in \XeTeX. The macro package uses \XeTeX's +%D inter-char token mechanism in order to support the basic Chinese +%D typesetting rules. This macro aims to port \type{zhspacing} to Hans +%D Hagen's \ConTeXt\ format. + +%D \ConTeXt\ MKII does not load unicode-letters.tex automatically +%D when the format is dumped. What's worse, standard \ConTeXt\ +%D distribution does not have unicode-letters.tex included. +%D So in order to define all the default \XeTeX\ character classes +%D as in plain \TeX\ and \LaTeX, we striped the related macros +%D from unicode-letters.tex to \type{zhspacing-unicode}. + + +\def\ID #1 #2 {\set{#1}{#2}{\global\XeTeXcharclass\n=1 \global\catcode\n=11 }} +\countdef\n=255 +\def\set#1#2#3{\n="#1 \loop #3 \ifnum\n<"#2 \advance\n by 1 \repeat} +\def\loop#1\repeat{\def\body{#1}\iterate} +\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next} +\let\repeat=\fi \ID 3400 4DB5 \ID 4E00 9FC3 \ID 20000 2A6D6 + +%D \ConTeXt\ does not have the right catcode for zhspacing.sty defined. +%D So we should define the catcode correctly in order to load it. + +\catcode`\!=12 +\catcode`\@=11 +\catcode`\?=12 + + +%D zhspacing uses \TeX\ commands \type{\lq} and \type{\rq} in plain TeX. +%D However, these are not defined in \ConTeXt. So we define the two macros. + +\def\lq{`} \def\rq{'} + +%D And now we can load \type{zhspacing.sty} safely. + +\input zhspacing.sty + + +%D Last thing: we define the typescript for Adobe Chinese fonts. + +\starttypescript [serif] [myzhfont] + \definefontsynonym [Serif] [ZhSerif] + \definefontsynonym [SerifBold] [ZhSerifBold] + \definefontsynonym [SerifItalic] [ZhSerifItalic] + \definefontsynonym [SerifBoldItalic] [ZhSerifBoldItalic] +\stoptypescript + +\starttypescript [serif] [myzhfont] + \definefontsynonym [ZhSerif] [name:AdobeSongStd-Light] + \definefontsynonym [ZhSerifBold] [name:AdobeHeitiStd-Regular] + \definefontsynonym [ZhSerifItalic] [name:AdobeKaitiStd-Regular] + \definefontsynonym [ZhSerifBoldItalic] [name:AdobeHeitiStd-Regular] +\stoptypescript + +\starttypescript [sans] [myzhfont] + \definefontsynonym [Sans] [ZhSans] + \definefontsynonym [SansBold] [ZhSansBold] + \definefontsynonym [SansItalic] [ZhSansItalic] + \definefontsynonym [SansBoldItalic] [ZhSansBoldItalic] +\stoptypescript + +\starttypescript [sans] [myzhfont] + \definefontsynonym [ZhSans] [name:AdobeKaitiStd-Regular] + \definefontsynonym [ZhSansBold] [name:AdobeHeitiStd-Regular] + \definefontsynonym [ZhSansItalic] [name:AdobeKaitiStd-Regular] + \definefontsynonym [ZhSansBoldItalic] [name:AdobeHeitiStd-Regular] +\stoptypescript + +\starttypescript [mono] [myzhfont] + \definefontsynonym [Mono] [ZhMono] + \definefontsynonym [MonoBold] [ZhMonoBold] + \definefontsynonym [MonoItalic] [ZhMonoItalic] + \definefontsynonym [MonoBoldItalic] [ZhMonoBoldItalic] +\stoptypescript + +\starttypescript [mono] [myzhfont] + \definefontsynonym [ZhMono] [name:AdobeFangsongStd-Regular] + \definefontsynonym [ZhMonoBold] [name:AdobeHeitiStd-Regular] + \definefontsynonym [ZhMonoItalic] [name:AdobeFangsongStd-Regular] + \definefontsynonym [ZhMonoBoldItalic] [name:AdobeHeitiStd-Regular] +\stoptypescript + + +\starttypescript[myzhfont] + \definetypeface [myzhfont] [rm] [serif] [myzhfont] [default] + \definetypeface [myzhfont] [ss] [sans] [myzhfont] [default] + \definetypeface [myzhfont] [tt] [mono] [myzhfont] [default] +\stoptypescript + +\usetypescript[myzhfont] + +%D We set all the \type{zhxxxfont} used in \type{zhspacing.sty}. + +\zhspacing +\def\zhongwen{\pushcurrentfont\myzhfont\popcurrentfont} +\def\zhfont{\zhongwen} +\def\zhpunctfont{\zhongwen} +\def\zhcjkextafont{\zhongwen} +\def\zhcjkextbfont{\zhongwen} + + +\protect
\ No newline at end of file diff --git a/Master/texmf-dist/tex/xetex/zhspacing/latex/zhfont.sty b/Master/texmf-dist/tex/xetex/zhspacing/latex/zhfont.sty new file mode 100644 index 00000000000..660f7a1ac2c --- /dev/null +++ b/Master/texmf-dist/tex/xetex/zhspacing/latex/zhfont.sty @@ -0,0 +1,143 @@ +% zhfont.sty coded by YIN Dian +% Simplify setting various font effects +% Hist: 071204 First coded. +% 071210 Improved. Added \newfontfamilywithslant and +% \newfontfamilywithslantandbold to simplify setting. +% 071211 Added fake bold support. +% 071231 Added underdot support. +% 080102 Minor changes on underdot. Don's use \scantokens. +% Fixed bug of \zhfont in ulem. Added font family +% selection and fake bold support in active hanzi. +\NeedsTeXFormat{LaTeX2e}[1996/12/01] +\def\filedate{2008/01/02} +\ProvidesPackage{zhfont}[\filedate] +\RequirePackage{zhspacing} +\RequirePackage{zhulem} +\newif\ifzhfont@fakebold +\zhfont@fakeboldfalse +\DeclareOption{fakebold}{\zhfont@fakeboldtrue} +\ProcessOptions\relax + +\def\zhs@tmpmacro{} +\def\zhs@curr@fam{-1} + +\zhnfsssavefont +\g@addto@macro\zhs@savefont{% + \long\edef\zhs@tmpmacro{\f@family}% + \def\zhs@curr@fam{0}% + \ifx\zhs@tmpmacro\sfdefault + \def\zhs@curr@fam{1}% + \else\ifx\zhs@tmpmacro\ttdefault + \def\zhs@curr@fam{2}% + \fi\fi + \edef\zhs@tmpmacro{\f@family}% + \ifx\zhs@tmpmacro\sfdefault + \def\zhs@curr@fam{1}% + \else\ifx\zhs@tmpmacro\ttdefault + \def\zhs@curr@fam{2}% + \fi\fi +} +\ifzhfont@fakebold +\def\zhfont@bx{bx} +\g@addto@macro\zhs@savefont{% + \ifx\f@series\zhfont@bx + \special{pdf: literal direct q 0.3 w 2 Tr}% + \fi +} +\g@addto@macro\zhs@restorefont{% + \ifx\f@series\zhfont@bx + \special{pdf: literal direct 0 Tr}% + \fi +} +\fi + +\def\newfontfamilywithslant#1#2{% + \newfontfamily#1[ItalicFont=#2,ItalicFeatures={RawFeature={slant=0.17}},BoldItalicFont=#2,BoldItalicFeatures={RawFeature={slant=0.17}}]{#2}% +} +\def\newfontfamilywithslantandbold#1#2#3{% + \newfontfamily#1[BoldFont=#3,ItalicFont=#2,ItalicFeatures={RawFeature={slant=0.17}},BoldItalicFont=#3,BoldItalicFeatures={RawFeature={slant=0.17}}]{#2}% +} + +%\newfontfamily\zhrmfont[BoldFont=SimHei,ItalicFont=SimSun,ItalicFeatures={RawFeature={slant=0.17}},BoldItalicFont=SimHei,BoldItalicFeatures={RawFeature={slant=0.17}}]{SimSun} +%\newfontfamily\zhsffont[ItalicFont=SimHei,ItalicFeatures={RawFeature={slant=0.17}}]{SimHei} +%\newfontfamily\zhttfont[BoldFont=KaiTi_GB2312,ItalicFont=FangSong_GB2312,ItalicFeatures={RawFeature={slant=0.17}},BoldItalicFont=KaiTi_GB2312,BoldItalicFeatures={RawFeature={slant=0.17}}]{FangSong_GB2312} +\ifzhfont@fakebold +\newfontfamilywithslant\zhrmfont{SimSun} +\newfontfamilywithslant\zhsffont{SimHei} +\newfontfamilywithslant\zhttfont{FangSong_GB2312} +\else +\newfontfamilywithslantandbold\zhrmfont{SimSun}{SimHei} +\newfontfamilywithslant\zhsffont{SimHei} +\newfontfamilywithslantandbold\zhttfont{FangSong_GB2312}{KaiTi_GB2312} +\fi +\def\zhfont{\ifcase\zhs@curr@fam\zhrmfont\or\zhsffont\or\zhttfont\else\zhrmfont\fi} + +\def\setzhmainfont{\newfontfamily\zhrmfont} +\def\setzhsansfont{\newfontfamily\zhsffont} +\def\setzhmonofont{\newfontfamily\zhttfont} + +\enableactivehanzi +\def\zhhanzihook#1{% + % select family + \long\edef\zhs@tmpmacro{\f@family}% + \def\zhs@curr@fam{0}% + \ifx\zhs@tmpmacro\sfdefault + \def\zhs@curr@fam{1}% + \else\ifx\zhs@tmpmacro\ttdefault + \def\zhs@curr@fam{2}% + \fi\fi + \edef\zhs@tmpmacro{\f@family}% + \ifx\zhs@tmpmacro\sfdefault + \def\zhs@curr@fam{1}% + \else\ifx\zhs@tmpmacro\ttdefault + \def\zhs@curr@fam{2}% + \fi\fi + \ifzhfont@fakebold\ifx\f@series\zhfont@bx + \special{pdf: literal direct q 0.3 w 2 Tr}% + \fi\fi + {\XeTeXinterchartokenstate=0\zhs@font #1}% + \ifzhfont@fakebold\ifx\f@series\zhfont@bx + \special{pdf: literal direct 0 Tr}% + \fi\fi +} + +\def\underdot@dot{\XeTeXinterchartokenstate=0\zhpunctfont \vbox to 0.5em{\vss\hbox{·}\vss}} +%\def\underdot@dot{\vbox to 0.5em{\vss\hbox{\bf .}\vss}} +\newskip\underdot@skip +\underdot@skip=2.5pt +\def\underdot{% + \begingroup + \makehanziglobalactive + \def\zhhanzihook##1{% + \setbox0=\hbox{\underdot@dot}% + \leavevmode\vtop{\baselineskip=\underdot@skip\lineskiplimit=-\maxdimen + \advance\baselineskip\ht0 + % select family + \long\edef\zhs@tmpmacro{\f@family}% + \def\zhs@curr@fam{0}% + \ifx\zhs@tmpmacro\sfdefault + \def\zhs@curr@fam{1}% + \else\ifx\zhs@tmpmacro\ttdefault + \def\zhs@curr@fam{2}% + \fi\fi + \edef\zhs@tmpmacro{\f@family}% + \ifx\zhs@tmpmacro\sfdefault + \def\zhs@curr@fam{1}% + \else\ifx\zhs@tmpmacro\ttdefault + \def\zhs@curr@fam{2}% + \fi\fi + \ialign{####\cr\XeTeXinterchartokenstate=0\zhs@font + \ifzhfont@fakebold\ifx\f@series\zhfont@bx + \special{pdf: literal direct q 0.3 w 2 Tr}##1% + \special{pdf: literal direct 0 Tr}\else ##1\fi\else ##1\fi + \cr\hidewidth\box0\hidewidth\cr}}% + }% + \underd@t +} +\def\underd@t#1{% + #1% + \makehanzigloballetter + \endgroup +} + +\endinput diff --git a/Master/texmf-dist/tex/xetex/zhspacing/latex/zhulem.sty b/Master/texmf-dist/tex/xetex/zhspacing/latex/zhulem.sty new file mode 100644 index 00000000000..86365e380ab --- /dev/null +++ b/Master/texmf-dist/tex/xetex/zhspacing/latex/zhulem.sty @@ -0,0 +1,18 @@ +% zhulem.sty coded by YIN Dian +% Fix compatibility problem with ulem +% Hist: 070822 Changed \UL@reskip and \UL@@penalty, able to work. +\NeedsTeXFormat{LaTeX2e}[1996/12/01] +\def\fileversion{0.4} +\def\filedate{2007/08/22} +\ProvidesPackage{zhulem}[\filedate\space\fileversion] +\RequirePackage{ulem}[2000/05/26] +%\let\zhulem@printfont\zhs@printf@nt +\def\zhulem@printfont#1{} +\def\UL@reskip{\zhs@savef@nt{tmp}\UL@stop \zhulem@printfont{tmp}\UL@leaders + \UL@start\zhs@restoref@nt{tmp}} +\def\UL@@penalty{\LA@penalty \ifnum\count@=\z@ + \@ne \else \count@ \fi % zero penalty => no penalty, so use 1 instead. + \zhs@savef@nt{tmp}\UL@stop \zhulem@printfont{tmp}\UL@start + \zhs@restoref@nt{tmp}} + +\endinput diff --git a/Master/texmf-dist/tex/xetex/zhspacing/plain/zhmath.sty b/Master/texmf-dist/tex/xetex/zhspacing/plain/zhmath.sty new file mode 100644 index 00000000000..88e69f60d7f --- /dev/null +++ b/Master/texmf-dist/tex/xetex/zhspacing/plain/zhmath.sty @@ -0,0 +1,156 @@ +% zhmath.sty coded by YIN Dian +% Use basic CJK characters in math environment. +% Hist: 071202 First coded. +% 071204 Set \XeTeXinterchartokenstate=0 to avoid a XeTeX bug. +% Added \ProvidesPackage. +% 071210 Added another method to set Chinese math fonts in +% LaTeX, via option noactive. Improved format detection. +% Added ability to set alpha and number fonts. +% 071211 Put \setalphanummathfonts in preamble so that +% \usecustommathfonts can be used in document in LaTeX. +% Changed \hbox to \mbox. Changed default option to +% noactive. +% 071215 Removed \XeTeXinterchartokenstate=0, as the XeTeX bug +% is fixed by JK. Changed \mathcjksizec/d to fit the +% main text size. +% 071229 Added \XeTeXinterchartokenstate=0 again, because not +% everyone has the latest version of XeTeX. Added custom +% and nocustom options. +\catcode`\@=11 +\ifx\zhmath@defined\@undefined +\def\zhmath@defined{\relax} +\def\filedate{2007/12/29} +\ifx\zhspacingrevision\@undefined +\input zhspacing.sty +\fi + +\def\zhmath@setXeTeXmathcodefam#1#2#3{% + % set #1..#2's math family to #3 + \count@=#1% + \loop + \XeTeXmathcode\count@=7 #3 \count@ + \unless\ifnum\count@>#2% + \advance\count@ by 1 + \repeat +} + +\def\zhmath@setactivemathchar#1#2#3#4#5#6{% + % set #1..#2 to active math chars, executing \mathchoice #3 #4 #5 #6. + \count@=#1% + \loop + \mathcode\count@="8000 + {\catcode\count@=\active\lccode`\~=\count@ + \lowercase{\xdef~{{\mathchoice{\noexpand#3{\number\count@}}% + {\noexpand#4{\number\count@}}{\noexpand#5{\number\count@}} + {\noexpand#6{\number\count@}}}}}% + }% + \unless\ifnum\count@>#2% + \advance\count@ by 1 + \repeat +} +\newif\ifzhmath@active +\newif\ifzhmath@custom + +\ifLaTeX@e % in LaTeX, similar to mathcjk + +\ProvidesPackage{zhmath}[\filedate] +\DeclareOption{active}{\zhmath@activetrue} +\DeclareOption{noactive}{\zhmath@activefalse} +\DeclareOption{custom}{\zhmath@customtrue} +\DeclareOption{nocustom}{\zhmath@customfalse} +\zhmath@activefalse +\zhmath@customtrue +\ProcessOptions\relax + +\def\mathcjksizea{} +\def\mathcjksizeb{} +\def\mathcjksizec{\dimen@=\dimexpr\f@size pt*6/10\relax\fontsize{\dimen@}{\dimen@}} +\def\mathcjksized{\dimen@=\dimexpr\f@size pt*5/10\relax\fontsize{\dimen@}{\dimen@}} + +\@ifundefined{zhmathfont}{\newfontfamily\zhmathfont{SimSun}}{} + +\ifzhmath@active + \def\zhmath@zhfont@disp#1{{\mbox{\XeTeXinterchartokenstate=0\zhmathfont\mathcjksizea\char#1\relax}}} + \def\zhmath@zhfont@text#1{{\mbox{\XeTeXinterchartokenstate=0\zhmathfont\mathcjksizeb\char#1\relax}}} + \def\zhmath@zhfont@scrp#1{{\mbox{\XeTeXinterchartokenstate=0\zhmathfont\mathcjksizec\char#1\relax}}} + \def\zhmath@zhfont@subs#1{{\mbox{\XeTeXinterchartokenstate=0\zhmathfont\mathcjksized\char#1\relax}}} + + \zhmath@setactivemathchar{"2E80}{"9FFF}{\zhmath@zhfont@disp}% + {\zhmath@zhfont@text}{\zhmath@zhfont@scrp}{\zhmath@zhfont@subs} + + \def\setzhmathfont#1{\let\zhmathfont=#1} +\else + \def\setzhmathfont#1{% + \let\zhmathfont=#1% + \begingroup + \normalfont + \zhmathfont + \xdef\zhmath@fenc{\f@encoding}% + \xdef\zhmath@ffam{\f@family}% + \endgroup + \DeclareSymbolFont{hanzi}{\zhmath@fenc}{\zhmath@ffam}{m}{n}% + } + \setzhmathfont\zhmathfont + \zhmath@setXeTeXmathcodefam{"2E80}{"9FFF}{\symhanzi} +\fi + +\ifzhmath@custom +\def\setalphanummathfonts#1{% + \let\zhmathalphanumfont=#1% + \begingroup + \normalfont + \zhmathalphanumfont + \xdef\zhmath@@fenc{\f@encoding}% + \xdef\zhmath@@ffam{\f@family}% + \endgroup + \DeclareSymbolFont{@letter}{\zhmath@@fenc}{\zhmath@@ffam}{m}{it}% + \DeclareSymbolFont{@number}{\zhmath@@fenc}{\zhmath@@ffam}{m}{n}% + \SetSymbolFont{@letter}{bold}{\zhmath@@fenc}{\zhmath@@ffam}{bx}{it}% + \SetSymbolFont{@number}{bold}{\zhmath@@fenc}{\zhmath@@ffam}{bx}{n}% +} +\@ifundefined{zhmathalphanumfont}{\newfontfamily\zhmathalphanumfont{Times New Roman}}{} +\setalphanummathfonts\zhmathalphanumfont +\def\usecustommathfonts{% + \zhmath@setXeTeXmathcodefam{`\0}{`\9}{\sym@number} + \zhmath@setXeTeXmathcodefam{`\a}{`\z}{\sym@letter} + \zhmath@setXeTeXmathcodefam{`\A}{`\Z}{\sym@letter} +} +\fi + +\else %in plain TeX + +\@ifundefined{zhmathfont}{\font\zhmathfont="SimSun" at 10pt}{} +\newfam\zhmath@fam +\newfam\zhmath@letterfam +\newfam\zhmath@numberfam + +\def\@setzhmathfonts#1#2{% + \edef\zhmath@font{\fontname#1 }% + \font\zhmath@tenfont=\zhmath@font at 10pt + \font\zhmath@sevenfont=\zhmath@font at 7pt + \font\zhmath@fivefont=\zhmath@font at 5pt\relax + \textfont#2=\zhmath@tenfont + \scriptfont#2=\zhmath@sevenfont + \scriptscriptfont#2=\zhmath@fivefont +} +\def\setzhmathfont#1{\@setzhmathfonts{#1}\zhmath@fam} +\setzhmathfont\zhmathfont + +\def\setalphanummathfonts#1#2{% #1: alpha, #2, num + \@setzhmathfonts{#1}\zhmath@letterfam + \@setzhmathfonts{#2}\zhmath@numberfam +} + +\zhmath@setXeTeXmathcodefam{"2E80}{"9FFF}{\zhmath@fam} + +\def\usecustommathfonts{% + \@ifundefined{zhmathletterfont}{\font\zhmathletterfont="Times New Roman/I" at 10pt}{} + \@ifundefined{zhmathnumberfont}{\font\zhmathnumberfont="Times New Roman" at 10pt}{} + \setalphanummathfonts\zhmathletterfont\zhmathnumberfont + \zhmath@setXeTeXmathcodefam{`\0}{`\9}{\zhmath@numberfam} + \zhmath@setXeTeXmathcodefam{`\a}{`\z}{\zhmath@letterfam} + \zhmath@setXeTeXmathcodefam{`\A}{`\Z}{\zhmath@letterfam} +} + +\fi % end if LaTeX +\fi diff --git a/Master/texmf-dist/tex/xetex/zhspacing/plain/zhsmyclass.sty b/Master/texmf-dist/tex/xetex/zhspacing/plain/zhsmyclass.sty new file mode 100644 index 00000000000..fc80762f09d --- /dev/null +++ b/Master/texmf-dist/tex/xetex/zhspacing/plain/zhsmyclass.sty @@ -0,0 +1,150 @@ +% zhsmyclass.sty coded by YIN Dian +% Implement easy inter-class token definition with inheritance +% Hist: 070807 First usable version coded. \newclass, \{set,get,prepend,append}interclasstoks +% The tricky part is prepending stuffs to a token register, see TeX by Topics. +% 070808 Added \setclassnum and \registerXeTeXclasstoks +% 070809 Removed unnecessary \global's. +% 070810 Only register non-empty tokens. +% 071019 Added \getclassnum +% 071210 Changed \@foreach to \@for. +\catcode`\@=11 +\ifx\@myclass@defined\@undefined +\def\@myclass@defined{\relax} +\input zhsusefulmacros.sty +\catcode`\@=11 +\def\@class@list{} +\def\newclass{\@ifnextchar[{\@newclass@param}{\@newclass}} +\def\@newclass@param[#1]#2{% + \if!#1! + \errmessage{Base class name shouldn't be empty.}% + \fi + \if!#2! + \errmessage{Class name shouldn't be empty.}% + \fi + \@ifundefined{@@classname@#1}{% + \errmessage{Base class not defined yet.}% + }{}% + \@ifundefined{@@classname@#2}{% if + \@namedef{@@classname@#2}{\relax}% + \@namedef{@@baseclass@#2}{#1}% + \@for\@@class:=\@class@list\do{% for + \if!\@@class! + \else + \@newinterclasstoks{#2}{\@@class}% + \@newinterclasstoks{\@@class}{#2}% + %\setinterclasstoks{#2}{\@@class}{\getinterclasstoks{#1}{\@@class}}% + %\setinterclasstoks{\@@class}{#2}{\getinterclasstoks{\@@class}{#1}}% + \copyinterclasstoks{#2}{\@@class}{#1}{\@@class}% + \copyinterclasstoks{\@@class}{#2}{\@@class}{#1}% + \fi + }% end for + \@newinterclasstoks{#2}{#2}% + \edef\@class@list{\@class@list,#2}% + }{% else + \errmessage{Class already defined.}% + }% end if +} +\def\@newclass#1{% + \if!#1! + \errmessage{Class name shouldn't be empty.}% + \fi + \@ifundefined{@@classname@#1}{% if + \@namedef{@@classname@#1}{\relax}% + \@for\@@class:=\@class@list\do{% for + \if!\@@class! + \else + \@newinterclasstoks{#1}{\@@class}% + \@newinterclasstoks{\@@class}{#1}% + \fi + }% end for + \@newinterclasstoks{#1}{#1}% + \edef\@class@list{\@class@list,#1}% + }{% else + \errmessage{Class already defined.}% + }% end if +} +\def\getbaseclass#1#2{% + \@ifundefined{@@baseclass@#1}{\def#2{}}{\edef#2{\csname @@baseclass@#1\endcsname}}% +} +\def\@newinterclasstoks#1#2{% + \expandafter\newtoks\csname @@interclasstoks@#1@#2\endcsname + \csname @@interclasstoks@#1@#2\endcsname={}%\meaning #1, \meaning #2}% + %%\expandafter\gdef\csname @@interclasstoks@#1@#2\endcsname{}% +} +\def\setinterclasstoks#1#2#3{% + \csname @@interclasstoks@#1@#2\endcsname={#3}% + %%\expandafter\edef\csname @@interclasstoks@#1@#2\endcsname{#3}% +} +\def\getinterclasstoks#1#2{% + \expandafter\the\csname @@interclasstoks@#1@#2\endcsname + %%\csname @@interclasstoks@#1@#2\endcsname +} +\def\copyinterclasstoks#1#2#3#4{% (#1, #2) <- (#3, #4) + \expandafter\csname @@interclasstoks@#1@#2\endcsname\expandafter{\expandafter\the\csname @@interclasstoks@#3@#4\endcsname}% +} +\def\prependinterclasstoks#1#2#3{% + \toks0={#3}% + \edef\@@prepend@act{\csname @@interclasstoks@#1@#2\endcsname={\the\toks0 + \expandafter\the\csname @@interclasstoks@#1@#2\endcsname}}% + \@@prepend@act + %%\expandafter\edef\csname @@interclasstoks@#1@#2\endcsname{#3\csname @@interclasstoks@#1@#2\endcsname}% +} +\def\appendinterclasstoks#1#2#3{% + \expandafter\csname @@interclasstoks@#1@#2\endcsname\expandafter{\the\csname @@interclasstoks@#1@#2\endcsname #3}% + %%\global\expandafter\edef\csname @@interclasstoks@#1@#2\endcsname{\csname @@interclasstoks@#1@#2\endcsname #3}% +} +\def\showallinterclasstoks{% + \par + \begingroup + \@for\class:=\@class@list\do{% + \if!\class! + \else + \@for\anotherclass:=\@class@list\do{% + \if!\anotherclass! + \else + [\class, \anotherclass]: %\csname @@interclasstoks@\class @\anotherclass\endcsname + \expandafter\the\csname @@interclasstoks@\class @\anotherclass\endcsname + \hfil\break + \fi + }% + \fi + }% + \endgroup +} +\newlinechar`\^^J +\def\setclassnum#1#2{% + \expandafter\chardef\csname @@classnum@#1\endcsname=#2\relax +} +\def\getclassnum#1{% + \csname @@classnum@#1\endcsname +} +\def\mydbgmessag@#1{} +\def\registerXeTeXclasstoks{% + \@for\class:=\@class@list\do{% + \@ifundefined{@@classnum@\class}{}{% + \@for\anotherclass:=\@class@list\do{% + \@ifundefined{@@classnum@\anotherclass}{}{% + \edef\@@temp@macro{\the\csname @@interclasstoks@\class @\anotherclass\endcsname}% + \ifx\@@temp@macro\empty + \else + \edef\@@temp@macro{\@@temp@macro}% + \ifx\@@temp@macro\empty + \else + \edef\@@register@act{\noexpand\XeTeXinterchartoks\csname @@classnum@\class\endcsname + \csname @@classnum@\anotherclass\endcsname\noexpand{\expandafter\the\csname + @@interclasstoks@\class @\anotherclass\endcsname\noexpand}}% + \@@register@act + \edef\@@register@act{\noexpand\mydbgmessag@\noexpand{Registered (\expandafter\number + \csname @@classnum@\class\endcsname, \expandafter\number + \csname @@classnum@\anotherclass\endcsname)\noexpand}}% + \@@register@act + \mydbgmessag@{Registered (\class, \anotherclass) token: \expandafter\the\csname + @@interclasstoks@\class @\anotherclass\endcsname ^^J}% + \fi + \fi + }% + }% + }% + }% +} +\fi diff --git a/Master/texmf-dist/tex/xetex/zhspacing/plain/zhspacing.sty b/Master/texmf-dist/tex/xetex/zhspacing/plain/zhspacing.sty new file mode 100644 index 00000000000..36a13bb5139 --- /dev/null +++ b/Master/texmf-dist/tex/xetex/zhspacing/plain/zhspacing.sty @@ -0,0 +1,818 @@ +% zhspacing.sty version 3.5 +% Simple macro for typesetting mixed Chinese documents in XeTeX +% with punctuation space adjustment and prohibitions +% coded by YIN Dian (yindian@ustc) +% Licensed under GPL +% History: 070804 First usable version. +% 070805 Several line breaking bug fixes. +% 070807 \zhinteropenskip changed to 0.6em. \enfont +% TODO list written. +% 070808 Use macros instead of skips to fit different font size. +% 070809 Tried to use myclass to manage classes, but failed. +% Then I found it works when \relax is added. +% 070810 Changed skip parameters. Removed \relax, only register +% non-empty tokens instead. Now it seems to work right. +% Several bugs fixed. CJK Ext-A/B support added. +% Added three skip schemes. +% 070812 Fixed font switch bug between CJK Ext-A and Ext-B chars. +% Obsoleted the use of \enfont. +% 070822 Fixed bug of unbalanced group when using ulem? Cleared +% XeTeX's pre-defined inter-char tokens. Use seperate +% font for punctuations. +% Deprecated the use of begin/end-groups in LaTeX, in +% order to work properly with ulem. Coded zhulem.sty. +% 070823 Use more flexible way to save font. Changed space +% ignoring mechanism after hanzi to allow \skipenzh added +% between hanzi and boundary if the next non-space token +% is a char and is not fullwidth nor in PUA. +% 070824 Enabled automatic skip between math formulas and CJK +% chars. Changed skip schemes. Added \zhspacingrevision. +% 071008 Fixed bug of missing \skipzh when hanzi next to space. +% Found bug of \zhs@skipspaces --- \iffalse error. +% Found bug?? in 10pt article: +% \fbox{\vbox{\hsize=12.2001pt\scriptsize \parindent=0pt +% \parskip=0pt《口口》口:“}} +% 071014 Found bug introduced by the last bug fix, which breaks +% the punctuation prohibitions. (Fixed on 071020) +% 071015 Fixed bug of not changing punctuation font after space. +% 071019 Fixed the \iffalse bug. Use \the\XeTeXcharclass +% instead of ifcjkchar. +% Defined token patterns to simplify settings, haha. +% 071020 Added ability to deal with space seperated characters. +% Added XeTeX existence test. More intelligent parindent +% setting. Fixed bug of English font change through not +% using \getinterclasstoks, hmmm. +% Seperated fullstop and halfstop skips. They were both +% treated as judou before. Added \halthalfskipscheme. +% 071027 Fixed bug of \halthalfskipscheme. Added class setting +% for some punctuations. +% 071103 Fixed bug of no \skipzh between CJK Ext-A/B chars. +% However, due to the current bug of XeTeX, CJK Ext-B +% chars may not have a correct \meaning, so having them +% after spaces may result in a compiling failure. +% 071117 Use \ifzhs@isvalidchar to avoid the XeTeX \meaning +% bug. Added \ProvidesPackage when under LaTeX. +% 071202 Fixed bug of wrong \ProvidesPackage in plain TeX. +% 071210 Changed usefulmacros.sty. Removed \@foreach because I +% find they are redundant --- \@for already has +% \expandafter #2. Improved LaTeX detecting. +% 071211 Minor change on \simsunskipscheme. +% 071229 Added a few punctuation classification settings. +% Refined code. Added active hanzi hook. Removed some +% debug code for compiling speed. Not thoroughly tested. +% 071231 Use \zhs@@a to reduce memory usage. Removed +% \zhs@active@alphabound because it's not effective. +% Use \lastnodetype and \spacefactor to determine whether +% or not to insert \skipenzh. Added a few punctuation +% classification settings. +% 080102 No \enableactivehanzi by default. Changed \zhhanzihook. +% Use hex number to represent hanzi. Added \zhs@font. +% Added ambiwide and ambinarrow options. Made active +% hanzi protected. +% 090720 Rename usefulmacros.sty and myclass.sty to +% zhsusefulmacros.sty and zhsmyclass.sty. +% Note: 1. Catcode test requires letter 'a' to be in category 11, and '!' +% to be in category 12. So don't change the default catcodes. +% 2. To speed up processing long Chinese documents, set \skipzh to +% empty and \XeTeXinterchartoks 1 1={}. This can save 1/4 time. +% 3. \zhspacing will generate a few spaces. Using it in horizontal +% mode will produce unwanted skips. +\catcode`\@=11 +\ifx\XeTeXrevision\@undefined + \errmessage{XeTeX required to use zhspacing}% +\fi +\ifx\XeTeXinterchartokenstate\@undefined + \errmessage{XeTeX 0.997 or above required to use zhspacing}% +\fi +\ifx\zhspacingrevision\@undefined +\def\zhspacingrevision{2008/01/02} +\input zhsusefulmacros.sty +\newif\ifzhs@ambiwide +\zhs@ambiwidetrue +\ifLaTeX@e + \ProvidesPackage{zhspacing}[\zhspacingrevision] + \DeclareOption{ambiwide}{\zhs@ambiwidetrue} + \DeclareOption{ambinarrow}{\zhs@ambiwidefalse} + \ProcessOptions\relax +\fi +\XeTeXlinebreaklocale="zh" +\XeTeXlinebreakskip=0pt plus 0.2em minus 0.1em +\def\zhnobreak{\nobreak} +\def\simsunskipscheme{% should be fit for sim-xxx fonts + % my skip + \def\skipzh{\hskip 0em plus 0.2em minus 0.1em} + \def\skipenzh{\hskip 0.25em plus 0.15em minus 0.05em} + \def\skipzhopen{\hskip -0.0em plus 0.0em minus 0.3em} + \def\skipzhinteropen{\hskip -0.3em plus 0.1em minus 0.1em} + \def\skipzhlinestartopen{\hskip -0.35em} + \def\skipzhclose{\hskip -0.0em plus 0.0em minus 0.3em} + \def\skipzhinterclose{\hskip -0.3em plus 0.1em minus 0.1em} + \def\skipzhlineendclose{\hskip -0.35em} + \def\skipzhhalfstop{\hskip -0.0em plus 0.0em minus 0.5em} + \def\skipzhinterhalfstop{\hskip -0.3em plus 0.1em minus 0.1em} + \def\skipzhlineendhalfstop{\hskip -0.6em} + \def\skipzhfullstop{\hskip -0.0em plus 0.0em minus 0.5em} + \def\skipzhinterfullstop{\hskip -0.3em plus 0.1em minus 0.1em} + \def\skipzhlineendfullstop{\hskip -0.575em} + % neg + \def\skipnegzhlinestartopen{\hskip 0.35em} + \def\skipnegzhlineendclose{\hskip 0.35em} + \def\skipnegzhlineendhalfstop{\hskip 0.6em} + \def\skipnegzhlineendfullstop{\hskip 0.575em} +} +\def\emptyskipscheme{% just for test use + % my skip + \def\skipzh{\hskip 0em plus 0.1em} + \def\skipenzh{\hskip 0em plus 0.2em} + \def\skipzhopen{\hskip 0pt} + \def\skipzhinteropen{\hskip 0pt} + \def\skipzhlinestartopen{\hskip 0pt} + \def\skipzhclose{\hskip 0pt} + \def\skipzhinterclose{\hskip 0pt} + \def\skipzhlineendclose{\hskip 0pt} + \def\skipzhhalfstop{\hskip 0pt} + \def\skipzhinterhalfstop{\hskip 0pt} + \def\skipzhlineendhalfstop{\hskip 0pt} + \def\skipzhfullstop{\hskip 0pt} + \def\skipzhinterfullstop{\hskip 0pt} + \def\skipzhlineendfullstop{\hskip 0pt} + % neg + \def\skipnegzhlinestartopen{\hskip 0pt} + \def\skipnegzhlineendclose{\hskip 0pt} + \def\skipnegzhlineendhalfstop{\hskip 0pt} + \def\skipnegzhlineendfullstop{\hskip 0pt} +} +\def\haltfullskipscheme{% should be fit for Adobe opentype fonts with halfwidth alternative enabled + % my skip + \def\skipzh{\hskip 0em plus 0.2em minus 0.1em} + \def\skipenzh{\hskip 0.25em plus 0.15em minus 0.05em} + \def\skipzhopen{\hskip 0.3em minus 0.3em} + \def\skipzhinteropen{\hskip 0em plus 0.1em } + \def\skipzhlinestartopen{\hskip 0em} + \def\skipzhclose{\hskip 0.3em minus 0.3em} + \def\skipzhinterclose{\hskip 0em plus 0.1em} + \def\skipzhlineendclose{\hskip 0em} + \def\skipzhhalfstop{\hskip 0.4em minus 0.4em} + \def\skipzhinterhalfstop{\hskip 0em plus 0.1em} + \def\skipzhlineendhalfstop{\hskip 0em} + \def\skipzhfullstop{\hskip 0.4em minus 0.4em} + \def\skipzhinterfullstop{\hskip 0em plus 0.1em} + \def\skipzhlineendfullstop{\hskip 0em} + % neg + \def\skipnegzhlinestartopen{\hskip 0em} + \def\skipnegzhlineendclose{\hskip 0em} + \def\skipnegzhlineendhalfstop{\hskip 0em} + \def\skipnegzhlineendfullstop{\hskip 0em} +} +\let\haltskipscheme\haltfullskipscheme % for backward compatibility +\def\halthalfskipscheme{% should be fit for Adobe opentype fonts with halfwidth alternative enabled + % my skip + \def\skipzh{\hskip 0em plus 0.2em minus 0.1em} + \def\skipenzh{\hskip 0.25em plus 0.15em minus 0.05em} + \def\skipzhopen{\hskip 0.0em plus 0.3em} + \def\skipzhinteropen{\hskip 0em plus 0.1em } + \def\skipzhlinestartopen{\hskip 0em} + \def\skipzhclose{\hskip 0.0em plus 0.3em} + \def\skipzhinterclose{\hskip 0em plus 0.1em} + \def\skipzhlineendclose{\hskip 0em} + \def\skipzhhalfstop{\hskip 0.0em plus 0.4em} + \def\skipzhinterhalfstop{\hskip 0em plus 0.1em} + \def\skipzhlineendhalfstop{\hskip -0.15em} + \def\skipzhfullstop{\hskip 0.0em plus 0.4em} + \def\skipzhinterfullstop{\hskip 0em plus 0.1em} + \def\skipzhlineendfullstop{\hskip -0.15em} + % neg + \def\skipnegzhlinestartopen{\hskip 0em} + \def\skipnegzhlineendclose{\hskip 0em} + \def\skipnegzhlineendhalfstop{\hskip 0.15em} + \def\skipnegzhlineendfullstop{\hskip 0.15em} +} +\simsunskipscheme +%\let\mydbgmessage\message +\def\mydbgmessage#1{} + +% font save and restore +\def\zhs@oldf@encoding{} +\def\zhs@oldf@family{} +\def\zhs@oldf@series{} +\def\zhs@oldf@shape{} +\def\zhs@oldf@size{} +\def\zhs@savef@nt#1{% + \expandafter\xdef\csname zhs@#1f@encoding\endcsname{\f@encoding}% + \expandafter\xdef\csname zhs@#1f@family\endcsname{\f@family}% + \expandafter\xdef\csname zhs@#1f@series\endcsname{\f@series}% + \expandafter\xdef\csname zhs@#1f@shape\endcsname{\f@shape}% + \expandafter\xdef\csname zhs@#1f@size\endcsname{\f@size}% +} +\def\zhs@restoref@nt#1{% + \edef\f@encoding{\csname zhs@#1f@encoding\endcsname}% + \edef\f@family{\csname zhs@#1f@family\endcsname}% + \edef\f@series{\csname zhs@#1f@series\endcsname}% + \edef\f@shape{\csname zhs@#1f@shape\endcsname}% + \edef\f@size{\csname zhs@#1f@size\endcsname}% + \selectfont +} +\def\zhs@printf@nt#1{% + \immediate\write16{Font #1 is: \csname zhs@#1f@encoding\endcsname/\csname zhs@#1f@family\endcsname/\csname + zhs@#1f@series\endcsname/\csname zhs@#1f@shape\endcsname/\csname zhs@#1f@size\endcsname}% +} +\def\zhgroupsavefont{% + \let\zhs@savefont=\begingroup + \let\zhs@restorefont=\endgroup +} +\def\zhnfsssavefont{% + \def\zhs@savefont{\zhs@savef@nt{old}} + \def\zhs@restorefont{\zhs@restoref@nt{old}} +} +\ifLaTeX@e + \zhnfsssavefont +\else + \zhgroupsavefont +\fi + +% test CJK char +\def\chartonum#1#2{% #1: an explicit or implicit char; #2: return macro + \ifcat#1a% + \edef#2{\expandafter\@lettertonum\meaning #1\@end}% + \edef#2{\expandafter\number\expandafter\lq #2}% + \else + \ifcat#1!% + \edef#2{\expandafter\@chartonum\meaning #1\@end}% + \edef#2{\expandafter\number\expandafter\lq #2}% + \else + \errmessage{In \string\chartonum, parameter not a letter, nor a character}% + \fi + \fi +} +{\escapechar=-1 + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\@lettertonum + \expandafter\string\csname the letter \endcsname#1\@end{#1} + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\@chartonum + \expandafter\string\csname the character \endcsname#1\@end{#1} +} +\let\zhs@tmpchar\relax +\def\zhs@skipspaces{\futurenonspacelet\zhs@tmpchar\zhs@skipsp@ces} +\def\zhs@skipsp@ces{% + %\expandafter\mydbgmessage\expandafter{\meaning\zhs@tmpchar}% + \ifcat a\noexpand\zhs@tmpchar % catcode 11 + \zhs@testskipenzh + \else + \ifcat !\noexpand\zhs@tmpchar % catcode 12 + \zhs@testskipenzh + \else + \ifcat $\noexpand\zhs@tmpchar % catcode 3 + \skipenzh\relax + \fi + \fi + \fi +} +\def\zhs@tmpnum{-1} +\def\ifzhs@isvalidchar#1??#2\ok{\if!#2!} +\def\zhs@testskipenzh{% + \chartonum\zhs@tmpchar\zhs@tmpnum + \expandafter\ifzhs@isvalidchar\zhs@tmpnum??\ok + \edef\zhs@tmpnum{\the\XeTeXcharclass\zhs@tmpnum}% + \else + \edef\zhs@tmpnum{\getclassnum{cjkextb}}% + \fi + \ifnum\zhs@tmpnum = \getclassnum{alphanum}% + \skipenzh\relax + \else + \ifnum\zhs@tmpnum = \getclassnum{hanzi}% + \skipzh\relax + \else + \ifnum\zhs@tmpnum = \getclassnum{closefw}% + %\getinterclasstoks{hanzi}{closefw}% + \zhnobreak + \else + \ifnum\zhs@tmpnum = \getclassnum{halfstop}% + %\getinterclasstoks{hanzi}{halfstop}% + \zhnobreak + \else + \ifnum\zhs@tmpnum = \getclassnum{fullstop}% + \zhnobreak + \else + \ifnum\zhs@tmpnum = \getclassnum{openfw}% + \zhnobreak\skipnegzhlinestartopen\relax % compensate + \else + \ifnum\zhs@tmpnum = \getclassnum{cjkexta}% + \skipzh\relax + \else + \ifnum\zhs@tmpnum = \getclassnum{cjkextb}% + \skipzh\relax + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \fi +} +\def\zhs@aftermathskip{% + \ifnum\lastnodetype=10 % math node + \skipenzh\relax + \fi +} +% Character class settings. +\input zhsmyclass.sty +% three base classes: boundary, halfwidth and fullwidth +\newclass{boundary} +\setclassnum{boundary}{255} +\newclass{halfwidth} +\newclass{fullwidth} +\setinterclasstoks{boundary}{fullwidth}{\mydbgmessage{^^JZ}\zhs@savefont\zhfont} +\setinterclasstoks{fullwidth}{boundary}{\mydbgmessage{^^Jz}\zhs@restorefont\ignorespaces} +\setinterclasstoks{halfwidth}{fullwidth}{\mydbgmessage{^^JP}\zhs@savefont\zhfont} +\setinterclasstoks{fullwidth}{halfwidth}{\mydbgmessage{^^Jp}\zhs@restorefont} +% derived class alphanum and hanzi +\newclass[halfwidth]{alphanum} +\setclassnum{alphanum}{0} +\newclass[fullwidth]{hanzi} +\setclassnum{hanzi}{1} +\setinterclasstoks{hanzi}{hanzi}{\skipzh\relax} +%\appendinterclasstoks{alphanum}{hanzi}{\mydbgmessage{^^JQ}\skipenzh\relax} +%\prependinterclasstoks{hanzi}{alphanum}{\mydbgmessage{^^Jq}\skipenzh\relax} +\setinterclasstoks{alphanum}{hanzi}{\mydbgmessage{^^JQ}\skipenzh\relax\zhs@savefont\zhfont} +\setinterclasstoks{hanzi}{alphanum}{\mydbgmessage{^^Jq}\zhs@restorefont\skipenzh\relax} +\setinterclasstoks{hanzi}{boundary}{\mydbgmessage{^^Ji}\zhs@restorefont\zhs@skipspaces} +\setinterclasstoks{boundary}{hanzi}{\mydbgmessage{^^JI}\zhs@aftermathskip\zhs@savefont\zhfont} +% derived class from fullwidth +\newclass[fullwidth]{openfw} % ‘, (, etc +\setclassnum{openfw}{2} +\newclass[fullwidth]{closefw} % ’, ), etc +\setclassnum{closefw}{3} +\newclass[fullwidth]{halfstop} % ,, , etc +\setclassnum{halfstop}{4} +\newclass[fullwidth]{fullstop} % 。 etc +\setclassnum{fullstop}{10} +\newclass[fullwidth]{fwpunct} % extra fullwidth punctuations +\setclassnum{fwpunct}{7} +% patterns +\def\zhs@punct@inter#1{% + \zhnobreak\csname skipzhinter#1\endcsname\relax +} +\def\zhs@leftpunct@after#1{% + \allowbreak\csname skipzh#1\endcsname\nobreak\csname skipnegzhlinestart#1\endcsname\vadjust{}\zhnobreak\csname skipzhlinestart#1\endcsname\relax +} +\def\zhs@leftpunct@after@boundary#1{% + \zhnobreak\csname skipzhlinestart#1\endcsname\relax +} +\let\zhs@tmp\relax +\def\zhs@leftpunct@before@boundary#1{\def\zhs@tmp{#1}\futurenonspacelet\zhs@tmpchar\zhs@leftpunct@before@boundary@} +\def\zhs@leftpunct@before@boundary@{% + %\mydbgmessage{left punct before boundary}% + %\expandafter\mydbgmessage\expandafter{\meaning\zhs@tmpchar}% + \ifcat a\noexpand\zhs@tmpchar % catcode 11 + \zhs@leftpunct@before@boundary@@ + \else + \ifcat !\noexpand\zhs@tmpchar % catcode 12 + \zhs@leftpunct@before@boundary@@ + \fi + \fi +} +\def\zhs@leftpunct@before@boundary@@{% + \chartonum\zhs@tmpchar\zhs@tmpnum + \expandafter\ifzhs@isvalidchar\zhs@tmpnum??\ok + \edef\zhs@tmpnum{\the\XeTeXcharclass\zhs@tmpnum}% + \else + \edef\zhs@tmpnum{\getclassnum{cjkextb}}% + \fi + \zhs@tmp +} +\def\zhs@leftpunct@after@right#1#2{% + \zhnobreak\csname skipzhlineend#2\endcsname\allowbreak\csname skipnegzhlineend#2\endcsname\csname skipzhinter#2\endcsname\csname skipzhinter#1\endcsname\csname skipnegzhlinestart#1\endcsname\vadjust{}\zhnobreak\csname skipzhlinestart#1\endcsname\relax +} +\def\zhs@rightpunct@before#1{% + \zhnobreak\csname skipzhlineend#1\endcsname\allowbreak\csname skipnegzhlineend#1\endcsname\csname skipzh#1\endcsname\relax +} +\def\zhs@rightpunct@before@boundary#1{\def\zhs@tmp{#1}\futurenonspacelet\zhs@tmpchar\zhs@rightpunct@before@boundary@} +\def\zhs@rightpunct@before@boundary@{% + %\mydbgmessage{right punct before boundary}% + %\expandafter\mydbgmessage\expandafter{\meaning\zhs@tmpchar}% + \ifcat a\noexpand\zhs@tmpchar % catcode 11 + \zhs@rightpunct@before@boundary@@ + \else + \ifcat !\noexpand\zhs@tmpchar % catcode 12 + \zhs@rightpunct@before@boundary@@ + \fi + \fi +} +\def\zhs@rightpunct@before@boundary@@{% + \chartonum\zhs@tmpchar\zhs@tmpnum + \expandafter\ifzhs@isvalidchar\zhs@tmpnum??\ok + \edef\zhs@tmpnum{\the\XeTeXcharclass\zhs@tmpnum}% + \else + \edef\zhs@tmpnum{\getclassnum{cjkextb}}% + \fi + \zhs@tmp +} +% open fullwidth punctuation after other characters +\@for\zhs@class:={hanzi,fwpunct,alphanum,halfwidth}\do{%,boundary + \prependinterclasstoks{\zhs@class}{openfw}{\mydbgmessage{^^JA1}\zhs@leftpunct@after{open}} +} +\setinterclasstoks{openfw}{openfw}{\mydbgmessage{^^JA2}\zhs@punct@inter{open}} +\setinterclasstoks{closefw}{openfw}{\mydbgmessage{^^JA3}\zhs@leftpunct@after@right{open}{close}} +\setinterclasstoks{halfstop}{openfw}{\mydbgmessage{^^JA4}\zhs@leftpunct@after@right{open}{halfstop}} +\setinterclasstoks{fullstop}{openfw}{\mydbgmessage{^^JA4}\zhs@leftpunct@after@right{open}{fullstop}} +% close fullwidth punctuation before other characters +\@for\zhs@class:={hanzi,fwpunct,alphanum,halfwidth}\do{%,boundary + \prependinterclasstoks{closefw}{\zhs@class}{\mydbgmessage{^^JB1}\zhs@rightpunct@before{close}} +} +\setinterclasstoks{closefw}{closefw}{\mydbgmessage{^^JB2}\zhs@punct@inter{close}} +\setinterclasstoks{closefw}{halfstop}{\mydbgmessage{^^JB3}\zhs@punct@inter{close}} +\setinterclasstoks{closefw}{fullstop}{\mydbgmessage{^^JB3}\zhs@punct@inter{close}} +% halfstop punctuation before other characters +\@for\zhs@class:={hanzi,fwpunct,alphanum,halfwidth}\do{%,boundary + \prependinterclasstoks{halfstop}{\zhs@class}{\mydbgmessage{^^JC1}\zhs@rightpunct@before{halfstop}} +} +\setinterclasstoks{halfstop}{closefw}{\mydbgmessage{^^Jb2}\zhs@punct@inter{halfstop}} +\setinterclasstoks{halfstop}{halfstop}{\mydbgmessage{^^JC2}\zhs@punct@inter{halfstop}} +\setinterclasstoks{halfstop}{fullstop}{\mydbgmessage{^^JC2}\zhs@punct@inter{halfstop}} +% fullstop punctuation before other characters +\@for\zhs@class:={hanzi,fwpunct,alphanum,halfwidth}\do{%,boundary + \prependinterclasstoks{fullstop}{\zhs@class}{\mydbgmessage{^^JC1}\zhs@rightpunct@before{fullstop}} +} +\setinterclasstoks{fullstop}{closefw}{\mydbgmessage{^^Jb2}\zhs@punct@inter{fullstop}} +\setinterclasstoks{fullstop}{halfstop}{\mydbgmessage{^^JC2}\zhs@punct@inter{fullstop}} +\setinterclasstoks{fullstop}{fullstop}{\mydbgmessage{^^JC2}\zhs@punct@inter{fullstop}} +% open fullwidth punctuation before other characters +\@for\zhs@class:={hanzi,fwpunct,alphanum,halfwidth,closefw,halfstop,fullstop}\do{%,boundary + \prependinterclasstoks{openfw}{\zhs@class}{\mydbgmessage{^^Ja}\zhnobreak} +} +% close fullwidth punctuation after other characters +\@for\zhs@class:={hanzi,fwpunct,alphanum,halfwidth,boundary}\do{% + \prependinterclasstoks{\zhs@class}{closefw}{\mydbgmessage{^^Jb}\zhnobreak} +} +% halfstop punctuation after other characters +\@for\zhs@class:={hanzi,fwpunct,alphanum,halfwidth,boundary}\do{% + \prependinterclasstoks{\zhs@class}{halfstop}{\mydbgmessage{^^Jc}\zhnobreak} +} +% fullstop punctuation after other characters +\@for\zhs@class:={hanzi,fwpunct,alphanum,halfwidth,boundary}\do{% + \prependinterclasstoks{\zhs@class}{fullstop}{\mydbgmessage{^^Jc}\zhnobreak} +} +% boundary special treat +\prependinterclasstoks{boundary}{openfw}{\mydbgmessage{^^JA0}\zhs@leftpunct@after@boundary{open}} +\appendinterclasstoks{closefw}{boundary}{\mydbgmessage{^^JB0}\zhs@rightpunct@before@boundary{% + \ifnum\zhs@tmpnum = \getclassnum{closefw}% + %\getinterclasstoks{closefw}{closefw}% + \zhs@punct@inter{close}% + \else + \ifnum\zhs@tmpnum = \getclassnum{halfstop}% + %\getinterclasstoks{closefw}{halfstop}% + \zhs@punct@inter{close}% + \else + \ifnum\zhs@tmpnum = \getclassnum{fullstop}% + \zhs@punct@inter{close}% + \else + \ifnum\zhs@tmpnum = \getclassnum{openfw}% + %\getinterclasstoks{closefw}{openfw}% + \zhs@leftpunct@after@right{open}{close}% + \zhnobreak\skipnegzhlinestartopen\relax % compensate + \else + \zhs@rightpunct@before{close}% + \fi + \fi + \fi + \fi +}} +\appendinterclasstoks{halfstop}{boundary}{\mydbgmessage{^^JC0}\zhs@rightpunct@before@boundary{% + \ifnum\zhs@tmpnum = \getclassnum{closefw}% + %\getinterclasstoks{halfstop}{closefw}% + \zhs@punct@inter{halfstop}% + \else + \ifnum\zhs@tmpnum = \getclassnum{halfstop}% + %\getinterclasstoks{halfstop}{halfstop}% + \zhs@punct@inter{halfstop}% + \else + \ifnum\zhs@tmpnum = \getclassnum{fullstop}% + \zhs@punct@inter{halfstop}% + \else + \ifnum\zhs@tmpnum = \getclassnum{openfw}% + %\getinterclasstoks{halfstop}{openfw}% + \zhs@leftpunct@after@right{open}{halfstop}% + \zhnobreak\skipnegzhlinestartopen\relax % compensate + \else + \zhs@rightpunct@before{halfstop}% + \fi + \fi + \fi + \fi +}} +\appendinterclasstoks{fullstop}{boundary}{\mydbgmessage{^^JC0}\zhs@rightpunct@before@boundary{% + \ifnum\zhs@tmpnum = \getclassnum{closefw}% + \zhs@punct@inter{fullstop}% + \else + \ifnum\zhs@tmpnum = \getclassnum{halfstop}% + \zhs@punct@inter{fullstop}% + \else + \ifnum\zhs@tmpnum = \getclassnum{fullstop}% + \zhs@punct@inter{fullstop}% + \else + \ifnum\zhs@tmpnum = \getclassnum{openfw}% + \zhs@leftpunct@after@right{open}{fullstop}% + \zhnobreak\skipnegzhlinestartopen\relax % compensate + \else + \zhs@rightpunct@before{fullstop}% + \fi + \fi + \fi + \fi +}} +\appendinterclasstoks{openfw}{boundary}{\mydbgmessage{^^Ja0}\zhs@leftpunct@before@boundary{% + \ifnum\zhs@tmpnum = \getclassnum{openfw}% + %\getinterclasstoks{openfw}{openfw}% + \zhs@punct@inter{open}% + \zhnobreak\skipnegzhlinestartopen\relax % compensate + \fi +}} +% punctuation font change +\@for\zhs@class:={openfw,closefw,halfstop,fullstop,fwpunct}\do{% + \appendinterclasstoks{hanzi}{\zhs@class}{\zhpunctfont} + \appendinterclasstoks{\zhs@class}{hanzi}{\zhfont} + \appendinterclasstoks{boundary}{\zhs@class}{\zhpunctfont} + \appendinterclasstoks{halfwidth}{\zhs@class}{\zhpunctfont} +} +% CJK Ext-A/B support +\newclass[hanzi]{cjkexta} +\setclassnum{cjkexta}{8} +\newclass[hanzi]{cjkextb} +\setclassnum{cjkextb}{9} +\@for\zhs@class:={hanzi,fwpunct,openfw,closefw,halfstop,fullstop,alphanum,halfwidth,boundary}\do{% + \appendinterclasstoks{\zhs@class}{cjkexta}{\zhcjkextafont} + \appendinterclasstoks{\zhs@class}{cjkextb}{\zhcjkextbfont} + \prependinterclasstoks{cjkexta}{\zhs@class}{\zhfont} + \prependinterclasstoks{cjkextb}{\zhs@class}{\zhfont} +} +\setinterclasstoks{cjkexta}{cjkexta}{\skipzh\relax} +\setinterclasstoks{cjkexta}{cjkextb}{\zhcjkextbfont\skipzh\relax} +\setinterclasstoks{cjkextb}{cjkexta}{\zhcjkextafont\skipzh\relax} +\setinterclasstoks{cjkextb}{cjkextb}{\skipzh\relax} +{ +\newcount\n +\n="3400 \loop \ifnum\n<"4E00 \global\XeTeXcharclass\n=8 \advance\n by 1\repeat +\n="20000\loop \ifnum\n<"30000 \global\XeTeXcharclass\n=9 \advance\n by 1\repeat +} +% long fullwidth punctuations +\newclass[fwpunct]{longpunct} % … etc +\setclassnum{longpunct}{5} +\setinterclasstoks{longpunct}{longpunct}{\zhnobreak} +% derived class from halfwidth +\newclass[halfwidth]{hwpunct} % (, ., etc +\setclassnum{hwpunct}{6} + +% Font settings +\ifLaTeX@e + \RequirePackage{fontspec} + \@ifundefined{zhfont}{\newfontfamily\zhfont[BoldFont=SimHei]{SimSun}}{} + \@ifundefined{zhpunctfont}{\newfontfamily\zhpunctfont{SimSun}}{} + \@ifundefined{zhcjkextafont}{\def\zhcjkextafont{\message{CJK Ext-A}}}{} + \@ifundefined{zhcjkextbfont}{\def\zhcjkextbfont{\message{CJK Ext-B}}}{} +\else + \@ifundefined{zhfont}{\font\zhfont="SimSun" at 10pt}{} + \@ifundefined{zhpunctfont}{\font\zhpunctfont="SimSun" at 10pt}{} + \@ifundefined{zhcjkextafont}{\def\zhcjkextafont{\message{CJK Ext-A}}}{} + \@ifundefined{zhcjkextbfont}{\def\zhcjkextbfont{\message{CJK Ext-B}}}{} +\fi + +% code range utils +\newif\ifzhs@result +\newcount\zhs@tmpcnt +\def\@ifnuminrange#1#2#3#4{% #1: num, #2: range with format a->b,c->d + % #3: true block, #4: false block + \zhs@resultfalse + \@for\zhs@range:=#2\do{% + \expandafter\@ifrangecontains\expandafter[\zhs@range]{#1}{\zhs@resulttrue}{}% + }% + \ifzhs@result #3\else #4\fi +} + +\def\@ifrangecontains[#1->#2]#3#4#5{% + \ifnum#3<#1\relax + #5% + \else + \ifnum#3>#2\relax + #5% + \else + #4% + \fi + \fi +} + +\def\@fornuminrange#1:=#2\do#3{% #1: count register, #2: range + \@for\zhs@range:=#2\do{% + \expandafter\@@fornuminrange\expandafter[\zhs@range]{#1}{#3}% + }% +} +\def\@@fornuminrange[#1->#2]#3#4{% + #3=#1% + \loop + \unless\ifnum#3>#2\relax + #4\relax + \advance #3by 1% + \repeat +} + +\def\zhs@hanzirange{% data from unicodeletters.tex + "2E80->"2E99, + "2E9B->"2EF3, + "2F00->"2FD5, + "2FF0->"2FFB, + "3000->"3000, + "3003->"3004, + "3006->"3007, + "3012->"3013, + "3020->"3029, + "3030->"303A, + "303D->"303F, + "3042->"3042, + "3044->"3044, + "3046->"3046, + "3048->"3048, + "304A->"3062, + "3064->"3082, + "3084->"3084, + "3086->"3086, + "3088->"308D, + "308F->"3094, + "309F->"309F, + "30A2->"30A2, + "30A4->"30A4, + "30A6->"30A6, + "30A8->"30A8, + "30AA->"30C2, + "30C4->"30E2, + "30E4->"30E4, + "30E6->"30E6, + "30E8->"30ED, + "30EF->"30F4, + "30F7->"30FA, + "30FF->"30FF, + "3105->"312C, + "3131->"318E, + "3190->"31B7, + "31C0->"31CF, + "3200->"321E, + "3220->"3243, + "3250->"32FE, + "3300->"33FF, + "3400->"4DB5, + "4E00->"9FBB, + "A000->"A014, + "A016->"A48C, + "A490->"A4C6, + "F900->"FA2D, + "FA30->"FA6A, + "FA70->"FAD9, + "FE30->"FE34, + "FE45->"FE46, + "FE49->"FE4F, + "FE51->"FE51, + "FE58->"FE58, + "FE5F->"FE66, + "FE68->"FE68, + "FE6B->"FE6B, + "FF02->"FF03, + "FF06->"FF07, + "FF0A->"FF0B, + "FF0D->"FF0D, + "FF0F->"FF19, + "FF1C->"FF1E, + "FF20->"FF3A, + "FF3C->"FF3C, + "FF3E->"FF5A, + "FF5C->"FF5C, + "FF5E->"FF5E, + "FFE2->"FFE4, + "20000->"2A6D6, + "2F800->"2FA1D +} +\def\zhs@extarange{"3400->"4DB5} +\def\zhs@extbrange{"20000->"2FA1D} + +% set active hanzi for hooking +\def\makehanziglobalactive{% + \@fornuminrange\zhs@tmpcnt:=\zhs@hanzirange\do{% + \global\catcode\zhs@tmpcnt=\active}% +} + +\def\makehanzigloballetter{% + \@fornuminrange\zhs@tmpcnt:=\zhs@hanzirange\do{% + \global\catcode\zhs@tmpcnt=11}% +} + +\def\zhhanzihook#1{{\XeTeXinterchartokenstate=0\zhs@font #1}} + +\def\zhs@h@x#1{\ifcase#1 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or + 9\or A\or B\or C\or D\or E\or F\fi} +\def\zhs@hex#1{\if!#1!\else\ifnum#1<16 \zhs@h@x{#1}\else + \expandafter\zhs@hex\expandafter{\number\numexpr(#1-8)/16}% + \expandafter\zhs@h@x\expandafter{\number\numexpr#1-(#1-8)/16*16}\fi\fi} + +\let\zhs@font\zhfont +\def\enableactivehanzi{% + \def\zhs@@a##1{\zhs@afteralphamathskip + \expandafter\@ifrangecontains\expandafter[\zhs@extarange]{"##1}{\global + \let\zhs@font\zhcjkextafont}{\expandafter\@ifrangecontains + \expandafter[\zhs@extbrange]{"##1}{\global\let\zhs@font\zhcjkextbfont + }{\global\let\zhs@font\zhfont}}% + \zhhanzihook{\char"##1}\zhs@active@lookafter}% + \@fornuminrange\zhs@tmpcnt:=\zhs@hanzirange\do{% + \lccode`\~=\zhs@tmpcnt + \lowercase{\protected\xdef~{\noexpand\zhs@@a{\expandafter\zhs@hex + \expandafter{\number\zhs@tmpcnt}}}}% + }% +} + +\def\zhs@afteralphamathskip{% + \ifhmode + \ifnum\lastnodetype=10 % math node + \skipenzh\relax + \else\ifnum\lastnodetype=0 + \ifnum\spacefactor=999 + \skipenzh + \else\ifnum\spacefactor=1000 + \skipenzh + \fi\fi + \fi\fi + \fi +} + +{\escapechar=-1 + \xdef\zhs@active@ident{\string\zhs@@a} +} +\expandafter\def\expandafter\ifzhs@notactivehanzi\expandafter#\expandafter1% + \zhs@active@ident#2\ok{\if!#2!} +\def\zhs@active@lookafter{\futurenonspacelet\zhs@tmpchar\zhs@active@look@fter} +\def\zhs@active@look@fter{% + %\expandafter\mydbgmessage\expandafter{\meaning\zhs@tmpchar}% + \if\relax\noexpand\zhs@tmpchar % control sequence + \zhs@beforeactivehanziskip + \else + \ifcat a\noexpand\zhs@tmpchar % catcode 11 + \zhs@testskipenzh + \else + \ifcat !\noexpand\zhs@tmpchar % catcode 12 + \zhs@testskipenzh + \else + \ifcat $\noexpand\zhs@tmpchar % catcode 3 + \skipenzh\relax + \fi + \fi + \fi + \fi +} + +\def\zhs@beforeactivehanziskip{% + %\let\zhs@tmp\iffalse % for \if match + \edef\zhs@tmp{\meaning\zhs@tmpchar}% + \expandafter\expandafter\expandafter\ifzhs@notactivehanzi + \expandafter\zhs@tmp\zhs@active@ident\ok + \else + \skipzh\relax + \fi +} + +\def\zhspacing{% + \@for\zhs@char:={`:,`,,`、}\do{\XeTeXcharclass\zhs@char=4} + \@for\zhs@char:={`。,`.,`;}\do{\XeTeXcharclass\zhs@char=10} + \ifzhs@ambiwide + \@for\zhs@char:={`“,`‘}\do{\XeTeXcharclass\zhs@char=2} + \@for\zhs@char:={`”,`’}\do{\XeTeXcharclass\zhs@char=3} + \@for\zhs@char:={`—,`…}\do{\XeTeXcharclass\zhs@char=5} + \else + \@for\zhs@char:={`“,`‘,`”,`’,`—,`…}\do{\XeTeXcharclass\zhs@char=6} + \fi + \@for\zhs@char:={`\!,`\",`\',`\(,`\),`\,,`\-,`\.,`\:,`\;,`\<,`\>,`\?,`\[,`\],`\`,`\{,`\},`\\,`\/}\do{\XeTeXcharclass\zhs@char=6} + \@for\zhs@char:={`℃,`·,`$,`%}\do{\XeTeXcharclass\zhs@char=7} + % clear XeTeX pre-defined toks + \XeTeXinterchartoks 0 1 = {} + \XeTeXinterchartoks 0 2 = {} + \XeTeXinterchartoks 0 3 = {} + \XeTeXinterchartoks 1 0 = {} + \XeTeXinterchartoks 2 0 = {} + \XeTeXinterchartoks 3 0 = {} + \XeTeXinterchartoks 1 1 = {} + \XeTeXinterchartoks 1 2 = {} + \XeTeXinterchartoks 1 3 = {} + \XeTeXinterchartoks 2 1 = {} + \XeTeXinterchartoks 2 2 = {} + \XeTeXinterchartoks 2 3 = {} + \XeTeXinterchartoks 3 1 = {} + \XeTeXinterchartoks 3 2 = {} + \XeTeXinterchartoks 3 3 = {} + \registerXeTeXclasstoks + \XeTeXinterchartokenstate=1\relax + \ifLaTeX@e + \setbox0=\hbox{\normalsize\def\zhs@tmp{\kern 2em}\zhs@tmp}% + \parindent=\wd0 + \else + \parindent=2em\relax + \fi + \message{zhspacing installed.^^J} +} + +\fi diff --git a/Master/texmf-dist/tex/xetex/zhspacing/plain/zhsusefulmacros.sty b/Master/texmf-dist/tex/xetex/zhspacing/plain/zhsusefulmacros.sty new file mode 100644 index 00000000000..96b5d720e7c --- /dev/null +++ b/Master/texmf-dist/tex/xetex/zhspacing/plain/zhsusefulmacros.sty @@ -0,0 +1,97 @@ +% zhsusefulmacros.sty +% This file provides several useful LaTeX macros as well as \ifLaTeX@e, +% and \futurenonspacelet. +% Licensed under LPPL. +\catcode`\@=11 +\ifx\@usefulmacros@defined\@undefined +\def\@usefulmacros@defined{\relax} +\def\@usefulmacros@LaTeX@e{LaTeX2e} +\def\ifLaTeX@e{\ifx\fmtname\@usefulmacros@LaTeX@e} +%\ifx\LaTeX\@undefined +\ifLaTeX@e\else +\def\@nnil{\@nil}% +\def\@empty{}% +\def\@fornoop#1\@@#2#3{}% +\long\def\@for#1:=#2\do#3{% + \expandafter\def\expandafter\@fortmp\expandafter{#2}% + \ifx\@fortmp\@empty \else + \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}\fi}% +\long\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else + #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi}% +\long\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil + \expandafter\@fornoop \else + #4\relax\expandafter\@iforloop\fi#2\@@#3{#4}}% +\def\@tfor#1:={\@tf@r#1 }% +\long\def\@tf@r#1#2\do#3{\def\@fortmp{#2}\ifx\@fortmp\space\else + \@tforloop#2\@nil\@nil\@@#1{#3}\fi}% +\long\def\@tforloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil + \expandafter\@fornoop \else + #4\relax\expandafter\@tforloop\fi#2\@@#3{#4}}% +\long\def\@ifnextchar#1#2#3{% + \let\reserved@d=#1% + \def\reserved@a{#2}% + \def\reserved@b{#3}% + \futurelet\@let@token\@ifnch} +\def\@ifnch{% + \ifx\@let@token\@sptoken + \let\reserved@c\@xifnch + \else + \ifx\@let@token\reserved@d + \let\reserved@c\reserved@a + \else + \let\reserved@c\reserved@b + \fi + \fi + \reserved@c} +\def\:{\let\@sptoken= } \: % this makes \@sptoken a space token +\def\:{\@xifnch} \expandafter\def\: {\futurelet\@let@token\@ifnch} +% +\long\def\@firstoftwo#1#2{#1} +\long\def\@secondoftwo#1#2{#2} +\expandafter\ifx\csname ifcsname\endcsname\relax +\def\@ifundefined#1{% + \expandafter\ifx\csname#1\endcsname\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\else +\def\@ifundefined#1{% + \unless\ifcsname#1\endcsname + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\fi +% +\def\@namedef#1{\expandafter\def\csname #1\endcsname} +% +\fi % end if + +\def\@BTcs{} +\let\nexttoken\relax +\let\next\relax +\def\futurenonspacelet#1{\def\@BTcs{#1}% + \afterassignment\@BTfnslone\let\nexttoken= } +\def\@BTfnslone{\expandafter\futurelet\@BTcs\@BTfnsltwo} +\def\@BTfnsltwo{\expandafter\ifx\@BTcs\@sptoken\let\next=\@BTfnslthree + \else\let\next=\nexttoken\fi \next} +\def\@BTfnslthree{\afterassignment\@BTfnslone\let\next= } + +\ifx\fbox\@undefined +\newbox\fbox@tmpbox +\newdimen\fbox@linewidth +\newdimen\fbox@tmpdim +\fbox@linewidth=0.4pt +\long\def\fbox#1{% + \setbox\fbox@tmpbox=\hbox{#1}% + \fbox@tmpdim=2\fbox@linewidth + \advance\fbox@tmpdim\wd\fbox@tmpbox + \leavevmode\hbox{\vbox{\hrule height \fbox@linewidth width \fbox@tmpdim + \hbox{\vrule width \fbox@linewidth height \ht\fbox@tmpbox + #1\vrule width \fbox@linewidth height \ht\fbox@tmpbox}% + \hrule height \fbox@linewidth width \fbox@tmpdim + }}% +} +\fi +\fi |