% \iffalse
%<*internal>
\iffalse
%</internal>
%<*readme>

CJKpunct is a LaTeX package for adjust spaces around full-width punctuation.

%</readme>
%<*internal>
\fi
%</internal>
%
%<*internal>
\begingroup
%</internal>
%<*batchfile>
\input docstrip.tex
\keepsilent
\usedir{tex/latex/CJK/CJKpunct}
\preamble

 Version 4.8.1-2 (30-Aug-2008)

 This is the file CJKpunct.sty for the CJK package

 Authors:
            Linbo Zhang (zlb@lsec.cc.ac.cn)
            Wenchang Sun (sunwch@nankai.edu.cn)


\endpreamble
\askforoverwritefalse
\generate{\file{CJKpunct.sty}{\from{CJKpunct.dtx}{CJKpunct}}}
%</batchfile>
%<batchfile>\endbatchfile
%<*internal>
\generate{\file{CJKpunct.ins}{\from{CJKpunct.dtx}{batchfile}}}
\nopreamble\nopostamble
\generate{\file{README.txt}{\from{\jobname.dtx}{readme}}}
\endgroup
%</internal>
%
%<*driver>
\documentclass[12pt]{ltxdoc}
\usepackage{xcolor}
\usepackage[bookmarks=true,CJKbookmarks,bookmarksopen=true,dvipdfm,pdfstartview=FitH]{hyperref}
\usepackage{CJK}
\usepackage{CJKspace}
\usepackage{CJKpunct}
\textheight 210mm
\textwidth 150mm
\oddsidemargin 0pt
\evensidemargin 0pt

% macros
{\catcode`\|=0 \catcode`\\=12
 |gdef|bslash{\}}

