<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% \iffalse meta-comment
%
% Copyright (C) 2017--2020 by Xiangdong Zeng &lt;xdzeng96@gmail.com&gt;
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3c of this license or (at your option) any later
% version. The latest version of this license is in:
%
%   http://www.latex-project.org/lppl.txt
%
% and version 1.3 or later is part of all distributions of
% LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Xiangdong Zeng.
%
% This work consists of the files zhlipsum.dtx,
%                                 zhlipsum-text.dtx,
%           and the derived files zhlipsum.ins,
%                                 zhlipsum.sty,
%                                 zhlipsum-utf8.def,
%                                 zhlipsum-gbk.def,
%                                 zhlipsum-big5.def,
%                                 zhlipsum-en.tex,
%                                 zhlipsum.pdf,
%                                 zhlipsum-en.pdf,
%                             and README.md.
%
%&lt;*internal&gt;
\iffalse
%&lt;/internal&gt;
%
%&lt;*readme&gt;
The `zhlipsum` package
======================

The `zhlipsum` package provides an interface to dummy text in
Chinese language, which will be useful for testing Chinese
documents.

`zhlipsum` supports UTF-8, GBK and Big5 encodings.

Basic usage
-----------

    \zhlipsum
    \zhlipsum*[1-5]
    \zhlipsum[6-10,18][name=trad]

