summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/ctex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2015-06-30 21:26:14 +0000
committerKarl Berry <karl@freefriends.org>2015-06-30 21:26:14 +0000
commitaaec8ff3cf7236ae9429a6d9238b1838af2441d6 (patch)
tree7d00cf0ec8459200ac8e721eed28d09e155012c9 /Master/texmf-dist/source/latex/ctex
parent56e4ae7a5ecbbf9bf7b858d20cb0c3e0d21edc8a (diff)
ctex (30jun15)
git-svn-id: svn://tug.org/texlive/trunk@37720 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/ctex')
-rw-r--r--Master/texmf-dist/source/latex/ctex/ctex.dtx2332
1 files changed, 1514 insertions, 818 deletions
diff --git a/Master/texmf-dist/source/latex/ctex/ctex.dtx b/Master/texmf-dist/source/latex/ctex/ctex.dtx
index b635785a8d9..353a630cdd8 100644
--- a/Master/texmf-dist/source/latex/ctex/ctex.dtx
+++ b/Master/texmf-dist/source/latex/ctex/ctex.dtx
@@ -55,12 +55,14 @@ This package consists of the file ctex.dtx, and the derived files
ctex.pdf,
ctex.ins,
ctex.sty,
- ctexcap.sty,
ctexsize.sty,
ctexheading.sty,
ctexart.cls,
ctexbook.cls,
ctexrep.cls,
+ ctexcap.sty,
+ ctexhook.sty,
+ ctexpatch.sty,
ctex-c5size.clo,
ctex-cs4size.clo,
ctex-article.def,
@@ -191,12 +193,14 @@ This package consists of the file ctex.dtx, and the derived files
and the derived files ctex.pdf,
ctex.ins,
ctex.sty,
- ctexcap.sty,
ctexsize.sty,
ctexheading.sty,
ctexart.cls,
ctexbook.cls,
ctexrep.cls,
+ ctexcap.sty,
+ ctexhook.sty,
+ ctexpatch.sty,
ctex-c5size.clo,
ctex-cs4size.clo,
ctex-article.def,
@@ -251,13 +255,15 @@ This package consists of the file ctex.dtx, and the derived files
{
\usedir{tex/latex/ctex}
\file{ctex.sty} {\from{\jobname.dtx}{style,ctex}}
- \file{ctexcap.sty} {\from{\jobname.dtx}{ctexcap}}
\file{ctexsize.sty} {\from{\jobname.dtx}{style,ctexsize}}
\file{ctexheading.sty} {\from{\jobname.dtx}{style,ctexheading}}
\file{ctexart.cls} {\from{\jobname.dtx}{class,article}}
\file{ctexbook.cls} {\from{\jobname.dtx}{class,book}}
\file{ctexrep.cls} {\from{\jobname.dtx}{class,report}}
\usepostamble\emptypostamble
+ \file{ctexcap.sty} {\from{\jobname.dtx}{ctexcap}}
+ \file{ctexhook.sty} {\from{\jobname.dtx}{ctexhook}}
+ \file{ctexpatch.sty} {\from{\jobname.dtx}{ctexpatch}}
\file{ctex-c5size.clo} {\from{\jobname.dtx}{c5size}}
\file{ctex-cs4size.clo} {\from{\jobname.dtx}{cs4size}}
\file{ctex-article.def} {\from{\jobname.dtx}{heading,article}}
@@ -321,12 +327,14 @@ This package consists of the file ctex.dtx, and the derived files
\Msg{* The recommended directory is TDS:tex/latex/ctex *}
\Msg{* *}
\Msg{* ctex.sty *}
-\Msg{* ctexcap.sty *}
\Msg{* ctexsize.sty *}
\Msg{* ctexheading.sty *}
\Msg{* ctexart.cls *}
\Msg{* ctexbook.cls *}
\Msg{* ctexrep.cls *}
+\Msg{* ctexcap.sty *}
+\Msg{* ctexhook.sty *}
+\Msg{* ctexpatch.sty *}
\Msg{* ctex-c5size.clo *}
\Msg{* ctex-cs4size.clo *}
\Msg{* ctex-article.def *}
@@ -384,10 +392,10 @@ This package consists of the file ctex.dtx, and the derived files
%</internal>
%<*!(readme|install|zhmap|spa)>
%<*!(c19|c70|ctexspa)>
-%<*driver|class|style|ctexcap>
+%<*driver|class|style|ctexcap|ctexhook|ctexpatch>
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
-%</driver|class|style|ctexcap>
+%</driver|class|style|ctexcap|ctexhook|ctexpatch>
%<.!(readme|install|zhmap|spa|c19|c70|ctexspa)>\ctexPutVersion
%<*driver>
\InputIfFileExists{ctex.ver}{}{
@@ -398,8 +406,6 @@ This package consists of the file ctex.dtx, and the derived files
%</driver>
%<ctex> {Chinese adapter in LaTeX (CTEX)}
%<ctex>\ProvidesExplPackage{\ExplFileName}
-%<ctexcap> {Chinese adapter in LaTeX (CTEX)}
-%<ctexcap>\ProvidesExplPackage{ctexcap}
%<ctexsize> {Chinese font size definition (CTEX)}
%<ctexsize>\ProvidesExplPackage{ctexsize}
%<ctexheading> {Heading style modification (CTEX)}
@@ -410,6 +416,12 @@ This package consists of the file ctex.dtx, and the derived files
%<class&book>\ProvidesExplClass{ctexbook}
%<class&report> {Chinese adapter for class report (CTEX)}
%<class&report>\ProvidesExplClass{ctexrep}
+%<ctexcap> {Chinese adapter in LaTeX (CTEX)}
+%<ctexcap>\ProvidesExplPackage{ctexcap}
+%<ctexhook> {Document and package hooks (CTEX)}
+%<ctexhook>\ProvidesExplPackage{ctexhook}
+%<ctexpatch> {Patching commands (CTEX)}
+%<ctexpatch>\ProvidesExplPackage{ctexpatch}
%<c5size> {c5size option (CTEX)}
%<c5size>\ProvidesExplFile{ctex-c5size.clo}
%<cs4size> {cs4size option (CTEX)}
@@ -466,7 +478,7 @@ This package consists of the file ctex.dtx, and the derived files
%<founder>\ProvidesExplFile{ctex-fontset-founder.def}
%<ubuntu> {Ubuntu fonts definition (CTEX)}
%<ubuntu>\ProvidesExplFile{ctex-fontset-ubuntu.def}
- {\ExplFileDate}{2.1}{\ExplFileDescription}
+ {\ExplFileDate}{2.2}{\ExplFileDescription}
%</!(c19|c70|ctexspa)>
%<rm&c19>\ProvidesFile{c19rm.fd}%
%<sf&c19>\ProvidesFile{c19sf.fd}%
@@ -475,8 +487,8 @@ This package consists of the file ctex.dtx, and the derived files
%<sf&c70>\ProvidesFile{c70sf.fd}%
%<tt&c70>\ProvidesFile{c70tt.fd}%
%<ctexspa>\ProvidesFile{ctexspa.def}%
-%<c19|c70> [2015/05/15 v2.1 Chinese font definition (CTEX)]
-%<ctexspa> [2015/05/15 v2.1 Space info for CJKpunct (CTEX)]
+%<c19|c70> [2015/07/01 v2.2 Chinese font definition (CTEX)]
+%<ctexspa> [2015/07/01 v2.2 Space info for CJKpunct (CTEX)]
%</!(readme|install|zhmap|spa)>
%<*driver>
\ExplSyntaxOff
@@ -493,7 +505,6 @@ This package consists of the file ctex.dtx, and the derived files
name = {第,节},
},
}
-\appto\abstract{\parindent=2\ccwd} ^^A l3doc.cls 设置列表环境中 \listparindent=\z@
\usepackage[toc]{multitoc}
\usepackage{geometry}
\usepackage{tabularx}
@@ -547,7 +558,7 @@ This package consists of the file ctex.dtx, and the derived files
%% 不对代码实现的 \section 以下标题编目录。
\AtBeginEnvironment{implementation}{%
\ifnum\value{tocdepth}>\@ne
- \addtocontents{toc}{\noexpand\value{tocdepth}=1\relax}%
+ \addtocontents{toc}{\protect\value{tocdepth}=1\relax}%
\fi}
\ifxetex
\let\ctexdocverbaddon\xeCJKVerbAddon
@@ -560,16 +571,23 @@ This package consists of the file ctex.dtx, and the derived files
\fi
\setlist{noitemsep,topsep=\smallskipamount}
\setlist[1]{labelindent=\parindent}
+\setlist[enumerate]{leftmargin=*}
\setlist[itemize]{leftmargin=*}
\newlist{optdesc}{description}{3}
%% 设置间距为 \marginparsep,与 l3doc 一致
\setlist[optdesc]{%
- font=\mdseries\small\ttfamily,align=right,
+ font=\mdseries\small\ttfamily,align=right,listparindent=\parindent,
labelsep=\marginparsep,labelindent=-\marginparsep,leftmargin=*}
\fvset{
fontsize=\small,baselinestretch=1,numbersep=5pt,
formatcom=\ctexdocverbaddon,
listparameters=\setlength\topsep{\MacrocodeTopsep}}
+\DefineVerbatimEnvironment{frameverb}{Verbatim}{%
+ gobble=4,
+ frame=single,framesep=8pt,
+ listparameters=
+ \setlength\topsep{\medskipamount}%
+ \appto\FV@EndList{\nointerlineskip}}
\DefineVerbatimEnvironment{ctexexam}{Verbatim}{%
gobble=4,
frame=single,framesep=10pt,
@@ -600,7 +618,13 @@ This package consists of the file ctex.dtx, and the derived files
\appto\AltMacroFont{\hyphenchar\font\m@ne\ctexdocverbaddon}
\def\Module#1{\mbox{%
\color{purple}\footnotesize\normalfont\sffamily\textlangle#1\textrangle}}
+\newcommand*\exptarget{\Hy@raisedlink{\hypertarget{expstar}{}}}
+\newcommand*\rexptarget{\Hy@raisedlink{\hypertarget{rexpstar}{}}}
+\newcommand*\expstar{\hyperlink{expstar}{$\star$}}
+\newcommand*\rexpstar{\hyperlink{rexpstar}{\ding{73}}}
\ExplSyntaxOn
+%% l3doc 会设置列表环境中 \listparindent=\z@,我们在这里恢复它。
+\cs_set_eq:NN \list \__codedoc_oldlist:nn
\cs_new_nopar:Npn \zihaopt #1
{
\exp_last_unbraced:Nf \tl_head:w
@@ -677,6 +701,7 @@ This package consists of the file ctex.dtx, and the derived files
\let\tn\bookmarkcstn
\let\meta\bookmarkmeta
\let\opt\@firstofone}
+\preto\@thehead{\cslet{MakeUppercase\space}{\@iden}}
\def\orbar{\textup{\textbar}}
\def\defaultval#1{\textbf{\textup{#1}}}
\def\defaultvalaux#1){\defaultval{#1}}
@@ -687,11 +712,11 @@ This package consists of the file ctex.dtx, and the derived files
\def\pdfTeX{\hologo{pdfTeX}}
\def\XeTeX{\hologo{XeTeX}}
\def\XeLaTeX{\hologo{XeLaTeX}}
-\DeclareRobustCommand\LuaLaTeX{\hologo{LuaLaTeX}}
+\def\LuaLaTeX{\hologo{LuaLaTeX}}
\def\pdfLaTeX{\hologo{pdfLaTeX}}
\def\LaTeX{\hologo{LaTeX}}
\def\LaTeXe{\hologo{LaTeX2e}}
-\def\LTXIII{\hologo{LaTeX3}}
+\def\LaTeXiii{\hologo{LaTeX3}}
\def\dvipdfmx{DVIPDFM\textit{x}}
\def\ctexkitrev#1{%
\href{https://github.com/CTeX-org/ctex-kit/commit/#1}{\texttt{ctex-kit} rev. #1}}
@@ -718,25 +743,21 @@ This package consists of the file ctex.dtx, and the derived files
\CodelineIndex
\RecordChanges
\def\glossaryname{版本历史}
-\GlossaryPrologue{\section*{\glossaryname}}
+\GlossaryPrologue{\section{\glossaryname}}
\IndexPrologue{%
- \section*{\indexname}
+ \section{\indexname}
\textit{意大利体的数字表示描述对应索引项的页码;
带下划线的数字表示定义对应索引项的代码行号;
罗马字体的数字表示使用对应索引项的代码行号。}}
\usepackage{makecell}
+\newcommand{\bashcmd}{\texttt}
\newcommand{\TeXLive}{\TeX\ Live}
-\newcommand{\opos}[1]{\texttt{\small #1}} ^^A option position
-\newcommand{\OPC}
- {\opos{该选项只能在调用 \CTeX{} 宏包/文档类时作为选项使用}}
-\newcommand{\OSET}
- {\opos{该选项只能用 \tn{ctexset} 来设置}}
-\newcommand{\OBOTH}
- {\opos{该选项既可以作为宏包/文档类选项使用,也可以使用 \tn{ctexset} 来设置}}
+\newcommand{\MiKTeX}{\hologo{MiKTeX}}
\usepackage{threeparttable}
\begin{document}
\DocInput{\jobname.dtx}
\newgeometry{hmargin=15mm,vmargin={25mm,15mm},footskip=7mm}
+ \ctexset{section/numbering=false}
\PrintChanges
\PrintIndex
\end{document}
@@ -744,13 +765,14 @@ This package consists of the file ctex.dtx, and the derived files
%
% \fi
%
-% \changes{v2.0}{2014/03/06}{应用 \LTXIII{} 重新整理代码。}
+% \changes{v2.0}{2014/03/06}{应用 \LaTeXiii{} 重新整理代码。}
% \changes{v2.0}{2014/03/12}{删除 \file{c19gbsn.fd} 和 \file{c19gkai.fd}。}
% \changes{v2.1}{2015/05/18}{将章节标题设置功能提取到可以独立使用的宏包
% \pkg{ctexheading} 中。}
+% \changes{v2.2}{2015/06/24}{不再依赖 \pkg{etoolbox} 宏包。}
%
%
-% \CheckSum{4523}
+% \CheckSum{5026}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -810,8 +832,8 @@ This package consists of the file ctex.dtx, and the derived files
% 在开发新版本时,考虑到合作开发和调试的方便,我们放弃了 \pkg{doc} 和 \pkg{DocStrip},
% 采取了直接编写宏包代码的方式。
%
-% 2014 年 3 月,为了适应 \LaTeX{} 的最新发展,特别是 \LTXIII{} 的逐渐成熟,李清用
-% \LTXIII{} 重构了整个宏包的代码,并重新使用 \pkg{doc} 和 \pkg{DocStrip} 工具进行代码
+% 2014 年 3 月,为了适应 \LaTeX{} 的最新发展,特别是 \LaTeXiii{} 的逐渐成熟,李清用
+% \LaTeXiii{} 重构了整个宏包的代码,并重新使用 \pkg{doc} 和 \pkg{DocStrip} 工具进行代码
% 的管理,升级版本号为 2.0,并改称 \CTeX{} 宏集。
%
% 2015 年 3 月,由于 Google Code 即将停止服务,ctex-kit 项目迁移至
@@ -829,7 +851,7 @@ This package consists of the file ctex.dtx, and the derived files
%
% 另一方面,随着 \TeX{} 引擎和 \LaTeX{} 宏包的不断发展,\LaTeX{} 的中文支持方式从早期的
% 专用系统(如 \pkg{CCT})发展为适用于不同引擎的多种方式^^A
-% \footnote{比如:\pdfTeX{} 引擎下的 \pkg{CJK}、\pkg{zhmCJK}宏包、
+% \footnote{比如:\pdfTeX{} 引擎下的 \pkg{CJK}、\pkg{zhmCJK}宏包,
% \XeTeX{} 引擎下的 \pkg{xeCJK} 宏包和 \LuaTeX{} 引擎下的 \pkg{LuaTeX-ja} 宏
% 包}。这些方式的适用情况和使用方式有不少细节上的差异,同时操作系统的不同、语言环境的不同等
% 客观情况又进一步带来了更多的细节差异。我们设计 \CTeX{} 宏集的另一个主要目的就是
@@ -845,7 +867,7 @@ This package consists of the file ctex.dtx, and the derived files
% 结合而成的。在纯文本环境下,该名字应写作“CTeX”。
%
% \CTeX{} 宏集是由 \href{http://bbs.ctex.org}{\CTeX{} 社区} 发起并维护的
-% LaTeX \emph{宏包和文档类的集合}。
+% \LaTeX{} \emph{宏包和文档类的集合}。
% 社区另有发布名为 \href{http://www.ctex.org/CTeX}{\CTeX{} 套装}
% 的 \TeX{} 发行版,与本文档所述的 \CTeX{} 宏集并非是同一事物。
%
@@ -887,6 +909,51 @@ This package consists of the file ctex.dtx, and the derived files
% \end{tabularx}
% \end{table}
%
+% \subsection{\CTeX{} 宏集的安装和更新}
+% \label{subsec:easy-ins}
+%
+% \CTeX{} 宏集依赖的宏包和宏集已被最常见的 \TeX{} 发行版 \TeXLive{} 和 \MiKTeX{}
+% 所收录。如果本地安装 \TeXLive{} 或 \MiKTeX{} 不是完全版本,就可能需要通过这
+% 两个发行版提供的\emph{宏包管理器}来安装宏包。
+%
+% \TeXLive{} 的宏包管理器是 tlmgr。用户可以在系统命令行中^^A
+% \footnote{Windows 系统的命令行是 CMD 命令提示符,你可以使用 Win + R 组合键^^A
+% 打开“运行”对话框,然后输入 cmd 确认打开命令提示符窗口。}^^A
+% 执行
+% \begin{frameverb}
+% tlmgr gui
+% \end{frameverb}
+% 启动管理器的图形界面(Windows 用户也可以通过开始菜单的
+% TeX Live 2015 \ding{212} TeX Live Manager 打开)。
+% 连接上远程仓库之后,搜索 ctex 安装即可。
+% tlmgr 的图形界面使用 Perl 编写,容易造成系统假死。遇到这种问题的用户,
+% 也可以直接在系统命令行执行
+% \begin{frameverb}
+% tlmgr install ctex
+% \end{frameverb}
+% 来安装 \CTeX{} 宏集\footnote{*nix 用户可能需要超级用户权限才能正确安装宏集。}。
+%
+% \MiKTeX{} 的宏包管理器是 mpm (\MiKTeX{} Package Manager)。用户可以在开始菜单
+% 找到 MiKTeX \ding{212} Maintenance (Admin) \ding{212} Package Manager (Admin),
+% 打开管理器,连接上远程仓库之后,搜索 ctex 安装即可。
+%
+% 若希望了解 \CTeX{} 宏集具体的依赖情况和手工安装宏集的方法,
+% 请参阅第 \ref{sec:dep-ins}~节。
+%
+% 当宏包发布新版本,并被发行版在远程仓库安装之后,在本地就可以通过宏包管理器来
+% 取得新版本。
+%
+% 对于 \TeXLive{},可以在 tlmgr 的图形界面点击“更新全部已安装的”按钮或者在
+% 命令行执行
+% \begin{frameverb}
+% tlmgr update --all
+% \end{frameverb}
+% 来完整更新已安装的宏包。
+%
+% 对于 \MiKTeX{},在开始菜单找到
+% MiKTeX \ding{212} Maintenance (Admin) \ding{212} Update (Admin),
+% 按照界面说明更新即可。
+%
% \subsection{使用 \CTeX{} 文档类}
%
% \emph{如果用户需要在标准文档类的基础上添加中文支持和中文版式支持,我们建议用户使用 \CTeX{}
@@ -940,68 +1007,6 @@ This package consists of the file ctex.dtx, and the derived files
% \end{document}
% \end{ctexexam}
%
-% \section{依赖与安装}
-%
-% \CTeX{} 是一个 \LaTeX{} 宏包,只有一个源文件 \file{ctex.dtx}。
-% 使用不同的编译方式时,\CTeX{} 依赖的宏包略有不同。在安装 \CTeX{} 宏集之前,请确保
-% 你的系统里已经正确安装了这些宏包。\CTeX{} 依赖宏包的详情叙述如下:
-%
-% \begin{itemize}
-% \item \pkg{expl3}、\pkg{xparse} 和 \pkg{l3keys2e} 宏包。它们属于 \pkg{l3kernel}
-% 和 \pkg{l3packages} 宏集,它们还依赖
-% \begin{itemize}
-% \item \pkg{etex} 宏包。
-% \end{itemize}
-% \item \pkg{indentfirst} 宏包,属于 \pkg{tools} 宏集。
-% \item \pkg{etoolbox} 宏包。
-% \item \pkg{everysel} 宏包,属于 \pkg{ms} 宏集。
-% \item \pkg{zhnumber} 宏包。
-% \item[\ding{229}] 以上是各种编译方式都必需的依赖项。
-% \item \pkg{CJK} 宏集,它的下划线功能依赖 \pkg{ulem} 宏包。
-% \item \pkg{CJKpunct} 宏包。
-% \item \pkg{xCJK2uni} 宏包。
-% \item \pkg{zhmetrics} 宏包。
-% \item \pkg{zhmCJK} 宏包。
-% \item[\ding{229}] 以上是使用 \pdfLaTeX{} 或 \LaTeX{} + \dvipdfmx{} 的编译方式所需要
-% 的依赖项,其中 \pkg{zhmCJK} 是可选的。
-% \item \pkg{xeCJK} 宏包,它还依赖
-% \begin{itemize}
-% \item \pkg{fontspec} 宏包,它还依赖
-% \begin{itemize}
-% \item \pkg{euenc} 宏包。
-% \item \pkg{xunicode} 宏包,它还依赖 \pkg{tipa} 宏包。
-% \end{itemize}
-% \end{itemize}
-% \item[\ding{229}] 以上是使用 \XeLaTeX{} 编译时的依赖项。
-% \item \pkg{LuaTeX-ja} 宏集,它还依赖
-% \begin{itemize}
-% \item \pkg{luaotfload} 宏包,它还依赖 \pkg{luatexbase} 宏包。
-% \item \pkg{xkeyval} 宏包。
-% \end{itemize}
-% \item[\ding{229}] 以上是使用 \LuaLaTeX{} 编译时的依赖项。
-% \end{itemize}
-%
-% \CTeX{} 依赖的各个宏包和宏集均已被 \TeXLive{} 和 \hologo{MiKTeX} 收录。如果
-% 你是这两个 \TeX{} 发行版的用户,可以使用他们提供的宏包管理器来安装这些宏包,或将他们
-% 更新到最新版本。如果你不使用这两个发行版,请参考你使用的 \TeX{} 发行版和相关宏包
-% 的说明文档。
-%
-% 出于一些原因,\pkg{zhmCJK} 尚未被收入 \TeXLive{} 和 \hologo{MiKTeX}。因此,若
-% 你希望使用 \pkg{zhmCJK} 作为 \CTeX{} 宏集的底层中文支持方式,需要自行安装该宏包。
-% \pkg{zhmCJK} 的安装较为复杂。我们建议你从 CTAN 下载 \pkg{zhmCJK} 的
-% \href{http://mirrors.ctan.org/install/language/chinese/zhmcjk.tds.zip}{TDS
-% 安装包},按目录结构将文件复制到 \TeX{} 发行版的本地 TDS 根目录,然后刷新文件
-% 名数据库。关于安装的详细内容,可以参照其
-% \href{http://mirrors.ctan.org/language/chinese/zhmcjk/zhmCJK.pdf}{宏包手册}
-% 中第 3 节的指导。
-%
-% \CTeX{} 的正式版本也已被 \TeXLive{} 和 \hologo{MiKTeX} 收录。因此,使用这两个发行版
-% 的用户可以如常使用宏包管理器来安装。如果你不使用者两个发行版,我们建议你从 CTAN
-% 下载 \CTeX{} 的
-% \href{http://mirrors.ctan.org/install/language/chinese/ctex.tds.zip}{TDS
-% 安装包} 按目录结构将文件复制到 \TeX{} 发行版的本地 TDS 根目录,然后刷新文件
-% 名数据库。
-%
% \section{宏包选项与 \tn{ctexset} 命令}
% \label{sec:options}
%
@@ -1016,12 +1021,18 @@ This package consists of the file ctex.dtx, and the derived files
% 也有的以 \meta{key}|=|\meta{value} 的形式提供。对于以键值对形式提供的选项,
% 在下面的说明中使用\textbf{粗体}来表示 \CTeX{} 的默认设置。
%
-% 另一方面,在这些选项里,有些选项只能作为宏包/文档类选项,需要在引入宏包/文档类的时候指定;
-% 有些选项只能通过 \CTeX{} 宏集提供的用户接口 \tn{ctexset} 来设定;
-% 也有一些选项既可以作为宏包/文档类选项,也可以通过 \tn{ctexset} 来设定。
-% 后续文档中将在使用说明中对每个选项的使用方式做说明。
+% 另一方面,这些选项可以分为以下三类:
+% \begin{itemize}
+% \item 名字后带有 \rexptarget\rexpstar{} 号的选项,只能作为宏包/文档类选项,需要
+% 在引入宏包/文档类的时候指定;
+% \item 名字后带有 \exptarget\expstar{} 号的选项,只能通过 \CTeX{} 宏集提供的
+% 用户接口 \tn{ctexset} 来设定;
+% \item 名字后不带有特殊符号的选项,既可以作为宏包/文档类选项,也可以通过
+% \tn{ctexset} 来设定。
+% \end{itemize}
+% 后续文档将在使用说明中对某些特殊的选项加以说明。
%
-% \begin{function}{\ctexset}
+% \begin{function}[added=2014-03-18]{\ctexset}
% \begin{syntax}
% \tn{ctexset} \Arg{键值列表}
% \end{syntax}
@@ -1039,7 +1050,7 @@ This package consists of the file ctex.dtx, and the derived files
% }
% \end{ctexexam}
%
-% \tn{ctexset} 采用 \LaTeX3 风格的键值设置,支持不同类型的选项与层次化的选
+% \tn{ctexset} 采用 \LaTeXiii{} 风格的键值设置,支持不同类型的选项与层次化的选
% 项设置,相关示例见 \ref{sec:secstyle}~节。
%
% \section{编译方式、编码与中文字库}
@@ -1077,10 +1088,7 @@ This package consists of the file ctex.dtx, and the derived files
% \subsection{中文编码}
% \label{subs:encoding}
%
-% \begin{function}{GBK, UTF8}
-% \begin{syntax}
-% \OPC
-% \end{syntax}
+% \begin{function}[rEXP]{GBK, UTF8}
% 指明编写文档时使用的编码格式。\CTeX{} 宏集无法检测用户编写文档时使用的编码格式,因此
% 需要用户自行指定编码。\emph{我们建议用户总是使用 UTF-8 编码,并显式指定 \opt{UTF8}
% 选项,并使用 \XeLaTeX{} 或 \LuaLaTeX{} 编译。}
@@ -1129,6 +1137,7 @@ This package consists of the file ctex.dtx, and the derived files
% \makecell{\pkg{CJK} + \pkg{zhmetrics}\\Fandol 字库} \\
% \bottomrule
% \end{tabular}
+% \smallskip
% \begin{tablenotes}\footnotesize
% \item [1] Windows Vista 及以后的 Windows 操作系统。
% \item [2] Windows XP 及以前的 Windows 操作系统。
@@ -1145,12 +1154,11 @@ This package consists of the file ctex.dtx, and the derived files
% 意外情况失效,或者在用户有特殊需求的情况下使用。\emph{除非必要,用户不
% 应使用这些选项。}
%
-% \begin{function}{zhmap}
+% \begin{function}[rEXP,updated=2014-03-08]{zhmap}
% \begin{syntax}
% zhmap = <\TTF|zhmCJK>
-% \OPC\opos{,并且只在使用 \pdfLaTeX{}/\LaTeX{} 编译时有意义}
% \end{syntax}
-% 指定字体映射机制。
+% 指定字体映射机制。本选项只在使用 \pdfLaTeX/\LaTeX{} 编译时有意义。
% \end{function}
% \begin{optdesc}
% \item[true] 使用 \pkg{zhmetrics} 宏包,将 CJK 字库通过 \tn{special}
@@ -1165,11 +1173,10 @@ This package consists of the file ctex.dtx, and the derived files
% ,由 \pkg{zhmCJK} 宏包提供从 CJK 字库到 \file{.ttf} 的映射。
% \end{optdesc}
%
-% \begin{function}{fontset}
+% \begin{function}[added=2014-03-08]{fontset}
% \begin{syntax}
% fontset =^^A
-% <none|adobe|fandol|founder|mac|ubuntu|windows|windowsnew|windowsold...>
-% \OBOTH
+% <none|adobe|fandol|founder|mac|ubuntu|windows|windowsnew|windowsold|...>
% \end{syntax}
% 指定 \CTeX{} 宏集加载的字库。
%
@@ -1193,7 +1200,7 @@ This package consists of the file ctex.dtx, and the derived files
% \end{optdesc}
%
% 注意:使用 (pdf)\LaTeX{} 编译的时候,若设置 \opt{zhmap = false}(比如需要
-% 使用 \LaTeX{} + DVIPS 编译),则需要按照传统方式^^A
+% 使用 \LaTeX{} + Dvips 编译),则需要按照传统方式^^A
% \footnote{可以使用 \pkg{zhmetrics} 宏包提供的脚本
% \href{https://github.com/CTeX-org/ctex-kit/blob/master/zhmetrics/CTeXFonts.lua}
% {\file{CTeXFonts.lua}}。}^^A
@@ -1217,7 +1224,7 @@ This package consists of the file ctex.dtx, and the derived files
% \documentclass[fontset = none]{ctexart}
% \ctexset{fontset = founder}
% \begin{document}
-% 在文档类选项中声明 \verb|fontset = none|,随后在导言区用 \tn{ctexset}
+% 在文档类选项中声明 \verb|fontset = none|,随后在导言区用 \verb|\ctexset|
% 指定字体。
% \end{document}
% \end{ctexexam}
@@ -1246,10 +1253,9 @@ This package consists of the file ctex.dtx, and the derived files
% \subsection{文档默认字号}
% \label{subs:options-class}
%
-% \begin{function}{zihao}
+% \begin{function}[rEXP,added=2015-05-06]{zihao}
% \begin{syntax}
% zihao = <-4|5|false>
-% \OPC
% \end{syntax}
% 将文章默认字号(\tn{normalsize})设置为小四号字或五号字,
% 具体情况见表 \ref{tab:fontsize}。\opt{false} 禁用本功能。
@@ -1269,8 +1275,8 @@ This package consists of the file ctex.dtx, and the derived files
% \multicolumn1c{|10pt|} & \multicolumn1c{|11pt|} & \multicolumn1c{|12pt|} \\
% \cmidrule(lr){2-3} \cmidrule(lr){4-5}
% \cmidrule(lr){6-6} \cmidrule(lr){7-7} \cmidrule(lr){8-8}
-% 字体命令 & 字号 & \textrm{bp} & 字号 & \textrm{bp}
-% & \textrm{pt} & \textrm{pt} & \textrm{pt} \\
+% 字体命令 & 字号 & \si{bp} & 字号 & \si{bp}
+% & \si{pt} & \si{pt} & \si{pt} \\
% \midrule
% |\tiny| & 七号 & 5.5 & 小六 & 6.5 & ~5 & ~6 & ~6 \\
% |\scriptsize| & 小六 & 6.5 & 六号 & 7.5 & ~7 & ~8 & ~8 \\
@@ -1286,10 +1292,7 @@ This package consists of the file ctex.dtx, and the derived files
% \end{tabular}
%\end{table}
%
-% \begin{function}{10pt, 11pt, 12pt}
-% \begin{syntax}
-% \OPC
-% \end{syntax}
+% \begin{function}[rEXP]{10pt, 11pt, 12pt}
% \CTeX{} 文档类是在 \LaTeX{} 标准文档类之上开发的。因此,除了可以使用 \CTeX{}
% 宏包定义的字号选项之外,还可以使用标准文档类的同类选项(\opt{10pt}、\opt{11pt}
% 和 \opt{12pt})。在使用这些来自标准文档类的选项的时候,\CTeX{} 文档类的字号
@@ -1307,11 +1310,12 @@ This package consists of the file ctex.dtx, and the derived files
% \subsection{章节标题风格}
% \label{subs:options-heading}
%
-% \begin{function}{heading}
+% \begin{function}[rEXP,added=2014-03-08]{heading}
% \begin{syntax}
% heading = <\TFF>
-% \opos{该选项只能在调用 \pkg{ctex.sty} 时作为宏包选项使用}
% \end{syntax}
+% 本选项只能在调用 \pkg{ctex.sty} 时作为宏包选项使用。
+%
% \CTeX{} 宏集提供了一套用于修改文档章节标题格式的接口。该选项用于选择是否
% 启用该功能。详细的设置方法请参见
% \ref{sec:secstyle}~节和 \ref{subs:pagestyle}~节。
@@ -1323,11 +1327,8 @@ This package consists of the file ctex.dtx, and the derived files
% 三个中文文档类\emph{完全}一致;若不然,则会根据 \tn{chapter}
% 是否有定义来使用 \cls{ctexbook} 或者 \cls{ctexart} 的标题设置。
%
-% \begin{function}{sub3section, sub4section}
-% \begin{syntax}
-% \OPC
-% \end{syntax}
-% 会修改 \tn{paragraph} 和 \tn{subparagraph} 的格式。
+% \begin{function}[rEXP]{sub3section, sub4section}
+% 修改 \tn{paragraph} 和 \tn{subparagraph} 的格式。
%
% 默认情况下,\tn{paragraph} 和 \tn{subparagraph} 会将标题与随后的正文
% 排版在同一个段落。启用 \opt{sub3section} 会将 \tn{paragraph} 的格式修改为
@@ -1346,32 +1347,31 @@ This package consists of the file ctex.dtx, and the derived files
% \subsection{排版方案选项}
% \label{subs:options-type-style}
%
-% \begin{function}{scheme}
+% \begin{function}[rEXP,added=2015-04-15]{scheme}
% \begin{syntax}
% scheme = <(chinese)|plain>
-% \OPC
% \end{syntax}
% 选择文章的排版方案,预设有 \opt{chinese} 和 \opt{plain} 两种方案。%
% \end{function}
-% \begin{optdesc}
+% \begin{optdesc}[itemsep=\medskipamount]
% \item[chinese] 调整默认字号为五号字,并调整行距为 |1.3|;
% 汉化文档中的标题名字(如“图”、“表”、“目录”和“参考文献”,
% 见 \ref{subs:capname}~节);
% 在 \opt{heading = true} 的情况下^^A
% \footnote{使用 \CTeX{} 文档类,或者使用 \pkg{ctex} 宏包且开启该选项时。}^^A
% (\ref{subs:options-heading}~节),还会将章节标题的风格修改为
-% 中文样式(见 \ref{sec:secstyle}~节)。当 \pkg{ctex} 宏包与标准文档类及其
-% 衍生文档类联用时,会载入 \pkg{indentfirst} 宏包,
-% 以实现章节标题后的段首缩进。
+% 中文样式(见 \ref{sec:secstyle}~节)。
+%
+% 当关闭 \opt{heading} 选项的 \pkg{ctex} 宏包与标准文档类或其衍生文档类
+% 联用时,会载入 \pkg{indentfirst} 宏包,以实现章节标题后的段首缩进。
% \item[plain] 不调整默认字号和行距,不会汉化文档中的标题名字,也不会将章节
% 标题风格修改为中文样式,同时不会调整 \tn{pagestyle},并禁用 \opt{autoindent}
% 选项。事实上,此时的 \CTeX{} 宏集只提供了中文支持功能,而不对文章版式进行任何修改。
% \end{optdesc}
%
-% \begin{function}{punct}
+% \begin{function}[updated=2014-04-11]{punct}
% \begin{syntax}
% punct = <(quanjiao)|banjiao|kaiming|CCT|plain>
-% \OBOTH
% \end{syntax}
% 设置标点处理格式。预定义好的格式有:
% \end{function}
@@ -1386,10 +1386,9 @@ This package consists of the file ctex.dtx, and the derived files
% \item[plain] 原样(不调整标点间距)。
% \end{optdesc}
%
-% \begin{function}{space}
+% \begin{function}[updated=2014-03-08]{space}
% \begin{syntax}
% space = <\TF|(auto)>
-% \OBOTH
% \end{syntax}
% 是否在生成的 PDF 中保留汉字后面的空格。
% \end{function}
@@ -1420,10 +1419,9 @@ This package consists of the file ctex.dtx, and the derived files
% \emph{使用 \textup{\LuaLaTeX} 编译的时候,该选项无效:汉字间的空格以及汉字与西文字符
% 之间的空格总是有效,不会被忽略,但可以自动忽略掉由换行产生的空格。}
%
-% \begin{function}{linespread}
+% \begin{function}[rEXP,added=2014-04-23]{linespread}
% \begin{syntax}
% linespread = <数值>
-% \OPC
% \end{syntax}
% 接受一个浮点数值,设置行距倍数。本选项的初始值与 \opt{scheme} 有关。
% \end{function}
@@ -1435,10 +1433,9 @@ This package consists of the file ctex.dtx, and the derived files
% 其他宏包或用户设置决定。
% \end{optdesc}
%
-% \begin{function}{autoindent}
+% \begin{function}[added=2014-03-13]{autoindent}
% \begin{syntax}
% autoindent = <\TTF|数值|带单位的数值>
-% \OBOTH
% \end{syntax}
% 在字体大小发生变化时,是否自动调整段首缩进(\tn{parindent})的大小。
% \end{function}
@@ -1455,10 +1452,9 @@ This package consists of the file ctex.dtx, and the derived files
% \end{ctexexam}
% \end{optdesc}
%
-% \begin{function}{linestretch}
+% \begin{function}[EXP,added=2014-03-26]{linestretch}
% \begin{syntax}
% linestretch = <数值或长度>
-% \OSET
% \end{syntax}
% \opt{linestretch} 是一个比较特殊的选项,它用来设置汉字之间弹性间距的弹性程
% 度。如果有单位,则可以在选项中直接写;如果是数字,单位则是汉字宽度
@@ -1485,10 +1481,9 @@ This package consists of the file ctex.dtx, and the derived files
% \CTeX 宏包对显示当前日期的 \tn{today} 命令进行了汉化,使之以中文的方式显示今
% 天的日期。如编译本文档的日期就是“\today”。
%
-% \begin{function}{today}
+% \begin{function}[EXP]{today}
% \begin{syntax}
% today = <(small)|big|old>
-% \OSET
% \end{syntax}
% 该选项用来控制 \tn{today} 命令的输出格式:
% \begin{optdesc}
@@ -1521,75 +1516,66 @@ This package consists of the file ctex.dtx, and the derived files
%
% \begin{defaultcapconfig}
%
-% \begin{function}{contentsname}
+% \begin{function}[EXP]{contentsname}
% \begin{syntax}
% contentsname = <名字>
-% \OSET
% \end{syntax}
% 设置目录标题名 \tn{contentsname}。中文默认为“\contentsname”。
% \end{function}
%
-% \begin{function}{listfigurename}
+% \begin{function}[EXP]{listfigurename}
% \begin{syntax}
% listfigurename = <名字>
-% \OSET
% \end{syntax}
% 设置插图目录标题名 \tn{listfigurename}。中文默认为“\listfigurename”。
% \end{function}
%
-% \begin{function}{listtablename}
+% \begin{function}[EXP]{listtablename}
% \begin{syntax}
% listtablename = <名字>
-% \OSET
% \end{syntax}
% 设置表格目录标题名 \tn{listtablename}。中文默认为“\listtablename”。
% \end{function}
%
-% \begin{function}{figurename}
+% \begin{function}[EXP]{figurename}
% \begin{syntax}
% figurename = <名字>
-% \OSET
% \end{syntax}
% 设置图片环境标题名 \tn{figurename}。中文默认为“\figurename”。
% \end{function}
%
-% \begin{function}{tablename}
+% \begin{function}[EXP]{tablename}
% \begin{syntax}
% tablename = <名字>
-% \OSET
% \end{syntax}
% 设置表格环境标题名 \tn{tablename}。中文默认为“\tablename”。
% \end{function}
%
-% \begin{function}{abstractname}
+% \begin{function}[EXP]{abstractname}
% \begin{syntax}
% abstractname = <名字>
-% \OSET
% \end{syntax}
% 设置摘要 \env{abstract} 环境标题名 \tn{abstractname}。中文默认
% 为“\abstractname”。注意 \cls{book} 类没有摘要,该选项无效。
% \end{function}
%
-% \begin{function}{indexname}
+% \begin{function}[EXP]{indexname}
% \begin{syntax}
% indexname = <名字>
-% \OSET
% \end{syntax}
% 设置索引标题名 \tn{indexname}。中文默认为“\indexname”。
% \end{function}
%
-% \begin{function}{appendixname}
+% \begin{function}[EXP]{appendixname}
% \begin{syntax}
% appendixname = <名字>
-% \OSET
% \end{syntax}
% 设置附录标题名 \tn{appendixname}。中文默认为“\appendixname”。
% \end{function}
%
-% \begin{function}{bibname}
+% \begin{function}[EXP]{bibname}
% \begin{syntax}
% bibname = <名字>
-% \OSET
% \end{syntax}
% 设置参考文献标题名 \tn{refname}(对 \cls{article})或 \tn{bibname}(对
% \cls{report} 和 \cls{book})。中文默认为“\refname”。
@@ -1602,9 +1588,9 @@ This package consists of the file ctex.dtx, and the derived files
%
% 当使用了 \CTeX 的文档类或是用 \pkg{ctex} 宏包加载了 \opt{heading} 选项时,会
% 设置整个文档的页面格式(page style)为 |headings|,即相当于设置了
-% \begin{verbatim}[gobble=2]
-% \pagestyle{headings}
-% \end{verbatim}
+% \begin{frameverb}
+% \pagestyle{headings}
+% \end{frameverb}
% 在页眉中显示当前章节的编号与标题。
%
% 同时,\CTeX 宏包也会对默认的 |headings| 页面格式进行修改,使之调用
@@ -1709,22 +1695,59 @@ This package consists of the file ctex.dtx, and the derived files
% \changes{v2.0}{2015/03/21}{\tn{CTEXsetup}, \tn{CTEXoptions} 是过时命令。}
% 章节标题的格式选项是分层设置的。顶层的选项是章节标题名称,次一级的选项是章节
% 标题的格式。章节标题名包括 |part|, |chapter|, |section|, |subsection|,
-% |subsubsecton|, |paragraph|, |subparagraph|;而可用的格式包括 \opt{name},
-% \opt{number}, \opt{format}, \opt{nameformat}, \opt{numberformat},
-% \opt{aftername}, \opt{titleformat}, \opt{beforeskip}, \opt{afterskip},
-% \opt{indent}, \opt{pagestyle} 等。但注意,对 \cls{article} 及其衍生的
+% |subsubsection|, |paragraph|, |subparagraph|;而可用的格式包括 \opt{numbering},
+% \opt{name}, \opt{number}, \opt{format}, \opt{nameformat}, \opt{numberformat},
+% \opt{aftername}, \opt{titleformat}, \opt{aftertitle}, \opt{runin},
+% \opt{afterindent}, \opt{beforeskip}, \opt{afterskip}, \opt{indent},
+% \opt{pagestyle} 等。但注意,对 \cls{article} 及其衍生的
% \cls{ctexart} 等文档类,没有 |chapter| 级别的标题。
%
% 多级选项之间用斜线分开,例如,\opt{part/name} 选项设置 \tn{part} 标题的在数
% 字前后的名称,而 \opt{section/number} 选项设置 \tn{section} 标题的数字类型。
% 注意斜线前后都不要有空格。
%
-% \begin{function}{part/name, chapter/name, section/name, subsection/name,
-% subsubsection/name, paragraph/name, subparagraph/name}
+% 使用 \tn{ctexset} 设置多级选项时,可以在同一个上级选项下设置多个下级选项。
+%
+% 例如,同时设置 |part| 一级标题的 \opt{pagestyle} 选项,|chapter| 一级标题的
+% \opt{format} 与 \opt{pagestyle} 选项和 |section| 一级标题的 \opt{name} 与
+% \opt{number} 选项:
+% \begin{ctexexam}
+% \ctexset {
+% part/pagestyle = empty,
+% chapter = {
+% format = \raggedright,
+% pagestyle = empty,
+% },
+% section = {
+% name = {第,节},
+% number = \chinese{section},
+% }
+% }
+% \end{ctexexam}
+%
+% \begin{function}[EXP,added=2015-06-21]{part/numbering, chapter/numbering,
+% section/numbering, subsection/numbering, subsubsection/numbering,
+% paragraph/numbering, subparagraph/numbering}
+% \begin{syntax}
+% numbering = \TTF
+% \end{syntax}
+% 控制是否对章节标题编号。对各级标题的默认值均为 \opt{true}。
+%
+% 我们知道,\LaTeX{} 带星号的章节标题命令(如 \tn{section*})不会对标题编号,
+% 但也不会将该没编号的标题编入目录中。本选项控制的是不带星号的标题命令是否编号。
+% 设置本选项为 \opt{false},除了不对标题编号以外,功能与正常标题一致,
+% 比如可以编目录,正确的 \pkg{hyperref} 目录超链接位置和页眉标记。
+%
+% 注意,章节标题的编号深度受 \LaTeX{} 计数器 |secnumdepth| 的控制。
+% \opt{numbering} 选项在 |secnumdepth| 的控制下起作用。
+% \end{function}
+%
+% 如果没有特别说明,以下将用 “|...|” 代表各级章节标题名。
+%
+% \begin{function}[EXP,updated=2014-03-08]{.../name}
% \begin{syntax}
% name = \{<前名字>,<后名字>\}
% name = \Arg{前名字}
-% \OSET
% \end{syntax}
% 设置章节的名字。名字可以分为前后两部分,即章节编号前后的词语,两个词之间用
% 一个半角逗号分开;也可以只有一部分,表示只有章节编号之前的名字。例如:
@@ -1743,26 +1766,23 @@ This package consists of the file ctex.dtx, and the derived files
% \caption{\opt{name} 选项的默认设置}
% \begin{tabular}{llll}
% \toprule
-% 标题名 & \opt{scheme = chinese} &
-% \opt{scheme = plain} & 注 \\
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} & 注 \\
% \midrule
% part & |{第,部分}| & |{\partname\space}| & 原 \tn{partname} 为 Part \\
% chapter & |{第,章}| & |{\chaptername\space}|
% & 原 \tn{chaptername} 为 Chapter \\
-% section & |{}| & |{}| & \\
-% subsection & |{}| & |{}| & \\
-% subsubsection & |{}| & |{}| & \\
-% paragraph & |{}| & |{}| & \\
-% subparagraph & |{}| & |{}| & \\
+% section & 同右 & |{}| & \\
+% subsection & 同右 & |{}| & \\
+% subsubsection & 同右 & |{}| & \\
+% paragraph & 同右 & |{}| & \\
+% subparagraph & 同右 & |{}| & \\
% \bottomrule
% \end{tabular}
% \end{table}
%
-% \begin{function}{part/number, chapter/number, section/number, subsection/number,
-% subsubsection/number, paragraph/number, subparagraph/number}
+% \begin{function}[EXP]{.../number}
% \begin{syntax}
% number = \Arg{数字输出命令}
-% \OSET
% \end{syntax}
% 设置章节编号的数字输出格式。\meta{数字输出命令} 通常是对应章节编号计数器的
% 输出命令,如 \tn{thesection} 或 |\chinese{chapter}| 之类。
@@ -1786,8 +1806,7 @@ This package consists of the file ctex.dtx, and the derived files
% \setlength\leftskip{0pt plus 1 fil minus \marginparwidth}
% \begin{tabular}{llll}
% \toprule
-% 标题名 & \opt{scheme = chinese} &
-% \opt{scheme = plain}
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain}
% & 原 |\the|\meta{标题} 等价定义 \\
% \midrule
% part & |\chinese{part}| & |\thepart| & |\Roman{part}| \\
@@ -1815,26 +1834,10 @@ This package consists of the file ctex.dtx, and the derived files
% 节的完整编号。例如用于帮助定义自定义的目录格式、页眉格式等。
% \end{function}
%
-% 使用 \tn{ctexset} 设置多级选项时,可以在同一个上级选项下设置多个下级选项。例
-% 如同时设置 |section| 一级标题的 \opt{name} 与 \opt{number} 选项:
-% \begin{ctexexam}
-% \ctexset{
-% section = {
-% name = {第,节},
-% number = \chinese{section}
-% }
-% }
-% \end{ctexexam}
-%
-%
-% \begin{function}{part/format, chapter/format, section/format,
-% subsection/format, subsubsection/format, paragraph/format,
-% subparagraph/format,
-% .../format+}
+% \begin{function}[EXP,updated=2015-06-30]{.../format, .../format+}
% \begin{syntax}
% format = \Arg{格式命令}
% format+= \Arg{格式命令}
-% \OSET
% \end{syntax}
% \opt{format} 选项用于控制章节标题的全局格式,作用域为章节名字和随后的标题
% 内容。可以用于控制章节标题的对齐方式、整体字体字号等格式。
@@ -1842,25 +1845,24 @@ This package consists of the file ctex.dtx, and the derived files
% 带加号的 \opt{format+} 选项则用于在已有格式之后追加新的格式命令。
%
% 例如,设置章格式为无衬线字体左对齐,为节格式增加无衬线字体设置:
+% \end{function}
% \begin{ctexexam}
% \ctexset{
-% chapter/format=\sffamily\raggedright,
-% section/format+=\sffamily
+% chapter/format = \sffamily\raggedright,
+% section/format+ = \sffamily
% }
% \end{ctexexam}
-% \end{function}
%
% \begin{table}[htbp]
% \small\centering
% \caption{\opt{format} 选项的默认设置}
% \begin{tabular}{lll}
% \toprule
-% 标题名 & \opt{scheme = chinese} &
-% \opt{scheme = plain} \\
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
% \midrule
-% part (article) & |\centering| & |\raggedright| \\
-% part & 同右 & |\centering| \\
-% chapter & |\centering| & |\raggedright| \\
+% part (article) & |\Large\bfseries\centering| & |\raggedright| \\
+% part & |\huge\bfseries\centering| & |\centering| \\
+% chapter & |\huge\bfseries\centering| & |\raggedright| \\
% section & |\Large\bfseries\centering| & |\Large\bfseries| \\
% subsection & 同右 & |\large\bfseries| \\
% subsubsection & 同右 & |\normalsize\bfseries| \\
@@ -1870,14 +1872,10 @@ This package consists of the file ctex.dtx, and the derived files
% \end{tabular}
% \end{table}
%
-% \begin{function}{part/nameformat, chapter/nameformat, section/nameformat,
-% subsection/nameformat, subsubsection/nameformat, paragraph/nameformat,
-% subparagraph/nameformat,
-% .../nameformat+}
+% \begin{function}[EXP,updated=2015-06-30]{.../nameformat, .../nameformat+}
% \begin{syntax}
% nameformat = \Arg{格式命令}
% nameformat+= \Arg{格式命令}
-% \OSET
% \end{syntax}
% \opt{nameformat} 用于控制章节名字的格式,作用域为章节名字,包括编号。它一
% 般用于章节名(包括编号)与章节标题的字体、字号等设置不一致的情形。参见
@@ -1887,6 +1885,8 @@ This package consists of the file ctex.dtx, and the derived files
%
% \opt{nameformat} 选项的最后一个格式命令可以是一个有一个参数的命令。
% 这个命令的参数用于接受章节名字和编号,实现特殊效果(见例~\ref{exam:miscopt})。
+%
+% \opt{nameformat} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
% \end{function}
%
% \begin{table}[htbp]
@@ -1894,12 +1894,11 @@ This package consists of the file ctex.dtx, and the derived files
% \caption{\opt{nameformat} 选项的默认设置}
% \begin{tabular}{lll}
% \toprule
-% 标题名 & \opt{scheme = chinese} &
-% \opt{scheme = plain} \\
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
% \midrule
-% part (article) & 同右 & |\Large\bfseries| \\
-% part & 同右 & |\huge\bfseries| \\
-% chapter & 同右 & |\huge\bfseries| \\
+% part (article) & |{}| & |\Large\bfseries| \\
+% part & |{}| & |\huge\bfseries| \\
+% chapter & |{}| & |\huge\bfseries| \\
% section & 同右 & |{}| \\
% subsection & 同右 & |{}| \\
% subsubsection & 同右 & |{}| \\
@@ -1909,14 +1908,10 @@ This package consists of the file ctex.dtx, and the derived files
% \end{tabular}
% \end{table}
%
-% \begin{function}{part/numberformat, chapter/numberformat,
-% section/numberformat, subsection/numberformat, subsubsection/numberformat,
-% paragraph/numberformat, subparagraph/numberformat,
-% .../numberformat+}
+% \begin{function}[EXP,updated=2015-06-19]{.../numberformat, .../numberformat+}
% \begin{syntax}
% numberformat = \Arg{格式命令}
% numberformat+= \Arg{格式命令}
-% \OSET
% \end{syntax}
% \opt{numberformat} 选项用于控制章节编号的格式,作用域仅为编号数字本身。对
% 各级标题默认均为空,当你需要编号的格式和前后的章节名字不一样时可以使用。
@@ -1939,14 +1934,10 @@ This package consists of the file ctex.dtx, and the derived files
% \huge\bfseries 第 \textit{\color{blue}\zihao{0}4} 章
% \end{center}
%
-% \begin{function}{part/aftername, chapter/aftername, section/aftername,
-% subsection/aftername, subsubsection/aftername, paragraph/aftername,
-% subparagraph/aftername,
-% .../aftername+}
+% \begin{function}[EXP,updated=2014-03-08]{.../aftername, .../aftername+}
% \begin{syntax}
% aftername = \Arg{代码}
% aftername+= \Arg{代码}
-% \OSET
% \end{syntax}
% \opt{aftername} 选项的参数 \meta{代码} 将被插入到章节编号与其后的标题内容之
% 间,用于控制格式变换。常用于控制章节编号与标题内容之间的距离,或者控制标题
@@ -1960,8 +1951,7 @@ This package consists of the file ctex.dtx, and the derived files
% \caption{\opt{aftername} 选项的默认设置}
% \begin{tabular}{lll}
% \toprule
-% 标题名 & \opt{scheme = chinese} &
-% \opt{scheme = plain} \\
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
% \midrule
% part (article) & |\quad| & |\par\nobreak| \\
% part & 同右 & |\par\vskip 20pt| \\
@@ -1975,14 +1965,10 @@ This package consists of the file ctex.dtx, and the derived files
% \end{tabular}
% \end{table}
%
-% \begin{function}{part/titleformat, chapter/titleformat, section/titleformat,
-% subsection/titleformat, subsubsection/titleformat, paragraph/titleformat,
-% subparagraph/titleformat,
-% .../titleformat+}
+% \begin{function}[EXP,updated=2015-06-30]{.../titleformat, .../titleformat+}
% \begin{syntax}
% titleformat = \Arg{格式命令}
% titleformat+= \Arg{格式命令}
-% \OSET
% \end{syntax}
% \opt{titleformat} 选项用于控制标题内容的格式,作用域为章节标题内容。
%
@@ -2017,12 +2003,11 @@ This package consists of the file ctex.dtx, and the derived files
% \caption{\opt{titleformat} 选项的默认设置}
% \begin{tabular}{lll}
% \toprule
-% 标题名 & \opt{scheme = chinese} &
-% \opt{scheme = plain} \\
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
% \midrule
-% part (article) & |\Large\bfseries| & |\huge\bfseries| \\
-% part & |\huge\bfseries| & |\Huge\bfseries| \\
-% chapter & |\huge\bfseries| & |\Huge\bfseries| \\
+% part (article) & |{}| & |\huge\bfseries| \\
+% part & |{}| & |\Huge\bfseries| \\
+% chapter & |{}| & |\Huge\bfseries| \\
% section & 同右 & |{}| \\
% subsection & 同右 & |{}| \\
% subsubsection & 同右 & |{}| \\
@@ -2032,109 +2017,157 @@ This package consists of the file ctex.dtx, and the derived files
% \end{tabular}
% \end{table}
%
-% \begin{function}{part/aftertitle, chapter/aftertitle, section/aftertitle,
-% subsection/aftertitle, subsubsection/aftertitle, paragraph/aftertitle,
-% subparagraph/aftertitle,
-% .../aftertitle+}
+% \begin{function}[EXP,added=2015-06-19]{.../aftertitle, .../aftertitle+}
% \begin{syntax}
% aftertitle = \Arg{代码}
% aftertitle+= \Arg{代码}
-% \OSET
% \end{syntax}
% \opt{aftertitle} 选项的参数 \meta{代码} 将被插入到章节标题内容之后。
-% 可用于控制标题内容结束后是否另起一段。
%
% \opt{aftertitle+} 选项用于在原有代码后面附加代码。
%
% \opt{aftertitle} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
%
-% 使用 \opt{sub3section} 或 \opt{sub4section} 宏包选项(见
-% \ref{subs:options-heading}~节)后,\tn{paragraph} 与 \tn{subparagraph}
-% 这两级标题会改为排在不同段,会影响 \opt{aftertitle} 选项的默认值。
+% \opt{sub3section} 或 \opt{sub4section} 宏包选项(见
+% \ref{subs:options-heading}~节)会影响 \opt{aftertitle} 选项的默认值。
% \end{function}
%
-% \begin{function}{part/beforeskip, chapter/beforeskip, section/beforeskip,
-% subsection/beforeskip, subsubsection/beforeskip, paragraph/beforeskip,
-% subparagraph/beforeskip}
+% \begin{table}[htbp]
+% \begin{minipage}[t]{.5\linewidth}
+% \small\centering
+% \caption{\opt{aftertitle} 选项的默认设置}
+% \begin{tabular}{ll}
+% \toprule
+% 标题名 & 默认值 \\
+% \midrule
+% part & |\par| \\
+% chapter & |\par| \\
+% section & |\@@par| \\
+% subsection & |\@@par| \\
+% subsubsection & |\@@par| \\
+% paragraph & |{}| \\
+% \qquad(sub3section) & |\@@par| \\
+% \qquad(sub4section) & 同上 \\
+% subparagraph & |{}| \\
+% \qquad(sub4section) & |\@@par| \\
+% \bottomrule
+% \end{tabular}
+% \end{minipage}%
+% \begin{minipage}[t]{.5\linewidth}
+% \small\centering
+% \caption{\opt{runin} 选项的默认设置}
+% \begin{tabular}{ll}
+% \toprule
+% 标题名 & 默认值 \\
+% \midrule
+% part & 无效 \\
+% chapter & 无效 \\
+% section & |false| \\
+% subsection & |false| \\
+% subsubsection & |false| \\
+% paragraph & |true| \\
+% \qquad(sub3section) & |false| \\
+% \qquad(sub4section) & 同上 \\
+% subparagraph & |true| \\
+% \qquad(sub4section) & |false| \\
+% \bottomrule
+% \end{tabular}
+% \end{minipage}
+% \end{table}
+%
+% \begin{function}[EXP,added=2015-06-27]{section/runin, subsection/runin,
+% subsubsection/runin, paragraph/runin, subparagraph/runin}
% \begin{syntax}
-% beforeskip = \Arg{弹性间距}
-% \OSET
+% runin = \TF
+% \end{syntax}
+% \opt{runin} 选项只对 \tn{section} 级以下标题有意义。
+% 用于确定标题与随后的正文是否排在同一段之上。
+%
+% \opt{runin} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
+%
+% 默认情况下,\tn{paragraph}、\tn{subparagraph} 两级标题是与后面正文排在同一
+% 段的,\opt{runin} 选项为 \opt{true};但使用 \opt{sub3section} 或
+% \opt{sub4section} 宏包选项(见 \ref{subs:options-heading}~节)后,
+% 将对这两级标题设 \opt{runin} 选项为 \opt{false},这两级标题会改为排在不同段。
+% \end{function}
+%
+% \begin{function}[EXP,added=2015-06-27]{.../afterindent}
+% \begin{syntax}
+% afterindent = \TF
% \end{syntax}
-% \opt{beforeskip} 选项用于设置章节标题前的垂直间距及章节标题后首段的缩进。
+% \opt{afterindent} 选项用于设置章节标题后首段的缩进。
%
-% \meta{弹性间距} 的绝对值被用于设置标题间的垂直间距,而 \meta{弹性间距} 的正
-% 负号用于设置标题后第一段的首行缩进。当参数是负值时,章节标题后的第一段按英
-% 文文档的排版习惯,没有首行缩进;参数是正值时,则保留首行缩进。
+% \cls{book} 和 \cls{report} 类的 \tn{part} 标题被单独排在一页之上,
+% \opt{afterindent} 选项没有意义。
%
-% 使用 \opt{sub3section} 或 \opt{sub4section} 宏包选项(见
-% \ref{subs:options-heading}~节)后,\tn{paragraph} 与 \tn{subparagraph}
-% 这两级标题会改为排在不同段,会影响 \opt{beforeskip} 选项的默认值。
+% 对于 \tn{section} 级以下标题,若设置了 \opt{runin} 选项为 \opt{true},
+% 即标题与随后正文排在同一段,\opt{afterindent} 选项也就没有了意义。
% \end{function}
%
% \begin{table}[htbp]
% \small\centering
-% \caption{\opt{beforeskip} 选项的默认设置}
+% \caption{\opt{afterindent} 选项的默认设置}
% \begin{tabular}{lll}
% \toprule
-% 标题名 & \opt{scheme = chinese} &
-% \opt{scheme = plain} \\
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
% \midrule
-% part (article) & |4ex| & |-4ex| \\
+% part (article) & |true| & |false| \\
% part & 无效 & 无效 \\
-% chapter & |50pt| & |-50pt| \\
-% section & |3.5ex plus 1ex minus .2ex| & |-3.5ex plus -1ex minus -.2ex| \\
-% subsection & |3.25ex plus 1ex minus .2ex| & |-3.25ex plus -1ex minus -.2ex| \\
-% subsubsection & |3.25ex plus 1ex minus .2ex| & |-3.25ex plus -1ex minus -.2ex| \\
-% paragraph & 同右 & |3.25ex plus 1ex minus .2ex| \\
-% \qquad(sub3section) & |3.25ex plus 1ex minus .2ex| & |-3.25ex plus -1ex minus -.2ex| \\
-% \qquad(sub4section) & 同上 & 同上 \\
-% subparagraph & 同右 & |3.25ex plus 1ex minus .2ex| \\
-% \qquad(sub4section) & |3.25ex plus 1ex minus .2ex| & |-3.25ex plus -1ex minus -.2ex| \\
+% chapter & |true| & |false| \\
+% section & |true| & |false| \\
+% subsection & |true| & |false| \\
+% subsubsection & |true| & |false| \\
+% paragraph & |true| & |false| \\
+% subparagraph & |true| & |false| \\
% \bottomrule
% \end{tabular}
% \end{table}
%
-% \begin{function}{part/afterskip, chapter/afterskip, section/afterskip,
-% subsection/afterskip, subsubsection/afterskip, paragraph/afterskip,
-% subparagraph/afterskip}
+% \begin{function}[EXP,updated=2015-06-27]{.../beforeskip}
% \begin{syntax}
-% afterskip = \Arg{弹性间距}
-% \OSET
+% beforeskip = \Arg{弹性间距}
% \end{syntax}
-% \opt{afterskip} 选项控制章节标题与后面下方之间的距离。\meta{弹性间距} 的正
-% 负号确定标题与后面正文是否排在同一段。如果是正值则正文另起一段,\meta{弹性
-% 间距} 给出垂直间距;如果是负值则章节标题与正文第一段排在同一段,\meta{弹性
-% 间距} 的绝对值给出水平间距。
+% \opt{beforeskip} 选项用于设置章节标题前的垂直间距。
%
-% 默认情况下,\tn{paragraph}、\tn{subparagraph} 两级标题是与后面正文排在同一
-% 段的,\opt{afterskip} 选项取负数;但使用 \opt{sub3section} 或
-% \opt{sub4section} 宏包选项(见 \ref{subs:options-heading}~节)后,则这
-% 两级标题会改为排在不同段。
-%
-% \opt{afterskip} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
+% \opt{beforeskip} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
% \end{function}
%
% \begin{table}[htbp]
-% \begin{minipage}[t]{.5\linewidth}
% \small\centering
-% \caption{\opt{aftertitle} 选项的默认设置}
+% \caption{\opt{beforeskip} 选项的默认设置}
% \begin{tabular}{ll}
% \toprule
% 标题名 & 默认值 \\
% \midrule
-% part & |\par| \\
-% chapter & |\par| \\
-% section & |\@@par| \\
-% subsection & |\@@par| \\
-% subsubsection & |\@@par| \\
-% paragraph & |{}| \\
-% \qquad(sub3section) & |\@@par| \\
-% \qquad(sub4section) & 同上 \\
-% subparagraph & |{}| \\
-% \qquad(sub4section) & |\@@par| \\
+% part (article) & |4ex| \\
+% part & |0pt plus 1fil| \\
+% chapter & |50pt| \\
+% section & |3.5ex plus 1ex minus .2ex| \\
+% subsection & |3.25ex plus 1ex minus .2ex| \\
+% subsubsection & |3.25ex plus 1ex minus .2ex| \\
+% paragraph & |3.25ex plus 1ex minus .2ex| \\
+% subparagraph & |3.25ex plus 1ex minus .2ex| \\
% \bottomrule
% \end{tabular}
-% \end{minipage}%
+% \end{table}
+%
+% \begin{function}[EXP,updated=2015-06-27]{.../afterskip}
+% \begin{syntax}
+% afterskip = \Arg{弹性间距}
+% \end{syntax}
+% \opt{afterskip} 选项控制章节标题与后面下方之间的距离。
+%
+% 对于 \tn{section} 级以下标题,\opt{runin} 选项会影响 \opt{afterskip} 选项的意义:
+% 若 \opt{runin} 为 \opt{true},标题与随后正文排在同一段,\meta{弹性间距} 给出水平间距。
+% 否则,正文另起一段,\meta{弹性间距} 给出的是垂直间距。
+%
+% \opt{afterskip} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
+%
+% \opt{sub3section} 或 \opt{sub4section} 宏包选项(见
+% \ref{subs:options-heading}~节)会影响 \opt{aftertitle} 选项的默认值。
+% \end{function}
+%
+% \begin{table}[htbp]
% \begin{minipage}[t]{.5\linewidth}
% \small\centering
% \caption{\opt{afterskip} 选项的默认设置}
@@ -2143,33 +2176,51 @@ This package consists of the file ctex.dtx, and the derived files
% 标题名 & 默认值 \\
% \midrule
% part (article) & |3ex| \\
-% part & 无效 \\
+% part & |0pt plus 1fil| \\
% chapter & |40pt| \\
% section & |2.3ex plus .2ex| \\
% subsection & |1.5ex plus .2ex| \\
% subsubsection & |1.5ex plus .2ex| \\
-% paragraph & |-1em| \\
+% paragraph & |1em| \\
% \qquad(sub3section) & |1ex plus .2ex| \\
% \qquad(sub4section) & 同上 \\
-% subparagraph & |-1em| \\
+% subparagraph & |1em| \\
% \qquad(sub4section) & |1ex plus .2ex| \\
% \bottomrule
% \end{tabular}
% \end{minipage}%
+% \begin{minipage}[t]{.5\linewidth}
+% \small\centering
+% \caption{\opt{indent} 选项的默认设置}
+% \begin{tabular}{ll}
+% \toprule
+% 标题名 & 默认值 \\
+% \midrule
+% part (article) & |0pt| \\
+% part & 无效 \\
+% chapter & |0pt| \\
+% section & |0pt| \\
+% subsection & |0pt| \\
+% subsubsection & |0pt| \\
+% paragraph & |0pt| \\
+% subparagraph & |\parindent| \\
+% \qquad(sub3section) & |0pt| \\
+% \qquad(sub4section) & 同上 \\
+% \bottomrule
+% \end{tabular}
+% \end{minipage}
% \end{table}
%
-% \begin{function}{part/indent, chapter/indent, section/indent,
-% subsection/indent, subsubsection/indent, paragraph/indent,
-% subparagraph/indent}
+% \begin{function}[EXP,updated=2015-06-27]{.../indent}
% \begin{syntax}
% indent = \Arg{缩进间距}
-% \OSET
% \end{syntax}
% \opt{indent} 选项用于设置章节标题本身的首行缩进。
%
% \opt{indent} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
-% \end{function}
%
+% 例如,设置 \tn{section} 标题缩进 \SI{20}{pt}:
+% \end{function}
% \begin{ctexexam}
% \ctexset{section={
% format=\Large\bfseries,
@@ -2180,28 +2231,15 @@ This package consists of the file ctex.dtx, and the derived files
% \noindent 无缩进的正文。
% \end{ctexexam}
%
+% \begin{function}[EXP,added=2014-03-21]{part/pagestyle, chapter/pagestyle}
+% \begin{syntax}
+% pagestyle = \Arg{页面格式}
+% \end{syntax}
+% 设置 \cls{book}/\cls{ctexbook} 或 \cls{report}/\cls{ctexrep} 文档类
+% 中,\tn{part} 与 \tn{chapter} 标题所在页的页面格式(page style)。
+% \end{function}
+%
% \begin{table}[htbp]
-% \begin{minipage}[t]{.5\linewidth}
-% \small\centering
-% \caption{\opt{indent} 选项的默认设置}
-% \begin{tabular}{ll}
-% \toprule
-% 标题名 & 默认值 \\
-% \midrule
-% part (article) & |0pt| \\
-% part & 无效 \\
-% chapter & |0pt| \\
-% section & |0pt| \\
-% subsection & |0pt| \\
-% subsubsection & |0pt| \\
-% paragraph & |0pt| \\
-% subparagraph & |\parindent| \\
-% \qquad(sub3section) & |0pt| \\
-% \qquad(sub4section) & |0pt| \\
-% \bottomrule
-% \end{tabular}
-% \end{minipage}%
-% \begin{minipage}[t]{.5\linewidth}
% \small\centering
% \caption{\opt{pagestyle} 选项的默认设置}
% \begin{tabular}{ll}
@@ -2213,26 +2251,27 @@ This package consists of the file ctex.dtx, and the derived files
% chapter & |plain| \\
% \bottomrule
% \end{tabular}
-% \end{minipage}%
% \end{table}
%
-% \begin{function}{part/pagestyle, chapter/pagestyle}
+% \begin{function}[EXP,added=2015-06-21]{appendix/numbering}
% \begin{syntax}
-% pagestyle = \Arg{页面格式}
-% \OSET
+% numbering = \TTF
% \end{syntax}
-% 设置 \cls{book}/\cls{ctexbook} 或 \cls{report}/\cls{ctexrep} 文档类
-% 中,\tn{part} 与 \tn{chapter} 标题所在页的页面格式(page style)。
+% 控制是否对附录章(对 \cls{book} 与 \cls{report})或附录节(对 \cls{article})
+% 进行编号。
+%
+% 用法与普通章节 \opt{numbering} 选项类似。
% \end{function}
%
-% \begin{function}{appendix/name}
+% \begin{function}[updated=2014-03-08]{appendix/name}
% \begin{syntax}
% name = \{<前名字>,<后名字>\}
% name = \Arg{前名字}
-% \OSET
% \end{syntax}
% 设置附录章(对 \cls{book} 与 \cls{report})或附录节(对 \cls{article})的
-% 名字。用法与普通章节 \opt{name} 选项类似。
+% 名字。
+%
+% 用法与普通章节 \opt{name} 选项类似。
%
% 注意该选项与 \opt{appendixname} 选项(\ref{subs:capname}~节)在意义上有
% 些重叠,但意义不同。\opt{appendixname} 选项只用来重定义
@@ -2255,13 +2294,14 @@ This package consists of the file ctex.dtx, and the derived files
% \end{tabular}
% \end{table}
%
-% \begin{function}{appendix/number}
+% \begin{function}[EXP]{appendix/number}
% \begin{syntax}
% number = \Arg{数字输出命令}
-% \OSET
% \end{syntax}
% 设置附录章(对 \cls{book} 与 \cls{report})或附录节(对 \cls{article})编
-% 号的数字输出格式。用法与普通章节的 \opt{number} 选项类似。
+% 号的数字输出格式。
+%
+% 用法与普通章节的 \opt{number} 选项类似。
%
% 该选项也同时控制附录章节计数器的交叉引用。
%
@@ -2287,12 +2327,11 @@ This package consists of the file ctex.dtx, and the derived files
% \begin{ctexexam}[labelref=exam:miscopt]
% \ctexset {
% chapter = {
-% format = \Huge\bfseries,
-% nameformat = \hrule height 1bp \relax\bigskip\hfill\chapternamebox,
-% number = \arabic{chapter},
-% aftername = \par\medskip,
-% titleformat = {},
-% aftertitle = \bigskip\hrule height 2bp \relax
+% format = \Huge\bfseries,
+% nameformat = \hrule height 1bp \relax\bigskip\hfill\chapternamebox,
+% number = \arabic{chapter},
+% aftername = \par\medskip,
+% aftertitle = \bigskip\hrule height 2bp \relax
% }
% }
% \newcommand\chapternamebox[1]{%
@@ -2316,15 +2355,15 @@ This package consists of the file ctex.dtx, and the derived files
% \label{sec:useful-commands}
% \subsection{字号与间距}
%
-% \begin{function}{\zihao}
+% \begin{function}[updated=2014-03-08]{\zihao}
% \begin{syntax}
-% \tn{zihao}\Arg{字号}
+% \tn{zihao} \Arg{字号}
% \end{syntax}
% 用于调整字号大小。其中 \meta{字号} 的有效值共有 16 个,如表 \ref{tab:zihao}
% 所示。使用 \tn{zihao} 命令调整字体大小时,西文字号大小会始终和中文字号保持一致。
% \end{function}
%
-% \begin{table}[htbp]
+% \begin{table}[!htbp]
% \centering
% \def\ZH#1{\zihaopt{#1} & \zihao{#1}}
% \tabcolsep=1em
@@ -2354,9 +2393,9 @@ This package consists of the file ctex.dtx, and the derived files
% \end{tabular}
% \end{table}
%
-% \begin{function}{\ziju}
+% \begin{function}[updated=2014-03-28]{\ziju}
% \begin{syntax}
-% \tn{ziju}\Arg{中文字符宽度的倍数}
+% \tn{ziju} \Arg{中文字符宽度的倍数}
% \end{syntax}
% 用于调整相邻汉字之间的间距,即(在正常中文行文中)前一个汉字的右边缘与后一个汉字
% 的左边缘之间的距离。其中参数可以是任意浮点数值;而中文字符宽度指的是实际汉字的
@@ -2365,22 +2404,17 @@ This package consists of the file ctex.dtx, and the derived files
% 这个命令会影响 \tn{ccwd} 的值,但不会影响英文字距。
% \end{function}
%
-% \begin{function}{\ccwd}
+% \begin{function}[updated=2014-03-27]{\ccwd}
% 当前汉字的字宽保存在长度寄存器 \tn{ccwd} 之中。汉字字宽是相邻两个汉字中心
% 之间的距离,包含字距在内。因此修改字距会间接修改字宽。
% \end{function}
%
-% \begin{function}{\CTEXsetfont}
-% 更新当前的中文字体信息,包括当前字距(\tn{ccwd})和段首缩进(\tn{parindent})。
-% 一般来说,用户无需使用这个命令。
-% \end{function}
-%
% \subsection{中文数字转换}
%
% \CTeX{} 宏集的中文数字转换功能实际上是调用 \pkg{zhnumber} 宏包来完成。下面只
% 介绍一些基本的用法,更高级的用法可以查阅 \pkg{zhnumber} 宏包的文档。
%
-% \begin{function}{\chinese}
+% \begin{function}[updated=2014-03-08]{\chinese}
% \begin{syntax}
% \tn{chinese} \Arg{counter}
% \end{syntax}
@@ -2388,14 +2422,14 @@ This package consists of the file ctex.dtx, and the derived files
% 计数器上,将计数器的值以中文数字的形式输出。
% \end{function}
%
-% \begin{function}{\zhnumber}
+% \begin{function}[added=2014-03-08]{\zhnumber}
% \begin{syntax}
% \tn{zhnumber} \Arg{number}
% \end{syntax}
% 以中文格式输出数字。这里的数字可以是整数、小数和分数。
% \end{function}
%
-% \begin{function}{\zhdigits}
+% \begin{function}[added=2014-03-08]{\zhdigits}
% \begin{syntax}
% \tn{zhdigits} \Arg{number}
% \end{syntax}
@@ -2444,7 +2478,7 @@ This package consists of the file ctex.dtx, and the derived files
%
% \subsection{\LuaLaTeX{} 下替代字体的设置}
%
-% \begin{function}{AlternateFont}
+% \begin{function}[added=2014-04-14]{AlternateFont}
% \begin{syntax}
% \tn{setCJKfamilyfont} \Arg{family}
% \ [
@@ -2461,7 +2495,7 @@ This package consists of the file ctex.dtx, and the derived files
% \meta{character range_n} 内,对应字形的替代字体。
% \end{function}
%
-% \begin{function}{CharRange}
+% \begin{function}[added=2014-04-14]{CharRange}
% \begin{syntax}
% \tn{setCJKfamilyfont} \Arg{family}
% \ [
@@ -2482,7 +2516,7 @@ This package consists of the file ctex.dtx, and the derived files
% \setCJKmainfont[CharRange={"6800->"9FFF}, ...]{...}
% \end{ctexexam}
%
-% \begin{function}{declarecharrange}
+% \begin{function}[EXP,added=2014-04-14]{declarecharrange}
% \begin{syntax}
% \tn{ctexset}
% \ \{
@@ -2508,7 +2542,7 @@ This package consists of the file ctex.dtx, and the derived files
% 一起使用。如果没有给 \meta{name} 设置值,则等价于设置 \opt{CharRange=\meta{name}},
% 即只设置 \meta{name} 对应的字符范围的替代字体。
%
-% \begin{function}{clearalternatefont,resetalternatefont}
+% \begin{function}[EXP,added=2014-04-15]{clearalternatefont,resetalternatefont}
% \begin{syntax}
% \tn{ctexset}
% \ \{
@@ -2538,12 +2572,12 @@ This package consists of the file ctex.dtx, and the derived files
% 与本机不同。
% \end{itemize}
%
-% 与 \CTeX{} 宏集的源代码一样,配置文件采用 \LaTeX3 的语法编写。
+% 与 \CTeX{} 宏集的源代码一样,配置文件采用 \LaTeXiii{} 的语法编写。
%
% \CTeX{} 宏集的配置文件随宏包其他文件一起安装在 \TeX{} 系统 TDS 目录树中,文
% 件后缀是 \file{.cfg}。为了避免本地配置文件内容因 \CTeX{} 宏集的更新而丢失,
% 不要直接修改系统 TDS 目录树中的配置文件,而应该将系统自带的配置文件复制到本
-% 地的或用户私有的 TDS 目录树中修改,并运行 |texhash| 命令刷新文件名数据库。
+% 地的或用户私有的 TDS 目录树中修改,并运行 \bashcmd{texhash} 命令刷新文件名数据库。
%
% 例如对于 \TeX{} Live,系统自带的配置文件就在 \TeX{} Live 安装目录下的
% \path{texmf-dist/tex/latex/ctex/config/} 子目录下,可以修改它的副本,保存在
@@ -2551,8 +2585,8 @@ This package consists of the file ctex.dtx, and the derived files
% \path{~/.texlive2015/texmf-var/tex/latex/ctex/} 目录下,作为本地/用户专有的
% 配置文件。复制配置文件后需要运行 |texhash| 命令使本地配置文件生效。
%
-% \hologo{MiKTeX} 的配置文件也保存在类似的目录结构中,\hologo{MiKTeX} 管理的
-% 几个 TDS 根目录可以在 \hologo{MiKTeX} Options 设置项中查看到,这里不再赘述。
+% \MiKTeX{} 的配置文件也保存在类似的目录结构中,\MiKTeX{} 管理的
+% 几个 TDS 根目录可以在 \MiKTeX{} Options 设置项中查看到,这里不再赘述。
%
% 除了修改本地 \TeX{} 系统中的配置文件,对于特定文档,也可以将修改过的配置文件
% 保存在文档的工作目录下。此时配置文件就只对工作目录下的所有文档生效。
@@ -2568,7 +2602,7 @@ This package consists of the file ctex.dtx, and the derived files
% % 该设置可以用在安装了 Windows 字体的非 Windows 系统中。
% \keys_set:nn { ctex / option } { fontset = windowsnew }
% \end{ctexexam}
-% 如上例所示,宏包选项通常使用 \LaTeX3 的 \cs{keys_set:nn} 命令完成键值设置,
+% 如上例所示,宏包选项通常使用 \LaTeXiii{} 的 \cs{keys_set:nn} 命令完成键值设置,
% 第一个参数是固定的子模块 |ctex/option|,第二个参数中是用户定义的新的默认宏包
% 选项。
%
@@ -2579,7 +2613,7 @@ This package consists of the file ctex.dtx, and the derived files
%
% 配置文件 \file{ctex.cfg} 将在宏包的末尾被载入生效。可以用它完成任意的设置,
% 或是覆盖已有的定义。随系统安装的配置文件除版本信息外没有实际内容,注意配置文
-% 件中也使用 \LaTeX3 语法。
+% 件中也使用 \LaTeXiii{} 语法。
%
% \begin{ctexexam}
% % 简单的 ctex.cfg 内容示例。
@@ -2652,14 +2686,11 @@ This package consists of the file ctex.dtx, and the derived files
% \end{function}
%
% \begin{function}{indent, noindent}
-% \opt{indent} 什么也不做,\pkg{ctex} 宏包的相关功能在与标准文档类及其衍生
-% 文档类联用时默认打开;\CTeX{} 文档类的相关功能由章节
-% \opt{beforeskip} 选项的值来确定。过时选项。
-%
-% \opt{noindent} 什么也不做,也不会使章节首行停止缩进。需要使用 \tn{ctexset}
-% 命令设置章节的 \opt{beforeskip} 选项为正数才能完成原来 \opt{noindent} 选项的
-% 工作。另外,设置 \opt{scheme = plain} 可以保持原有英文文档类的效果,使章节首行停止缩
-% 进。过时选项。
+% \opt{indent} 和 \opt{noindent} 什么也不做,过时选项。
+%
+% 在中文版式下,\pkg{ctex} 宏包的相关功能在与标准文档类及其衍生文档类联用时
+% 默认打开。\CTeX{} 文档类的相关功能由章节标题的 \opt{afterindent} 选项的值
+% 来确定。
% \end{function}
%
% \begin{function}{zhmap, nozhmap}
@@ -2735,6 +2766,11 @@ This package consists of the file ctex.dtx, and the derived files
% 在新版本中,上述由 \opt{fntef} 衍生的相关宏都成为过时命令。
% \end{function}
%
+% \begin{function}{\CTEXsetfont}
+% 更新当前的中文字体信息,包括当前字距(\tn{ccwd})和段首缩进(\tn{parindent})。
+% 一般来说,用户无需使用这个命令。
+% \end{function}
+%
% \begin{function}{\CTEXindent}
% 更新 \tn{ccwd} 宽度后设置 |\parindent=2\ccwd|。过时命令。
% \end{function}
@@ -2781,7 +2817,6 @@ This package consists of the file ctex.dtx, and the derived files
% \end{ctexexam}
% \end{function}
%
-%
% \subsection{\CTeX\ 1.02c 以后的 SVN 开发版}
%
% \CTeX 宏包在 1.02c 版本(2011/03/11)之后在 Google code 上的 SVN 开发版本,
@@ -2790,6 +2825,105 @@ This package consists of the file ctex.dtx, and the derived files
%
% \CTeX 宏包第 2 版不保证对未发布的 SVN 开发版兼容。
%
+% \subsection{\CTeX\ 2.2 之前的版本}
+%
+% \begin{function}{part/beforeskip, chapter/beforeskip, section/beforeskip,
+% subsection/beforeskip, subsubsection/beforeskip, paragraph/beforeskip,
+% subparagraph/beforeskip}
+% 在 \CTeX\ 2.2 之前的版本中,\opt{beforeskip} 选项的符号还用于确定章节标题后
+% 首段的缩进。当 \opt{beforeskip} 是负值时,章节标题后的第一段按英文文档的排版
+% 习惯,没有首行缩进,否则保留首行缩进。
+%
+% 这一特性在 2.2 版和后续版本中不再保留,相应的功能通过新的 \opt{afterindent}
+% 选项来设置。如果原先设置 \opt{beforeskip} 为负值,在新版本中需要改为正值,
+% 并设置相应的 \opt{afterindent} 选项为 \opt{false}。
+% \end{function}
+%
+% \begin{function}{section/afterskip, subsection/afterskip,
+% subsubsection/afterskip, paragraph/afterskip, subparagraph/afterskip}
+% 在 \CTeX\ 2.2 之前的版本中,对于 \tn{section} 级以下标题,\opt{afterskip}
+% 选项的符号用于确定标题与随后正文是否排在同一段。
+% 如果是正值,则正文另起一段,否则标题与随后正文排在同一段,
+% \opt{afterskip} 的绝对值给出水平间距。
+%
+% 这一特性在 2.2 版和后续版本中不再保留,相应的功能通过新的 \opt{runin}
+% 选项来设置。如果原先设置 \opt{afterskip} 为负值,在新版本中需要改为正值,
+% 并设置相应的 \opt{runin} 选项为 \opt{true}。
+% \end{function}
+%
+% \section{宏集依赖情况与手工安装方法}
+% \label{sec:dep-ins}
+%
+% 本节介绍 \CTeX{} 宏集的依赖情况,并介绍手工编译安装的具体方法。
+% 通常用户只需参照第 \ref{subsec:easy-ins}~节介绍的方法,使用发行版自带的宏包管理器安装
+% 本宏集。
+%
+% \CTeX{} 宏集有两个源文件:\file{ctex.dtx}、\file{ctexpunct.spa}。
+% 使用不同的编译方式时,\CTeX{} 依赖的宏包略有不同。在手工安装 \CTeX{} 宏集之前,请确保
+% 你的 \TeX{} 发行版中已经正确安装了这些宏包。\CTeX{} 依赖宏包的详情叙述如下:
+%
+% \begin{itemize}
+% \item \pkg{expl3}、\pkg{xparse} 和 \pkg{l3keys2e} 宏包。它们属于 \pkg{l3kernel}
+% 和 \pkg{l3packages} 宏集,它们还依赖
+% \begin{itemize}
+% \item \pkg{etex} 宏包。
+% \end{itemize}
+% \item \pkg{indentfirst} 宏包,属于 \pkg{tools} 宏集。
+% \item \pkg{everysel} 宏包,属于 \pkg{ms} 宏集。
+% \item \pkg{zhnumber} 宏包。
+% \item[\ding{229}] 以上是各种编译方式都必需的依赖项。
+% \item \pkg{CJK} 宏集,它的下划线功能依赖 \pkg{ulem} 宏包。
+% \item \pkg{CJKpunct} 宏包。
+% \item \pkg{xCJK2uni} 宏包。
+% \item \pkg{zhmetrics} 宏包。
+% \item \pkg{zhmCJK} 宏包。
+% \item[\ding{229}] 以上是使用 \pdfLaTeX{} 或 \LaTeX{} + \dvipdfmx{} 的编译方式所需要
+% 的依赖项,其中 \pkg{zhmCJK} 是可选的。
+% \item \pkg{xeCJK} 宏包,它还依赖
+% \begin{itemize}
+% \item \pkg{fontspec} 宏包,它还依赖
+% \begin{itemize}
+% \item \pkg{euenc} 宏包。
+% \item \pkg{xunicode} 宏包,它还依赖 \pkg{tipa} 宏包。
+% \end{itemize}
+% \end{itemize}
+% \item[\ding{229}] 以上是使用 \XeLaTeX{} 编译时的依赖项。
+% \item \pkg{LuaTeX-ja} 宏集,它还依赖
+% \begin{itemize}
+% \item \pkg{oberdiek} 宏集。
+% \item \pkg{xkeyval} 宏包。
+% \item \pkg{lualibs} 宏包。
+% \item \pkg{luaotfload} 宏包,它还依赖 \pkg{luatexbase} 宏包。
+% \end{itemize}
+% \item[\ding{229}] 以上是使用 \LuaLaTeX{} 编译时的依赖项。
+% \end{itemize}
+%
+% 出于一些原因,\pkg{zhmCJK} 尚未被收入 \TeXLive{} 和 \MiKTeX。因此,若
+% 你希望使用 \pkg{zhmCJK} 作为 \CTeX{} 宏集的底层中文支持方式,那么你需要自行安装该宏包。
+% \pkg{zhmCJK} 的安装较为复杂。我们建议你
+% \begin{enumerate}
+% \item 从 CTAN 下载 \pkg{zhmCJK} 宏包的
+% \href{http://mirrors.ctan.org/install/language/chinese/zhmcjk.tds.zip}
+% {TDS 安装包},
+% \item 按目录结构将文件复制到 \TeX{} 发行版的本地 TDS 根目录,
+% \item 最后执行 \bashcmd{texhash} 刷新 \TeX{} 发行版的 ls-R 数据库以完成安装。
+% \end{enumerate}
+% 其他细节,可参照其
+% \href{http://mirrors.ctan.org/language/chinese/zhmcjk/zhmCJK.pdf}{宏包手册}
+% 中第 3 节的指导。
+%
+% \emph{\CTeX{} 宏集已被 \TeXLive{} 和 \MiKTeX{} 收录,若无特别理由,
+% 我们强烈建议用户使用宏包管理器安装本宏集。}
+%
+% 若要手工安装,请遵循如下步骤:
+% \begin{enumerate}
+% \item 从 CTAN 下载 \CTeX{} 宏集的
+% \href{http://mirrors.ctan.org/install/language/chinese/ctex.tds.zip}
+% {TDS 安装包},
+% \item 按目录结构将文件复制到 \TeX{} 发行版的本地 TDS 根目录,
+% \item 最后执行 \bashcmd{texhash} 刷新 \TeX{} 发行版的 ls-R 数据库以完成安装。
+% \end{enumerate}
+%
% \section{开发人员}
%
% \begin{itemize}
@@ -2803,6 +2937,9 @@ This package consists of the file ctex.dtx, and the derived files
% \item 黄晨成 (\email{liamhuang0205@gmail.com})
% \end{itemize}
%
+% 目前比较活跃的开发维护人员是刘海洋、李清和黄晨成。
+%
+%
% \begin{thebibliography}{9}
% \bibitem{knuthtex1986}
% \textsc{Donald~Ervin Knuth}.
@@ -2832,14 +2969,6 @@ This package consists of the file ctex.dtx, and the derived files
%<@@=ctex>
% \end{macrocode}
%
-% \pkg{ctexcap} 是默认打开 \opt{heading} 选项的 \pkg{ctex}。
-% \begin{macrocode}
-%<*ctexcap>
-\PassOptionsToPackage { heading = true } { ctexcap }
-\RequirePackageWithOptions { ctex }
-%</ctexcap>
-% \end{macrocode}
-%
% 宏包载入检查。
% \begin{macrocode}
%<*class|ctex>
@@ -2896,14 +3025,13 @@ This package consists of the file ctex.dtx, and the derived files
% \end{macrocode}
%
% \begin{macrocode}
-\RequirePackage { etoolbox }
+\RequirePackage { ctexhook , ctexpatch }
%<!ctexheading>\RequirePackage { fix-cm , everysel }
% \end{macrocode}
%
% \subsection{内部函数与变量}
%
-% \begin{variable}[int]
-% {\l_@@_tmp_tl,\l_@@_tmp_int,\l_@@_tmp_dim,\l_@@_tmp_box}
+% \begin{variable}[int]{\l_@@_tmp_tl,\l_@@_tmp_int,\l_@@_tmp_dim,\l_@@_tmp_box}
% \begin{macrocode}
\tl_new:N \l_@@_tmp_tl
\int_new:N \l_@@_tmp_int
@@ -2912,55 +3040,9 @@ This package consists of the file ctex.dtx, and the derived files
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}[int]{\ctex_at_end_package:nn}
-% 与 \pkg{filehook} 的 \tn{AtEndOfPackageFile*} 类似,如果原来没有在载入宏包则
-% 在宏包末尾执行语句,否则立即执行。
-% \begin{macrocode}
-\cs_new_protected:Npn \ctex_at_end_package:nn #1#2
- {
- \@ifpackageloaded {#1}
- {#2}
- { \ctex_gadd_hook:cn { g_@@_at_end_ #1 _hook_tl } {#2} }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[int]{\ctex_gadd_hook:Nn, \ctex_gadd_hook:cn}
-% 给钩子附加内容。
-% \begin{macrocode}
-\cs_new_protected:Npn \ctex_gadd_hook:Nn #1#2
- {
- \tl_if_exist:NF #1 { \tl_new:N #1 }
- \tl_gput_right:Nn #1 {#2}
- }
-\cs_generate_variant:Nn \ctex_gadd_hook:Nn { c }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[int]{\ctex_package_end_hook:n, \ctex_package_end_hook:o}
-% 宏包末尾钩子,只执行一次,用后清除。
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_package_end_hook:n #1
- {
- \cs_if_exist_use:cT { g_@@_at_end_ #1 _hook_tl }
- { \cs_undefine:c { g_@@_at_end_ #1 _hook_tl } }
- }
-\cs_generate_variant:Nn \ctex_package_end_hook:n { o }
-% \end{macrocode}
-% \end{macro}
-%
-% 对 \tn{@popfilename} 做补丁来实现 \cs{ctex_at_end_package:nn} 的功能。
-% \begin{macrocode}
-\tl_put_left:Nn \@popfilename
- {
- \cs_if_eq:NNT \@currext \@pkgextension
- { \ctex_package_end_hook:o { \@currname } }
- }
-% \end{macrocode}
-%
% \begin{macro}[int]{\ctex_file_wrapper:nnn}
% 设置文件操作的 \tn{catcode} 环境,参数 |#1| 是设置,|#2| 是文件操作,|#3| 是恢复。
-% 默认关闭 \LTXIII{} 语法环境,并设置 |@| 的 \tn{catcode} 为 $11$。
+% 默认关闭 \LaTeXiii{} 语法环境,并设置 |@| 的 \tn{catcode} 为 $11$。
% \begin{macrocode}
\cs_new_protected:Npn \ctex_file_wrapper:nnn #1#2#3
{
@@ -3009,128 +3091,6 @@ This package consists of the file ctex.dtx, and the derived files
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[int]{\ctex_parse_name:NN}
-% 用 \tn{DeclareRobustCommand} 定义的宏或者由 \tn{newcommand} 或 \tn{newrobustcmd}
-% 定义的带一个可选参数的宏第一次展开的结果都不是其实际定义,实际定义被保存在另外的
-% 宏中。由这些命令定义的宏的第一次展开结果可以有下面的形式(细节可查阅 \pkg{xpatch}
-% 的文档):
-% \begin{verbatim}[numbers=left,gobble=4]
-% \protect␣\xaa␣␣ % \DeclareRobustCommand\xaa[1]{...}
-% \protect␣\xab␣␣ % \DeclareRobustCommand\xab[1][]{...}
-% \@protected@testopt␣\xac␣\\xac␣{} % \newcommand\xac[1][]{...}
-% \@testopt␣\\xad␣{} % \newrobustcmd\xad[1][]{...}
-% \x@protect␣\1\protect␣\1␣␣ % \DeclareRobustCommand\1[1]{...}
-% \x@protect␣\2\protect␣\2␣␣ % \DeclareRobustCommand\2[1][]{...}
-% \@protected@testopt␣\3\\3␣{} % \newcommand\3[1][]{...}
-% \@testopt␣\\4␣{} % \newrobustcmd\4[1][]{...}
-% \end{verbatim}
-% \pkg{etoolbox} 的 \tn{patchcmd} 的主要原理是先对宏的 \tn{meaning} 作字符串
-% 替换,然后再用 \tn{scantokens} 来重建它。我们希望对宏的实际定义打补丁,为此需要
-% 先得到对应的名字。\pkg{letltxmacro}、\pkg{show2e} 和 \pkg{xpatch} 宏包中都有
-% 类似的工作。我们不想依赖 \pkg{xpatch},主要是因为它与同作者的 \pkg{regexpatch}
-% 宏包共用了主要函数的名字,从而将导致用户不能使用 \pkg{regexpatch}。
-% \begin{macrocode}
-\cs_new_protected:Npn \ctex_parse_name:NN #1#2
- { \ctex_parse_name:NNx #1#2 { \cs_to_str:N #2 } }
-\group_begin:
-\char_set_lccode:nn { `\< } { `\{ }
-\char_set_lccode:nn { `\/ } { `\\ }
-\char_set_lccode:nn { `\A } { `\t }
-\tl_map_function:nN { \A \E \S \O \P } \char_set_catcode_other:N
-\tex_lowercase:D
- {
- \group_end:
- \cs_new_protected:Npn \ctex_parse_name:NNn #1#2#3
- {
- \bool_if:nTF { \cs_if_exist_p:c { #3 ~ } || \cs_if_exist_p:c { /#3 } }
- {
- \group_begin:
- \use:x
- {
- \group_end:
- \@@_parse_name:nNNNnN { \token_get_replacement_spec:N #2 }
- \exp_not:N #2 \exp_not:c { #3 ~ } \exp_not:c { /#3 }
- } {#3} #1
- }
- { #1#2 }
- }
- \cs_new_protected:Npn \@@_parse_name:nNNNnN #1#2#3#4#5#6
- {
- \exp_args:Nc #6
- {
- \str_case:nnTF {#1}
- {
- { \protect #3 } { }
- { \x@protect #2 \protect #3 } { }
- }
- {
- \str_if_eq_x:nnTF { \exp_not:n { /@protected@ #3 /#3 } }
- {
- \exp_last_unbraced:Nf \@@_parse_name:w
- \token_get_replacement_spec:N #3 AESAOPA ~ < \q_stop
- }
- { /#5 ~ } { #5 ~ }
- }
- {
- \str_case:onTF { \@@_parse_name:w #1 AESAOPA ~ < \q_stop }
- {
- { /@protected@ #2 #4 } { }
- { /@ #4 } { }
- }
- { /#5 } {#5}
- }
- }
- }
- \cs_new:Npn \@@_parse_name:w #1 AESAOPA ~ #2 < #3 \q_stop { #1#2 }
- }
-\cs_generate_variant:Nn \ctex_parse_name:NNn { NNx }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[int]
-% {\ctex_patch_cmd:NnnTF,\ctex_preto_cmd:NnTF,\ctex_appto_cmd:NnTF}
-% 在打补丁前先解析实际名字。
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_patch_cmd:NnnTF { \ctex_parse_name:NN \patchcmd }
-\cs_new_protected_nopar:Npn \ctex_preto_cmd:NnTF { \ctex_parse_name:NN \pretocmd }
-\cs_new_protected_nopar:Npn \ctex_appto_cmd:NnTF { \ctex_parse_name:NN \apptocmd }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[int]{\ctex_patch_cmd:Nnn}
-% 参数记号 |#| 作为宏的参数被读入时,总是会双写,会影响随后的字符串替换。需要先
-% 将它转换为普通符号。并且在补丁的时候关闭 \LTXIII{} 语法。
-% \begin{macrocode}
-\cs_new_protected:Npn \ctex_patch_cmd:Nnn
- {
- \group_begin:
- \char_set_catcode_other:N \#
- \@@_patch_cmd:Nnn
- }
-\cs_new_protected:Npn \@@_patch_cmd:Nnn #1#2#3
- {
- \group_end:
- \group_begin:
- \ExplSyntaxOff
- \ctex_patch_cmd:NnnTF #1 {#2} {#3}
- {
- \cs_gset_eq:NN \@@_tmp:w #1
- \group_end:
- \cs_set_eq:NN #1 \@@_tmp:w
- \cs_undefine:N \@@_tmp:w
- }
- { \group_end: \ctex_patch_failure:N #1 }
- }
-\cs_new_protected:Npn \ctex_patch_failure:N #1
- { \msg_warning:nnx { ctex } { patch-failure } { \token_to_str:N #1 } }
-\msg_new:nnn { ctex } { patch-failure }
- {
- Patching~command~`#1'~failed.\\
- ctex~may~not~work~as~expected.
- }
-% \end{macrocode}
-% \end{macro}
-%
% \begin{variable}[int]{\g_@@_section_depth_flag}
% 若大于 |3|,则 \tn{paragraph} 和 \tn{subparagraph} 标题单独占一行;若为 |3|,则
% \tn{paragraph} 单独占一行。
@@ -3183,12 +3143,12 @@ This package consists of the file ctex.dtx, and the derived files
% \end{macro}
%
% \begin{macro}[int]{\ctex_if_preamble:TF}
-% 测试是否在 \LaTeXe{} 的导言区。在宏包内部初始为真,在 \tn{AfterEndPreamble}
-% 钩子中再设置为假。注意,\tn{AfterEndPreamble} 在 \tn{AtBeginDocument} 之后执行,
+% 测试是否在 \LaTeXe{} 的导言区。在宏包内部初始为真,文档最开始位置再设置为假。
+% 注意,钩子 \cs{ctex_after_end_preamble:n} 在 \tn{AtBeginDocument} 之后执行,
% 可以与 \tn{@onlypreamble} 的行为一致。
% \begin{macrocode}
\cs_new_eq:NN \ctex_if_preamble:TF \use_i:nn
-\AfterEndPreamble { \cs_set_eq:NN \ctex_if_preamble:TF \use_ii:nn }
+\ctex_after_end_preamble:n { \cs_set_eq:NN \ctex_if_preamble:TF \use_ii:nn }
% \end{macrocode}
% \end{macro}
%
@@ -3394,8 +3354,8 @@ This package consists of the file ctex.dtx, and the derived files
{
\msg_warning:nnn { ctex } { deprecated-option }
{
- The~ functionality~ has~ been~ removed.~
- It's~ better~ to~ set~ the~ heading~ styles~ via~ beforeskip~
+ The~ functionality~ has~ been~ removed.\\
+ It's~ better~ to~ set~ the~ heading~ styles~ via~ `afterindent'~
options.~
}
} ,
@@ -3404,8 +3364,8 @@ This package consists of the file ctex.dtx, and the derived files
{
\msg_warning:nnn { ctex } { deprecated-option }
{
- The~ functionality~ has~ been~ removed.~
- It's~ better~ to~ set~ the~ heading~ styles~ via~ beforeskip~
+ The~ functionality~ has~ been~ removed.\\
+ It's~ better~ to~ set~ the~ heading~ styles~ via~ `afterindent'~
options.
}
} ,
@@ -3625,7 +3585,7 @@ This package consists of the file ctex.dtx, and the derived files
\cs_if_exist:NF \hypersetup
{ \cs_new_eq:NN \hypersetup \ctex_hypersetup:n }
}
- \AtEndPreamble { \RequirePackage { hyperref } }
+ \ctex_at_end_preamble:n { \RequirePackage { hyperref } }
} ,
}
% \end{macrocode}
@@ -3831,14 +3791,13 @@ This package consists of the file ctex.dtx, and the derived files
\ctex_if_pdfmode:TF
{
\group_end:
- \ExplSyntaxOff
- \ctex_appto_cmd:NnTF \DeclareFontFamily { \CTEX@Family@CMap {#1} {#2} }
+ \ctex_appto_cmd:NnnTF \DeclareFontFamily { \ExplSyntaxOff }
+ { \CTEX@Family@CMap {#1} {#2} }
{
\ctex_at_end_package:nn { cmap }
{ \cs_gset_eq:NN \CTEX@Family@CMap \use_none:nn }
}
{ \ctex_patch_failure:N \DeclareFontFamily }
- \ExplSyntaxOn
}
{ \group_end: }
% \end{macrocode}
@@ -3881,13 +3840,20 @@ This package consists of the file ctex.dtx, and the derived files
\tl_if_exist:NF \CJKrmdefault { \tl_new:N \CJKrmdefault }
\tl_if_exist:NF \CJKsfdefault { \tl_new:N \CJKsfdefault }
\tl_if_exist:NF \CJKttdefault { \tl_new:N \CJKttdefault }
- \ctex_preto_cmd:NnTF \rmfamily { \CJKfamily { \CJKrmdefault } } { }
+ \ctex_preto_cmd:NnnTF \rmfamily { \ExplSyntaxOff }
+ { \CJKfamily { \CJKrmdefault } }
+ { }
{ \ctex_patch_failure:N \rmfamily }
- \ctex_preto_cmd:NnTF \sffamily { \CJKfamily { \CJKsfdefault } } { }
+ \ctex_preto_cmd:NnnTF \sffamily { \ExplSyntaxOff }
+ { \CJKfamily { \CJKsfdefault } }
+ { }
{ \ctex_patch_failure:N \sffamily }
- \ctex_preto_cmd:NnTF \ttfamily { \CJKfamily { \CJKttdefault } } { }
+ \ctex_preto_cmd:NnnTF \ttfamily { \ExplSyntaxOff }
+ { \CJKfamily { \CJKttdefault } }
+ { }
{ \ctex_patch_failure:N \ttfamily }
- \ctex_preto_cmd:NnTF \normalfont { \CJKfamily { \CJKfamilydefault } }
+ \ctex_preto_cmd:NnnTF \normalfont { \ExplSyntaxOff }
+ { \CJKfamily { \CJKfamilydefault } }
{ \cs_set_eq:NN \reset@font \normalfont }
{ \ctex_patch_failure:N \normalfont }
% \end{macrocode}
@@ -4006,7 +3972,7 @@ This package consists of the file ctex.dtx, and the derived files
% \tn{CJK@envStart}。这样可以避免将 \env{CJK} 环境内置入 \env{document} 环境的
% 最里层,最后也就不需要 \tn{clearpage}。\pkg{zhmCJK} 已经提供类似功能。
% \begin{macrocode}
- \exp_args:Nx \AtEndPreamble
+ \exp_args:Nx \ctex_at_end_preamble:n
{
\exp_not:N \CJK@envStart
{ } { \l_@@_encoding_tl } { \exp_not:N \CJKfamilydefault }
@@ -4995,13 +4961,20 @@ This package consists of the file ctex.dtx, and the derived files
\tl_if_exist:NF \CJKrmdefault { \tl_const:Nn \CJKrmdefault { rm } }
\tl_if_exist:NF \CJKsfdefault { \tl_const:Nn \CJKsfdefault { sf } }
\tl_if_exist:NF \CJKttdefault { \tl_const:Nn \CJKttdefault { tt } }
-\ctex_preto_cmd:NnTF \rmfamily { \CJKfamily { \CJKrmdefault } } { }
+\ctex_preto_cmd:NnnTF \rmfamily { \ExplSyntaxOff }
+ { \CJKfamily { \CJKrmdefault } }
+ { }
{ \ctex_patch_failure:N \rmfamily }
-\ctex_preto_cmd:NnTF \sffamily { \CJKfamily { \CJKsfdefault } } { }
+\ctex_preto_cmd:NnnTF \sffamily { \ExplSyntaxOff }
+ { \CJKfamily { \CJKsfdefault } }
+ { }
{ \ctex_patch_failure:N \sffamily }
-\ctex_preto_cmd:NnTF \ttfamily { \CJKfamily { \CJKttdefault } } { }
+\ctex_preto_cmd:NnnTF \ttfamily { \ExplSyntaxOff }
+ { \CJKfamily { \CJKttdefault } }
+ { }
{ \ctex_patch_failure:N \ttfamily }
-\ctex_preto_cmd:NnTF \normalfont { \CJKfamily { \CJKfamilydefault } }
+\ctex_preto_cmd:NnnTF \normalfont { \ExplSyntaxOff }
+ { \CJKfamily { \CJKfamilydefault } }
{ \cs_set_eq:NN \reset@font \normalfont }
{ \ctex_patch_failure:N \normalfont }
% \end{macrocode}
@@ -5549,8 +5522,11 @@ This package consists of the file ctex.dtx, and the derived files
% \begin{macrocode}
\AtBeginDocument
{
- \ctex_appto_cmd:NnTF \verbatim@font { \CTEX@verbatim@font@hook }
- { } { \ctex_patch_failure:N \verbatim@font }
+ \ctex_appto_cmd:NnnTF \verbatim@font
+ { \char_set_catcode_letter:n { 64 } }
+ { \CTEX@verbatim@font@hook }
+ { }
+ { \ctex_patch_failure:N \verbatim@font }
}
\cs_new_protected_nopar:Npn \CTEX@verbatim@font@hook
{ \ltjsetparameter { autospacing = false , autoxspacing = false } }
@@ -5597,7 +5573,7 @@ This package consists of the file ctex.dtx, and the derived files
\ctex_ltj_ensure_default_family:
%</luatex>
}
-\AtEndPreamble { \ctex_update_default_family: }
+\ctex_at_end_preamble:n { \ctex_update_default_family: }
% \end{macrocode}
% \end{macro}
%
@@ -5964,17 +5940,13 @@ This package consists of the file ctex.dtx, and the derived files
}
\cs_new_eq:NN \CTEX@selectfont@hook \prg_do_nothing:
\cs_new_eq:Nc \@@_save_selectfont: { selectfont ~ }
-\use:n
+\ctex_preto_cmd:NnnTF \selectfont { \ExplSyntaxOff }
+ { \CTEX@selectfont@hook }
{
- \ExplSyntaxOff
- \ctex_preto_cmd:NnTF \selectfont { \CTEX@selectfont@hook }
- {
- \tl_put_left:Nn \@EverySelectfont@Init
- { \cs_set_eq:cN { selectfont ~ } \@@_save_selectfont: }
- }
- { \ctex_patch_failure:N \selectfont }
+ \tl_put_left:Nn \@EverySelectfont@Init
+ { \cs_set_eq:cN { selectfont ~ } \@@_save_selectfont: }
}
-\ExplSyntaxOn
+ { \ctex_patch_failure:N \selectfont }
% \end{macrocode}
% \end{macro}
%
@@ -6129,6 +6101,8 @@ This package consists of the file ctex.dtx, and the derived files
% \end{macrocode}
% \end{macro}
%
+% \changes{v2.0}{2014/03/26}{新增 \opt{linestretch} 选项。}
+%
% \begin{macro}{linestretch}
% 若行宽不是汉字宽度的整数倍,自然要求伸展它们之间的差。这里设置的是在此基础上的
% 额外伸展量。初始化为一个汉字的宽度。若设置为 \tn{maxdimen},则禁用此功能。
@@ -6307,6 +6281,21 @@ This package consists of the file ctex.dtx, and the derived files
% \end{macrocode}
% \end{macro}
%
+% \changes{v2.2}{2015/06/29}{给 \pkg{enumitem} 宏包注册 \tn{chinese} 和
+% \tn{zhnum}。}
+%
+% 给 \pkg{enumitem} 宏包注册 \tn{chinese} 和 \tn{zhnum}。
+% \begin{macrocode}
+\ctex_at_end_package:nn { enumitem }
+ {
+ \cs_if_free:NF \AddEnumerateCounter
+ {
+ \AddEnumerateCounter * { \zhnum } { \zhnum_int:n } { 1 }
+ \AddEnumerateCounter * { \chinese } { \zhnum_int:n } { 1 }
+ }
+ }
+% \end{macrocode}
+%
% \begin{macro}{\CTEXnumber,\CTEXdigits}
% \begin{macrocode}
\NewDocumentCommand \CTEXnumber { m m }
@@ -6395,16 +6384,23 @@ This package consists of the file ctex.dtx, and the derived files
% \end{macrocode}
%
% \subsubsection{定义标题格式选项}
+
+%
+% \begin{variable}[int]{\c_@@_section_headings_seq}
+% 保存 \tn{section} 级以下标题名字。
+% \begin{macrocode}
+\seq_new:N \c_@@_section_headings_seq
+\seq_gset_from_clist:Nn \c_@@_section_headings_seq
+ { section , subsection , subsubsection , paragraph , subparagraph }
+% \end{macrocode}
+% \end{variable}
%
% \begin{variable}[int]{\c_@@_headings_seq}
% \begin{macrocode}
\seq_new:N \c_@@_headings_seq
-\seq_gset_from_clist:Nn \c_@@_headings_seq
- {
-%<article> part , section , subsection , subsubsection ,
-%<book|report> part , chapter , section , subsection , subsubsection ,
- paragraph , subparagraph
- }
+\seq_gset_eq:NN \c_@@_headings_seq \c_@@_section_headings_seq
+%<book|report>\seq_gput_left:Nn \c_@@_headings_seq { chapter }
+\seq_gput_left:Nn \c_@@_headings_seq { part }
% \end{macrocode}
% \end{variable}
%
@@ -6444,8 +6440,13 @@ This package consists of the file ctex.dtx, and the derived files
% \end{macro}
%
% \changes{v2.1}{2015/05/22}{\opt{format+}, \opt{nameformat+} 等带加号的选项,
-% 加号与前面的文字之间可以有可选的空格。}
+% 加号与前面的文字之间可以有可选的空格。}
% \changes{v2.1}{2015/06/19}{新的标题格式选项 \opt{aftertitle}。}
+% \changes{v2.2}{2015/06/21}{新的标题格式选项 \opt{numbering}。}
+% \changes{v2.2}{2015/06/27}{\opt{beforeskip} 和 \opt{afterskip} 选项的符号
+% 不再有特殊意义。}
+% \changes{v2.2}{2015/06/27}{新的标题格式选项 \opt{afterindent}。}
+% \changes{v2.2}{2015/06/27}{新的标题格式选项 \opt{runin}。}
%
% \begin{macro}[int]{\@@_def_heading_keys:n}
% \begin{macrocode}
@@ -6453,56 +6454,60 @@ This package consists of the file ctex.dtx, and the derived files
{
\tl_put_right:Nx \l_@@_tmp_tl
{
- #1 .meta:nn = { ctex / #1 } { ####1 } ,
- #1 / name .code:n =
+ #1 .meta:nn = { ctex / #1 } { ####1 } ,
+ #1 / name .code:n =
{ \ctex_assign_heading_name:nn {#1} { ####1 } } ,
- #1 / number .tl_set:N = \exp_not:c { CTEX@the#1 } ,
- #1 / format .tl_set:N = \exp_not:c { CTEX@#1@format } ,
- #1 / nameformat .tl_set:N = \exp_not:c { CTEX@#1@nameformat } ,
- #1 / numberformat .tl_set:N = \exp_not:c { CTEX@#1@numberformat } ,
- #1 / aftername .tl_set:N = \exp_not:c { CTEX@#1@aftername } ,
- #1 / titleformat .tl_set:N = \exp_not:c { CTEX@#1@titleformat } ,
- #1 / aftertitle .tl_set:N = \exp_not:c { CTEX@#1@aftertitle } ,
- #1 / beforeskip .tl_set:N = \exp_not:c { CTEX@#1@beforeskip } ,
- #1 / afterskip .tl_set:N = \exp_not:c { CTEX@#1@afterskip} ,
- #1 / indent .tl_set:N = \exp_not:c { CTEX@#1@indent } ,
- #1 / format+ .code:n =
+ #1 / number .tl_set:N = \exp_not:c { CTEX@the#1 } ,
+ #1 / format .tl_set:N = \exp_not:c { CTEX@#1@format } ,
+ #1 / nameformat .tl_set:N = \exp_not:c { CTEX@#1@nameformat } ,
+ #1 / numberformat .tl_set:N = \exp_not:c { CTEX@#1@numberformat } ,
+ #1 / aftername .tl_set:N = \exp_not:c { CTEX@#1@aftername } ,
+ #1 / titleformat .tl_set:N = \exp_not:c { CTEX@#1@titleformat } ,
+ #1 / aftertitle .tl_set:N = \exp_not:c { CTEX@#1@aftertitle } ,
+ #1 / beforeskip .tl_set:N = \exp_not:c { CTEX@#1@beforeskip } ,
+ #1 / afterskip .tl_set:N = \exp_not:c { CTEX@#1@afterskip} ,
+ #1 / indent .tl_set:N = \exp_not:c { CTEX@#1@indent } ,
+ #1 / numbering .bool_set:N = \exp_not:c { CTEX@#1@numbering } ,
+ #1 / afterindent .bool_set:N = \exp_not:c { CTEX@#1@afterindent } ,
+ #1 / runin .bool_set:N = \exp_not:c { CTEX@#1@runin } ,
+ #1 / format+ .code:n =
{ \tl_put_right:Nn \exp_not:c { CTEX@#1@format } { ####1 } } ,
- #1 / format~+ .code:n =
+ #1 / format~+ .code:n =
{ \tl_put_right:Nn \exp_not:c { CTEX@#1@format } { ####1 } } ,
- #1 / nameformat+ .code:n =
+ #1 / nameformat+ .code:n =
{ \tl_put_right:Nn \exp_not:c { CTEX@#1@nameformat } { ####1 } } ,
- #1 / nameformat~+ .code:n =
+ #1 / nameformat~+ .code:n =
{ \tl_put_right:Nn \exp_not:c { CTEX@#1@nameformat } { ####1 } } ,
- #1 / numberformat+ .code:n =
+ #1 / numberformat+ .code:n =
{ \tl_put_right:Nn \exp_not:c { CTEX@#1@numberformat } { ####1 } } ,
- #1 / numberformat~+ .code:n =
+ #1 / numberformat~+ .code:n =
{ \tl_put_right:Nn \exp_not:c { CTEX@#1@numberformat } { ####1 } } ,
- #1 / aftername+ .code:n =
+ #1 / aftername+ .code:n =
{ \tl_put_right:Nn \exp_not:c { CTEX@#1@aftername } { ####1 } } ,
- #1 / aftername~+ .code:n =
+ #1 / aftername~+ .code:n =
{ \tl_put_right:Nn \exp_not:c { CTEX@#1@aftername } { ####1 } } ,
- #1 / titleformat+ .code:n =
+ #1 / titleformat+ .code:n =
{ \tl_put_right:Nn \exp_not:c { CTEX@#1@titleformat } { ####1 } } ,
- #1 / titleformat~+ .code:n =
+ #1 / titleformat~+ .code:n =
{ \tl_put_right:Nn \exp_not:c { CTEX@#1@titleformat } { ####1 } } ,
- #1 / aftertitle+ .code:n =
+ #1 / aftertitle+ .code:n =
{ \tl_put_right:Nn \exp_not:c { CTEX@#1@aftertitle } { ####1 } } ,
- #1 / aftertitle~+ .code:n =
+ #1 / aftertitle~+ .code:n =
{ \tl_put_right:Nn \exp_not:c { CTEX@#1@aftertitle } { ####1 } } ,
- #1 / beforeskip .initial:n = \c_zero_skip ,
- #1 / afterskip .initial:n = \c_zero_skip ,
- #1 / indent .initial:n = \c_zero_dim ,
- #1 / beforeskip .value_required: ,
- #1 / afterskip .value_required: ,
- #1 / indent .value_required: ,
+ #1 / numbering .initial:n = true ,
+ #1 / beforeskip .initial:n = \c_zero_skip ,
+ #1 / afterskip .initial:n = \c_zero_skip ,
+ #1 / indent .initial:n = \c_zero_dim ,
+ #1 / beforeskip .value_required: ,
+ #1 / afterskip .value_required: ,
+ #1 / indent .value_required: ,
}
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\ctex_assign_heading_name:nn,\@@_assign_heading_name:nnn}
-% \opt{name} 的值是一个至多两个元素的逗号分隔列表。由于 \LTXIII{} 的
+% \opt{name} 的值是一个至多两个元素的逗号分隔列表。由于 \LaTeXiii{} 的
% \texttt{clist} 总是会自动忽略空元素,所以设置 |name={,章}| 后,第一个元素将会
% 是“章”,必须用空的分组保护空元素:|name={{},章}|,这在使用中有些许不便。我们
% 可以改用 \texttt{seq} 或者手写函数解析参数来加以改进。为实现的简单起见,这里用
@@ -6550,12 +6555,27 @@ This package consists of the file ctex.dtx, and the derived files
%
% \subsubsection{标准标题命令的修改}
%
+% \begin{macro}[int]{\CTEX@makeheadinganchor}
+% 用于 |numbering=false| 时,设置超链接跳转描点。
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \CTEX@makeheadinganchor { }
+\ctex_at_end_package:nn { hyperref }
+ { \cs_gset_protected_nopar:Npn \CTEX@makeheadinganchor { \phantomsection } }
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.2}{2015/06/27}{\opt{beforeskip}、\opt{afterskip} 和 \opt{indent}
+% 选项支持表达式。}
+%
% \paragraph{part 的标题}
%
% \begin{macrocode}
%<@@=>
% \end{macrocode}
%
+% \changes{v2.2}{2015/06/27}{非 \cls{ctexart} 类的 \opt{part/beforeskip} 和
+% \opt{part/afterskip} 选项有意义。}
+%
% \begin{macro}[int]{\part}
% \begin{macrocode}
%<*article>
@@ -6563,15 +6583,33 @@ This package consists of the file ctex.dtx, and the derived files
\if@noskipsec \leavevmode \fi
\par
% \addvspace{4ex}%
- \@tempskipa \CTEX@part@beforeskip \relax
- \ifdim \@tempskipa <\z@
- \@tempskipa -\@tempskipa \@afterindentfalse
- \else
+ \addvspace{\glueexpr\CTEX@part@beforeskip\relax}%
+ \ifodd \CTEX@part@afterindent
\@afterindenttrue
+ \else
+ \@afterindentfalse
\fi
- \addvspace{\@tempskipa}%
\secdef\@part\@spart}
%</article>
+%<*book|report>
+\renewcommand\part{%
+ \if@openright
+ \cleardoublepage
+ \else
+ \clearpage
+ \fi
+% \thispagestyle{plain}%
+ \thispagestyle{\CTEX@part@pagestyle}%
+ \if@twocolumn
+ \onecolumn
+ \@tempswatrue
+ \else
+ \@tempswafalse
+ \fi
+% \null\vfil
+ \null\vskip \glueexpr \CTEX@part@beforeskip \relax
+ \secdef\@part\@spart}
+%</book|report>
% \end{macrocode}
% \end{macro}
%
@@ -6580,40 +6618,44 @@ This package consists of the file ctex.dtx, and the derived files
%<*article>
\def\@part[#1]#2{%
\ifnum \c@secnumdepth >\m@ne
- \refstepcounter{part}%
-% \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
- \addcontentsline{toc}{part}{\CTEXthepart\hspace{1em}#1}%
+ \ifodd \CTEX@part@numbering
+ \refstepcounter{part}%
+% \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
+ \addcontentsline{toc}{part}{\CTEXthepart\hspace{1em}#1}%
+ \else
+ \CTEX@makeheadinganchor
+ \addcontentsline{toc}{part}{#1}%
+ \fi
\else
\addcontentsline{toc}{part}{#1}%
\fi
{\interlinepenalty \@M
% \normalfont \parindent \z@ \raggedright
- \normalfont \parindent \CTEX@part@indent \CTEX@part@format
- \ifnum \c@secnumdepth >\m@ne
+ \normalfont \parindent \dimexpr \CTEX@part@indent \relax \CTEX@part@format
+ \ifnum \c@secnumdepth >\m@ne \ifodd \CTEX@part@numbering
% \Large\bfseries\partname\nobreakspace\thepart\par\nobreak
\CTEX@partname
- \fi
+ \fi \fi
% \huge\bfseries #2%
\CTEX@part@titleformat{#2}%
\markboth{}{}%
\CTEX@part@aftertitle}%
\nobreak
% \vskip 3ex
- \vskip \CTEX@part@afterskip
+ \vskip \glueexpr \CTEX@part@afterskip \relax
\@afterheading}
%</article>
-% \end{macrocode}
-%
-% 标准文档类是在 \tn{part} 和 \tn{chapter} 定义的最开始设置 \tn{thispagestyle},
-% 我们这里的修改出现在它之后,可以覆盖之前的设置。
-% \begin{macrocode}
%<*book|report>
\def\@part[#1]#2{%
- \thispagestyle{\CTEX@part@pagestyle}%
\ifnum \c@secnumdepth >-2\relax
- \refstepcounter{part}%
-% \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
- \addcontentsline{toc}{part}{\CTEXthepart\hspace{1em}#1}%
+ \ifodd \CTEX@part@numbering
+ \refstepcounter{part}%
+% \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
+ \addcontentsline{toc}{part}{\CTEXthepart\hspace{1em}#1}%
+ \else
+ \CTEX@makeheadinganchor
+ \addcontentsline{toc}{part}{#1}%
+ \fi
\else
\addcontentsline{toc}{part}{#1}%
\fi
@@ -6621,10 +6663,10 @@ This package consists of the file ctex.dtx, and the derived files
{\interlinepenalty \@M
% \normalfont \centering
\normalfont \CTEX@part@format
- \ifnum \c@secnumdepth >-2\relax
+ \ifnum \c@secnumdepth >-2\relax \ifodd \CTEX@part@numbering
% \huge\bfseries\partname\nobreakspace\thepart\par\vskip 20\p@
\CTEX@partname
- \fi
+ \fi \fi
% \Huge\bfseries #2\par}%
\CTEX@part@titleformat{#2}%
\CTEX@part@aftertitle}%
@@ -6639,13 +6681,14 @@ This package consists of the file ctex.dtx, and the derived files
\def\@spart#1{%
{\interlinepenalty \@M
% \normalfont \parindent \z@ \raggedright
- \normalfont \parindent \CTEX@part@indent \CTEX@part@format
+ \normalfont \parindent \dimexpr \CTEX@part@indent \relax
+ \CTEX@part@format
% \huge \bfseries #1\par}%
\CTEX@part@titleformat{#1}%
\CTEX@part@aftertitle}%
\nobreak
% \vskip 3ex
- \vskip \CTEX@part@afterskip
+ \vskip \glueexpr \CTEX@part@afterskip \relax
\@afterheading}
%</article>
%<*book|report>
@@ -6661,23 +6704,65 @@ This package consists of the file ctex.dtx, and the derived files
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[int]{\@endpart}
+% \begin{macrocode}
+%<*book|report>
+\def\@endpart{%
+% \vfil
+ \vskip \glueexpr \CTEX@part@afterskip \relax
+ \newpage
+ \if@twoside
+ \if@openright
+ \null
+ \thispagestyle{empty}%
+ \newpage
+ \fi
+ \fi
+ \if@tempswa
+ \twocolumn
+ \fi}
+%</book|report>
+% \end{macrocode}
+% \end{macro}
+%
% \paragraph{chapter 的标题}
%
% \begin{macrocode}
%<*book|report>
% \end{macrocode}
%
+% \begin{macro}[int]{\chapter}
+% \begin{macrocode}
+\renewcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
+% \thispagestyle{plain}%
+ \thispagestyle{\CTEX@chapter@pagestyle}%
+ \global\@topnum\z@
+% \@afterindentfalse
+ \ifodd \CTEX@chapter@afterindent
+ \@afterindenttrue
+ \else
+ \@afterindentfalse
+ \fi
+ \secdef\@chapter\@schapter}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[int]{\@chapter}
% \begin{macrocode}
\def\@chapter[#1]#2{%
\ifnum \c@secnumdepth >\m@ne
%<book> \if@mainmatter
- \refstepcounter{chapter}%
-% \typeout{\@chapapp\space\thechapter.}%
- \typeout{\CTEXthechapter}%
- \addcontentsline{toc}{chapter}
-% {\protect\numberline{\thechapter}#1}%
- {\protect\numberline{\CTEXthechapter\hspace{0.3em}}#1}%
+ \ifodd \CTEX@chapter@numbering
+ \refstepcounter{chapter}%
+% \typeout{\@chapapp\space\thechapter.}%
+ \typeout{\CTEXthechapter}%
+ \addcontentsline{toc}{chapter}
+% {\protect\numberline{\thechapter}#1}%
+ {\protect\numberline{\CTEXthechapter\hspace{0.3em}}#1}%
+ \else
+ \CTEX@makeheadinganchor
+ \addcontentsline{toc}{chapter}{#1}%
+ \fi
%<book> \else
%<book> \addcontentsline{toc}{chapter}{#1}%
%<book> \fi
@@ -6699,21 +6784,17 @@ This package consists of the file ctex.dtx, and the derived files
% \begin{macro}[int]{\@makechapterhead}
% \begin{macrocode}
\def\@makechapterhead#1{%
- \thispagestyle{\CTEX@chapter@pagestyle}%
% \vspace*{50\p@}%
- \@tempskipa \CTEX@chapter@beforeskip \relax
- \ifdim \@tempskipa <\z@
- \@tempskipa -\@tempskipa \@afterindentfalse
- \else
- \@afterindenttrue
- \fi
- \vspace*{\@tempskipa}%
+ \vspace*{\glueexpr\CTEX@chapter@beforeskip\relax}%
% {\normalfont \parindent \z@ \raggedright
- {\normalfont \parindent \CTEX@chapter@indent \CTEX@chapter@format
+ {\normalfont \parindent \dimexpr \CTEX@chapter@indent \relax
+ \CTEX@chapter@format
\ifnum \c@secnumdepth >\m@ne
%<book> \if@mainmatter
-% \huge\bfseries\@chapapp\space\thechapter\par\nobreak\vskip 20\p@
- \CTEX@chaptername
+ \ifodd \CTEX@chapter@numbering
+% \huge\bfseries\@chapapp\space\thechapter\par\nobreak\vskip 20\p@
+ \CTEX@chaptername
+ \fi
%<book> \fi
\fi
\interlinepenalty\@M
@@ -6722,7 +6803,7 @@ This package consists of the file ctex.dtx, and the derived files
\CTEX@chapter@aftertitle
\nobreak
% \vskip 40\p@
- \vskip \CTEX@chapter@afterskip
+ \vskip \glueexpr \CTEX@chapter@afterskip \relax
}}
% \end{macrocode}
% \end{macro}
@@ -6730,24 +6811,18 @@ This package consists of the file ctex.dtx, and the derived files
% \begin{macro}[int]{\@makeschapterhead}
% \begin{macrocode}
\def\@makeschapterhead#1{%
- \thispagestyle{\CTEX@chapter@pagestyle}%
% \vspace*{50\p@}%
- \@tempskipa \CTEX@chapter@beforeskip \relax
- \ifdim \@tempskipa <\z@
- \@tempskipa -\@tempskipa \@afterindentfalse
- \else
- \@afterindenttrue
- \fi
- \vspace*{\@tempskipa}%
+ \vspace*{\glueexpr\CTEX@chapter@beforeskip\relax}%
% {\normalfont \parindent \z@ \raggedright
- {\normalfont \parindent \CTEX@chapter@indent \CTEX@chapter@format
+ {\normalfont \parindent \dimexpr \CTEX@chapter@indent \relax
+ \CTEX@chapter@format
\interlinepenalty\@M
% \Huge \bfseries #1\par\nobreak
\CTEX@chapter@titleformat{#1}
\CTEX@chapter@aftertitle
\nobreak
% \vskip 40\p@
- \vskip \CTEX@chapter@afterskip
+ \vskip \glueexpr \CTEX@chapter@afterskip \relax
}}
% \end{macrocode}
% \end{macro}
@@ -6758,6 +6833,34 @@ This package consists of the file ctex.dtx, and the derived files
%
% \paragraph{section 类的标题}
%
+% \begin{macro}[int]{\@startsection}
+% \begin{macrocode}
+\def\@startsection#1#2#3#4#5#6{%
+ \if@noskipsec \leavevmode \fi
+ \par
+% \@tempskipa #4\relax
+% \@afterindenttrue
+% \ifdim \@tempskipa <\z@
+% \@tempskipa -\@tempskipa \@afterindentfalse
+% \fi
+ \CTEX@update@sectionformat@n{#1}%
+ \ifodd \CTEX@afterindent
+ \@afterindenttrue
+ \else
+ \@afterindentfalse
+ \fi
+ \if@nobreak
+ \everypar{}%
+ \else
+% \addpenalty\@secpenalty\addvspace\@tempskipa
+ \addpenalty\@secpenalty\addvspace{\glueexpr #4\relax}%
+ \fi
+ \@ifstar
+ {\@ssect{#3}{#4}{#5}{#6}}%
+ {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[int]{\@seccntformat}
% \begin{macrocode}
\def\@seccntformat#1{%
@@ -6773,14 +6876,20 @@ This package consists of the file ctex.dtx, and the derived files
\ifnum #2>\c@secnumdepth
\let\@svsec\@empty
\else
- \refstepcounter{#1}%
- \protected@edef\@svsec{\@seccntformat{#1}\relax}%
+ \ifodd \csname CTEX@#1@numbering\endcsname
+ \refstepcounter{#1}%
+ \protected@edef\@svsec{\@seccntformat{#1}\relax}%
+ \else
+ \CTEX@makeheadinganchor
+ \let\@svsec\@empty
+ \fi
\fi
- \@tempskipa #5\relax
- \ifdim \@tempskipa>\z@
+% \@tempskipa #5\relax
+% \ifdim \@tempskipa>\z@
+ \unless \ifodd \CTEX@runin
\begingroup
#6{%
- \@hangfrom{\hskip #3\relax\@svsec}%
+ \@hangfrom{\hskip\glueexpr #3\relax\@svsec}%
% \interlinepenalty \@M #8\@@par}%
\interlinepenalty \@M
\csname CTEX@#1@titleformat\endcsname{#8}%
@@ -6789,15 +6898,17 @@ This package consists of the file ctex.dtx, and the derived files
\csname #1mark\endcsname{#7}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else
-% \protect\numberline{\csname the#1\endcsname}%
- \protect\numberline{\@ifundefined{CTEXthe#1}%
+ \ifodd \csname CTEX@#1@numbering\endcsname
+% \protect\numberline{\csname the#1\endcsname}%
+ \protect\numberline{\@ifundefined{CTEXthe#1}%
{\csname the#1\endcsname}%
{\csname CTEXthe#1\endcsname}}%
+ \fi
\fi
#7}%
\else
\def\@svsechd{%
- #6{\hskip #3\relax
+ #6{\hskip\glueexpr #3\relax
% \@svsec #8}%
\@svsec
\csname CTEX@#1@titleformat\endcsname{#8}%
@@ -6805,10 +6916,12 @@ This package consists of the file ctex.dtx, and the derived files
\csname #1mark\endcsname{#7}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else
-% \protect\numberline{\csname the#1\endcsname}%
- \protect\numberline{\@ifundefined{CTEXthe#1}%
+ \ifodd \csname CTEX@#1@numbering\endcsname
+% \protect\numberline{\csname the#1\endcsname}%
+ \protect\numberline{\@ifundefined{CTEXthe#1}%
{\csname the#1\endcsname}%
{\csname CTEXthe#1\endcsname}}%
+ \fi
\fi
#7}}%
\fi
@@ -6817,51 +6930,84 @@ This package consists of the file ctex.dtx, and the derived files
% \end{macro}
%
% \begin{macro}[int]{\@ssect}
-% \tn{@ssect} 并没有参数给出当前标题的名字,扩展它的参数会与 \pkg{hyperref} 冲突。
-% 它的第二个参数是 BEFORESKIP(\tn{@startsection} 的第四个参数),在定义中并没有
-% 被用到,应该可以用它来传递名字。我们这里通过函数 \tn{CTEX@titleformat@n} 来传递,
-% 它将在 |#4| 中被重定义为相应的 \opt{titleformat}。
% \begin{macrocode}
\def\@ssect#1#2#3#4#5{%
- \@tempskipa #3\relax
- \ifdim \@tempskipa>\z@
+% \@tempskipa #3\relax
+% \ifdim \@tempskipa>\z@
+ \unless \ifodd \CTEX@runin
\begingroup
#4{%
- \@hangfrom{\hskip #1}%
+ \@hangfrom{\hskip\glueexpr #1\relax}%
% \interlinepenalty \@M #5\@@par}%
\interlinepenalty \@M
\CTEX@titleformat@n{#5}%
\CTEX@aftertitle}%
\endgroup
\else
-% \def\@svsechd{#4{\hskip #1\relax #5}}%
- \def\@svsechd{#4{\hskip #1\relax \CTEX@titleformat@n{#5}\CTEX@aftertitle}}%
+% \def\@svsechd{#4{\hskip\glueexpr #1\relax #5}}%
+ \def\@svsechd{#4{\hskip\glueexpr #1\relax
+ \CTEX@titleformat@n{#5}\CTEX@aftertitle}}%
\fi
\@xsect{#3}}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[int]{\@xsect}
+% \begin{macrocode}
+\def\@xsect#1{%
+% \@tempskipa #1\relax
+% \ifdim \@tempskipa>\z@
+ \unless \ifodd \CTEX@runin
+ \par \nobreak
+% \vskip \@tempskipa
+ \vskip\glueexpr #1\relax
+ \@afterheading
+ \else
+ \@nobreakfalse
+ \global\@noskipsectrue
+ \everypar{%
+ \if@noskipsec
+ \global\@noskipsecfalse
+ {\setbox\z@\lastbox}%
+ \clubpenalty\@M
+ \begingroup \@svsechd \endgroup
+ \unskip
+% \@tempskipa #1\relax
+% \hskip -\@tempskipa
+ \hskip\glueexpr #1\relax
+ \else
+ \clubpenalty \@clubpenalty
+ \everypar{}%
+ \fi}%
+ \fi
+ \ignorespaces}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
%<@@=ctex>
% \end{macrocode}
%
-% \begin{macro}[int]{\CTEX@set@titleformat@n, \CTEX@titleformat@n}
-% 在 \tn{@startsection} 中设置 \tn{CTEX@titleformat@n} 为相应函数。
+% \begin{macro}[int]{\CTEX@update@sectionformat@n}
+% 在 \tn{@startsection} 中设置 \tn{CTEX@titleformat@n} 等为相应函数。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \CTEX@set@titleformat@n #1
+\cs_new_protected_nopar:Npn \CTEX@update@sectionformat@n #1
{
\cs_set_eq:Nc \CTEX@titleformat@n { CTEX@#1@titleformat }
\cs_set_eq:Nc \CTEX@aftertitle { CTEX@#1@aftertitle }
+ \cs_set_eq:Nc \CTEX@afterindent { CTEX@#1@afterindent }
+ \cs_set_eq:Nc \CTEX@runin { CTEX@#1@runin }
}
\cs_new_eq:NN \CTEX@titleformat@n \use:n
\cs_new_eq:NN \CTEX@aftertitle \prg_do_nothing:
+\cs_new_eq:NN \CTEX@afterindent \c_true_bool
+\cs_new_eq:NN \CTEX@runin \c_false_bool
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
\int_zero:N \l_@@_tmp_int
-\clist_map_inline:nn
- { section , subsection , subsubsection , paragraph , subparagraph }
+\seq_map_inline:Nn \c_@@_section_headings_seq
{
\int_incr:N \l_@@_tmp_int
\cs_gset_protected_nopar:cpx {#1}
@@ -6871,25 +7017,23 @@ This package consists of the file ctex.dtx, and the derived files
{ \exp_not:c { CTEX@#1@indent } }
{ \exp_not:c { CTEX@#1@beforeskip } }
{ \exp_not:c { CTEX@#1@afterskip } }
- {
- \CTEX@set@titleformat@n {#1}
- \exp_not:N \normalfont \exp_not:c { CTEX@#1@format }
- }
+ { \exp_not:N \normalfont \exp_not:c { CTEX@#1@format } }
}
}
% \end{macrocode}
%
-%
% \paragraph{附录标题}
%
-% \begin{macro}[int]{appendix/name,appendix/number}
+% \begin{macro}[int]{appendix/name,appendix/number,appendix/numbering}
% \begin{macrocode}
\keys_define:nn { ctex }
{
- appendix .meta:nn = { ctex / appendix } {#1} ,
- appendix / name .code:n =
+ appendix .meta:nn = { ctex / appendix } {#1} ,
+ appendix / name .code:n =
{ \ctex_assign_heading_name:nn { appendix } {#1} } ,
- appendix / number .tl_set:N = \CTEX@appendixnumber
+ appendix / number .tl_set:N = \CTEX@appendix@number ,
+ appendix / numbering .bool_set:N = \CTEX@appendix@numbering ,
+ appendix / numbering .initial:n = true
}
\tl_new:N \CTEX@preappendix
\tl_new:N \CTEX@postappendix
@@ -6904,18 +7048,121 @@ This package consists of the file ctex.dtx, and the derived files
\CTEX@save@appendix
%<*article>
\gdef \CTEX@presection { \CTEX@preappendix }
- \gdef \CTEX@thesection { \CTEX@appendixnumber }
+ \gdef \CTEX@thesection { \CTEX@appendix@number }
\gdef \CTEX@postsection { \CTEX@postappendix }
+ \gdef \CTEX@section@numbering { \CTEX@appendix@numbering }
%</article>
%<*book|report>
\gdef \CTEX@prechapter { \CTEX@preappendix }
- \gdef \CTEX@thechapter { \CTEX@appendixnumber }
+ \gdef \CTEX@thechapter { \CTEX@appendix@number }
\gdef \CTEX@postchapter { \CTEX@postappendix }
+ \gdef \CTEX@chapter@numbering { \CTEX@appendix@numbering }
%</book|report>
}
% \end{macrocode}
% \end{macro}
%
+% \paragraph{兼容 \pkg{titlesec} 宏包}
+%
+% 我们修改了 \tn{@startsection} 的定义,它的第四个(\meta{beforeskip})和
+% 第五个(\meta{afterskip})参数的符号不再有特殊意义,改由相应的选项
+% \opt{afterindent} 和 \opt{runin} 来控制。
+%
+% 引入 \pkg{titlesec} 宏包,并且未设置它的 \opt{loadonly} 选项时,\pkg{titlesec}
+% 会展开 section 类标题获取它们的参数,进行初始设置。我们需要进行一些调整。
+%
+% \begin{macro}[int]{\ctex_titlesec_hook:}
+% \tn{titleformat} 的设置保存在名为 |\ttlf@|\meta{section} 的宏中备用,它的内容是
+% \begin{center}\small
+% |\ttlh@|\meta{shape}\Arg{format}\Arg{label}\Arg{sep}\Arg{before}\Arg{after}
+% \end{center}
+% 我们这里的 \meta{shape} 为 |hang| 或者 |runin|。\tn{titlespacing} 的设置保存在
+% |\ttls@|\meta{section} 之中,它的内容是
+% \begin{center}\small
+% \Arg{left}\Arg{right}\Arg{before}\Arg{after}\Arg{afterindent}
+% \end{center}
+% 其中 \meta{afterindent} 为 |1| 或 |0|,分别对应是否保留段首缩进。
+% 我们需要根据 \CTeX{} 的 \opt{runin} 和 \opt{afterindent} 选项调整
+% |\ttlh@|\meta{shape} 和 \meta{afterindent}。注意,由 \tn{ttl@extract} 得的
+% \meta{before} 和 \meta{after} 的值总是非负的,而 \CTeX{} 的 \opt{beforeskip}
+% 和 \opt{afterskip} 是可以取负值的,但我们不打算调整它们了。
+% 如果使用了 \pkg{titlesec} 的 \opt{indentafter} 等选项,也不需要调整
+% |\ttls@|\meta{section}。
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \ctex_titlesec_hook:
+ {
+ \@ifpackagewith { titlesec } { explicit }
+ {
+ \cs_set_eq:NN \@@_titlesec_format:Nn
+ \@@_titlesec_format_explicit:Nn
+ }
+ { }
+ \clist_map_inline:nn
+ { indentafter , noindentafter , indentfirst , nonindentfirst }
+ {
+ \@ifpackagewith { titlesec } { ##1 }
+ {
+ \clist_map_break:n
+ { \cs_set_eq:NN \@@_titlesec_hook:n \@@_titlesec_format:n }
+ }
+ { }
+ }
+ \seq_map_function:NN \c_@@_section_headings_seq \@@_titlesec_hook:n
+ }
+\cs_new_protected_nopar:Npn \@@_titlesec_hook:n #1
+ {
+ \@@_titlesec_format:n {#1}
+ \exp_args:Nc \@@_titlesec_spacing:Nn { ttls@#1 } {#1}
+ }
+\cs_new_protected_nopar:Npn \@@_titlesec_format:n #1
+ {
+ \cs_if_free:cF { ttlf@#1 }
+ { \exp_args:Nc \@@_titlesec_format:Nn { ttlf@#1 } {#1} }
+ }
+\cs_new_protected_nopar:Npn \@@_titlesec_format:Nn #1#2
+ {
+ \tl_set:Nx #1
+ {
+ \bool_if:cTF { CTEX@#2@runin }
+ { \exp_not:N \ttlh@runin }
+ { \exp_not:N \ttlh@hang }
+ \tl_tail:N #1
+ }
+ }
+\cs_new_protected_nopar:Npn \@@_titlesec_format_explicit:Nn #1#2
+ {
+ \cs_set_nopar:Npx #1 ##1
+ {
+ \bool_if:cTF { CTEX@#2@runin }
+ { \exp_not:N \ttlh@runin }
+ { \exp_not:N \ttlh@hang }
+ \exp_args:No \tl_tail:n { #1 { } }
+ }
+ }
+\cs_new_protected_nopar:Npn \@@_titlesec_spacing:Nn #1#2
+ { \tl_set:Nx #1 { \exp_after:wN \@@_titlesec_spacing:nnnnnn #1 {#2} } }
+\cs_new:Npn \@@_titlesec_spacing:nnnnnn #1#2#3#4#5#6
+ {
+ \exp_not:n { {#1} {#2} {#3} {#4} }
+ { \bool_if:cTF { CTEX@#6@afterindent } { \@ne } { \z@ } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\@ifpackageloaded { titlesec }
+ { }
+ {
+ \ctex_at_end_package:nn { titlesec }
+ {
+ \@ifpackagewith { titlesec } { loadonly }
+ { }
+ { \ctex_titlesec_hook: }
+ }
+ }
+% \end{macrocode}
+%
+%
% \subsubsection{目录标签的宽度}
%
% \begin{macro}[int]{\numberline}
@@ -6934,19 +7181,22 @@ This package consists of the file ctex.dtx, and the derived files
\use:n
{
\group_end:
- \ExplSyntaxOff
- \ctex_preto_cmd:NnTF \numberline { \CTEX@toc@width@n {#1} } { }
+ \ctex_preto_cmd:NnnTF \numberline { \ExplSyntaxOff }
+ { \CTEX@toc@width@n {#1} }
+ { }
{ \ctex_patch_failure:N \numberline }
\@ifpackageloaded { tocloft }
{ }
{
\ctex_at_end_package:nn { tocloft }
{
- \ctex_preto_cmd:NnTF \numberline { \CTEX@toc@width@n {#1} } { }
+ \ctex_preto_cmd:NnnTF \numberline
+ { \char_set_catcode_letter:n { 64 } }
+ { \CTEX@toc@width@n {#1} }
+ { }
{ \ctex_patch_failure:N \numberline }
}
}
- \ExplSyntaxOn
}
% \end{macrocode}
% \end{macro}
@@ -6956,16 +7206,23 @@ This package consists of the file ctex.dtx, and the derived files
% \begin{macro}[int]{\ps@headings}
% \begin{macrocode}
%<*article>
-\ctex_patch_cmd:Nnn \ps@headings { \thesection } { \CTEXthesection }
+\ctex_patch_cmd:Nnn \ps@headings
+ { \thesection \quad }
+ { \ifodd \CTEX@section@numbering \CTEXthesection \quad \fi }
\if@twoside
- \ctex_patch_cmd:Nnn \ps@headings { \thesubsection } { \CTEXthesubsection }
+ \ctex_patch_cmd:Nnn \ps@headings
+ { \thesubsection \quad }
+ { \ifodd \CTEX@subsection@numbering \CTEXthesubsection \quad \fi }
\fi:
%</article>
%<*book|report>
\ctex_patch_cmd:Nnn \ps@headings
- { \@chapapp\ \thechapter.~\ } { \CTEXthechapter \quad }
+ { \@chapapp\ \thechapter.~\ }
+ { \ifodd \CTEX@chapter@numbering \CTEXthechapter \quad \fi }
\if@twoside
- \ctex_patch_cmd:Nnn \ps@headings { \thesection.~\ } { \CTEXthesection \quad }
+ \ctex_patch_cmd:Nnn \ps@headings
+ { \thesection.~\ }
+ { \ifodd \CTEX@section@numbering \CTEXthesection \quad \fi }
\fi:
%</book|report>
% \end{macrocode}
@@ -6981,16 +7238,20 @@ This package consists of the file ctex.dtx, and the derived files
{
%<*article>
\ctex_patch_cmd:Nnn \ps@fancy
- { \thesection \hskip 1em \relax } { \CTEXthesection \quad }
+ { \thesection \hskip 1em \relax }
+ { \ifodd \CTEX@section@numbering \CTEXthesection \quad \fi }
\ctex_patch_cmd:Nnn \ps@fancy
- { \thesubsection \hskip 1em \relax } { \CTEXthesubsection \quad }
+ { \thesubsection \hskip 1em \relax }
+ { \ifodd \CTEX@subsection@numbering \CTEXthesubsection \quad \fi }
%</article>
%<*book|report>
\ctex_patch_cmd:Nnn \ps@fancy
-%<book> { \@chapapp\ \thechapter.~\ } { \if@mainmatter \CTEXthechapter \quad \fi }
-%<report> { \@chapapp\ \thechapter.~\ } { \CTEXthechapter \quad }
+ { \@chapapp\ \thechapter.~\ }
+%<book> { \if@mainmatter \ifodd \CTEX@chapter@numbering \CTEXthechapter \quad \fi \fi }
+%<report> { \ifodd \CTEX@chapter@numbering \CTEXthechapter \quad \fi }
\ctex_patch_cmd:Nnn \ps@fancy
- { \thesection.~\ } { \CTEXthesection \quad }
+ { \thesection.~\ }
+ { \ifodd \CTEX@section@numbering \CTEXthesection \quad \fi }
%</book|report>
}
% \end{macrocode}
@@ -7082,6 +7343,9 @@ This package consists of the file ctex.dtx, and the derived files
%
% \changes{v2.1}{2015/05/30}{修复 \cls{ctexbook} 和 \cls{ctexrep} 类的中文
% \opt{part/number} 选项初值为空的错误。}
+% \changes{v2.2}{2015/06/30}{将中文版式下的 \texttt{part} 和 \texttt{chapter}
+% 标题的 \opt{nameformat} 和 \opt{titleformat} 选项的初值合并到 \opt{format} 中。}
+%
% \begin{macrocode}
\keys_set:nn { ctex / part }
{
@@ -7094,31 +7358,33 @@ This package consists of the file ctex.dtx, and the derived files
number = \chinese { part } ,
%</chinese>
%<*article>
- nameformat = \Large \bfseries ,
+ beforeskip = 4ex ,
afterskip = 3ex ,
%<*plain>
format = \raggedright ,
+ nameformat = \Large \bfseries ,
aftername = \par \nobreak ,
titleformat = \huge \bfseries ,
- beforeskip = -4ex
+ afterindent = false
%</plain>
%<*chinese>
- format = \centering ,
+ format = \Large \bfseries \centering ,
aftername = \quad ,
- titleformat = \Large \bfseries ,
- beforeskip = 4ex
+ afterindent = true
%</chinese>
%</article>
%<*book|report>
- format = \centering ,
- nameformat = \huge \bfseries ,
aftername = \par \vskip 20 \p@ ,
+ beforeskip = 0pt \@plus 1fil ,
+ afterskip = 0pt \@plus 1fil ,
pagestyle = plain ,
%<*plain>
+ format = \centering ,
+ nameformat = \huge \bfseries ,
titleformat = \Huge \bfseries
%</plain>
%<*chinese>
- titleformat = \huge \bfseries
+ format = \huge \bfseries \centering
%</chinese>
%</book|report>
}
@@ -7129,23 +7395,23 @@ This package consists of the file ctex.dtx, and the derived files
\keys_set:nn { ctex / chapter }
{
pagestyle = plain ,
- nameformat = \huge \bfseries ,
aftertitle = \par ,
+ beforeskip = 50 \p@ ,
afterskip = 40 \p@ ,
%<*plain>
name = \chaptername \space ,
number = \thechapter ,
format = \raggedright ,
+ nameformat = \huge \bfseries ,
aftername = \par \nobreak \vskip 20 \p@ ,
titleformat = \Huge \bfseries ,
- beforeskip = -50 \p@
+ afterindent = false
%</plain>
%<*chinese>
number = \chinese { chapter } ,
- format = \centering ,
+ format = \huge \bfseries \centering ,
aftername = \quad ,
- titleformat = \huge \bfseries ,
- beforeskip = 50 \p@
+ afterindent = true
%</chinese>
}
%</book|report>
@@ -7161,14 +7427,16 @@ This package consists of the file ctex.dtx, and the derived files
number = \thesection ,
aftername = \quad ,
aftertitle = \@@par ,
+ beforeskip = 3.5ex \@plus 1ex \@minus .2ex ,
afterskip = 2.3ex \@plus .2ex ,
+ runin = false ,
%<*plain>
format = \Large \bfseries ,
- beforeskip = -3.5ex \@plus -1ex \@minus -.2ex
+ afterindent = false
%</plain>
%<*chinese>
format = \Large \bfseries \centering ,
- beforeskip = 3.5ex \@plus 1ex \@minus .2ex
+ afterindent = true
%</chinese>
}
% \end{macrocode}
@@ -7180,12 +7448,14 @@ This package consists of the file ctex.dtx, and the derived files
format = \large \bfseries ,
aftername = \quad ,
aftertitle = \@@par ,
+ beforeskip = 3.25ex \@plus 1ex \@minus .2ex ,
afterskip = 1.5ex \@plus .2ex ,
+ runin = false ,
%<*plain>
- beforeskip = -3.25ex \@plus -1ex \@minus -.2ex
+ afterindent = false
%</plain>
%<*chinese>
- beforeskip = 3.25ex \@plus 1ex \@minus .2ex
+ afterindent = true
%</chinese>
}
% \end{macrocode}
@@ -7197,12 +7467,14 @@ This package consists of the file ctex.dtx, and the derived files
format = \normalsize \bfseries ,
aftername = \quad ,
aftertitle = \@@par ,
+ beforeskip = 3.25ex \@plus 1ex \@minus .2ex ,
afterskip = 1.5ex \@plus .2ex ,
+ runin = false ,
%<*plain>
- beforeskip = -3.25ex \@plus -1ex \@minus -.2ex
+ afterindent = false
%</plain>
%<*chinese>
- beforeskip = 3.25ex \@plus 1ex \@minus .2ex
+ afterindent = true
%</chinese>
}
% \end{macrocode}
@@ -7212,7 +7484,14 @@ This package consists of the file ctex.dtx, and the derived files
{
number = \theparagraph ,
format = \normalsize \bfseries ,
- aftername = \quad
+ aftername = \quad ,
+ beforeskip = 3.25ex \@plus 1ex \@minus .2ex ,
+%<*plain>
+ afterindent = false
+%</plain>
+%<*chinese>
+ afterindent = true
+%</chinese>
}
% \end{macrocode}
%
@@ -7221,7 +7500,14 @@ This package consists of the file ctex.dtx, and the derived files
{
number = \thesubparagraph ,
format = \normalsize \bfseries ,
- aftername = \quad
+ aftername = \quad ,
+ beforeskip = 3.25ex \@plus 1ex \@minus .2ex ,
+%<*plain>
+ afterindent = false
+%</plain>
+%<*chinese>
+ afterindent = true
+%</chinese>
}
% \end{macrocode}
%
@@ -7232,20 +7518,15 @@ This package consists of the file ctex.dtx, and the derived files
\keys_set:nn { ctex / paragraph }
{
aftertitle = \@@par ,
-%<*plain>
- beforeskip = -3.25ex \@plus -1ex \@minus -.2ex ,
-%</plain>
-%<*chinese>
- beforeskip = 3.25ex \@plus 1ex \@minus .2ex ,
-%</chinese>
- afterskip = 1ex \@plus .2ex
+ afterskip = 1ex \@plus .2ex ,
+ runin = false
}
}
{
\keys_set:nn { ctex / paragraph }
{
- beforeskip = 3.25ex \@plus 1ex \@minus .2ex ,
- afterskip = -1em
+ afterskip = 1em ,
+ runin = true
}
}
\int_compare:nNnTF \g__ctex_section_depth_flag > \c_three
@@ -7253,20 +7534,15 @@ This package consists of the file ctex.dtx, and the derived files
\keys_set:nn { ctex / subparagraph }
{
aftertitle = \@@par ,
-%<*plain>
- beforeskip = -3.25ex \@plus -1ex \@minus -.2ex ,
-%</plain>
-%<*chinese>
- beforeskip = 3.25ex \@plus 1ex \@minus .2ex ,
-%</chinese>
- afterskip = 1ex \@plus .2ex
+ afterskip = 1ex \@plus .2ex ,
+ runin = false
}
}
{
\keys_set:nn { ctex / subparagraph }
{
- beforeskip = 3.25ex \@plus 1ex \@minus .2ex ,
- afterskip = -1em
+ afterskip = 1em ,
+ runin = true
}
}
\int_compare:nNnTF \g__ctex_section_depth_flag > \c_two
@@ -7430,7 +7706,7 @@ This package consists of the file ctex.dtx, and the derived files
% \begin{macrocode}
%<*generic>
\tl_if_exist:NT \c_@@_std_class_tl
- { \RequirePackage{ indentfirst } }
+ { \RequirePackage { indentfirst } }
%</generic>
% \end{macrocode}
%
@@ -7689,7 +7965,7 @@ This package consists of the file ctex.dtx, and the derived files
% \begin{macrocode}
\fp_compare:nNnF { \l_@@_line_spread_fp } ? { \c_zero_fp }
{
- \linespread { \fp_use:N \l_@@_line_spread_fp }
+ \exp_args:Nx \linespread { \fp_use:N \l_@@_line_spread_fp }
% \end{macrocode}
%
% \changes{v2.0}{2014/04/23}{调整 \tn{footnotesep} 的大小,以适合行距的变化。}
@@ -7763,46 +8039,9 @@ This package consists of the file ctex.dtx, and the derived files
%<*class|ctex>
% \end{macrocode}
%
-% \subsubsection{其他兼容性修改}
-%
-% \begin{macro}[int]{\end}
% \changes{v2.0}{2014/03/09}
% {解决 \pkg{etoolbox} 与 \pkg{breqn} 关于 \tn{end} 的冲突。}
-% \pkg{breqn} 宏包对 \tn{end} 作了如下处理,然而这个处理并不保险。
-% \begin{verbatim}
-% \def\@tempa#1\endcsname#2\@nil{\def\latex@end##1{#2}}
-% \expandafter\@tempa\end{#1}\@nil
-% \def\end#1{\csname end#1\endcsname \latex@end{#1}}%
-% \end{verbatim}
-% \pkg{etoolbox} 在 \tn{end} 定义中的 \tn{csname} 前加入
-% 钩子 |\csuse{@end@#1@hook}|。如果 \pkg{etoolbox} 先于 \pkg{breqn} 被载入(这
-% 在使用 \cls{ctexart} 等文档类时几乎是必然的),|\csuse{@end@#1@hook}| 将会被
-% 忽略,即 \tn{AtEndEnvironment} 失效。如果交换两个宏包的载入顺序,则
-% \pkg{etoolbox} 会给出警告:\tn{AfterEndEnvironment} 失效,我们不打算处理这种
-% 情况。
-% \begin{macrocode}
-\group_begin:
-\char_set_catcode_other:N \#
-\use:n
- {
- \group_end:
- \ExplSyntaxOff
- \ctex_at_end_package:nn { breqn }
- {
- \ctex_patch_cmd:NnnTF \end { \csname end#1 \endcsname }
- {
- \csuse { @end@#1@hook }
- \csname end#1 \endcsname
- } { }
- {
- \ctex_preto_cmd:NnTF \end { \csuse { @end@#1@hook } }
- { } { \ctex_patch_failure:N \end }
- }
- }
- \ExplSyntaxOn
- }
-% \end{macrocode}
-% \end{macro}
+% \changes{v2.2}{2015/06/23}{删去 \pkg{etoolbox} 与 \pkg{breqn} 的兼容补丁。}
%
% \subsection{载入中文字体}
%
@@ -8572,7 +8811,7 @@ This package consists of the file ctex.dtx, and the derived files
% \begin{macrocode}
%<*windows>
\ProvidesFile{zhwindowsfonts.tex}%
- [2015/05/25 v2.1 Windows font map loader for pdfTeX and DVIPDFMx (CTEX)]
+ [2015/07/01 v2.2 Windows font map loader for pdfTeX and DVIPDFMx (CTEX)]
\ifzhmappdf
\pdfmapline{=gbk@UGBK@ <simsun.ttc}
@@ -8644,7 +8883,7 @@ This package consists of the file ctex.dtx, and the derived files
% \begin{macrocode}
%<*adobe>
\ProvidesFile{zhadobefonts.tex}%
- [2015/05/25 v2.1 Adobe font map loader for DVIPDFMx (CTEX)]
+ [2015/07/01 v2.2 Adobe font map loader for DVIPDFMx (CTEX)]
\ifzhmappdf
%% pdfTeX does not support OTF fonts
@@ -8680,7 +8919,7 @@ This package consists of the file ctex.dtx, and the derived files
% \begin{macrocode}
%<*fandol>
\ProvidesFile{zhfandolfonts.tex}%
- [2015/05/25 v2.1 Fandol font map loader for DVIPDFMx (CTEX)]
+ [2015/07/01 v2.2 Fandol font map loader for DVIPDFMx (CTEX)]
\ifzhmappdf
%% pdfTeX does not support OTF fonts
@@ -8716,7 +8955,7 @@ This package consists of the file ctex.dtx, and the derived files
% \begin{macrocode}
%<*founder>
\ProvidesFile{zhfounderfonts.tex}%
- [2015/05/25 v2.1 Founder font map loader for pdfTeX and DVIPDFMx (CTEX)]
+ [2015/07/01 v2.2 Founder font map loader for pdfTeX and DVIPDFMx (CTEX)]
\ifzhmappdf
\pdfmapline{=gbk@UGBK@ <FZSSK.TTF}
@@ -8788,7 +9027,7 @@ This package consists of the file ctex.dtx, and the derived files
% \begin{macrocode}
%<*ubuntu>
\ProvidesFile{zhubuntufonts.tex}%
- [2015/05/25 v2.1 Ubuntu font map loader for pdfTeX and DVIPDFMx (CTEX)]
+ [2015/07/01 v2.2 Ubuntu font map loader for pdfTeX and DVIPDFMx (CTEX)]
\ifzhmappdf
\pdfmapline{=gbk@UGBK@ <uming.ttc}
@@ -8993,6 +9232,463 @@ This package consists of the file ctex.dtx, and the derived files
%</spa>
% \end{macrocode}
%
+%
+% \subsection{\pkg{ctexcap} 宏包}
+%
+% \begin{macrocode}
+%<*ctexcap>
+% \end{macrocode}
+%
+% \pkg{ctexcap} 是过时宏包。
+% \begin{macrocode}
+\clist_new:N \l_@@_ctexcap_options_clist
+\clist_set:Nx \l_@@_ctexcap_options_clist
+ { \exp_not:v { opt@ \@currname . \@currext } , heading }
+\msg_new:nnn { ctexcap } { deprecated }
+ {
+ Package~`ctexcap'~is~deprecated.\\
+ Please~use~package~`ctex'~with~option~`#1'~instead: \\\\
+ \iow_indent:n { \token_to_str:N \usepackage [#1] \{ ctex \} } \\
+ }
+\msg_warning:nnx { ctexcap } { deprecated }
+ { \clist_use:Nn \l_@@_ctexcap_options_clist { , ~ } }
+% \end{macrocode}
+%
+% \pkg{ctexcap} 是默认打开 \opt{heading} 选项的 \pkg{ctex}。
+% \begin{macrocode}
+\PassOptionsToPackage { heading = true } { ctexcap }
+\RequirePackageWithOptions { ctex }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</ctexcap>
+% \end{macrocode}
+%
+%
+% \subsection{\pkg{ctexhook} 宏包}
+%
+% \changes{v2.2}{2015/06/26}{将文档开头和宏包末尾钩子提取到 \pkg{ctexhook} 宏包中。}
+%
+% \begin{macrocode}
+%<*ctexhook>
+% \end{macrocode}
+%
+% \begin{macro}[int]{\ctex_at_end_preamble:n,\ctex_after_end_preamble:n}
+% 实现 \pkg{etoolbox} 宏包的 \tn{AtEndPreamble} 和 \tn{AfterEndPreamble}。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_at_end_preamble:n #1
+ { \tl_gput_right:Nn \g_@@_end_preamble_hook_tl {#1} }
+\cs_new_protected:Npn \ctex_after_end_preamble:n #1
+ { \tl_gput_right:Nn \g_@@_after_end_preamble_hook_tl {#1} }
+\cs_new_protected_nopar:Npn \CTEX@document@left@hook
+ { \group_end: \g_@@_end_preamble_hook_tl \group_begin: }
+\cs_new_protected_nopar:Npn \CTEX@document@right@hook
+ { \scan_stop: \g_@@_after_end_preamble_hook_tl \tex_ignorespaces:D }
+\cs_set_nopar:Npx \document
+ {
+ \CTEX@document@left@hook
+ \exp_not:o { \document }
+ \CTEX@document@right@hook
+ }
+\tl_new:N \g_@@_end_preamble_hook_tl
+\tl_new:N \g_@@_after_end_preamble_hook_tl
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_at_end_package:nn}
+% 与 \pkg{filehook} 的 \tn{AtEndOfPackageFile*} 类似,如果原来没有在载入宏包则
+% 在宏包末尾执行语句,否则立即执行。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_at_end_package:nn #1#2
+ {
+ \@ifpackageloaded {#1}
+ {#2}
+ { \ctex_gadd_hook:cn { g_@@_at_end_ #1 _hook_tl } {#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_gadd_hook:Nn, \ctex_gadd_hook:cn}
+% 给钩子附加内容。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_gadd_hook:Nn #1#2
+ {
+ \tl_if_exist:NF #1 { \tl_new:N #1 }
+ \tl_gput_right:Nn #1 {#2}
+ }
+\cs_generate_variant:Nn \ctex_gadd_hook:Nn { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_package_end_hook:n, \ctex_package_end_hook:o}
+% 宏包末尾钩子,只执行一次,用后清除。
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \ctex_package_end_hook:n #1
+ {
+ \cs_if_exist_use:cT { g_@@_at_end_ #1 _hook_tl }
+ { \cs_undefine:c { g_@@_at_end_ #1 _hook_tl } }
+ }
+\cs_generate_variant:Nn \ctex_package_end_hook:n { o }
+% \end{macrocode}
+% \end{macro}
+%
+% 对 \tn{@popfilename} 做补丁来实现 \cs{ctex_at_end_package:nn} 的功能。
+% \begin{macrocode}
+\tl_put_left:Nn \@popfilename
+ {
+ \cs_if_eq:NNT \@currext \@pkgextension
+ { \ctex_package_end_hook:o { \@currname } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</ctexhook>
+% \end{macrocode}
+%
+%
+% \subsection{\pkg{ctexpatch} 宏包}
+%
+% \changes{v2.2}{2015/06/23}{新增子宏包 \pkg{ctexpatch} 实现给宏打补丁功能。}
+%
+% \begin{macrocode}
+%<*ctexpatch>
+% \end{macrocode}
+%
+% \begin{macro}[int]{\ctex_patch_cmd_once:NnnnTF}
+% 只进行第一次匹配进行替换。参数 |#2| 是宏重建时的 \tn{catcode} 设置。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_patch_cmd_once:NnnnTF #1#2
+ {
+ \ctex_patch_boot:NNnnTF \@@_patch_cmd:Nnnnnw #1
+ { once } {#2} { \use_i:nn } { \use_ii:nn }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_patch_cmd_all:NnnnTF}
+% 替换所有匹配到的文本。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_patch_cmd_all:NnnnTF #1#2
+ {
+ \ctex_patch_boot:NNnnTF \@@_patch_cmd:Nnnnnw #1
+ { all } {#2} { \use_i:nn } { \use_ii:nn }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_patch_cmd:Nnn}
+% 快捷方式,在补丁的时候关闭 \LaTeXiii{} 语法和设置 |@| 为字母类,补丁失败时给出警告。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_patch_cmd:Nnn #1
+ {
+ \ctex_patch_boot:NNnnTF \@@_patch_cmd:Nnnnnw #1
+ { once }
+ {
+ \ExplSyntaxOff
+ \char_set_catcode_letter:n { 64 }
+ }
+ { }
+ { \ctex_patch_failure:N #1 }
+ }
+\cs_new_protected:Npn \ctex_patch_failure:N #1
+ { \msg_warning:nnx { ctex } { patch-failure } { \token_to_str:N #1 } }
+\msg_new:nnn { ctex } { patch-failure }
+ { Oops!~Command~`#1'~is~NOT~patchable.\\ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_preto_cmd:NnnTF}
+% 在宏的原本定义前面增加钩子。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_preto_cmd:NnnTF #1#2
+ {
+ \ctex_patch_boot:NNnnTF \@@_hookto_cmd:Nnnnw #1
+ { left } {#2} { \use_i:nn } { \use_ii:nn }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_appto_cmd:NnnTF}
+% 在宏的原本定义后面追加钩子。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_appto_cmd:NnnTF #1#2
+ {
+ \ctex_patch_boot:NNnnTF \@@_hookto_cmd:Nnnnw #1
+ { right } {#2} { \use_i:nn } { \use_ii:nn }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_patch_boot:NNnnTF}
+% 参数记号 |#| 作为宏的参数被读入时,总是会双写,会影响随后的字符串替换。需要先
+% 将它转换为普通符号。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_patch_boot:NNnnTF #1#2#3#4#5#6
+ {
+ \tl_set:Nn \@@_patch_true:w {#5}
+ \tl_set:Nn \@@_patch_false:w {#6}
+ \group_begin:
+ \char_set_catcode_other:n { 35 }
+ \ctex_parse_name:NN #1 #2 {#3} {#4}
+ }
+\tl_new:N \@@_patch_true:w
+\tl_new:N \@@_patch_false:w
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_parse_name:NN}
+% 用 \tn{DeclareRobustCommand} 定义的宏或者由 \tn{newcommand} 或 \tn{newrobustcmd}
+% 定义的带一个可选参数的宏第一次展开的结果都不是其实际定义,实际定义被保存在另外的
+% 宏中。由这些命令定义的宏的第一次展开结果可以有下面的形式(细节可查阅 \pkg{xpatch}
+% 的文档):
+% \begin{verbatim}[numbers=left,gobble=4]
+% \protect␣\xaa␣␣ % \DeclareRobustCommand\xaa[1]{...}
+% \protect␣\xab␣␣ % \DeclareRobustCommand\xab[1][]{...}
+% \@protected@testopt␣\xac␣\\xac␣{} % \newcommand\xac[1][]{...}
+% \@testopt␣\\xad␣{} % \newrobustcmd\xad[1][]{...}
+% \x@protect␣\1\protect␣\1␣␣ % \DeclareRobustCommand\1[1]{...}
+% \x@protect␣\2\protect␣\2␣␣ % \DeclareRobustCommand\2[1][]{...}
+% \@protected@testopt␣\3\\3␣{} % \newcommand\3[1][]{...}
+% \@testopt␣\\4␣{} % \newrobustcmd\4[1][]{...}
+% \end{verbatim}
+% \pkg{ctexpatch} 的主要原理是先对宏的 \tn{meaning} 作字符串替换,然后再用
+% \tn{scantokens} 来重建它。我们希望对宏的实际定义打补丁,为此需要先得到
+% 对应的名字。\pkg{letltxmacro}、\pkg{show2e} 和 \pkg{xpatch} 宏包中都有
+% 类似的工作。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_parse_name:NN #1#2
+ { \ctex_parse_name:NNx #1#2 { \cs_to_str:N #2 } }
+\group_begin:
+\char_set_lccode:nn { `\< } { `\{ }
+\char_set_lccode:nn { `\/ } { `\\ }
+\char_set_lccode:nn { `\A } { `\t }
+\tl_map_function:nN { \A \E \S \O \P } \char_set_catcode_other:N
+\tex_lowercase:D
+ {
+ \group_end:
+ \cs_new_protected:Npn \ctex_parse_name:NNn #1#2#3
+ {
+ \bool_if:nTF { \cs_if_exist_p:c { #3 ~ } || \cs_if_exist_p:c { /#3 } }
+ {
+ \group_begin:
+ \use:x
+ {
+ \group_end:
+ \@@_parse_name:nNNNnN { \token_get_replacement_spec:N #2 }
+ \exp_not:N #2 \exp_not:c { #3 ~ } \exp_not:c { /#3 }
+ } {#3} #1
+ }
+ { #1#2 }
+ }
+ \cs_new_protected:Npn \@@_parse_name:nNNNnN #1#2#3#4#5#6
+ {
+ \exp_args:Nc #6
+ {
+ \str_case:nnTF {#1}
+ {
+ { \protect #3 } { }
+ { \x@protect #2 \protect #3 } { }
+ }
+ {
+ \str_if_eq_x:nnTF { \exp_not:n { /@protected@ #3 /#3 } }
+ {
+ \exp_last_unbraced:Nf \@@_parse_name:w
+ \token_get_replacement_spec:N #3 AESAOPA ~ < \q_stop
+ }
+ { /#5 ~ } { #5 ~ }
+ }
+ {
+ \str_case:onTF { \@@_parse_name:w #1 AESAOPA ~ < \q_stop }
+ {
+ { /@protected@ #2 #4 } { }
+ { /@ #4 } { }
+ }
+ { /#5 } {#5}
+ }
+ }
+ }
+ \cs_new:Npn \@@_parse_name:w #1 AESAOPA ~ #2 < #3 \q_stop { #1#2 }
+ }
+\cs_generate_variant:Nn \ctex_parse_name:NNn { NNx }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}[int]{\l_@@_prefix_tl,\l_@@_parameter_tl,\l_@@_replacement_tl}
+% 分别保存宏的 \tn{meaning} 中的前缀、参数文本和替换文本。
+% \begin{macrocode}
+\tl_new:N \l_@@_prefix_tl
+\tl_new:N \l_@@_parameter_tl
+\tl_new:N \l_@@_replacement_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[int]{\ctex_get_macro_meaning:NTF}
+% \begin{macro}[aux]{\@@_get_macro_meaning:w}
+% 解构待补丁宏的 \tn{meaning}。若命令不是宏,则走向 |false| 分支。
+% \begin{macrocode}
+\group_begin:
+ \char_set_lccode:nn { `\; } { `\: }
+ \tl_map_function:nN { \M \A \C \R \O \; } \char_set_catcode_other:N
+\tex_lowercase:D
+ {
+ \group_end:
+ \cs_new_protected:Npn \ctex_get_macro_meaning:NTF #1
+ {
+ \exp_after:wN \@@_get_macro_meaning:w
+ \token_to_meaning:N #1 \q_stop MACRO ; -> \q_no_value \q_stop
+ }
+ \cs_new_protected:Npn \@@_get_macro_meaning:w #1 MACRO ; #2 -> #3 \q_stop
+ {
+ \tl_set:Nn \l_@@_replacement_tl {#3}
+ \quark_if_no_value:NTF \l_@@_replacement_tl
+ { \use_ii:nn }
+ {
+ \tl_set:Nn \l_@@_prefix_tl {#1}
+ \tl_set:Nn \l_@@_parameter_tl {#2}
+ \use_i_delimit_by_q_stop:nw { \use_i:nn }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_if_rescanable:NnTF}
+% 检查宏是否可以重建。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_if_rescanable:NnTF #1#2#3#4
+ {
+ \ctex_get_macro_meaning:NTF #1
+ {
+ \@@_patch_rebuild:Nn \CTEXPATCHRESCANCMD {#2}
+ \cs_if_eq:NNTF #1 \CTEXPATCHRESCANCMD {#3} {#4}
+ }
+ {#4}
+ }
+\cs_new_eq:NN \CTEXPATCHRESCANCMD \prg_do_nothing:
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_patch_rebuild:Nn}
+% 使用 \cs{tl_rescan:nn} 来重新记号化 \tn{meaning} 字符串。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_rebuild:Nn #1#2
+ {
+ \tl_if_empty:nTF {#2}
+ { \tl_rescan:nx {#2} }
+ {
+ \tl_rescan:nx
+ {
+ #2 \scan_stop:
+ \int_set_eq:NN \tex_endlinechar:D \c_minus_one
+ \int_set_eq:NN \tex_newlinechar:D \c_minus_one
+ }
+ }
+ {
+ \l_@@_prefix_tl \exp_not:N \def \exp_not:N #1 \l_@@_parameter_tl
+ { \l_@@_replacement_tl }
+ }
+ }
+\cs_generate_variant:Nn \tl_rescan:nn { nx }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_patch_cmd:Nnnnnw}
+% 对宏的替换文本进行字符串替换,然后重建。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_cmd:Nnnnnw #1#2#3#4#5
+ {
+ \group_end:
+ \ctex_if_rescanable:NnTF #1 {#3}
+ {
+ \use:x
+ {
+ \@@_patch_replace:nnnTF {#2}
+ { \tl_to_str:n {#4} }
+ { \tl_to_str:n {#5} }
+ }
+ {
+ \@@_patch_rebuild:Nn \CTEXPATCHRESCANCMD {#3}
+ \cs_set_eq:NN #1 \CTEXPATCHRESCANCMD
+ \@@_patch_true:w
+ }
+ { \@@_patch_false:w }
+ }
+ { \@@_patch_false:w }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_patch_replace:nnnTF}
+% 替换前先检查原文本是否存在。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_replace:nnnTF #1#2#3#4
+ {
+ \tl_if_in:NnTF \l_@@_replacement_tl {#2}
+ { \use:c { tl_replace_ #1 :Nnn } \l_@@_replacement_tl {#2} {#3} #4 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_hookto_cmd:Nnnnw}
+% 在宏的前/后附加钩子。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_hookto_cmd:Nnnnw #1#2#3#4
+ {
+ \group_end:
+ \ctex_get_macro_meaning:NTF #1
+ {
+ \tl_if_empty:NTF \l_@@_parameter_tl
+ { \@@_hookto_cmd_parameterless:Nnnw #1 {#2} {#4} }
+ { \@@_hookto_cmd_parameter:Nnnnw #1 {#2} {#3} {#4} }
+ }
+ { \@@_patch_false:w }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[aux]{\@@_hookto_cmd_parameterless:Nnnw}
+% 如果宏没有参数,可以直接进行附加操作。注意保持宏的前缀。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_hookto_cmd_parameterless:Nnnw #1#2#3
+ {
+ \tl_if_empty:NF \l_@@_prefix_tl
+ { \tl_rescan:nx { } { \l_@@_prefix_tl } }
+ \edef #1
+ {
+ \use:c { @@_ #2 _hook_aux:nn }
+ { \exp_not:o {#1} }
+ { \exp_not:n {#3} }
+ }
+ \@@_patch_true:w
+ }
+\cs_new:Npn \@@_left_hook_aux:nn #1#2 { #2#1 }
+\cs_new_eq:NN \@@_right_hook_aux:nn \use:nn
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[aux]{\@@_hookto_cmd_parameter:Nnnnw}
+% 如果宏有参数,需要在字符串中进行附加,然后再重建。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_hookto_cmd_parameter:Nnnnw #1#2#3#4
+ {
+ \@@_patch_rebuild:Nn \CTEXPATCHRESCANCMD {#3}
+ \cs_if_eq:NNTF #1 \CTEXPATCHRESCANCMD
+ {
+ \use:c { tl_put_ #2 :Nx } \l_@@_replacement_tl { \tl_to_str:n {#4} }
+ \@@_patch_rebuild:Nn \CTEXPATCHRESCANCMD {#3}
+ \cs_set_eq:NN #1 \CTEXPATCHRESCANCMD
+ \@@_patch_true:w
+ }
+ { \@@_patch_false:w }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</ctexpatch>
+% \end{macrocode}
+%
% \end{implementation}
%
% \Finale