\newcommand{\defmacro}[1]{%                   % Define a macro.
 \textcolor{macrocolor}{$\backslash$#1}\index{\string\verb+\bslash#1+}%
}

\newcommand{\usemacro}[1]{%                   % Define a macro.
  \textcolor{macrocolor}{\string#1}%
  #1\index{\string\verb+\string#1+}%
}

\definecolor{parametercolor}{rgb}{1,0,1}
\definecolor{optioncolor}{rgb}{0,0,1}
\definecolor{macrocolor}{rgb}{0,0,0.63}

\newcommand{\usepmacro}[3][]{%
  \edef\tempa{#1}%
  \textcolor{macrocolor}{\string#2}%
  \string{\textcolor{parametercolor}{#3}\string}%
  \ifx\tempa\@empty\else (#1)\fi%
  #2{#3}\index{\string\verb+\string#2+}%
}

\newenvironment{decl}[1][]%
    {\par\small\addvspace{4.5ex plus 1ex}%
     \vskip -\parskip
     \ifx\relax#1\relax
        \def\@decl@date{}%
     \else
        \def\@decl@date{\NEWfeature{#1}}%
     \fi
     \noindent\hspace{-\leftmargini}%
     \begin{tabular}{|l|}\hline\ignorespaces}%
    {\\\hline\end{tabular}\nobreak\@decl@date\par\nobreak
     \vspace{2.3ex}\vskip -\parskip}

\renewcommand{\arg}[1]{{\tt\string{}\m{#1}{\tt\string}}}
\newcommand{\m}[1]{\mbox{\color{parametercolor}$\langle$\it #1\/$\rangle$}}

\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
\begin{CJK*}{GB}{gbsn}
  \DocInput{CJKpunct.dtx}
  \makeatletter
  \c@IndexColumns = 2
  \PrintIndex
  \newpage
\end{CJK*}
\end{document}
%</driver>
%
%<*CJKpunct>
\def\fileversion{4.8.1-2}
\def\filedate{2008/08/30}
\ProvidesPackage{CJKpunct}[\filedate\space\fileversion]
%</CJKpunct>
%
% \fi
%
% \makeatletter                         ^^A% To document @-cmds
% \errorcontextlines=999                ^^A% Show up all my mistakes
%
% \GetFileInfo{CJKpunct.sty}
%
% \title{CJKpunct  使用说明}
% \author{张林波 \quad 孙文昌}
% \date{2008 年 8 月 12 日}
% \maketitle
%
%
% \def\CJKpunct{{\textcolor{blue}{\texttt{CJKpunct}}}}
% \CJKpunct\ 是一个 \LaTeX\ 宏包， 用于排版中文标点，提供多种标点样式，以实现行末对齐、
% 标点挤压等效果。 其基本方法来自 CCT。
% \section{调用方式}
% \parindent 2em
% \parskip 5pt
% \begin{decl}
%   \defmacro{usepackage}\{\textcolor{parametercolor}{CJKpunct}\}
% \end{decl}
%
% \section{常用宏命令}
% \begin{decl}
%  \defmacro{punctstyle}\arg{punct style}
% \end{decl}
%
% 设置标点格式，有效值分别为
%
% \begin{tabular}{ll}
%   punct style & \\
%   \textcolor{parametercolor}{banjiao}       & 半角式 \\
%   \textcolor{parametercolor}{quanjiao}     & 全角式\\
%   \textcolor{parametercolor}{kaiming}      & 开明式\\
%   \textcolor{parametercolor}{hangmobanjiao}& 行末半角式\\
%   \textcolor{parametercolor}{CCT}          &    CCT 格式\\
%   \textcolor{parametercolor}{plain}          &   CJK 缺省格式
% \end{tabular}
%
%
% 注意：为了得到最好的排版效果，需要制作字体相关的 CJKpunct.spa 文件。请参考
% source/README.txt
%
%
% \begin{decl}
%   \defmacro{CJKpunctallowbreakbetweenpuncts} \\
%   \defmacro{CJKpunctnobreakbetweenpuncts}
% \end{decl}
%
% 缺省状态下，\CJKpunct\ 禁止在相邻的标点间换行（行末半角和 CJK 缺省格式除外）。 使用
%
% \defmacro{CJKpunctallowbreakbetweenpuncts}\newline
% 改变这一设置。注意：行末半角和 CJK 缺省格式总是允许相邻标点间换行。
%
% \begin{decl}
%  \defmacro{CJKpunctsetkern}\arg{标点1}\arg{标点2}\arg{间距}
% \end{decl}
%
%    设置标点 1 与标点 2 之间的距离。 例如，\defmacro{CJKpunctsetkern}\{：\}\{“\}\{0.4em\}
%
% \begin{decl}
%  \defmacro{CJKpunctmapfamily}\arg{font encoding}\arg{font family}\arg{font series}\arg{font shape}
%    \arg{punct family}
% \end{decl}
%
%  缺省状态下， \CJKpunct\ 根据 CJKfamily 确定当前标点符号的实际字体。 但这对C19com等组合字体
%  不适用。此命令提供一个解决方案：用户可以指定 \arg{font encoding}/ \arg{font family}/
% \arg{font series}/ \arg{font shape} 所对应的标点符号字体。例如，对于C19rm, 可以做如下设置：
%
% \begin{verbatim}
%   \CJKpunctmapfamily{C19}{rm}{m}{n}{song}
%   \CJKpunctmapfamily{C19}{rm}{bx}{n}{hei}
%   \CJKpunctmapfamily{C19}{rm}{m}{sl}{song}
%   \CJKpunctmapfamily{C19}{rm}{bx}{sl}{hei}
%   \CJKpunctmapfamily{C19}{rm}{m}{it}{kai}
%   \CJKpunctmapfamily{C19}{rm}{bx}{it}{kai}
% \end{verbatim}
%
% \section{制作 CJKpunct.spa 文件}
%
%  文件 CJKpunct.spa 保存了字体相关的标点符号宽度。制作方法请参考 source/REAME.txt
% \StopEventually{}
%
%
% \clearpage
% \part{CJKpunct.sty}
%
%
% \iffalse
%<*CJKpunct>
% \fi
% \fontsize{10pt}{10pt}\selectfont
% CJKpunct
%    \begin{macrocode}
\endlinechar \m@ne

\newif\if@CJKpunct
\newif\if@CJKpunct@dokerning
\newcount\CJKpunct@cnta
\newcount\CJKpunct@cntb
\newcount\CJKpunct@cntc
\newcount\CJKpunct@cntd
\newcount\CJKpunct@cnte
%    \end{macrocode}
%
% 为使 \CJKpunct\ 起作用，重定义一些 CJK 宏。
%
%    \begin{macrocode}
\let\CJKo@testLastCJK\CJK@testLastCJK
\def\CJKpunct@testLastCJK{
  \global\CJK@false
  \global\edef\CJKpunct@lastkern{\number\lastkern}}

\let\CJKo@testLastKern\CJK@testLastKern
\def\CJKpunct@testLastKern{
  \global\CJK@false}

\let\CJKo@testPrePunct\CJK@testPrePunct
\let\CJKo@testPostPunct\CJK@testPostPunct
\def\CJKpunct@testPrePunct#1#2#3{}
\def\CJKpunct@testPostPunct#1#2#3{}


\let\CJKo@nobreakglue\CJK@nobreakglue
\let\CJKoglue\CJKglue
%    \end{macrocode}
%
%  \defmacro{CJKsymbol} 的定义中需要三重括号以保证兼容 CJKfntef 宏包。
%
%    \begin{macrocode}

\let\CJKosymbol\CJKsymbol
\def\CJKpunct@CJKsymbol#1{
  {{{
  \ifnum\CJKpunct@lastkern>0\relax
    \ifnum\CJKpunct@lastcharclass=0\relax
      \CJKoglue
    \else
      \CJKpunct@ULspecials
    \fi
  \fi
  \CJKosymbol{#1}
  \gdef\CJKpunct@lastcharclass{0}}}}}

\def\CJKpunct@lastcharclass{0}
\def\CJKpunct@lastkern{0}
%    \end{macrocode}
%
%  标点符号的排版规则：
%
%    \begin{macrocode}
\let\CJKopunctsymbol\CJKpunctsymbol
\def\CJKpunct@CJKpunctsymbol#1{
  \CJKpunct@setfamily
  \CJKpunct@setmarginkerning
  \edef\CJKpunct@currentpunct{\CJK@plane/\the#1}
  \ifcsname CJKpunct@\CJK@enc @\CJKpunct@currentpunct\endcsname
    \edef\CJKpunct@currentcharclass{
      \csname CJKpunct@\CJK@enc @\CJKpunct@currentpunct\endcsname}
    {{{%  We need three braces for CJKulem to work
    \@CJKpunctfalse
    \ifnum\CJKpunct@lastkern>0\relax
      \ifnum\CJKpunct@lastcharclass>0\relax
        \unkern
        \unkern
        \ifnum\CJKpunct@punctstyle>0\relax
          \@CJKpuncttrue
        \else
          \ifcsname CJKpunct@specialpunct\CJK@enc \CJKpunct@currentpunct\endcsname
            \@CJKpuncttrue
          \fi
        \fi
      \fi
    \fi
    \if@CJKpunct
      \CJKpunct@unskip
      \CJKpunct@setkern{\CJKpunct@lastpunct}{\CJKpunct@currentpunct}
      \kern \csname CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family
        @kern\CJKpunct@lastpunct @\CJKpunct@currentpunct\endcsname
      \CJKpunct@nobreak
    \else
      \CJKpunct@ULspecials
      \ifnum\CJKpunct@currentcharclass=1\relax
        \hskip \csname CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family
          @lglue@\CJKpunct@currentpunct\endcsname  plus 0.1em minus 0.1 em
      \else
        \ifcsname CJKpunct@specialpunct\CJK@enc \CJKpunct@currentpunct\endcsname
          \CJKoglue  % breakable
        \else
          \nobreak
        \fi
      \fi
    \fi
    \global\edef\CJKpunct@lastpunct{\CJKpunct@currentpunct}

    \vrule width \csname CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family
      @lrule@\CJKpunct@currentpunct\endcsname depth \z@ height \z@

    \CJKopunctsymbol{#1}
    \vrule width \csname CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family
      @rrule@\CJKpunct@currentpunct\endcsname depth \z@ height \z@

    \ifnum\CJKpunct@currentcharclass=2\relax
      \hskip \csname CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family
        @rglue@\CJKpunct@currentpunct\endcsname  plus 0.1em minus 0.1 em
    \fi
    \global\let\CJKpunct@lastcharclass\CJKpunct@currentcharclass}}}
  \else
    \CJKsymbol{#1}
    \global\def\CJKpunct@lastcharclass{0}
  \fi}
%    \end{macrocode}
%
% 设置当前 font family.
%
%    \begin{macrocode}
\def\CJKpunct@setfamily{
  \ifcsname \CJK@enc @\CJK@family @\f@series @\f@shape\endcsname
    \global\edef\CJKpunct@family{\csname \CJK@enc @\CJK@family @\f@series @\f@shape\endcsname}
  \else
    \edef\CJKpunct@family{\CJK@family}
  \fi}

\def\CJKpunctmapfamily#1#2#3#4#5{
  \expandafter\edef\csname #1@#2@#3@#4\endcsname{#5}}

\CJKpunctmapfamily{C19}{rm}{m}{n}{song}
\CJKpunctmapfamily{C19}{rm}{bx}{n}{hei}
\CJKpunctmapfamily{C19}{rm}{m}{sl}{song}
\CJKpunctmapfamily{C19}{rm}{bx}{sl}{hei}
\CJKpunctmapfamily{C19}{rm}{m}{it}{kai}
\CJKpunctmapfamily{C19}{rm}{bx}{it}{kai}

\CJKpunctmapfamily{C19}{com}{m}{n}{song}
\CJKpunctmapfamily{C19}{com}{bx}{n}{hei}
\CJKpunctmapfamily{C19}{com}{m}{sl}{kai}
\CJKpunctmapfamily{C19}{com}{bx}{sl}{kai}
\CJKpunctmapfamily{C19}{com}{m}{it}{kai}
\CJKpunctmapfamily{C19}{com}{bx}{it}{kai}

\CJKpunctmapfamily{C19}{sf}{m}{n}{you}
\CJKpunctmapfamily{C19}{sf}{bx}{n}{you}
\CJKpunctmapfamily{C19}{sf}{m}{sl}{you}
\CJKpunctmapfamily{C19}{sf}{bx}{sl}{you}
\CJKpunctmapfamily{C19}{sf}{m}{it}{you}
\CJKpunctmapfamily{C19}{sf}{bx}{it}{you}

\CJKpunctmapfamily{C19}{tt}{m}{n}{fs}
\CJKpunctmapfamily{C19}{tt}{bx}{n}{fs}
\CJKpunctmapfamily{C19}{tt}{m}{sl}{fs}
\CJKpunctmapfamily{C19}{tt}{bx}{sl}{fs}
\CJKpunctmapfamily{C19}{tt}{m}{it}{fs}
\CJKpunctmapfamily{C19}{tt}{bx}{it}{fs}
%    \end{macrocode}
%
%  CJK 缺省标点符号格式
%
%    \begin{macrocode}
\def\CJKpunct@plainpunctsymbol#1#2{
  \CJKpunctsymbol{#2}}
%    \end{macrocode}
%
% 设置标点符号边界宽度。
%
%    \begin{macrocode}
\def\CJKpunct@setmarginkerning{
  \ifcsname CJKpunct @\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family\endcsname
  \else
    \expandafter\gdef\csname CJKpunct @\CJKpunct@punctstyle @\CJK@enc
      @\CJKpunct@family\endcsname{}
    \ifcsname CJKpunct@\CJKpunct@family @spaces\endcsname
      \PackageInfo{CJKpunct}{use punctuation spaces for family '\CJKpunct@family'
        \space with punctstyle (\CJKpunct@currentpunctstyle)}\relax
      \edef\CJKpunct@spaces{\csname CJKpunct@\CJKpunct@family @spaces\endcsname}
    \else
      \ifcsname CJKpunct@spaces@\CJKpunct@family\endcsname
      \else
        \PackageInfo{CJKpunct}{punctuation spaces for family '\CJKpunct@family' do not exist.
          \space Use family 'def' instead.}\relax
         \global\expandafter\def\csname CJKpunct@spaces@\CJKpunct@family\endcsname{}
      \fi
      \edef\CJKpunct@spaces{\csname CJKpunct@def@spaces\endcsname}
    \fi
    \CJKpunct@cnta=0\relax
    \expandafter\CJKpunct@@setmarginkerning\CJKpunct@spaces
  \fi}

\def\CJKpunct@@setmarginkerning#1,#2,{
  \edef\CJKpunct@temp{#1}
  \ifx\CJKpunct@temp\@empty
    \def\CJKpunct@temp{}
  \else
    \def\CJKpunct@temp{\CJKpunct@@setmarginkerning}
    \ifnum\CJKpunct@cnta<12
      \def\CJKpunct@lr{l}
    \else
      \def\CJKpunct@lr{r}
    \fi
    \edef\CJKpunct@encpn{\csname CJKpunct@pn@\CJK@enc @\the\CJKpunct@cnta\endcsname}
    \if l\CJKpunct@lr
      \expandafter\gdef\csname CJKpunct@\CJK@enc @\CJKpunct@encpn\endcsname{1}
    \else
      \expandafter\gdef\csname CJKpunct@\CJK@enc @\CJKpunct@encpn\endcsname{2}
    \fi

    \@CJKpunct@dokerningtrue
    \ifnum\CJKpunct@punctstyle=\CJKpunct@ps@plain\relax
      \@CJKpunct@dokerningfalse
    \else
      \ifcsname CJKpunct@specialpunct\CJK@enc\CJKpunct@encpn\endcsname
        \@CJKpunct@dokerningfalse
      \fi
    \fi

    \ifnum\CJKpunct@punctstyle=\CJKpunct@ps@banjiao
      \def\CJKpunct@sidespaces{12}
    \else
      \def\CJKpunct@sidespaces{15}
    \fi

    \ifnum\CJKpunct@cnta=12\relax
      {\CJKpunct@cntb=#1\relax
      \advance\CJKpunct@cntb #2\relax
      \advance\CJKpunct@cntb 2\relax
      \CJKpunct@numtostring{\CJKpunct@cntb}
      \edef\CJKpunct@temp{\csname CJKpunct@pn@\CJK@enc @12\endcsname}
      \CJKpunct@cntc=0\relax
      \loop
        \global\expandafter\edef\csname CJKpunct\CJKpunct@punctstyle
          @\CJK@enc @\CJKpunct@family @kern\CJKpunct@temp @\CJKpunct@temp\endcsname{
            -0.\CJKpunct@decimal em}
        \advance \CJKpunct@cntc 1\relax
      \ifnum\CJKpunct@cntc<6\repeat}
    \fi
    \if@CJKpunct@dokerning
      \CJKpunct@cntb=#1\relax
      \advance\CJKpunct@cntb -\CJKpunct@sidespaces\relax
      \ifnum\CJKpunct@cntb<0\relax
        \CJKpunct@cntb=0\relax
      \fi
      \CJKpunct@cntc=#2\relax
      \advance\CJKpunct@cntc -\CJKpunct@sidespaces\relax
      \ifnum\CJKpunct@cntc<0\relax
        \CJKpunct@cntc=0\relax
      \fi

      \CJKpunct@cntd=\CJKpunct@cntb
      \advance\CJKpunct@cntd\CJKpunct@cntc\relax

      \ifcase\CJKpunct@punctstyle
          % hangmobanjiao
      \or % quanjiao
      \or % banjiao
        \advance\CJKpunct@cntd -50\relax
      \or % kaiming
        \ifcsname CJKpunct@kaiming\CJK@enc\CJKpunct@encpn\endcsname
        \else
          \advance\CJKpunct@cntd -50\relax
        \fi
      \or %CCT
        \advance\CJKpunct@cntd -20\relax
      \fi
      \CJKpunct@cnte=\CJKpunct@cntd
      \ifnum\CJKpunct@cntd<0\relax
        \CJKpunct@cntd=0\relax
      \fi
    \else
      \CJKpunct@cntb=0\relax
      \CJKpunct@cntc=0\relax
      \CJKpunct@cntd=0\relax
      \CJKpunct@cnte=0\relax
    \fi
    \CJKpunct@numtostring{\CJKpunct@cntb}
    \global\expandafter\edef\csname CJKpunct\CJKpunct@punctstyle
      @\CJK@enc @\CJKpunct@family @lrule@\CJKpunct@encpn\endcsname{
        -0.\CJKpunct@decimal em}
    \CJKpunct@numtostring{\CJKpunct@cntc}
    \global\expandafter\edef\csname CJKpunct\CJKpunct@punctstyle
      @\CJK@enc @\CJKpunct@family @rrule@\CJKpunct@encpn\endcsname{
        -0.\CJKpunct@decimal em}
    \CJKpunct@numtostring{\CJKpunct@cntd}
    \global\expandafter\edef\csname CJKpunct\CJKpunct@punctstyle
      @\CJK@enc @\CJKpunct@family @\CJKpunct@lr glue@\CJKpunct@encpn\endcsname{
        0.\CJKpunct@decimal em}
    \global\expandafter\edef\csname CJKpunct\CJKpunct@punctstyle
      @\CJK@enc @\CJKpunct@family @\CJKpunct@lr oglue@\CJKpunct@encpn\endcsname{
        \the\CJKpunct@cnte}
  \fi
  \advance \CJKpunct@cnta 1\relax
  \CJKpunct@temp}

\def\CJKpunct@numtostring#1{
  \edef\CJKpunct@decimal{\the#1}
  \ifnum\CJKpunct@decimal<10\relax
    \edef\CJKpunct@decimal{0\CJKpunct@decimal}
  \fi}
%    \end{macrocode}
%
%  设置相邻标点之间的距离
%
%    \begin{macrocode}
\def\CJKpunct@setkern#1#2{
  \ifcsname CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family @kern#1@#2\endcsname
  \else
    \CJKpunct@cnta=0\relax
    \ifcsname CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family @roglue@#1\endcsname
      \advance\CJKpunct@cnta\csname
        CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family @roglue@#1\endcsname
    \fi
    \ifcsname CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family @loglue@#2\endcsname
      \advance\CJKpunct@cnta\csname CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family
        @loglue@#2\endcsname
    \fi
    \relax
    \ifcase\CJKpunct@punctstyle
        % hangmobanjiao
    \or % quanjiao
      \advance\CJKpunct@cnta -50\relax
    \or % banjiao
    \or % kaiming
      \ifcsname CJKpunct@kaiming#1\endcsname
        \ifcsname CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family @loglue@#2\endcsname
          \advance\CJKpunct@cnta -50\relax
        \fi
      \fi
    \fi
    \ifnum\CJKpunct@cnta<0\relax
      \CJKpunct@cnta=0\relax
    \fi
    \CJKpunct@numtostring{\CJKpunct@cnta}
    \global\expandafter\edef\csname
      CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family @kern#1@#2\endcsname{
        0.\CJKpunct@decimal em}
  \fi}
%    \end{macrocode}
%
% CJKfntef 宏包兼容命令：
%
%    \begin{macrocode}

\let\CJKpunct@unskip\unskip
\def\CJKpunct@UL@unskip{
  \ifcsname CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family
    @rglue@\CJKpunct@lastpunct\endcsname
    \hskip -\csname CJKpunct\CJKpunct@punctstyle @\CJK@enc @\CJKpunct@family
      @rglue@\CJKpunct@lastpunct\endcsname \relax
  \fi}

\@ifundefined{UL@hskip}{\let\UL@hskip\relax}{}

\def\CJKpunct@punctUL@group{
  \ifx\hskip\UL@hskip
      \egroup
      \UL@stop
      \UL@start
      \bgroup
  \fi}

\def\CJKpunct@ULspecials{}

\AtBeginDocument{
  \ifcsname UL@hook\endcsname
    \addto@hook\UL@hook{\let\CJK@ignorespaces\ignorespaces
       \let\CJKpunct@unskip\CJKpunct@UL@unskip
       \let\CJKpunct@ULspecials\CJKpunct@punctUL@group}
  \fi}
%    \end{macrocode}
%
%  设置相邻标点间是否允许换行（缺省不允许）。
%
%    \begin{macrocode}
\def\CJKpunctallowbreakbetweenpuncts{
  \def\CJKpunct@nobreak{
    \ifnum\CJKpunct@lastcharclass=2
      \hskip 0pt
    \fi}}

\def\CJKpunctnobreakbetweenpuncts{
  \let\CJKpunct@nobreak\nobreak}
\CJKpunctnobreakbetweenpuncts
%    \end{macrocode}
%
% 标点符号样式：
%
%    \begin{macrocode}
\def\CJKpunctstyle#1{
  \ifcsname CJKpunct@ps@#1\endcsname
    \edef\CJKpunct@currentpunctstyle{#1}
    \edef\CJKpunct@punctstyle{\csname CJKpunct@ps@#1\endcsname}
    \ifnum\CJKpunct@punctstyle=\CJKpunct@ps@plain\relax
      \CJKpunctallowbreakbetweenpuncts
      \let\CJK@testLastCJK\CJKo@testLastCJK
      \let\CJK@testLastKern\CJKo@testLastKern
      \let\CJK@testPrePunct\CJKo@testPrePunct
      \let\CJK@testPostPunct\CJKo@testPostPunct
      \let\CJKpunct@punctsymbol\CJKpunct@plainpunctsymbol
      \let\CJKsymbol\CJKosymbol
      \let\CJKpunctsymbol\CJKopunctsymbol
      \let\CJKglue\CJKoglue
      \let\CJK@nobreakglue\CJKo@nobreakglue
      \let\CJKpunct@utfsymbol\CJKpunct@utfbsymbol
    \else
      \let\CJK@testLastCJK\CJKpunct@testLastCJK
      \let\CJK@testLastKern\CJKpunct@testLastKern
      \let\CJK@testPrePunct\CJKpunct@testPrePunct
      \let\CJK@testPostPunct\CJKpunct@testPostPunct
      \let\CJKpunct@punctsymbol\CJKpunct@@punctsymbol
      \let\CJKsymbol\CJKpunct@CJKsymbol
      \let\CJKpunctsymbol\CJKpunct@CJKpunctsymbol
      \let\CJKglue\relax
      \let\CJK@nobreakglue\relax
      \let\CJKpunct@utfsymbol\CJKpunct@utfasymbol
    \fi
  \else
    \PackageWarning{CJKpunct}{Punctstyle #1\space is not defined.}\relax
  \fi}

\let\punctstyle\CJKpunctstyle
\def\CJKpunct@ps@hangmobanjiao{0}
\def\CJKpunct@ps@marginkerning{0}
\def\CJKpunct@ps@quanjiao{1}
\def\CJKpunct@ps@fullwidth{1}
\def\CJKpunct@ps@banjiao{2}
\def\CJKpunct@ps@halfwidth{2}
\def\CJKpunct@ps@kaiming{3}
\def\CJKpunct@ps@mixedwidth{3}
\def\CJKpunct@ps@CCT{4}
\def\CJKpunct@ps@plain{5}
\AtBeginDocument{\punctstyle{quanjiao}}

\def\CJKplainout{\punctstyle{plain}}
\let\CJKnormalout\relax
%    \end{macrocode}
%
% 允许用户使用 \defmacro{CJKpunctsetkern} 调整相邻标点之间的距离
%
%    \begin{macrocode}
\def\CJKpunctsetkern#1#2#3{
  \CJKpunct@setplanenumber{#1}
  \edef\CJKpunct@pna{\CJKpunct@char@pn}
  \CJKpunct@setplanenumber{#2}
  \edef\CJKpunct@pnb{\CJKpunct@char@pn}
  \global\expandafter\edef\csname CJKpunct\CJKpunct@punctstyle
     @\CJK@enc @\CJKpunct@family @kern\CJKpunct@pna @\CJKpunct@pnb\endcsname{
       #3}}

\def\CJKpunct@setplanenumber#1{{
  \def\CJK@testPrePunct##1##2##3{
    \global\edef\CJKpunct@charplane{\CJK@plane}
    \global\edef\CJKpunct@charnumber{\the\@tempcnta}}
  \savebox\voidb@x{#1}
  \global\edef\CJKpunct@char@pn{\CJKpunct@charplane/\CJKpunct@charnumber}}}

%
% 标点符号表, 不能改变顺序!!
% pre ‘“「『〔（［｛〈《〖【
% post  —…、。，．：；！？％〕）］｝〉》〗】’”」』
%    \end{macrocode}
%
%  设置标点符号所对应 CJKplane 和 字符序号， 与编码有关。
%
%    \begin{macrocode}
\def\CJKpunct@punctlist#1{
  \CJKpunct@cnta=0\relax
  \def\CJKpunct@enc{#1}
  \CJKpunct@setpunctfamilynumber}

\def\CJKpunct@setpunctfamilynumber#1,{
  \edef\CJKpunct@temp{#1}
  \ifx\CJKpunct@temp\@empty
    \def\CJKpunct@temp{}
  \else
    \expandafter\def\csname CJKpunct@pn@\CJKpunct@enc @\the\CJKpunct@cnta\endcsname{#1}
    \advance \CJKpunct@cnta 1\relax
    \def\CJKpunct@temp{\CJKpunct@setpunctfamilynumber}
  \fi
  \CJKpunct@temp}

\CJKpunct@punctlist{C70}20/24,20/28,30/12,30/14,30/20,ff/8,ff/59,ff/91,%
30/8,30/10,30/22,30/16,%
20/20,20/38,30/1,30/2,ff/12,ff/14,ff/26,ff/27,ff/1,ff/31,ff/5,30/21,ff/9,%
ff/61,ff/93,30/9,30/11,30/23,30/17,20/25,20/29,30/13,30/15,,

%gb
\CJKpunct@punctlist{C10}01/13,01/15,01/23,01/25,01/17,01/195,01/246,02/22,01/19,%
01/21,01/27,01/29,%
01/9,01/12,01/1,01/2,01/199,01/201,01/213,01/214,01/188,01/218,01/192,01/18,%
01/196,01/248,02/24,01/20,01/22,01/28,01/30,01/14,01/16,01/24,01/26,,

%gbk
\CJKpunct@punctlist{C19}25/45,25/47,25/55,25/57,25/49,26/163,26/214,26/246,25/51,%
25/53,25/59,25/61,%
25/41,25/44,25/33,25/34,26/167,26/169,26/181,26/182,26/156,26/186,26/160,%
25/50,26/164,26/216,26/248,25/52,25/54,25/60,25/62,25/46,25/48,25/56,25/58,,

\def\CJKpunct@totalpuncts{35}
%    \end{macrocode}
%
% 恢复 CJKutf8 重定义的引号
%
%    \begin{macrocode}
\ifcsname DeclareUnicodeCharacter\endcsname
  \DeclareUnicodeCharacter{2018}{\CJKpunct@utfsymbol{"80}{"98}}
  \DeclareUnicodeCharacter{2019}{\CJKpunct@utfsymbol{"80}{"99}}
  \DeclareUnicodeCharacter{201C}{\CJKpunct@utfsymbol{"80}{"9C}}
  \DeclareUnicodeCharacter{201D}{\CJKpunct@utfsymbol{"80}{"9D}}
  \DeclareUnicodeCharacter{2014}{\CJKpunct@utfsymbol{"80}{"94}}
  \DeclareUnicodeCharacter{2026}{\CJKpunct@utfsymbol{"80}{"A6}}
\fi
\def\CJKpunct@utfasymbol#1#2{
  \CJK@punctchar{\CJK@uniPunct}{0}{#1}{#2}}
\def\CJKpunct@utfbsymbol#1#2{
  \ifnum #2=148
    \textemdash
  \else
    \ifnum #2=166
      \textellipsis
    \else
      \ifnum #2=152
        \textquoteleft
      \else
        \ifnum #2=153
          \textquoteright
        \else
          \ifnum #2=156
            \textquotedblleft
          \else
            \ifnum #2=157
              \textquotedblright
            \fi
          \fi
        \fi
      \fi
    \fi
  \fi}
%    \end{macrocode}
%
% 省略号和破折号：
%
%    \begin{macrocode}
\def\CJKpunct@setspecialpunct#1#2{
  \expandafter\def\csname CJKpunct@specialpunct#1#2\endcsname{}}
\CJKpunct@setspecialpunct{C70}{20/20}
\CJKpunct@setspecialpunct{C70}{20/38}
\CJKpunct@setspecialpunct{C19}{25/41}
\CJKpunct@setspecialpunct{C19}{25/44}
\CJKpunct@setspecialpunct{C10}{01/9}
\CJKpunct@setspecialpunct{C10}{01/12}
%    \end{macrocode}
%
%  开明式中的全角标点。
%
%    \begin{macrocode}
\def\CJKpunct@setkaimingpunct#1#2{
  \expandafter\def\csname CJKpunct@kaiming#1#2\endcsname{}}
\CJKpunct@setkaimingpunct{C70}{30/02}
\CJKpunct@setkaimingpunct{C70}{ff/1}
\CJKpunct@setkaimingpunct{C70}{ff/31}
\CJKpunct@setkaimingpunct{C19}{25/34}
\CJKpunct@setkaimingpunct{C19}{26/156}
\CJKpunct@setkaimingpunct{C19}{26/186}
\CJKpunct@setkaimingpunct{C10}{01/2}
\CJKpunct@setkaimingpunct{C10}{01/188}
\CJKpunct@setkaimingpunct{C10}{01/218}
%    \end{macrocode}
%
% 缺省标点符号宽度
%
%    \begin{macrocode}
\def\CJKpunct@def@spaces{69,18,60,6,63,2,63,3,69,8,69,6,69,1,39,%
37,63,4,56,2,63,5,63,6,6,6,12,11,23,50,24,54,16,71,20,69,12,76,13,%
74,26,61,3,50,3,4,8,69,6,69,2,69,38,39,4,62,2,55,5,62,7,62,16,71,9,%
58,3,62,3,62,,,}
%    \end{macrocode}

%
% 调入字体相关的设置
%
%    \begin{macrocode}
\IfFileExists{CJKpunct.spa}{\input{CJKpunct.spa}}{}

\endlinechar `\^^M
%    \end{macrocode}
%
%
%
% \iffalse
%</CJKpunct>
% \fi


%
% \Finale
%
% \typeout{*************************************************************}
% \typeout{*}
% \typeout{* To finish the installation you have to move the following}
% \typeout{* files into a directory searched by LaTeX:}
% \typeout{*}
% \typeout{* \space\space\space  CJKpunct.sty}
% \typeout{*}
% \typeout{*************************************************************}
% \Finale
\endinput