More information can be found in the package documentation
[zhlipsum.pdf](http://mirror.ctan.org/macros/latex/contrib/zhlipsum/zhlipsum.pdf)
(Chinese version) or [zhlipsum-en.pdf](http://mirror.ctan.org/macros/latex/contrib/zhlipsum/zhlipsum-en.pdf)
(English version).

Installation
------------

To install `zhlipsum`, you can use one of the following methods:

- If you are running TeX Live, the simplest way is to run

      tlmgr install zhlipsum

- Download
  [zhlipsum.tds.zip](http://mirror.ctan.org/install/macros/latex/contrib/zhlipsum.tds.zip)
  from CTAN, extract it in the root of one of your TDS trees, and
  update the filename database.

Contributing
------------

[Issues](https://github.com/stone-zeng/zhlipsum/issues) and
[pull requests](https://github.com/stone-zeng/zhlipsum/pulls)
are always welcome.

License
-------

This work may be distributed and/or modified under the conditions of
the [LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
either version 1.3c of this license or (at your option) any later
version.

-----

Copyright (C) 2017&amp;ndash;2020 by Xiangdong Zeng &lt;xdzeng96@gmail.com&gt;.
%&lt;/readme&gt;
%
%&lt;*internal&gt;
\fi
\begingroup
  \def\NameOfLaTeXe{LaTeX2e}
\expandafter\endgroup\ifx\NameOfLaTeXe\fmtname\else
\csname fi\endcsname
%&lt;/internal&gt;
%
%&lt;*install&gt;
\input ctxdocstrip.tex
\keepsilent

\preamble

    Copyright (C) 2017--2020 by Xiangdong Zeng &lt;xdzeng96@gmail.com&gt;

    This work may be distributed and/or modified under the
    conditions of the LaTeX Project Public License, either
    version 1.3c of this license or (at your option) any later
    version. The latest version of this license is in:

      http://www.latex-project.org/lppl.txt

    and version 1.3 or later is part of all distributions of
    LaTeX version 2005/12/01 or later.

    This work has the LPPL maintenance status `maintained'.

    The Current Maintainer of this work is Xiangdong Zeng.

    This work consists of the files zhlipsum.dtx,
                                    zhlipsum-text.dtx,
              and the derived files zhlipsum.ins,
                                    zhlipsum.sty,
                                    zhlipsum-utf8.def,
                                    zhlipsum-gbk.def,
                                    zhlipsum-big5.def,
                                    zhlipsum-en.tex,
                                    zhlipsum.pdf,
                                    zhlipsum-en.pdf,
                                and README.md.

\endpreamble

\generate{
  \usedir{tex/latex/zhlipsum}
    \file{\jobname.sty}      {\from{\jobname.dtx}{package}}
    \file{\jobname-utf8.def} {\from{\jobname.dtx}{text,utf8}
                              \from{\jobname-text.dtx}{text,utf8}}
    \file{\jobname-gbk.def}  {\from{\jobname.dtx}{text,gbk}
                              \from{\jobname-text.dtx}{text,gbk}}
    \file{\jobname-big5.def} {\from{\jobname.dtx}{text,big5}
                              \from{\jobname-text.dtx}{text,big5}}
%&lt;/install&gt;
%&lt;*internal&gt;
  \usedir{source/latex/zhlipsum}
    \file{\jobname.ins}      {\from{\jobname.dtx}{install}}
%&lt;/internal&gt;
%&lt;*install&gt;
  \usedir{doc/latex/zhlipsum}
  \nopreamble\nopostamble
    \file{README.md}         {\from{\jobname.dtx}{readme}}
}

\obeyspaces
\Msg{****************************************************}
\Msg{*                                                  *}
\Msg{* To finish the installation you have to move the  *}
\Msg{* following file into a directory searched by TeX: *}
\Msg{*                                                  *}
\Msg{*     zhlipsum.sty                                 *}
\Msg{*     zhlipsum-utf8.def                            *}
\Msg{*     zhlipsum-gbk.def                             *}
\Msg{*     zhlipsum-big5.def                            *}
\Msg{*                                                  *}
\Msg{* The recommended directory is                     *}
\Msg{*   TDS:tex/latex/zhlipsum                         *}
\Msg{*                                                  *}
\Msg{* To produce the documentation run the file        *}
\Msg{* zhlipsum.dtx through XeLaTeX.                    *}
\Msg{*                                                  *}
\Msg{* Happy TeXing!                                    *}
\Msg{*                                                  *}
\Msg{****************************************************}

\endbatchfile
%&lt;/install&gt;
%
%&lt;*internal&gt;
\fi
%&lt;/internal&gt;
%
%&lt;package&gt;\NeedsTeXFormat{LaTeX2e}
%&lt;package&gt;\RequirePackage{expl3}
%&lt;*!(driver|install)&gt;
%&lt;!readme&gt;\GetIdInfo $Id: zhlipsum.dtx 1.2.0 2020-04-10 12:00:00Z Xiangdong Zeng &lt;xdzeng96@gmail.com&gt; $
%&lt;package&gt;  {Chinese dummy text}
%&lt;package&gt;\ProvidesExplPackage{\ExplFileName}
%&lt;utf8&gt;  {Chinese dummy text with UTF-8 encoding (for zhlipsum)}
%&lt;utf8&gt;\ProvidesExplFile{\ExplFileName-utf8.def}
%&lt;gbk&gt;  {Chinese dummy text with GBK encoding (for zhlipsum)}
%&lt;gbk&gt;\ProvidesExplFile{\ExplFileName-gbk.def}
%&lt;big5&gt;  {Chinese dummy text with Big5 encoding (for zhlipsum)}
%&lt;big5&gt;\ProvidesExplFile{\ExplFileName-big5.def}
%&lt;!readme&gt;  {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
%&lt;/!(driver|install)&gt;
%&lt;*driver&gt;
%^^A! \PassOptionsToPackage{scheme=plain, linespread=1.1}{ctex}
%^^A+
\documentclass{ctxdoc}
\usepackage{multirow}
\setCJKmainfont{Source Han Serif SC}[ItalicFont=Kaiti SC]
\setCJKmonofont{STFangsong}[ItalicFont=Kaiti SC]
%^^A-
\hypersetup{%
  pdftitle={zhlipsum: ä¸­æ–‡ä¹±æ•°å‡æ–‡ï¼ˆLorem ipsumï¼‰},
  pdfauthor={æ›¾ç¥¥ä¸œ},
  bookmarksnumbered=true
}
%^^A! \hypersetup{%
%^^A!   pdftitle={zhlipsum: Chinese dummy text},
%^^A!   pdfauthor={Xiangdong Zeng},
%^^A!   bookmarksnumbered=true
%^^A! }
%^^A! \ctexset{%
%^^A!   section={name={}, format+=\raggedright},
%^^A!   subsubsection/tocline={\CTEXnumberline{#1}#2}
%^^A! }
%^^A! \pagestyle{headings}
%^^A+
% Use `!` for comment in `ctexexam`.
\catcode`!=\active
\RecustomVerbatimEnvironment{ctexexam}{Verbatim}{%
  frame=single, framesep=10pt,
%^^A-
  gobble=4,
  label=\rule{0pt}{12pt}\textnormal{\bfseries ä¾‹ \arabic{ctexexam}},
  defineactive=\def!{\color{gray}\%},
%^^A!   gobble=2,
%^^A!   label=\rule{0pt}{12pt}\textnormal{\bfseries Example \arabic{ctexexam}},
%^^A!   defineactive=\def!{\color{gray}\itshape\%},
%^^A+
  listparameters=%
    \setlength\topsep{\bigskipamount}%
    \refstepcounter{ctexexam}\ctexexamlabelref}
\preto\ctexexam{\catcode`!=\active}
\preto\endctexexam{\catcode`!=12}
\catcode`!=12
% Do not add hyperlink for `TF`, and do not change color.
\ExplSyntaxOn
\cs_set_protected:Npn \__codedoc_typeset_TF:
  {
    \group_begin:
      \exp_args:No \__codedoc_if_macro_internal:nT \l__codedoc_tmpa_tl
        { \color[gray]{0.5} }
      \itshape TF
      \makebox[0pt][r]
        {
          \color{red}
          \underline{\phantom{\itshape TF} \kern-0.1em}
        }
    \group_end:
  }
\ExplSyntaxOff
\makeatother
\RenewDocumentEnvironment{arguments}{}%
  {\enumerate[label={\texttt{\#\arabic*:~}},
    leftmargin=2em, labelsep=0pt, nolistsep]}%
  {\endenumerate}
%^^A-
\def\IndexLayout{%
  \newgeometry{hmargin=1.00in, vmargin={1.25in, 1.00in}}%
  \ctexset{section/numbering=false}%
  \StopSpecialIndexModule}
\DoNotIndex{\\}
\begin{document}
  \DocInput{\jobname.dtx}
  \IndexLayout
  \PrintChanges
  \PrintIndex
\end{document}
%&lt;/driver&gt;
% \fi
%
% \changes{v0.1}{2017/04/08}{å¼€å§‹ç¼–å†™å®åŒ…ã€‚}
% \changes{v0.2}{2017/04/14}{ä»¿ç…§ \pkg{kantlipsum} å®åŒ…ï¼Œå®žçŽ°
%   ä»»æ„çš„æ®µè½é€‰å–ã€‚}
% \changes{v0.2}{2017/04/14}{ä½¿ç”¨åå­—ç©ºé—´ã€‚}
% \changes{v0.4}{2017/09/16}{å°†å®‰è£…ã€æµ‹è¯•æ–‡ä»¶é›†æˆè¿›æºæ–‡ä»¶ã€‚}
% \changes{v0.4}{2017/09/16}{ä¼˜åŒ–å®åŒ…å®žçŽ°ã€‚}
% \changes{v0.5}{2018/01/06}{æ·»åŠ&nbsp;è‹±æ–‡ç‰ˆç”¨æˆ·æ–‡æ¡£ã€‚}
% \changes{v1.1.1}{2018/09/08}{å®Œå–„æŒç»­é›†æˆç³»ç»Ÿï¼Œåœ¨å¤šå¹³å°ä¸Šè¿›è¡Œæµ‹è¯•ã€‚}
%
% \CheckSum{0}
%
% \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
%   Lower-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
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&amp;
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \&lt;
%   Equals        \=     Greater than  \&gt;     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \title{\textbf{zhlipsum: ä¸­æ–‡ä¹±æ•°å‡æ–‡ï¼ˆLorem ipsumï¼‰}}
% \author{æ›¾ç¥¥ä¸œ}
% \date{2020/04/10 \quad v1.2.0^^A
%   \thanks{\url{https://github.com/stone-zeng/zhlipsum}.}}
%^^A! \title{\textbf{The \pkg{zhlipsum} Package: Chinese Dummy Text}}
%^^A! \author{Xiangdong Zeng}
%^^A! \date{2020/04/10 \quad v1.2.0%
%^^A!   \thanks{\url{https://github.com/stone-zeng/zhlipsum}.}}
%^^A!
%
%^^A æ&nbsp;‡é¢˜é¡µé¡µè¾¹è·
% \newgeometry{hmargin={1.25in, 1.25in}, vmargin={1.25in, 1.00in}}
%
%^^A! \begin{document}
%^^A!
%
% \maketitle
%
% \begin{minipage}{0.9\textwidth}
% \small \itshape
% \mbox{} \par \mbox{} \par
% \qquad å¦‚å½­å¥‡å’Œç“¦ç‰¹æ›¼çš„å…¬å…±äº‹ä¸šæ‰€è¯å®žçš„é‚£æ&nbsp;·æœ‰ä¸€ä¸ªèƒ¡å­é›ªé›ªç™½çš„ä¸Šå¸è¶…
% è¶Šæ—¶é—´è¶…è¶Šç©ºé—´ç¡®ç¡®å®žå®žå­˜åœ¨ä»–åœ¨ç¥žåœ£çš„å†·æ¼&nbsp;ç¥žåœ£çš„ç–¯ç‹‚ç¥žåœ£çš„å–‘å“‘çš„é«˜å¤„æ·±
% æ·±åœ°çˆ±ç€æˆ‘ä»¬é™¤äº†å°‘æ•°çš„ä¾‹å¤–ä¸çŸ¥ä»€ä¹ˆåŽŸå›&nbsp;ä½†æ—¶é—´å°†ä¼šæ­ç¤ºä»–åƒç¥žåœ£çš„å¯†å…°è¾¾
% ä¸€æ&nbsp;·å’Œäººä»¬ä¸€èµ·å¿å—ç€ç—›è‹¦è¿™ç­äººä¸çŸ¥ä»€ä¹ˆåŽŸå›&nbsp;ä½†æ—¶é—´å°†ä¼šæ­ç¤ºç”Ÿæ´»åœ¨ç—›è‹¦ä¸­
% ç”Ÿæ´»åœ¨çƒˆç«ä¸­è¿™çƒˆç«è¿™ç«ç„°å¦‚æžœç»§ç»­ç‡ƒçƒ§æ¯«æ—&nbsp;ç–‘é—®å°†ä½¿ç©¹è‹ç€ç«ä¹Ÿå°±æ˜¯è¯´å°†åœ°
% ç‹±ç‚¸ä¸Šå¤©åŽ»å¤©æ˜¯é‚£ä¹ˆè“é‚£ä¹ˆæ¾„æ¾ˆé‚£ä¹ˆå¹³é™è¿™ç§å¹³é™å°½ç®¡æ—¶æ–­æ—¶ç»­æ€»æ¯”æ²¡æœ‰å¥½å¾—
% å¤šä½†æ˜¯åˆ«è¿™ä¹ˆå¿«è¿˜è¦è¿›ä¸€æ­¥è€ƒè™‘åˆ°æ³°æ–¯ä¸¢å’Œä¸˜é‚£å¾·çš„äººä½“æµ‹å®šå­¦é™¢çš„æœªå®Œæˆçš„
% ç&nbsp;”ç©¶ç»“æžœæ—©å·²æ–­å®šæ¯«æ—&nbsp;ç–‘é—®æ¢å¥è¯è¯´é™¤äº†ä¾é™„ç€äººç±»çš„ç–‘é—®ä¹‹å¤–åˆ«æ—&nbsp;å…¶ä»–ç–‘é—®
% æ&nbsp;¹æ®æ³°æ–¯ä¸¢å’Œä¸˜é‚£å¾·çš„æœªå®Œæˆçš„åŠ³åŠ¨çš„ç»“æžœæ—©å·²ä½œå‡ºå¦‚ä¸‹çš„è®ºæ–­ä½†æ˜¯åˆ«è¿™ä¹ˆå¿«
% ä¸çŸ¥ä»€ä¹ˆåŽŸå›&nbsp;æ&nbsp;¹æ®å½­å¥‡å’Œç“¦ç‰¹æ›¼çš„å…¬å…±äº‹ä¸šçš„ç»“æžœå·²æ¯«æ—&nbsp;ç–‘é—®åœ°æ–­å®šé‰´äºŽæ³¢æ³¢
% å¤«å’Œè´å°”å¥‘ä¸çŸ¥ä»€ä¹ˆåŽŸå›&nbsp;æœªå®Œæˆçš„åŠ³åŠ¨ä»¥åŠæ³°æ–¯ä¸¢å’Œä¸˜é‚£å¾·çš„æœªå®Œæˆçš„åŠ³åŠ¨å·²
% ç»å°±ä¸šå·²è¢«è®¸å¤šäººæ‰€å¦è®¤çš„è®ºç‚¹ä½œå‡ºè®ºæ–­è®¤ä¸ºæ³°æ–¯ä¸¢å’Œä¸˜é‚£å¾·æ‰€å‡è®¾çš„äººè®¤ä¸º
% å®žé™…å­˜åœ¨çš„äººè®¤ä¸ºäººç±»æ€»è€Œè¨€ä¹‹ç»Ÿè€Œè¨€ä¹‹å°½ç®¡æœ‰è¿›æ­¥çš„è¥å…»å­¦å’Œé€šå¤§ä¾¿è¯å´åœ¨
% è¡°å¼±èŽç¼©è¡°å¼±èŽç¼©è€Œä¸”ä¸Žæ­¤åŒæ—¶å°¤å…¶æ˜¯ä¸çŸ¥ä»€ä¹ˆåŽŸå›&nbsp;å°½ç®¡ä½“è‚²è¿åŠ¨åœ¨å„æ–¹é¢éƒ½
% æœ‰å¾ˆå¤§è¿›å±•å¦‚ç½‘çƒè¶³çƒç”°å¾„è½¦èµ›æ¸¸æ³³é£žè¡Œåˆ’èˆ¹éª‘é©¬æ»‘ç¿”æºœå†°å„å¼å„æ&nbsp;·çš„ç½‘çƒå„
% ç§å„æ&nbsp;·è‡´äººæ­»å‘½çš„é£žè¡Œè¿åŠ¨å„å¼å„æ&nbsp;·çš„ç§‹å¤©å¤å¤©å†¬å¤©å†¬å¤©ç½‘çƒå„ç§å„æ&nbsp;·çš„æ›²æ£
% çƒç›˜å°¼è¥¿æž—å’Œä»£ç”¨å“æ€»ä¹‹æˆ‘æŽ¥ä¸‹åŽ»è®²ä¸Žæ­¤åŒæ—¶ä¸çŸ¥ä»€ä¹ˆåŽŸå›&nbsp;è¦èŽç¼©è¦å‡å°‘å°½ç®¡
% æœ‰ç½‘çƒæˆ‘æŽ¥ä¸‹åŽ»è®²é£žè¡Œæ»‘ç¿”ä¹ç©´å’Œåå…«ç©´çš„é«˜å°”å¤«çƒå„ç§å„æ&nbsp;·çš„ç½‘çƒæ€»ä¹‹ä¸çŸ¥
% ä»€ä¹ˆåŽŸå›&nbsp;åœ¨ç•ªå…‹æ±‰è´å…‹æ±‰ç¦å°”æ±‰å…‹èŽ±æ™®æ±‰æ¢å¥è¯è¯´ä¸Žæ­¤åŒæ—¶å°¤å…¶æ˜¯ä¸çŸ¥ä»€ä¹ˆåŽŸ
% å›&nbsp;ä½†æ—¶é—´å°†ä¼šæ­ç¤ºè¦å‡å°‘å‡å°‘æˆ‘æŽ¥ä¸‹åŽ»è®²ç¦å°”æ±‰å…‹èŽ±æ™®æ±‰æ€»ä¹‹è‡ªä»Žå¡žç¼ªå°”Â·çº¦
% ç¿°é€ŠåŽ»ä¸–ä»¥åŽåˆ°çŽ°åœ¨æ¯ä¸ªäººçš„å…¨éƒ¨æŸå¤±å…±è®¡æ¯äººä¸€å‹å››å”¡åªæ˜¯å¤§æ¦‚çº¦ç•¥ç²—ç²—è®¡
% ç®—åˆ°å°æ•°ç‚¹åˆ†é‡å¾ˆè¶³ä¿æŒæ•´æ•°èµ¤è£¸è£¸çš„å…‰ç©¿ç€è¢œå­åœ¨åº·çº³é©¬æ‹‰æ€»ä¹‹ä¸çŸ¥ä»€ä¹ˆåŽŸ
% å›&nbsp;ä¸ç®¡æ€Žæ&nbsp;·æ—&nbsp;è®ºå¦‚ä½•äº‹å®žä¿±åœ¨å°¤å…¶æ˜¯è€ƒè™‘åˆ°æ›´åŠ&nbsp;è¿œä¸ºä¸¥è‚ƒçš„çœ‹æ¥æ›´åŠ&nbsp;ä¸¥è‚ƒçš„é‰´
% äºŽæ–¯ä¸¹å¨æ&nbsp;¼å’Œå½¼ç‰¹æ›¼çš„å¾’åŠ³çœ‹æ¥æ›´åŠ&nbsp;ä¸¥è‚ƒçš„é‰´äºŽé‰´äºŽé‰´äºŽæ–¯ä¸¹å¨æ&nbsp;¼å’Œå½¼ç‰¹æ›¼å¾’
% åŠ³åœ¨å¹³åŽŸåœ¨å±±åœ°åœ¨æµ·æ´‹åœ¨çƒˆç«æ²¸è…¾çš„æ²³é‡Œå¤©ç©ºæ˜¯ä¸€æ&nbsp;·çš„éšåŽæ˜¯å¤§åœ°æ¢å¥è¯è¯´å¤©
% ç©ºéšåŽæ˜¯å¤§åœ°åœ¨ä¸€ç‰‡å¯’å†·ä¸€ç‰‡æ¼†é»‘ä¸­å¤©ç©ºå¤§åœ°çŸ³å¤´çš„ä½æ‰€åœ¨ä¸€ç‰‡å¯’å†·ä¸­å“Žå“Ÿå“Ÿ
% åœ¨æˆ‘ä»¬çš„ä¸»è¯žç”Ÿå…­ç™¾å¹´å·¦å³å¤©ç©ºå¤§åœ°æµ·æ´‹å¤§åœ°çŸ³å¤´çš„ä½æ‰€æ±ªæ´‹ä¸­ä¸€ç‰‡å¯’å†·ä¸­åœ¨
% æµ·ä¸Šåœ¨é™†åœ°åœ¨ç©ºä¸­æˆ‘æŽ¥ä¸‹åŽ»è®²ä¸çŸ¥ä»€ä¹ˆåŽŸå›&nbsp;å°½ç®¡æœ‰ç½‘çƒäº‹å®žä¿±åœ¨ä½†æ—¶é—´å°†ä¼šæ­
% ç¤ºæˆ‘æŽ¥ä¸‹åŽ»è®²å“Žå“Ÿå“Ÿæ€»ä¹‹ä¸€å¥è¯çŸ³å¤´çš„ä½æ‰€è°èƒ½æ€€ç–‘æˆ‘æŽ¥ä¸‹åŽ»è®²ä½†æ˜¯åˆ«è¿™ä¹ˆå¿«
% æˆ‘æŽ¥ä¸‹åŽ»è®²å¤´é¢…è¦èŽç¼©è¡°å¼±å‡å°‘ä¸Žæ­¤åŒæ—¶å°¤å…¶æ˜¯ä¸çŸ¥ä»€ä¹ˆåŽŸå›&nbsp;å°½ç®¡æœ‰ç½‘çƒèƒ¡å­
% ç«ç„°çƒé˜ŸçŸ³å¤´é‚£ä¹ˆè“é‚£ä¹ˆå¹³é™å“Žå“Ÿå“Ÿå¤´é¢…å¤´é¢…å¤´é¢…å¤´é¢…åœ¨åº·çº³é©¬æ‹‰å°½ç®¡æœ‰ç½‘çƒ
% æœªå®Œæˆçš„å¾’ç„¶çš„åŠ³åŠ¨æ›´åŠ&nbsp;ä¸¥è‚ƒçš„çŸ³å¤´çš„ä½æ‰€æ€»ä¹‹æˆ‘æŽ¥ä¸‹åŽ»è®²å“Žå“Ÿå“Ÿå¾’åŠ³çš„æœªå®Œ
% æˆçš„å¤´é¢…å¤´é¢…åœ¨åº·çº³é©¬æ‹‰å°½ç®¡æœ‰ç½‘çƒå¤´é¢…å“Žå“ŸçŸ³å¤´ä¸˜é‚£å¾·ï¼ˆæ··æˆ˜ï¼Œæœ€åŽçš„ç‹‚
% å–Šï¼‰ç½‘çƒâ€¦â€¦çŸ³å¤´â€¦â€¦é‚£ä¹ˆå¹³é™â€¦â€¦ä¸˜é‚£å¾·â€¦â€¦æœªå®Œæˆçš„â€¦â€¦
% \end{minipage}
%
% \begin{flushright}
%   \small \itshape â€”â€”è¨ç¼ªå°”Â·è´å…‹ç‰¹ã€Šç­‰å¾…æˆˆå¤šã€‹
% \end{flushright}
%
%^^A ç”¨æˆ·æ‰‹å†Œçš„é¡µè¾¹è·
%^^A+
% \newgeometry{%
%   hmargin={2.0in, 0.8in},
%   vmargin={1.2in, 1.0in},
%   marginpar=1.8in
% }
%^^A-
%^^A!
%
%^^A! \maketitle
%^^A!
%
% \section{ç®€ä»‹}
%^^A! \section{Introduction}
%^^A!
%
% \pkg{zhlipsum} å®åŒ…ç”¨äºŽè¾“å…¥ä¸­æ–‡ä¹±æ•°å‡æ–‡ï¼ˆæ‹‰ä¸è¯­ä¸º \emph{Lorem
% ipsum}ï¼‰ã€‚ä¹±æ•°å‡æ–‡æ˜¯å¤§æ®µæ—&nbsp;æ„ä¹‰çš„æ–‡å­—ï¼Œå¸¸ç”¨æ¥æµ‹è¯•æŽ’ç‰ˆæ•ˆæžœã€‚æ”¯æŒå…¶ä»–
% è¯­è¨€ä¹±æ•°å‡æ–‡çš„å®åŒ…è¿˜æœ‰ \pkg{lipsum}ã€\pkg{kantlipsum}ã€
% \pkg{blindtext} ç­‰ã€‚
%^^A! The \pkg{zhlipsum} package is used for typesetting dummy text
%^^A! (i.e.\ ``\emph{Lorem ipsum}'') as \pkg{lipsum},
%^^A! \pkg{kantlipsum}, \pkg{blindtext} etc., but for Chinese
%^^A! language. Dummy text will be pretty useful, for example, when
%^^A! testing fonts or page styles.
%^^A!
%
% \pkg{zhlipsum} å®åŒ…æ”¯æŒ UTF-8ã€GBK å’Œ Big5 ç¼–ç&nbsp;ï¼Œä¾èµ– \LaTeX3{} é¡¹ç›®
% ä¸­çš„ \pkg{expl3}ã€\pkg{xparse} å’Œ \pkg{l3keys2e} å®åŒ…ã€‚ä¸ºæ­£ç¡®è¾“å…¥ä¸­
% æ–‡ï¼Œ\pkg{zhlipsum} éœ€è¦ä¸Ž \pkg{CJK} å®åŒ…æˆ– \CTeX{} å®é›†ç­‰é…å¥—ä½¿ç”¨ã€‚
%^^A! \pkg{zhlipsum} supports UTF-8, GBK and Big5 encodings. Packages
%^^A! \pkg{expl3}, \pkg{xparse} and \pkg{l3keys2e} in the \LaTeX3{}
%^^A! Project are required. To typeset Chinese properly, \pkg{zhlipsum}
%^^A! should be used with \pkg{CJK} package or \CTeX{} bundle.
%^^A!
%
% \section{ä½¿ç”¨è¯´æ˜Ž} \label{sec:user-guide}
%^^A! \section{User's guide} \label{sec:user-guide}
%^^A!
%
%^^A+
% \begin{function}[added=2017-09-16,updated=2018-04-01]{encoding}
%   \begin{syntax}
%     encoding = &lt;(utf8)|gbk|big5&gt;
%   \end{syntax}
%^^A-
%   ç”¨äºŽæŒ‡å®šç¼–ç&nbsp;çš„å®åŒ…é€‰é¡¹ï¼Œå¯åœ¨è°ƒç”¨å®åŒ…çš„æ—¶å€™è®¾å®šã€‚é»˜è®¤ä¸º
%   \opt{utf8}ã€‚å¯¹äºŽ \XeLaTeX{}ã€\LuaLaTeX{} å’Œ \upLaTeX{} ç­‰ Unicode
%   å¼•æ“Žï¼Œ\opt{gbk} å’Œ \opt{big5} ç¼–ç&nbsp;æ—&nbsp;æ•ˆï¼Œå®åŒ…å°†å¼ºåˆ¶ä½¿ç”¨ \opt{utf8}
%   ç¼–ç&nbsp;ã€‚
% \end{function}
%^^A!   Package option for selecting encoding. Default value is
%^^A!   \opt{utf8}. For Unicode engines as \XeLaTeX{}, \LuaLaTeX{} and
%^^A!   \upLaTeX{}, \opt{gbk} / \opt{big5} encodings are invalid and
%^^A!   \opt{utf8} will be used forcibly.
%^^A! \end{function}
%^^A!
%
% å¦‚æžœä½¿ç”¨äº† \CTeX{} å®é›†ï¼Œåˆ™ç¼–ç&nbsp;ä¼šæ&nbsp;¹æ® \CTeX{} è‡ªåŠ¨ç¡®å®šã€‚ä½†éœ€æ³¨æ„ï¼Œ
% åœ¨ \CTeX{} å®é›†ä¸­ï¼Œç›¸åº”çš„å®åŒ…é€‰é¡¹ä¸ºå¤§å†™çš„ \opt{UTF8} å’Œ \opt{GBK}ï¼Œ
% è€Œæœ¬å®åŒ…ä¸­æ‰€æœ‰é€‰é¡¹å‡ä¸ºå°å†™ã€‚
%^^A! If you have loaded \CTeX{} bundle, then the encoding will be
%^^A! selected automatically according to \CTeX{}. Note that in \CTeX{}
%^^A! bundle, the correspoding options are \opt{UTF8} and \opt{GBK},
%^^A! while the options in \pkg{zhlipsum} are all in \emph{lowercase}.
%^^A!
%
%^^A+
% \begin{function}[updated=2020-04-08]{\zhlipsum}
%^^A-
%   \begin{syntax}
%     \cs{zhlipsum}\oarg{æ®µè½}\oarg{é€‰é¡¹}
%     \cs{zhlipsum}*\oarg{æ®µè½}\oarg{é€‰é¡¹}
%   \end{syntax}
%   æ’å…¥å‡æ–‡æ–‡æœ¬ã€‚å‚æ•° \meta{æ®µè½} å’Œ \meta{é€‰é¡¹} éƒ½æ˜¯å¯é€‰çš„ã€‚æ³¨æ„å„
%   å‚æ•°ä¹‹é—´ä¸å¯ä»¥æœ‰ç©ºæ&nbsp;¼ã€‚
% \end{function}
%^^A!   \begin{syntax}
%^^A!     \cs{zhlipsum}\oarg{paragraph}\oarg{options}
%^^A!     \cs{zhlipsum*}\oarg{paragraph}\oarg{options}
%^^A!   \end{syntax}
%^^A!   Produce dummy text. Both arguments \meta{paragraph} and
%^^A!   \meta{options} are optional. Note that spaces are not allowed
%^^A!   between the arguments.
%^^A! \end{function}
%^^A!
%
% é»˜è®¤æƒ…å†µä¸‹ï¼Œä¸å¸¦æ˜Ÿå·çš„å‘½ä»¤ \cs{zhlipsum} ä¼šåœ¨å‡æ–‡æ®µè½ä¹‹åŽä¸Žä¹‹é—´
% è¿›è¡Œåˆ†æ®µï¼ˆå³æ’å…¥ \tn{par}ï¼‰ï¼Œè€Œå¸¦æ˜Ÿå·çš„å‘½ä»¤ \cs{zhlipsum}|*|
% åˆ™ä¸åšé¢å¤–å¤„ç†ã€‚æ‚¨å¯ä»¥åˆ©ç”¨åŽæ–‡ç»™å‡ºçš„ \opt{before}ã€\opt{after}ã€
% \opt{inter} é€‰é¡¹æ¥æ›´æ”¹é»˜è®¤è®¾ç½®ã€‚
%^^A! By default, the \cs{zhlipsum} command will insert \tn{par}
%^^A! after and between dummy text paragraphs, while \cs{zhlipsum}|*|
%^^A! will not give any extra processing. To change the default
%^^A! behavior, you can use the \opt{before}, \opt{after} and
%^^A! \opt{inter} options described below.
%^^A!
%
% ç¬¬ä¸€ä¸ªå¯é€‰å‚æ•° \meta{æ®µè½} ä¸ºè‹±æ–‡é€—å·åˆ†éš”çš„æ®µè½ç¼–å·åˆ—è¡¨ï¼Œä¸¾ä¾‹å¦‚ä¸‹ï¼š
%^^A! The first optional argument \meta{paragraph} should be a comma
%^^A! list. It can be specified as the following:
%^^A!
%
% \begin{ctexexam}
%   ! å‡è®¾å‡æ–‡æœ€å¤§æ®µè½æ•°ä¸º 50
%   \zhlipsum[2-4]          ! å¯ç”¨ a-b çš„å½¢å¼æŒ‡å®š
%   \zhlipsum[4,12,3-8]     ! ä¹Ÿå¯ç”¨å•ä¸ªæ•°å­—æŒ‡å®š
%   \zhlipsum[-10,40-]      ! è¾“å‡º 1-10 æ®µå’Œ 40-50 æ®µ
%   \zhlipsum[-]            ! è¾“å‡ºå…¨éƒ¨æ®µè½ï¼Œå³ 1-50 æ®µ
%   \zhlipsum               ! é»˜è®¤è¾“å‡º 1-3 æ®µ
%   \zhlipsum[48-52]        ! è¶…å‡ºéƒ¨åˆ†ä¼šè‡ªåŠ¨å¿½ç•¥ï¼Œå³åªè¾“å‡º 48-50 æ®µ
% \end{ctexexam}
%^^A! \begin{ctexexam}
%^^A!   ! Suppose the dummy text has 50 paragraphs.
%^^A!   \zhlipsum[2-4]          ! Can be specified as a-b
%^^A!   \zhlipsum[4,12,3-8]     ! A single number is also acceptable
%^^A!   \zhlipsum[-10,40-]      ! Produce paragraphs 1-10 and 40-50
%^^A!   \zhlipsum[-]            ! Produce all paragraphs, i.e. 1-50
%^^A!   \zhlipsum               ! Default value is 1-3
%^^A!   \zhlipsum[48-52]        ! Numbers larger than 50 will not be considered
%^^A!                           ! i.e. only paragraphs 48-50 are produced
%^^A! \end{ctexexam}
%^^A!
%
% ç¬¬äºŒä¸ªå¯é€‰å‚æ•° \meta{é€‰é¡¹} é€šè¿‡è‹±æ–‡é€—å·åˆ†éš”çš„é”®å€¼åˆ—è¡¨å½¢å¼ç»™å‡ºã€‚
% æ”¯æŒçš„é€‰é¡¹è§ä¸‹ã€‚
%^^A! The second optional argument \meta{options} should be a
%^^A! key-value list. Supported options are the listed below.
%^^A!
%
%^^A+
% \begin{function}[added=2018-03-24]{name}
%^^A-
%   \begin{syntax}
%     name = \meta{å‡æ–‡åç§°}
%   \end{syntax}
%   é€‰æ‹©æ’å…¥å‡æ–‡çš„åç§°ã€‚é¢„å®šä¹‰çš„å‡æ–‡å…±æœ‰ 6 ç§ï¼Œè§è¡¨~^^A
%   \ref{tab:pre-defined-dummy-text}ã€‚å½“ |encoding=utf8| æˆ– |gbk| æ—¶ï¼Œ
%   é»˜è®¤ä½¿ç”¨çš„å‡æ–‡ä¸º |simp|ï¼›è€Œå½“ |encoding=big5| æ—¶ï¼Œé»˜è®¤åˆ™ä¸º |trad|ã€‚
% \end{function}
%^^A!   \begin{syntax}
%^^A!     name = \meta{name}
%^^A!   \end{syntax}
%^^A!   Select the name of the dummy text. There are 6 pre-defined
%^^A!   dummy texts described in table~\ref{tab:pre-defined-dummy-text}.
%^^A!   The default text is |simp| when |encoding=utf8| or |gbk|, but
%^^A!   |trad| when |encoding=big5|.
%^^A! \end{function}
%^^A!
%
%^^A+
% \begingroup
% \def\B{\bullet}
% \def\M#1{\multirow{2}*{\textbf{#1}}}
% \def\T#1{\textbf{#1}}
% \begin{table}[htb]
%^^A-
%   \caption{é¢„å®šä¹‰å‡æ–‡} \label{tab:pre-defined-dummy-text}
%   \centering\small
%   \begin{tabular}{cccccccc}
%     \toprule
%       \M{åç§°} &amp; \M{æ®µè½æ•°} &amp; \M{ç®€ä½“ / ç¹ä½“} &amp; \M{æè¿°} &amp;
%         \multicolumn{3}{c}{\T{å„ç¼–ç&nbsp;ä¸‹çš„æ”¯æŒæƒ…å†µ}} \\
%       &amp; &amp; &amp; &amp; |utf8| &amp; |gbk| &amp; |big5| \\
%     \midrule
%       |simp|        &amp;  50 &amp; ç®€ &amp; æ—&nbsp;æ„ä¹‰éšæœºå‡æ–‡          &amp; \B &amp; \B &amp;    \\
%       |trad|        &amp;  50 &amp; ç¹ &amp; æ—&nbsp;æ„ä¹‰éšæœºå‡æ–‡          &amp; \B &amp; \B &amp; \B \\
%       |nanshanjing| &amp;  43 &amp; ç¹ &amp; ã€Šå±±æµ·ç»Â·å—å±±ç»ã€‹       &amp; \B &amp;    &amp;    \\
%       |xiangyu|     &amp;  45 &amp; ç¹ &amp; å¸é©¬è¿ã€Šå²è®°Â·é¡¹ç¾½æœ¬çºªã€‹ &amp; \B &amp; \B &amp; \B \\
%       |zhufu|       &amp; 110 &amp; ç®€ &amp; é²è¿…ã€Šç¥ç¦ã€‹            &amp; \B &amp; \B &amp;    \\
%       |aspirin|     &amp;  66 &amp; ç®€ &amp; ç»´åŸºç™¾ç§‘æ¡ç›®ï¼šé˜¿å¸åŒ¹æž—  &amp; \B &amp; \B &amp;    \\
%     \bottomrule
%   \end{tabular}
% \end{table}
% \endgroup
%^^A!   \caption{Pre-defined dummy texts} \label{tab:pre-defined-dummy-text}
%^^A!   \centering\scriptsize
%^^A!   \begin{tabular}{cccccccc}
%^^A!     \toprule
%^^A!       \M{Name} &amp; \T{Paragraph} &amp; \T{Simplified /} &amp; \M{Description} &amp;
%^^A!         \multicolumn{3}{c}{\T{Encodings' support}} \\
%^^A!       &amp; \T{numbers} &amp; \T{traditional} &amp; &amp; |utf8| &amp; |gbk| &amp; |big5| \\
%^^A!     \midrule
%^^A!       |simp|        &amp;  50 &amp; S &amp; Random dummy text                         &amp; \B &amp; \B &amp;    \\
%^^A!       |trad|        &amp;  50 &amp; T &amp; Random dummy text                         &amp; \B &amp; \B &amp; \B \\
%^^A!       |nanshanjing| &amp;  43 &amp; T &amp; \emph{Shanhaijing: Nanshanjing}           &amp; \B &amp;    &amp;    \\
%^^A!       |xiangyu|     &amp;  45 &amp; T &amp; \emph{Shiji: Xiang Yu Benji} by Sima Qian &amp; \B &amp; \B &amp; \B \\
%^^A!       |zhufu|       &amp; 110 &amp; S &amp; \emph{Zhufu} by Lu Xun                    &amp; \B &amp; \B &amp;    \\
%^^A!       |aspirin|     &amp;  66 &amp; S &amp; Wikipedia: \emph{Aspirin}                 &amp; \B &amp; \B &amp;    \\
%^^A!     \bottomrule
%^^A!   \end{tabular}
%^^A! \end{table}
%^^A! \endgroup
%^^A!
%
% æ‚¨ä¹Ÿå¯ä»¥é€šè¿‡ \cs{newzhlipsum} å‘½ä»¤æ¥å®šä¹‰æ–°çš„å‡æ–‡ã€‚
%^^A! You can use \cs{newzhlipsum} command to define new dummy text
%^^A! as well.
%^^A!
%
%^^A+
% \begin{function}[added=2018-03-29]{before,after,inter}
%^^A-
%   \begin{syntax}
%     before = \meta{å†…å®¹}
%     after  = \meta{å†…å®¹}
%     inter  = \meta{å†…å®¹}
%   \end{syntax}
%   åœ¨å‡æ–‡æ®µè½ä¹‹å‰ã€ä¹‹åŽä¸Žä¹‹é—´æ’å…¥å†…å®¹ã€‚æ³¨æ„ä½¿ç”¨ä¸å¸¦æ˜Ÿå·çš„
%   \cs{zhlipsum} å‘½ä»¤æ—¶æ’å…¥çš„åˆ†æ®µå‘½ä»¤ä¼šè¢«è¿™é‡Œçš„è®¾ç½®è¦†ç›–ã€‚
% \end{function}
%^^A!   \begin{syntax}
%^^A!     before = \meta{content}
%^^A!     after  = \meta{content}
%^^A!     inter  = \meta{content}
%^^A!   \end{syntax}
%^^A!   Insert contents before, after or between dummy text paragraphs.
%^^A!   Note that the \tn{par} command inserted when using \cs{zhlipsum}
%^^A!   will be overridden by the settings here.
%^^A! \end{function}
%^^A!
%
% \pagebreak[3]
%
%^^A+
% \begin{function}[added=2018-03-29]{\newzhlipsum}
%^^A-
%   \begin{syntax}
%     \cs{newzhlipsum}\Arg{å‡æ–‡åç§°}\Arg{æ®µè½åˆ—è¡¨}
%   \end{syntax}
%   å£°æ˜Žæ–°çš„å‡æ–‡ã€‚å‡æ–‡åç§°åŒºåˆ†å¤§å°å†™ã€‚æ®µè½åˆ—è¡¨ä»¥è‹±æ–‡é€—å·åˆ†éš”ï¼Œç¤ºä¾‹å¦‚ä¸‹ï¼š
% \end{function}
%^^A!   \begin{syntax}
%^^A!     \cs{newzhlipsum}\Arg{name}\Arg{paragraphs list}
%^^A!   \end{syntax}
%^^A!   Declare new dummy text. The \meta{name} is case sensitive and
%^^A!   the \meta{paragraphs list} is a comma list. An example is
%^^A!   shown below:
%^^A! \end{function}
%^^A!
%
% \begin{ctexexam}
%   ! æ³¨æ„åŒºåˆ†ä¸­æ–‡é€—å·ä¸Žè‹±æ–‡é€—å·
%   \newzhlipsum{jingyesi}{!
%     {åºŠå‰æ˜Žæœˆå…‰ï¼Œ}, {ç–‘æ˜¯åœ°ä¸Šéœœã€‚}, {ä¸¾å¤´æœ›æ˜Žæœˆï¼Œ}, {ä½Žå¤´æ€æ•…ä¹¡ã€‚}}
%
%   \zhlipsum*[-][name=jingyesi]  ! è¾“å‡ºå…¨éƒ¨å››å¥å‡æ–‡ï¼Œä¸”ä¸åˆ†æ®µ
% \end{ctexexam}
%^^A! \begin{ctexexam}
%^^A!   ! Fullwidth comma `ï¼Œ' is used in Chinese language.
%^^A!   ! Normal comma `,' is used as separator.
%^^A!   \newzhlipsum{jingyesi}{!
%^^A!     {åºŠå‰æ˜Žæœˆå…‰ï¼Œ}, {ç–‘æ˜¯åœ°ä¸Šéœœã€‚}, {ä¸¾å¤´æœ›æ˜Žæœˆï¼Œ}, {ä½Žå¤´æ€æ•…ä¹¡ã€‚}}
%^^A!
%^^A!   \zhlipsum*[-][name=jingyesi]  ! Print all the four sentences without `\par'
%^^A! \end{ctexexam}
%^^A!
%
% \section{ç¼–ç¨‹æŽ¥å£}
%^^A! \section{Programming interface}
%^^A!
%
% ä¸€èˆ¬è€Œè¨€ï¼Œç¬¬~\ref{sec:user-guide} èŠ‚ä¸­åˆ—å‡ºçš„å‘½ä»¤è¶³å¤Ÿä¸€èˆ¬ç”¨æˆ·ä½¿ç”¨ã€‚
% å¦‚éœ€ä½¿ç”¨ç¼–ç¨‹æŽ¥å£ï¼Œåˆ™å¯ä»¥è€ƒè™‘ä»¥ä¸‹å˜é‡å’Œå‡½æ•°ã€‚æ³¨æ„ä½¿ç”¨æ—¶éœ€ç¡®ä¿å¼€å¯
% \LaTeX3 è¯­æ³•ã€‚
%^^A! Usually, the commands provided in section~\ref{sec:user-guide}
%^^A! are sufficient for users. For programmers professional users,
%^^A! however, the programming interface is also necessary and provided
%^^A! here. \LaTeX3 syntax should be opened when using them.
%^^A!
%
%
%^^A+
% \begin{variable}{\g_zhlipsum_seq}
%^^A-
%   å‡æ–‡åç§°åˆ—è¡¨ã€‚
%\end{variable}
%^^A!   A sequence of dummy text names.
%^^A! \end{variable}
%^^A!
%
%^^A+
% \begin{function}{\zhlipsum_use:nn}
%^^A-
%   è¾“å‡ºå¤šæ®µå‡æ–‡ã€‚
%   \begin{arguments}
%     \item å‡æ–‡åç§°
%     \item æ®µè½ç¼–å·åˆ—è¡¨
%   \end{arguments}
% \end{function}
%^^A!   Produce some dummy text paragraphs.
%^^A!   \begin{arguments}
%^^A!     \item Name
%^^A!     \item Comma list of aragraph numbers.
%^^A!   \end{arguments}
%^^A! \end{function}
%^^A!
%
%^^A+
% \begin{function}[TF]{\zhlipsum_if_exist:n}
%^^A-
%   åˆ¤æ–­æ˜¯å¦å­˜åœ¨å¯¹åº”åç§°çš„å‡æ–‡ã€‚
%   \begin{arguments}
%     \item å‡æ–‡åç§°
%   \end{arguments}
% \end{function}
%^^A!   Test whether the name has been used for dummy textã€‚
%^^A!   \begin{arguments}
%^^A!     \item Name
%^^A!   \end{arguments}
%^^A! \end{function}
%^^A!
%
%^^A+
% \begin{function}{\zhlipsum_new:nn}
%^^A-
%   å£°æ˜Žå‡æ–‡ã€‚
%   \begin{arguments}
%     \item å‡æ–‡åç§°
%     \item æ–‡æœ¬åˆ—è¡¨
%   \end{arguments}
% \end{function}
%^^A!   Declare dummy text.
%^^A!   \begin{arguments}
%^^A!     \item Name.
%^^A!     \item Comma list of texts.
%^^A!   \end{arguments}
%^^A! \end{function}
%^^A!
%
% \section{å…¼å®¹æ€§ä¿¡æ¯}
%^^A! \section{Compatibility information}
%^^A!
%
% ä»¥ä¸‹é€‰é¡¹åœ¨æµ‹è¯•ç‰ˆ \pkg{zhlipsum} å®åŒ…ä¸­å­˜åœ¨ï¼Œä½†åœ¨ 1.0.0 ç‰ˆæœ¬ä¹‹åŽä¸
% å»ºè®®ç»§ç»­ä½¿ç”¨ã€‚è¿™é‡Œä»…ä¸ºå…¼å®¹æ€§ä¿ç•™ã€‚æœªæ¥å°†å¯èƒ½åˆ&nbsp;é™¤å¯¹å®ƒä»¬çš„æ”¯æŒã€‚
%^^A! The following option exists in the beta version of \pkg{zhlipsum}
%^^A! package, but has become deprecated after version 1.0.0. It is
%^^A! reserved only for compatibility and may be removed in the future.
%^^A!
%
% \begin{function}{script}
%   è¿‡æ—¶é€‰é¡¹ã€‚çŽ°åœ¨ç›¸å½“äºŽ \opt{name}ã€‚
% \end{function}
%^^A! \begin{function}{script}
%^^A!   Deprecated option. Now it's the same as \opt{name}.
%^^A! \end{function}
%^^A!
%
% \section{å·²çŸ¥é—®é¢˜}
%^^A! \section{Known issues}
%^^A!
%
% åç§°ä¸º |nanshanjing| å’Œ |xiangyu| çš„å‡æ–‡æ–‡æœ¬å«æœ‰è‹¥å¹²ç”Ÿåƒ»å­—ã€‚å¦‚éœ€æ­£ç¡®
% æ˜¾ç¤ºï¼Œå¯ä½¿ç”¨ \pkg{xeCJK} å®åŒ…ï¼Œå¹¶è®¾ç½®åŽå¤‡å­—ä½“ä¸º SimSun-ExtBã€Hanazono
% Mincho ï¼ˆèŠ±å›­æ˜Žæœï¼‰ç­‰ï¼Œå…·ä½“æ–¹æ³•è¯·å‚è€ƒ \pkg{xeCJK} å®åŒ…æ–‡æ¡£ï¼ˆä»…é’ˆå¯¹
% ç¼–ç&nbsp;ä¸º UTF-8ï¼Œä¸”ä½¿ç”¨ \XeLaTeX{} ç¼–è¯‘çš„æƒ…å†µï¼‰ã€‚
%^^A! Dummy text |nanshanjing| and |xiangyu| have some rarely used
%^^A! characters. To display them correctly, you can use the \pkg{xeCJK}
%^^A! package and set SimSun-ExtB or Hanazono Mincho as the fallback
%^^A! font. Refer to the \pkg{xeCJK}'s user guide for specific methods
%^^A! (only for UTF-8 encoding and \XeLaTeX{} engine).
%^^A!
%
% GBK å’Œ Big5 ç¼–ç&nbsp;åœ¨ç¬¬äºŒå­—èŠ‚å¹¶æ²¡æœ‰é¿å¼€ ASCII ç&nbsp;çš„èŒƒå›´ï¼Œå›&nbsp;æ­¤éƒ¨åˆ†æ±‰å­—ç¼–
% ç&nbsp;çš„ç¬¬äºŒå­—èŠ‚æ°å¥½æ˜¯ ASCII ç¼–ç&nbsp;ä¸­çš„ä¸€äº›ç‰¹æ®Šå­—ç¬¦ï¼ˆå¦‚ |{|ã€|}|ã€|\|
% ç­‰ï¼‰ï¼Œå°†å¯¼è‡´ç¼–è¯‘å¤±è´¥ã€‚æœ¬å®åŒ…åœ¨è¿™ä¸¤ç§ç¼–ç&nbsp;ä¸‹çš„ \file{.def} æ–‡ä»¶ä¸­é‡‡å–
%äº†ç‰¹æ®ŠæŠ€å·§ï¼ˆè§~\ref{subsec:dummy-text} å°èŠ‚ï¼‰ï¼Œè¯·é¿å…ä¿®æ”¹è¿™äº›æ–‡ä»¶ã€‚
%^^A! GBK and Big5 encodings do not escape the ASCII range in the
%^^A! second byte, so the second byte of some Chinese characters may
%^^A! have the same encoding as special characters in ASCII like |{|,
%^^A! |}|, |\| etc., which will lead to compilation failure. The
%^^A! \file{.def} files in \pkg{zhlipsum} are created with special
%^^A! techniques. Please do not modify them.
%^^A!
%
% å¦‚æ—&nbsp;ç‰¹æ®Šéœ€è¦ï¼Œå§‹ç»ˆå»ºè®®æ‚¨é‡‡ç”¨ UTF-8 ç¼–ç&nbsp;ï¼Œå¹¶ä½¿ç”¨ \XeLaTeX{}ã€
% \LuaLaTeX{} ç­‰ Unicode å¼•æ“Žç¼–è¯‘ã€‚
%^^A! If there is no special requirement, UTF-8 encoding and Unicode
%^^A! engines as \XeLaTeX{} and \LuaLaTeX{} are always recommended.
%^^A!
%
% ç‰¹æ®Šæƒ…å†µä¸‹ï¼Œå¦‚æžœæ‚¨å¿…é¡»ä½¿ç”¨ GBK æˆ– Big5 ç¼–ç&nbsp;ï¼Œå¹¶éœ€è¦å£°æ˜Žæ–°çš„å‡æ–‡ï¼Œ
% å¯ä»¥é‡‡å–ä»¥ä¸‹æ‰‹æ®µä¸´æ—¶å›žé¿ä¸Šè¿°é—®é¢˜ã€‚
%^^A! In special cases, if you must use GBK or Big5 encoding and need
%^^A! to declare new dummy text, the following method can be taken in
%^^A! order to avoid the problem temporarily.
%^^A!
%
% \begin{ctexexam}
%   ! æ–‡ä»¶ç¼–ç&nbsp;éœ€ä½¿ç”¨ Big5
%   ! \usepackage[encoding=big5]{zhlipsum}
%
%   ! ç›´æŽ¥ä½¿ç”¨ \newzhlipsum{big5}{è¨±è“‹åŠŸ, è“‹åŠŸè¨±, åŠŸè¨±è“‹} ä¼šæŠ¥é”™
%   ! åŽŸç†ï¼šåˆ†ç»„å†…ä½¿ç”¨ &lt; &gt; + ä»£æ›¿ { } \ åŽï¼Œå†å°†åŽŸå…ˆçš„ { } \ è®¾ä¸ºâ€œå…¶ä»–â€ç±»ï¼ˆå³
%   ! ç±»åˆ«ç&nbsp;ä¸º 12ï¼‰
%   \begingroup
%     \catcode`\&lt;=1
%     \catcode`\&gt;=2
%     \catcode`\+=0
%     \catcode`\{=12
%     \catcode`\}=12
%     \catcode`\\=12
%     +newzhlipsum&lt;big5&gt;&lt;è¨±è“‹åŠŸ, è“‹åŠŸè¨±, åŠŸè¨±è“‹&gt;
%   +endgroup
%   \zhlipsum[name=big5]
% \end{ctexexam}
%^^A! \begin{ctexexam}
%^^A!   ! File encoding should be Big5.
%^^A!   ! \usepackage[encoding=big5]{zhlipsum}
%^^A!
%^^A!   ! Using `\newzhlipsum{big5}{è¨±è“‹åŠŸ, è“‹åŠŸè¨±, åŠŸè¨±è“‹}' directly will
%^^A!   ! lead to an error.
%^^A!   ! Use &lt;, &gt;, + to replace {, } and \, then set the original {, } and \
%^^A!   ! to be `other' category (i.e. catcode=12).
%^^A!   \begingroup
%^^A!     \catcode`\&lt;=1
%^^A!     \catcode`\&gt;=2
%^^A!     \catcode`\+=0
%^^A!     \catcode`\{=12
%^^A!     \catcode`\}=12
%^^A!     \catcode`\\=12
%^^A!     +newzhlipsum&lt;big5&gt;&lt;è¨±è“‹åŠŸ, è“‹åŠŸè¨±, åŠŸè¨±è“‹&gt;
%^^A!   +endgroup
%^^A!   \zhlipsum[name=big5]
%^^A! \end{ctexexam}
%^^A!
%
%^^A! \end{document}
%
% \StopEventually{}
%
% \begin{implementation}
%
% \section{å®žçŽ°ç»†èŠ‚}
%
%    \begin{macrocode}
%&lt;*package&gt;
%&lt;@@=zhlipsum&gt;
%    \end{macrocode}
%
% æ£€æŸ¥ \LaTeX3 ç¼–ç¨‹çŽ¯å¢ƒã€‚
%    \begin{macrocode}
\RequirePackage { xparse, l3keys2e }
\msg_new:nnn { zhlipsum } { l3-too-old }
  {
    Package~ "#1"~ is~ too~ old. \\\\
    Please~ update~ an~ up-to-date~ version~ of~ the~ bundles \\
    "l3kernel"~ and~ "l3packages"~ using~ your~ TeX~ package \\
    manager~ or~ from~ CTAN.
  }
\clist_map_inline:nn { expl3, xparse, l3keys2e }
  {
    \@ifpackagelater {#1} { 2018/05/12 }
      { } { \msg_error:nnn { zhlipsum } { l3-too-old } {#1} }
  }
%    \end{macrocode}
%
% \subsection{å†…éƒ¨å˜é‡å’Œå‡½æ•°}
%
% \begin{variable}{
%   \l_@@_tmpa_tl,
%   \l_@@_tmpa_seq,
%   \l_@@_tmpb_seq,
%   \l_@@_tmpa_str}
% ä¸´æ—¶å˜é‡ã€‚
%    \begin{macrocode}
\tl_new:N  \l_@@_tmpa_tl
\seq_new:N \l_@@_tmpa_seq
\seq_new:N \l_@@_tmpb_seq
\str_new:N \l_@@_tmpa_str
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_zhlipsum_seq}
% å‡æ–‡åç§°åˆ—è¡¨ã€‚
%    \begin{macrocode}
\seq_new:N \g_zhlipsum_seq
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\c_zhlipsum_simp_seq,\c_zhlipsum_trad_seq}
% é¢„å®šä¹‰çš„ç®€ä½“ä¸­æ–‡ä¸Žç¹ä½“ä¸­æ–‡çš„å‡æ–‡åç§°åˆ—è¡¨ã€‚
%    \begin{macrocode}
\seq_const_from_clist:Nn \c_zhlipsum_simp_seq { simp, zhufu, aspirin }
\seq_const_from_clist:Nn \c_zhlipsum_trad_seq { trad, xiangyu, nanshanjing }
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}[int]{\file_input:x}
% \LaTeX3 å‡½æ•°å˜ä½“ã€‚
%    \begin{macrocode}
\cs_generate_variant:Nn \file_input:n { x }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[TF]{\@@_if_unicode_engine:}
% åˆ¤æ–­æ˜¯å¦ä¸º Unicode å¼•æ“Žã€‚æ¥è‡ªäºŽ \pkg{zhnumber} å®åŒ…ã€‚
%    \begin{macrocode}
\prg_new_conditional:Npnn \@@_if_unicode_engine: { T, F, TF }
  {
    \bool_lazy_any:nTF
      {
        \sys_if_engine_xetex_p:
        \sys_if_engine_luatex_p:
        \sys_if_engine_uptex_p:
      }
      { \prg_return_true: } { \prg_return_false: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[TF]{\@@_if_encoding:n}
% \begin{variable}{\g_@@_encoding_str}
% åˆ¤æ–­å½“å‰ç¼–ç&nbsp;ã€‚
%    \begin{macrocode}
\prg_new_conditional:Npnn \@@_if_encoding:n #1 { T, F, TF }
  {
    \str_if_eq:VnTF \g_@@_encoding_str {#1}
      { \prg_return_true: } { \prg_return_false: }
  }
\prg_generate_conditional_variant:Nnn \@@_if_encoding:n { V } { T, F, TF }
\str_new:N \g_@@_encoding_str
%    \end{macrocode}
% \end{variable}
% \end{macro}
%
% \begin{macro}{
%   \@@_msg_new:nn,
%   \@@_error:n,
%   \@@_error:nn,
%   \@@_warning:n,
%   \@@_warning:nn,
%   \@@_warning:nnn,
%   \@@_warning:nxxx,
%   \@@_info:nn}
% å„ç§ä¿¡æ¯å‡½æ•°çš„ç¼©ç•¥å½¢å¼ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_msg_new:nn   { \msg_new:nnn       { zhlipsum } }
\cs_new:Npn \@@_error:n      { \msg_error:nn      { zhlipsum } }
\cs_new:Npn \@@_error:nn     { \msg_error:nnn     { zhlipsum } }
\cs_new:Npn \@@_warning:n    { \msg_warning:nn    { zhlipsum } }
\cs_new:Npn \@@_warning:nn   { \msg_warning:nnn   { zhlipsum } }
\cs_new:Npn \@@_warning:nnn  { \msg_warning:nnnn  { zhlipsum } }
\cs_new:Npn \@@_warning:nxxx { \msg_warning:nnxxx { zhlipsum } }
\cs_new:Npn \@@_info:nn      { \msg_info:nnn      { zhlipsum } }
%    \end{macrocode}
% \end{macro}
%
% \subsection{å®åŒ…é€‰é¡¹}
%
% \changes{v0.4}{2017/09/16}{æ–°å¢ž \opt{encoding} é€‰é¡¹ã€‚}
% \changes{v0.5}{2017/12/22}{æ”¯æŒ Big5 ç¼–ç&nbsp;ã€‚}
% \changes{v1.0.0}{2018/04/01}{æ&nbsp;¹æ® \CTeX{} å®é›†çš„é€‰é¡¹è‡ªåŠ¨ç¡®å®šç¼–ç&nbsp;ã€‚}
% \changes{v1.2.0}{2020/02/20}{ä¼˜åŒ–ç¼–ç&nbsp;åˆ¤æ–­ã€‚}
%
% \begin{macro}{encoding}
% è®¾ç½®ç¼–ç&nbsp;ã€‚
%    \begin{macrocode}
\keys_define:nn { zhlipsum / option }
  {
    encoding .choices:nn =
      { utf8, gbk, big5 }
      { \str_gset:Nn \g_@@_encoding_str {#1} },
    encoding / unknown .code:n =
      { \@@_error:nn { invalid-encoding } {#1} },
    encoding .value_required:n = true,
%    \end{macrocode}
% \end{macro}
%
% å¤„ç†æœªçŸ¥é€‰é¡¹ã€‚
%    \begin{macrocode}
    unknown .code:n = { \@@_error:n { unknown-option } }
  }
%    \end{macrocode}
%
% æç¤ºä¿¡æ¯ã€‚
%    \begin{macrocode}
\@@_msg_new:nn { invalid-encoding }
  {
    Encoding~"#1"~is~invalid. \\
    Available~encodings~are~"utf8",~"gbk"~and~"big5".
  }
\@@_msg_new:nn { unknown-option }
  { Package~option~'\l_keys_key_tl'~is~unknown. }
%    \end{macrocode}
%
% \begin{macro}{\@@_check_unicode_engine_encoding:}
% Unicode å¼•æ“Žä¸‹ç¼–ç&nbsp;å§‹ç»ˆè®¾ä¸º UTF-8ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_check_unicode_engine_encoding:
  {
    \@@_if_unicode_engine:T
      {
        \str_if_empty:NF \g_@@_encoding_str
          {
            \@@_if_encoding:nF { utf8 }
              { \@@_warning:n { unicode-engine } }
          }
        \str_gset:Nn \g_@@_encoding_str { utf8 }
      }
  }
\@@_msg_new:nn { unicode-engine }
  {
    You~are~now~using~Unicode~engine~\c_sys_engine_str\c_space_tl~so~
    encoding~"\g_@@_encoding_str"~is~invalid. \\
    Changed~into~"utf8".
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_check_ctex_encoding:}
% å¦‚æžœè°ƒç”¨äº† \CTeX{} å®é›†ï¼Œåˆ™è‡ªåŠ¨ç¡®å®šç¼–ç&nbsp;ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_check_ctex_encoding:
  {
    \tl_if_exist:NT \l__ctex_encoding_tl
      {
        \str_set:Nx \l_@@_tmpa_str
          { \str_lower_case:f { \l__ctex_encoding_tl } }
        \str_if_empty:NF \g_@@_encoding_str
          {
            \@@_if_encoding:VF \l_@@_tmpa_str
              { \@@_warning:n { ctex-encoding-conflict } }
          }
        \str_gset_eq:NN \g_@@_encoding_str \l_@@_tmpa_str
      }
  }
\@@_msg_new:nn { ctex-encoding-conflict }
  {
    Package~option~"encoding=\g_@@_encoding_str"~is~in~conflict~with~
    ctex's~option~"\l__ctex_encoding_tl". \\
    Changed~into~"encoding=\l_@@_tmpa_str".
  }
%    \end{macrocode}
% \end{macro}
%
% å°†å®åŒ…é€‰é¡¹ä¼&nbsp;ç»™ |zhlipsum/option|ã€‚
%    \begin{macrocode}
\ProcessKeysOptions { zhlipsum / option }
%    \end{macrocode}
%
% æ£€æŸ¥ç¼–ç&nbsp;å…¼å®¹æ€§ã€‚
%    \begin{macrocode}
\@@_check_unicode_engine_encoding:
\@@_check_ctex_encoding:
\str_if_empty:NT \g_@@_encoding_str
  { \str_gset:Nn \g_@@_encoding_str { utf8 } }
%    \end{macrocode}
%
% \subsection{å‡½æ•°é€‰é¡¹}
%
% \begin{variable}{\l_@@_name_tl}
% ä¿å­˜å‡æ–‡åç§°ã€‚
%    \begin{macrocode}
\tl_new:N \l_@@_name_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\l_@@_before_tl,\l_@@_after_tl,\l_@@_inter_tl}
% ä¿å­˜å‡æ–‡ä¹‹å‰ã€ä¹‹åŽä¸Žä¹‹é—´æ’å…¥çš„å†…å®¹ã€‚
%    \begin{macrocode}
\tl_new:N \l_@@_before_tl
\tl_new:N \l_@@_after_tl
\tl_new:N \l_@@_inter_tl
%    \end{macrocode}
% \end{variable}
%
%    \begin{macrocode}
\keys_define:nn { zhlipsum }
  {
%    \end{macrocode}
%
% \changes{v1.0.0}{2018/03/24}{æ–°å¢žé€‰é¡¹ \opt{name}ã€‚}
%
% \begin{macro}{name}
% å‡æ–‡åç§°ã€‚Big5 ç¼–ç&nbsp;ä¸æ”¯æŒç®€ä½“ä¸­æ–‡ã€‚
%    \begin{macrocode}
    name .code:n =
      {
        \tl_set:Nn \l_@@_name_tl {#1}
        \@@_if_encoding:nT { big5 }
          {
            \seq_if_in:NVT \c_zhlipsum_simp_seq \l_@@_name_tl
              {
                \@@_warning:nn { big5-require-trad } {#1}
                \tl_set:Nn \l_@@_name_tl { trad }
              }
          }
      },
%    \end{macrocode}
% \end{macro}
%
% \changes{v0.5}{2017/12/22}{æ–°å¢žé€‰é¡¹ \opt{script}ï¼ŒåŒæ—¶æ”¯æŒç®€ä½“ä¸­æ–‡å’Œç¹ä½“ä¸­æ–‡ã€‚}
% \changes{v1.0.0}{2018/03/24}{\opt{script} æˆä¸ºè¿‡æ—¶é€‰é¡¹ã€‚}
%
% \begin{macro}{script}
% é€‰æ‹©è¾“å…¥ç®€ä½“ä¸­æ–‡æˆ–ç¹ä½“ä¸­æ–‡ã€‚è¿‡æ—¶é€‰é¡¹ã€‚
%    \begin{macrocode}
    script .code:n =
      {
        \@@_warning:nn { deprecated-option }
          { Option~ "name=#1"~ will~ be~ set. }
        \keys_set:nn { zhlipsum } { name = #1 }
      },
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.0.0}{2018/03/23}{æ–°å¢žé€‰é¡¹ \opt{before}ã€\opt{after}ã€‚}
% \changes{v1.0.0}{2018/03/29}{æ–°å¢žé€‰é¡¹ \opt{inter}ã€‚}
%
% \begin{macro}{before,after,inter}
% å‡æ–‡ä¹‹å‰ã€ä¹‹åŽä¸Žä¹‹é—´æ’å…¥çš„å†…å®¹ã€‚
%    \begin{macrocode}
    before .tl_set:N = \l_@@_before_tl,
    after  .tl_set:N = \l_@@_after_tl,
    inter  .tl_set:N = \l_@@_inter_tl
  }
%    \end{macrocode}
% \end{macro}
%
% æç¤ºä¿¡æ¯ã€‚
%    \begin{macrocode}
\@@_msg_new:nn { big5-require-trad }
  {
    Name~ "#1"~ is~ not~ available~ in~ "Big5"~ encoding. \\
    Changed~ into~ "trad".
  }
\@@_msg_new:nn { deprecated-option }
  { Option~ "\l_keys_key_tl"~ is~ deprecated. \\ #1 }
%    \end{macrocode}
%
% åˆå§‹é€‰é¡¹è®¾ç½®ã€‚
%    \begin{macrocode}
\@@_if_encoding:nTF { big5 }
  { \keys_set:nn { zhlipsum } { name = trad } }
  { \keys_set:nn { zhlipsum } { name = simp } }
%    \end{macrocode}
%
% \subsection{è¾“å‡ºå‡æ–‡}
%
% \begin{macro}{\zhlipsum,\@@:n}
% \changes{v0.5}{2018/01/05}{æ”¯æŒé€‰é¡¹è®¾ç½®ã€‚}
% \changes{v1.0.0}{2018/03/23}{æ›´æ”¹å‚æ•°å½¢å¼ï¼Œå…è®¸åˆ©ç”¨é€—å·åˆ†éš”åˆ—è¡¨é€‰æ‹©æ®µè½ã€‚}
% \changes{v1.1.0}{2018/04/08}{æ”¹å›žä½¿ç”¨æ–¹æ‹¬å·æŒ‡å®šæ®µè½æ•°çš„å½¢å¼ã€‚}
% \changes{v1.2.0}{2020/04/08}{ä¿®æ­£ \env{quote}/\env{quotation} ç­‰çŽ¯å¢ƒä¸­æ®µè½ç¼©è¿›æ¶ˆå¤±é—®é¢˜ã€‚}
% \changes{v1.2.0}{2020/04/08}{ä¸Ž \pkg{lipsum} ç­‰å®åŒ…ä¿æŒä¸€è‡´ï¼Œä¸åœ¨å¼€å¤´æ’å…¥åˆ†æ®µå‘½ä»¤ã€‚}
% è¾“å‡ºå‡æ–‡ï¼Œç¬¬ä¸€ä¸ªå¯é€‰å‚æ•°è¡¨ç¤ºæ®µè½æ•°ï¼Œé»˜è®¤ä¸º |1-3|ï¼›ç¬¬äºŒä¸ªå¯é€‰å‚æ•°ä¸ºé€‰é¡¹åˆ—è¡¨ã€‚
%    \begin{macrocode}
\NewDocumentCommand \zhlipsum { s o +o }
  {
    \group_begin:
      \IfBooleanF {#1}
        {
          \tl_set:Nn \l_@@_before_tl { }
          \tl_set:Nn \l_@@_after_tl  { \par }
          \tl_set:Nn \l_@@_inter_tl  { \par }
        }
      \IfValueTF {#3}
        {
          \keys_set:nn { zhlipsum } {#3}
          \@@:n {#2}
        }
        {
          \IfValueTF {#2}
            {
%    \end{macrocode}
% å¦‚æžœåªå¸¦ä¸€ä¸ªå‚æ•°ï¼Œé‚£ä¹ˆæ&nbsp;¹æ®å…¶æ˜¯å¦å«æœ‰ |=| æ¥åˆ¤æ–­è¯¥å‚æ•°æ˜¯æ®µè½æ•°è¿˜æ˜¯é€‰é¡¹åˆ—è¡¨ã€‚
%    \begin{macrocode}
              \@@_if_key_value_list:nTF {#2}
                {
                  \keys_set:nn { zhlipsum } {#2}
                  \@@:n { 1 - 3 }
                }
                { \@@:n {#2} }
            }
            { \@@:n { 1 - 3 } }
        }
    \group_end:
  }
\cs_new_protected:Npn \@@:n #1
  { \exp_args:No \zhlipsum_use:nn { \l_@@_name_tl } {#1} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_if_key_value_list:nTF}
% åˆ¤æ–­æ˜¯å¦ä¸ºé”®å€¼åˆ—è¡¨ï¼Œå³æ˜¯å¦å«æœ‰ |=|ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_if_key_value_list:nTF #1
  { \tl_if_in:nnTF {#1} {=} }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}{\l_@@_par_num_seq}
% ä¿å­˜æ®µè½ç¼–å·ã€‚
%    \begin{macrocode}
\seq_new:N \l_@@_par_num_seq
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{\zhlipsum_use:nn}
% \changes{v1.2.0}{2019/08/11}{æ£€æŸ¥ç©ºçš„æ®µè½èŒƒå›´é¿å…é™·å…¥æ­»å¾ªçŽ¯ã€‚}
% è¾“å‡ºå¤šæ®µå‡æ–‡ã€‚|#1| = å‡æ–‡åç§°ï¼Œ|#2| = æ®µè½ç¼–å·åˆ—è¡¨ã€‚è§£æžæ®µè½ç¼–å·ä¹‹
% åŽï¼ŒæŒ‰æ¬¡åºé€é¡¹è¾“å‡ºï¼Œå¹¶åœ¨å‰åŽæ’å…¥ç›¸åº”å†…å®¹ã€‚æ³¨æ„æœ€åŽä¸€æ®µéœ€è¦å•ç‹¬å¤„ç†ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \zhlipsum_use:nn #1#2
  {
    \@@_if_cjk_valid_encoding:TF
      {
        \zhlipsum_if_exist:nTF {#1}
          {
            \@@_parse_par:nn {#1} {#2}
            \seq_if_empty:NF \l_@@_par_num_seq
              {
                \seq_pop_right:NN  \l_@@_par_num_seq \l_@@_tmpa_tl
                \l_@@_before_tl
                \seq_map_inline:Nn \l_@@_par_num_seq
                  {
                    \@@_use:nn {#1} {##1}
                    \l_@@_inter_tl
                  }
                \@@_use:nn {#1} { \l_@@_tmpa_tl }
                \l_@@_after_tl
              }
          }
          { \@@_error:nn { invalid-name } {#1} }
      }
      { \@@_error:n { CJK-invalid-encoding } }
  }
\@@_msg_new:nn { invalid-name }
  {
    Name~ "#1"~ is~ unknown. \\
    Please~ use~ the~ pre-defined~ Chinese~ dummy~ texts~ or~
    declare~ new~ one.
  }
\@@_msg_new:nn { CJK-invalid-encoding }
  {
    The~ current~ CJK~ environment~ uses~ "\CJK@@@@@enc"~ encoding,~
    but~ zhlipsum~ package~ has~ been~ loaded~ with~ the~ option~
    "encoding=\g_@@_encoding_str". \\
    Please~ check~ the~ package~ options.
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[TF]{\@@_if_cjk_valid_encoding:}
% æ£€æŸ¥ \env{CJK} çŽ¯å¢ƒç¼–ç&nbsp;ã€‚
%    \begin{macrocode}
\prg_new_protected_conditional:Npnn \@@_if_cjk_valid_encoding: { TF }
  {
    \tl_if_exist:NTF \CJK@@@@@enc
      {
        \exp_args:NV \str_case:nn \g_@@_encoding_str
          {
            { utf8 } { \str_if_eq:VnTF \CJK@@@@@enc { UTF8 } }
            { gbk  } { \str_if_in:NnTF \CJK@@@@@enc { GB   } }
            { big5 } { \str_if_eq:VnTF \CJK@@@@@enc { Bg5  } }
          }
        { \prg_return_true: } { \prg_return_false: }
      }
      { \prg_return_true: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[TF]{\zhlipsum_if_exist:n}
% åˆ¤æ–­æ˜¯å¦å­˜åœ¨å¯¹åº”åç§°çš„å‡æ–‡ã€‚
%    \begin{macrocode}
\prg_new_protected_conditional:Npnn \zhlipsum_if_exist:n #1 { T, F, TF }
  {
    \seq_if_in:NnTF \g_zhlipsum_seq {#1}
      { \prg_return_true: } { \prg_return_false: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}{\l_@@_begin_int,\l_@@_end_int,\l_@@_max_int}
%    \begin{macrocode}
\int_new:N \l_@@_begin_int
\int_new:N \l_@@_end_int
\int_new:N \l_@@_max_int
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\l_@@_modified_range_bool,\l_@@_invalid_range_bool}
%    \begin{macrocode}
\bool_new:N \l_@@_modified_range_bool
\bool_new:N \l_@@_invalid_range_bool
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{\@@_parse_par:nn}
% è§£æžæ®µè½ç¼–å·åˆ—è¡¨ã€‚|#1| = å‡æ–‡åç§°ï¼Œ|#2| = æ®µè½ç¼–å·åˆ—è¡¨ã€‚
%
% ç¼–å·åˆ—è¡¨ç”¨é€—å·åˆ†éš”ï¼Œå…¶ä¸­çš„æ¯ä¸€é¡¹ä¸ºå•ä¸ªæ•°å­—æˆ–ä¸º |a-b| çš„å½¢å¼ã€‚è‹¥
% |a|ã€|b| ä¸ºç©ºï¼Œåˆ™åˆ†åˆ«å–ä¸º 1 æˆ–å…è®¸çš„æœ€å¤§å€¼ï¼ˆå³æ®µè½æ•°ï¼‰ã€‚è¶…è¿‡èŒƒå›´çš„
% æ•°å­—åˆ™å¿½ç•¥ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_parse_par:nn #1#2
  {
    \seq_clear:N \l_@@_par_num_seq
    \int_set_eq:Nc \l_@@_max_int { g_@@_ #1 _int }
    \clist_map_inline:nn {#2}
      {
        \@@_parse_par_aux:n {##1}
        \bool_if:NTF \l_@@_invalid_range_bool
          { \@@_warning:nnn { invalid-range } {##1} {#2} }
          {
            \bool_if:NT \l_@@_modified_range_bool
              {
                \@@_warning:nxxx { modified-range }
                  {##1} {#2} { \@@_par_range: }
              }
            \seq_concat:NNN \l_@@_par_num_seq
              \l_@@_par_num_seq \l_@@_tmpa_seq
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_parse_par_aux:n}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_parse_par_aux:n #1
  {
    \bool_set_false:N \l_@@_modified_range_bool
    \bool_set_false:N \l_@@_invalid_range_bool
    \seq_clear:N \l_@@_tmpa_seq
    \tl_if_in:nnTF {#1} { - }
      {
        \seq_set_split:Nnn \l_@@_tmpb_seq { - } {#1}
%    \end{macrocode}
% â€œ|-|â€ å·¦ä¾§çš„æ•°å­—ã€‚
%    \begin{macrocode}
        \seq_pop_left:NN \l_@@_tmpb_seq \l_@@_tmpa_tl
        \tl_if_empty:NTF \l_@@_tmpa_tl
          { \int_set_eq:NN \l_@@_begin_int \c_one_int }
          {
            \int_set:Nn \l_@@_begin_int { \l_@@_tmpa_tl }
            \int_compare:nNnT \l_@@_begin_int &lt; \c_one_int
              {
                \int_set_eq:NN \l_@@_begin_int \c_one_int
                \bool_set_true:N \l_@@_modified_range_bool
              }
          }
%    \end{macrocode}
% â€œ|-|â€ å³ä¾§çš„æ•°å­—ã€‚æ³¨æ„å·¦å³æ•°å­—å‡ç”± \cs{seq_pop_left:NN} å¾—åˆ°ï¼Œå›&nbsp;æ­¤
% |-3-4| å®žé™…ç›¸å½“äºŽ |-3|ï¼Œè¿›è€Œè¢«è§£æžä¸º |1-3|ã€‚
%    \begin{macrocode}
        \seq_pop_left:NN \l_@@_tmpb_seq \l_@@_tmpa_tl
        \tl_if_empty:NTF \l_@@_tmpa_tl
          { \int_set_eq:NN \l_@@_end_int \l_@@_max_int }
          {
            \int_set:Nn \l_@@_end_int { \l_@@_tmpa_tl }
            \int_compare:nNnT \l_@@_end_int &gt; \l_@@_max_int
              {
                \int_set_eq:NN \l_@@_end_int \l_@@_max_int
                \bool_set_true:N \l_@@_modified_range_bool
              }
          }
%    \end{macrocode}
% æ£€æŸ¥å–å€¼èŒƒå›´ã€‚
%    \begin{macrocode}
        \bool_lazy_or:nnTF
          { \int_compare_p:nNn \l_@@_begin_int &gt; \l_@@_max_int }
          { \int_compare_p:nNn \l_@@_begin_int &gt; \l_@@_end_int }
          { \bool_set_true:N \l_@@_invalid_range_bool }
          {
            \int_step_inline:nnn
              { \l_@@_begin_int } { \l_@@_end_int }
              { \seq_put_right:Nn \l_@@_tmpa_seq {##1} }
          }
      }
      {
%    \end{macrocode}
% å•ä¸ªæ•°å­—çš„å¤„ç†ã€‚
%    \begin{macrocode}
        \bool_lazy_or:nnTF
          { \int_compare_p:nNn {#1} &gt; \l_@@_max_int }
          { \int_compare_p:nNn {#1} &lt; \c_one_int }
          { \bool_set_true:N \l_@@_invalid_range_bool }
          { \seq_put_right:Nn \l_@@_tmpa_seq {#1} }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_par_range:}
% æ˜¾ç¤ºæ®µè½èŒƒå›´ï¼ˆç”¨åœ¨æç¤ºä¿¡æ¯ä¸­ï¼Œå¯ä»¥å®Œå…¨å±•å¼€ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_par_range:
  {
    \int_compare:nNnTF \l_@@_begin_int = \l_@@_end_int
      { \int_use:N \l_@@_begin_int }
      { \int_use:N \l_@@_begin_int - \int_use:N \l_@@_end_int }
  }
%    \end{macrocode}
% \end{macro}
%
% æç¤ºä¿¡æ¯ã€‚
%    \begin{macrocode}
\@@_msg_new:nn { modified-range }
  {
    Your~ required~ range~ "#1"~ in~ "#2"~ will~ be~ modified. \\
    Changed~ into~ "#3".
  }
\@@_msg_new:nn { invalid-range }
  {
    Your~ required~ range~ "#1"~ in~ "#2"~ is~ invalid. \\
    Nothing~ will~ be~ output.
  }
%    \end{macrocode}
%
% \begin{macro}{\@@_use:nn}
% è¾“å‡ºä¸€æ®µå‡æ–‡ã€‚|#1| = å‡æ–‡åç§°ï¼Œ|#2| = æ®µè½ç¼–å·ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_use:nn #1#2
  { \tl_use:c { c_@@_ #1 @ #2 _tl } }
%    \end{macrocode}
% \end{macro}
%
% \subsection{å£°æ˜Žå‡æ–‡}
%
% \begin{macro}{\newzhlipsum,\zhlipsum_new:nn}
% å£°æ˜Žå‡æ–‡ã€‚|#1| = å‡æ–‡åç§°ï¼Œ|#2| = æ–‡æœ¬ clistã€‚
%    \begin{macrocode}
\NewDocumentCommand \newzhlipsum { m m }
  { \zhlipsum_new:nn {#1} {#2} }
\cs_new_protected:Npn \zhlipsum_new:nn #1#2
  {
    \zhlipsum_if_exist:nTF {#1}
      { \@@_error:nn { already-defined } {#1} }
      {
        \seq_gput_left:Nn \g_zhlipsum_seq {#1}
        \int_new:c { g_@@_ #1 _int }
        \clist_map_inline:nn {#2} { \@@_new:nn {#1} {##1} }
        \@@_info:nn { defining-text } {#1}
      }
  }
\@@_msg_new:nn { already-defined }
  {
    Chinese~ dummy~ text~ "#1"~ has~ been~ used.~
    Please~ use~ another~ name.
  }
\@@_msg_new:nn { defining-text }
  {
    Chinese~ dummy~ text~ "#1"~ is~ created.~
    It~ has~ \int_use:c { g_@@_ #1 _int }~ paragraphs.
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_new:nn}
% å®šä¹‰æ–°çš„å‡æ–‡æ®µè½ã€‚|#1| = å‡æ–‡åç§°ï¼Œ|#2| = æ–‡æœ¬ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_new:nn #1#2
  {
    \int_gincr:c { g_@@_ #1 _int }
    \tl_const:cn
      { c_@@_ #1 @ \int_use:c { g_@@_ #1 _int } _tl } {#2}
  }
%    \end{macrocode}
% \end{macro}
%
% æ&nbsp;¹æ®ç¼–ç&nbsp;è¯»å…¥å‡æ–‡æ–‡æœ¬å®šä¹‰æ–‡ä»¶ã€‚
%    \begin{macrocode}
\file_input:x { zhlipsum- \g_@@_encoding_str .def }
%&lt;/package&gt;
%    \end{macrocode}
%
% \subsection{å‡æ–‡æ–‡æœ¬} \label{subsec:dummy-text}
%
% \changes{v1.0.0}{2018/03/27}{åˆ©ç”¨ç±»åˆ«ç&nbsp;æœºåˆ¶å›žé¿ \pkg{CJK} å®åŒ…çš„
%   é¢„å¤„ç†æ“ä½œã€‚}
%
% \begin{macro}{\@@_set_special_catcode:}
% åœ¨å£°æ˜Žé¢„å®šä¹‰æ–‡æœ¬æ—¶ï¼Œä¸ºäº†å…¼å®¹ \pkg{CJK} å®åŒ…çš„ç‰¹æ®Šå¤„ç†ï¼Œéœ€è¦ä¸´æ—¶æ›´æ”¹
% ç±»åˆ«ç&nbsp;ã€‚å…·ä½“æ¥è¯´ï¼Œåœ¨ GBK/Big5 ç¼–ç&nbsp;ä¸‹ï¼Œç”±äºŽæ±‰å­—çš„ç¬¬äºŒä¸ªå­—èŠ‚ä¼šä¸Ž
% \TeX{} ä¸­çš„ç‰¹æ®Šç¬¦å· |\|ã€|{|ã€|}|ã€|~| å†²çªï¼Œæ‰€ä»¥éœ€è¦å°†å®ƒä»¬çš„ç±»åˆ«ç&nbsp;
% æ”¹ä¸º 12ï¼ˆå…¶ä»–ï¼‰ï¼Œå¹¶åˆ†åˆ«ç”¨ |+|ã€|&lt;|ã€|&gt;| å’Œ |*| ä»£æ›¿ã€‚æ˜Ÿå· |*| åœ¨
% å¼€å¯ \LaTeX3 è¯­æ³•åŽå®žé™…ç›¸å½“äºŽç©ºæ&nbsp;¼ï¼ˆç±»åˆ«ç&nbsp;ä¸º 10ï¼‰ã€‚
%    \begin{macrocode}
%&lt;*text&gt;
\cs_new_protected:Npn \@@_set_special_catcode:
  {
%&lt;!utf8&gt;    \@@_active_first_byte:
    \char_set_catcode_escape:N      \+
    \char_set_catcode_group_begin:N \&lt;
    \char_set_catcode_group_end:N   \&gt;
    \char_set_catcode_space:N       \*
    \char_set_catcode_other:N \\
    \char_set_catcode_other:N \{
    \char_set_catcode_other:N \}
    \char_set_catcode_other:N \~
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_active_first_byte:}
% å°†æ±‰å­—çš„é¦–å­—èŠ‚è®¾ä¸ºæ´»åŠ¨å­—ç¬¦ï¼ˆç±»åˆ«ç&nbsp; 12ï¼‰ã€‚UTF-8 ç¼–ç&nbsp;ä¸‹ä¸éœ€è¦è¯¥æ“ä½œã€‚
%    \begin{macrocode}
%&lt;*!utf8&gt;
\cs_new_protected:Npx \@@_active_first_byte:
  {
    \int_step_function:nnN { "81 } { "FE }
      \char_set_catcode_active:n
  }
%&lt;/!utf8&gt;
%&lt;/text&gt;
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.0.0}{2018/03/26}{å¢žåŠ&nbsp;é¢„å®šä¹‰å‡æ–‡ã€‚}
% \changes{v1.1.1}{2018/07/19}{æ›´æ–°å‡æ–‡æ–‡æœ¬ã€‚}
%
% é¢„å®šä¹‰å‡æ–‡çš„å£°æ˜Žæ”¾ç½®åœ¨åˆ†ç»„å†…ï¼Œåˆ©ç”¨ \cs{@@_set_special_catcode:} åˆ‡æ¢
% ç±»åˆ«ç&nbsp;åŽå¯ä»¥ä¸å†éœ€è¦ \pkg{CJK} çš„é¢„å¤„ç†æ“ä½œã€‚å…·ä½“å£°æ˜Žæ­¤å¤„ä¸å†åˆ—å‡ºã€‚
%
% \end{implementation}
%
</pre></body></html>