texlive[64219] Master/texmf-dist: exam-zh (28aug22)

commits+karl at tug.org commits+karl at tug.org
Sun Aug 28 21:54:12 CEST 2022


Revision: 64219
          http://tug.org/svn/texlive?view=revision&revision=64219
Author:   karl
Date:     2022-08-28 21:54:12 +0200 (Sun, 28 Aug 2022)
Log Message:
-----------
exam-zh (28aug22)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/xelatex/exam-zh/CHANGELOG.md
    trunk/Master/texmf-dist/doc/xelatex/exam-zh/README.md
    trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/back/development.tex
    trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/back/package.tex
    trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/body/installation.tex
    trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/body/usage.tex
    trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/exam-zh-doc-setup.tex
    trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/exam-zh-doc.pdf
    trunk/Master/texmf-dist/doc/xelatex/exam-zh/examples/example-multiple.pdf
    trunk/Master/texmf-dist/doc/xelatex/exam-zh/examples/example-multiple.tex
    trunk/Master/texmf-dist/doc/xelatex/exam-zh/examples/example-single.pdf
    trunk/Master/texmf-dist/doc/xelatex/exam-zh/examples/example-single.tex
    trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-chinese-english.sty
    trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-choices.sty
    trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-font.sty
    trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-question.sty
    trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-symbols.sty
    trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh.cls

Added Paths:
-----------
    trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-textfigure.sty

Modified: trunk/Master/texmf-dist/doc/xelatex/exam-zh/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/xelatex/exam-zh/CHANGELOG.md	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/doc/xelatex/exam-zh/CHANGELOG.md	2022-08-28 19:54:12 UTC (rev 64219)
@@ -5,6 +5,33 @@
 格式参照 [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 并且此项目遵守 [Semantic Versioning](https://semver.org/spec/v2.0.0.html)。
 
+## [0.1.19] - 2022-08-27
+
+### Added
+
+- 增加 `choices` 的 `top-sep`, `bottom-sep`, `linesep` 键值
+- 增加对 `minipage` 的最小行距的控制
+- 增加 `\fillin` 的 `depth` 键值控制下划线的深度
+- 增加图文排版模块 `exam-zh-textfigure.sty`
+- 增加示例文件的图文排版
+
+### Changed
+
+- 修改列表环境 `enumerate` 参数
+- `show-columnline` 默认值改为 `false`
+
+### Fixed
+
+- 修复不同字体可能导致的 `bigstar` 缺失问题
+- 修复 `\ExamPrintAnswer` 的未设置编译报错问题
+
+## [0.1.19] - 2022-08-17
+
+### Added
+
+- 增加 `solution/show-solution` 的等效键值:`solution/show-answer`
+
+
 ## [0.1.18] - 2022-08-15
 
 ### Added

Modified: trunk/Master/texmf-dist/doc/xelatex/exam-zh/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/xelatex/exam-zh/README.md	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/doc/xelatex/exam-zh/README.md	2022-08-28 19:54:12 UTC (rev 64219)
@@ -13,14 +13,14 @@
 - ... (for more that you can do with it, please read the manual(in Chinese): `exam-zh-doc.pdf`
 
 
-Repository: https://gitee.com/zepinglee/exam-zh
+Repository: https://gitee.com/xkwxdyy/exam-zh
 Author: Zeping Lee
 Maintainer: Kangwei Xia, Lijun Guo
-Issues and pull requests are welcome: [issues]( https://gitee.com/zepinglee/exam-zh/issues) and [pulls](https://gitee.com/zepinglee/exam-zh/pulls)
+Issues and pull requests are welcome: [issues]( https://gitee.com/xkwxdyy/exam-zh/issues) and [pulls](https://gitee.com/xkwxdyy/exam-zh/pulls)
 
 # exam-zh:中国试卷 LaTeX 模板
 
-- 项目主页:<https://gitee.com/zepinglee/exam-zh>
+- 项目主页:<https://gitee.com/xkwxdyy/exam-zh>
 - 作者:Zeping Lee
 - 维护者:Kangwei Xia, Lijun Guo
 - 授权:[LaTeX Project Public License 1.3c](https://www.latex-project.org/lppl.txt)
@@ -33,7 +33,7 @@
 3. 通过用户接口可以方便更改密封线样式;
 4. 在 Windows, macOS 和 Linux 跨平台编译。
 
-使用前请仔细阅读 [发行版](https://gitee.com/zepinglee/exam-zh/releases) 的用户手册 `exam-zh-doc.pdf`。
+使用前请仔细阅读 [发行版](https://gitee.com/xkwxdyy/exam-zh/releases) 的用户手册 `exam-zh-doc.pdf`。
 
 ## 示例(simple example)
 

Modified: trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/back/development.tex
===================================================================
--- trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/back/development.tex	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/back/development.tex	2022-08-28 19:54:12 UTC (rev 64219)
@@ -3,7 +3,7 @@
 \section{参与开发}
 
 \begin{itemize}
-  \item 如果您有任何改进意见或者功能需求,欢迎前往 \href{https://gitee.com/zepinglee/exam-zh/issues}{gitee 仓库 issues} 提交 issue
+  \item 如果您有任何改进意见或者功能需求,欢迎前往 \href{https://gitee.com/xkwxdyy/exam-zh/issues}{gitee 仓库 issues} 提交 issue
   \item 欢迎 \cmd{fork} 本项目,提 \cmd{pr} 的形式参与开发
   \item 建议阅读 \href{https://zhuanlan.zhihu.com/typography-and-latex/}{muzimuzhi} 写的 \href{https://gitee.com/ustctug/ustcthesis/wiki/%E5%8F%82%E4%B8%8E%E5%BC%80%E5%8F%91}{参与开发}
   \item 参考阅读

Modified: trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/back/package.tex
===================================================================
--- trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/back/package.tex	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/back/package.tex	2022-08-28 19:54:12 UTC (rev 64219)
@@ -22,4 +22,14 @@
   \item \pkg{ulem}:下划线
   \item \pkg{tcolorbox}:彩框
   \item \pkg{varwidth}:“弹性”的 \env{minipage}
+\end{itemize}
+
+
+\file{exam-zh-textfigure.sty} 的宏包依赖:
+
+\begin{itemize}
+  \item \pkg{wrapstuff}:图文混排
+  \item \pkg{tabularray}:表格
+  \item \pkg{varwidth}:“弹性”的 \env{minipage}
+  \item \pkg{graphicx}:插图
 \end{itemize}
\ No newline at end of file

Modified: trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/body/installation.tex
===================================================================
--- trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/body/installation.tex	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/body/installation.tex	2022-08-28 19:54:12 UTC (rev 64219)
@@ -21,10 +21,10 @@
 您也可以通过访问 gitee 项目主页的方式获取最新版本的 \cls{exam-zh}(通常情况下,gitee 的版本会大于等于CTAN 的版本(因为 CTAN 从上传到审核到用户可以下载需要一天左右))。主要以「下载发行版」的方式获取最新版本的 \cls{exam-zh}:
 
 \begin{enumerate}
-  \item 进入项目主页(\href{https://gitee.com/zepinglee/exam-zh}{gitee 项目主页} (界面见图~\ref{figure:gitee项目主页} )
+  \item 进入项目主页(\href{https://gitee.com/xkwxdyy/exam-zh}{gitee 项目主页} (界面见图~\ref{figure:gitee项目主页} )
   \item 在右侧一列有“发行版”(gitee),并且有一个标签图标并有“vx.x.x - 20xx-xx-xx”字样,表示最新的发行版版本和发布时间,点击即可查看相关信息(如果想查看历史所有发行版信息,可以点击“发行版”右侧的“全部”(gitee))。
   
-    发行版中一般由以下信息构成(\href{https://gitee.com/zepinglee/exam-zh/releases}{gitee 发行版} 界面见图~\ref{figure:gitee发行版})
+    发行版中一般由以下信息构成(\href{https://gitee.com/xkwxdyy/exam-zh/releases}{gitee 发行版} 界面见图~\ref{figure:gitee发行版})
       \begin{itemize}
         \item 更新文件的特别说明。如果没有,则表明此次更新只需要更新 \file{exam-zh.cls} 文件至最新\footnote{“更新 \meta{文件} 至最新”目前表示在发行版中下载最新版本的模板,并用其中所需要更新的 \meta{文件} 去替换本地的旧 \meta{文件}} 即可
         \item 更新日志。 主要为此次发行版与上次发行版的不同,一般为“Added”、“Changed”、“Fixed”等信息
@@ -76,6 +76,7 @@
     \file{exam-zh-font.sty}       & 模版的字体模块宏包\\
     \file{exam-zh-symbols.sty}    & 模版的符号模块宏包\\
     \file{exam-zh-chinese-english.sty}    & 模版的语文英语模块宏包\\
+    \file{exam-zh-textfigure.sty}    & 模版的图文排版模块宏包\\
     \file{README.md}              & 简要自述 \\
     \file{CHANGELOG.md}           & 模板更新日志 \\
     \file{LICENSE}                & 模版发布许可证

Modified: trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/body/usage.tex
===================================================================
--- trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/body/usage.tex	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/body/usage.tex	2022-08-28 19:54:12 UTC (rev 64219)
@@ -684,7 +684,7 @@
 \end{function}
 
 \begin{function}{\chapter}
-  用于排一份的试卷标题。并可以用 \opt{page/show-chapter} 键值控制显示与否。
+  用于排一份的试卷标题。并可以用 \opt{page/show-chapter} 键值控制显示与否。新的 \tn{chapter} 下 \env{question} 环境计数器会重置。
 \end{function}
 
 其余的见~\ref{subsubsec:抬头} 节。
@@ -886,6 +886,113 @@
 
 
 
+\subsubsection{图文排版}
+
+图文排版模块为 \file{exam-zh-textfigure.sty},基于 xkwxdyy 的 \href{https://gitee.com/xkwxdyy/text-figure}{text-figure} 宏包优化而来,\pkg{text-figure} 宏包不再维护。
+
+试卷中的图文排版主要有三种类型:
+\begin{enumerate}
+  \item 多张图片并排,文字处于上方和下方;
+  \item 文字和图片左右或上下排版
+  \item 文字绕排(主要基于李清的 \pkg{wrapstuff} 宏包(\file{exam-zh-textfigure.sty} 中已加载))
+\end{enumerate}
+
+其中,文字绕排一般用于语文英语等文字较多的情形。
+
+\begin{function}[added = 2022-08-28]{multifigures 环境}
+  \begin{ccnusyntax}[emph={[2]multifigures}]
+    \begin{multifigures}(*\oarg{键值列表}*)
+      \item[标签1] (*\meta{内容1}*)
+      \item[标签2] (*\meta{内容2}*)
+      ...
+    \end{multifigures}
+  \end{ccnusyntax}
+  多张图片(无超链接引用)排版环境。\meta{键值列表} 见~\ref{subsubsec:参数-图文排版}。
+\end{function}
+
+\begin{latexexample}{\env{multifigures} 环境示例1}
+  \begin{multifigures}
+    \item[题 9 图:勾股数] \includegraphics[width=3cm]{example-image.png}
+    \item[题 11 图:圆锥曲线] \includegraphics[width=3cm]{example-image.png}
+  \end{multifigures}
+\end{latexexample}
+
+\begin{latexexample}{\env{multifigures} 环境示例2}
+  \begin{multifigures}[columns=2]
+    \item[题 9 图] \includegraphics[width=3cm]{example-image.png}
+    \item[题 10 图] \includegraphics[width=3cm]{example-image.png}
+    \item[题 11 图] \includegraphics[width=3cm]{example-image.png}
+    \item[题 12 图] \includegraphics[width=3cm]{example-image.png}
+  \end{multifigures}
+\end{latexexample}
+
+
+\begin{function}[added = 2022-08-28]{\textfigure}
+  \begin{ccnusyntax}[emph={[2]textfigure}]
+    \textfigure(*\oarg{参数列表}\marg{文本}\marg{图片}*)
+  \end{ccnusyntax}
+  图文排版命令。\meta{键值列表} 见~\ref{subsubsec:参数-图文排版}。
+\end{function}
+
+\begin{latexexample}{\tn{textfigure} 命令示例1}
+  \textfigure{
+    江州司马平安否? 惠远东林住得无? \par
+    湓浦曾闻似衣带,庐峰见说胜香炉。\par
+    题诗岁晏离鸿断,望阙天遥病鹤孤。\par
+    莫谩拘牵雨花社,青云依旧是前途。
+  }{
+    \includegraphics[width=3cm]{example-image.png}
+  }
+\end{latexexample}
+
+\begin{latexexample}{\tn{textfigure} 命令示例2}
+  \textfigure[text-width=\columnwidth,fig-pos=bottom-flushright]{
+    如图,在三棱锥 $A$-$BCD$ 中,$\text{平面} ABD \perp \text{平面} BCD$,
+    $AB = AD$,$O$ 为 $BD$ 的重点。
+    \begin{enumerate}
+      \item 证明:$OA \perp CD$;
+      \item 若 $\triangle OCD$ 是变长为 $1$ 的等边三角形,点 $E$ 在棱 $AD$ 上,
+        $DE = 2 EA$,且二面角 $E$-$BC$-$D$ 的大小为 $45^{\circ}$,
+        求三棱锥 $A$-$BCD$ 的体积。
+    \end{enumerate}
+  }{
+    \includegraphics[width=3cm]{example-image.png}
+  }
+\end{latexexample}
+
+
+\begin{latexexample}{\tn{textfigure} 命令示例3}
+  \textfigure{
+    \begin{question}
+      双曲线 $C: \frac{x^{2}}{4}-\frac{y^{2}}{2}=1$ 的右焦点为 $F$, 为点 $P$ 在 $C$ 的一条渐近线上, $O$ 为坐标原点, 若 $|P O|=|P F|$, 则 $\triangle P F O$ 的面积为 \paren
+      \begin{choices}
+        \item $\frac{3 \sqrt{2}}{4}$
+        \item $\frac{3 \sqrt{2}}{2}$
+        \item $2 \sqrt{2}$
+        \item $3 \sqrt{2}$
+      \end{choices}
+    \end{question}
+    
+    \begin{question}
+      设 $f(x)$ 是定义域为 $\mathbf{R}$ 的偶函数, 且在 $(0,+\infty)$ 单调递减, 则
+      \begin{choices}
+        \item $f\left(\log _{3} \frac{1}{4}\right)>f\left(2^{-\frac{3}{2}}\right)>f\left(2^{-\frac{2}{3}}\right)$
+        \item $f\left(\log _{3} \frac{1}{4}\right)>f\left(2^{-\frac{2}{3}}\right)>f\left(2^{-\frac{3}{2}}\right)$
+        \item $f\left(2^{-\frac{3}{2}}\right)>f\left(2^{-\frac{2}{3}}\right)>f\left(\log _{3} \frac{1}{4}\right)$
+        \item $f\left(2^{-\frac{2}{3}}\right)>f\left(2^{-\frac{3}{2}}\right)>f\left(\log _{3} \frac{1}{4}\right)$
+      \end{choices}
+    \end{question}
+  }{
+    \includegraphics[width = 2cm, height = 5cm]{example-image.png} \\ (第 9 题)
+  }
+\end{latexexample}
+
+
+\begin{function}{wrapstuff 环境}
+  \file{exam-zh-textfigure.sty} 模块默认加载 \pkg{wrapstuff} 宏包。具体 \env{wrapstuff} 环境使用请阅读手册。
+\end{function}
+
+
 \subsection{参数设置}
 
 \begin{function}{\examsetup}
@@ -1826,8 +1933,29 @@
   选项的最大列数。排版选项时会优先尝试该列数,如果无法排下内容,依次将列数除以 2 并取整再进行尝试,直到可以排下全部选项。默认为 |4| 。
 \end{function}
 
+\begin{function}[added = 2022-08-28]{choices/top-sep}
+  \begin{ccnusyntax}[emph={[1]top-sep}]
+    top-sep = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  \env{choices} 环境上方弹性间距。默认为 |0pt|。
+\end{function}
 
+\begin{function}[added = 2022-08-28]{choices/bottom-sep}
+  \begin{ccnusyntax}[emph={[1]bottom-sep}]
+    bottom-sep = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  \env{choices} 环境下方弹性间距。默认为 |0pt|。
+\end{function}
 
+\begin{function}[added = 2022-08-28]{choices/linesep}
+  \begin{ccnusyntax}[emph={[1]linesep}]
+    linesep = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  \env{choices} 环境的行数多于 1 时的行额外弹性间距。默认为 |0pt plus .5ex|。
+\end{function}
+
+
+
 \begin{function}{paren}
   \begin{ccnusyntax}[emph={[1]paren}]
     paren = (*\marg{键值列表}*)
@@ -1912,6 +2040,7 @@
 \end{function}
 
 
+
 \subsubsection{填空题} \label{subsubsec:参数-填空题}
 
 
@@ -2045,11 +2174,12 @@
 \end{function}
 
 
-\begin{function}[added = 2022-07-01]{solution/show-solution}
-  \begin{ccnusyntax}[emph={[1]show-solution}]
+\begin{function}[added = 2022-07-01,updated = 2022-08-17]{solution/show-solution,solution/show-answer}
+  \begin{ccnusyntax}[emph={[1]show-solution,show-answer}]
     show-solution = (*\TTF*)
+    show-answer = (*\TTF*)
   \end{ccnusyntax}
-  是否显示解答环境 \env{solution} 的内容。
+  是否显示解答环境 \env{solution} 的内容。\opt{show-solution} 和 \opt{show-answer} 两者等效。
 \end{function}
 
 \begin{function}[added = 2022-07-20]{solution/parbreak}
@@ -2181,20 +2311,7 @@
   \env{solution} 环境内容的颜色。默认为 |black|。
 \end{function}
 
-\begin{function}[added = 2022-07-19]{solution/top-sep}
-  \begin{ccnusyntax}[emph={[1]top-sep}]
-    top-sep = (*\meta{dimension}*)
-  \end{ccnusyntax}
-  \env{solution} 环境上方间距。默认为 |.5em plus .5em minus .2em|。
-\end{function}
 
-\begin{function}[added = 2022-07-19]{solution/bottom-sep}
-  \begin{ccnusyntax}[emph={[1]bottom-sep}]
-    bottom-sep = (*\meta{dimension}*)
-  \end{ccnusyntax}
-  \env{solution} 环境下方间距。默认为 |.5em plus .5em minus .2em|。
-\end{function}
-
 \begin{function}[added = 2022-07-19]{solution/blank-type}
   \begin{ccnusyntax}[emph={[1]blank-type}]
     blank-type = (*<(none)|manual|hide>*)
@@ -2635,4 +2752,174 @@
     zhu-circlednumber-base = (*<tikz|(font)>*)
   \end{ccnusyntax}
   在 \kvopt{poem/type}{chinese} 键值下,\tn{zhu} 的带圈数字的源。\opt{tikz} 表示此时带圈数字基于 \TikZ,\opt{font} 表示此时带圈数字基于字体。
+\end{function}
+
+
+\subsubsection{图文排版} \label{subsubsec:参数-图文排版}
+
+
+\begin{function}[updated = 2022-08-28]{multifigures}
+  \begin{ccnusyntax}[emph={[1]multifigures}]
+    multifigures = (*\marg{键值列表}*)
+    multifigures/(*\meta{key}*) = (*\meta{value}*)
+  \end{ccnusyntax}
+  该选项包含多个子项目。用于设置 \env{multifigures} 环境。可以在 \tn{examsetup} 中使用,也可以在 \env{multifigures} 环境的可选参数中使用。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{multifigures/columns}
+  \begin{ccnusyntax}[emph={[1]columns}]
+    columns = (*\meta{integer}*)
+  \end{ccnusyntax}
+  每行多少项。默认为 |3|。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{multifigures/fig-pos}
+  \begin{ccnusyntax}[emph={[1]fig-pos}]
+    fig-pos = (*<top|(above)|bottom|below|left|right>*)
+  \end{ccnusyntax}
+  图片相对于标签的位置。\opt{top} 和 \opt{above} 同义、\opt{bottom} 和 \opt{below} 同义。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{multifigures/top-sep}
+  \begin{ccnusyntax}[emph={[1]top-sep}]
+    top-sep = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  \env{multifigures} 环境上方额外弹性间距。默认为 |1ex plus .5ex minus .5ex|。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{multifigures/bottom-sep}
+  \begin{ccnusyntax}[emph={[1]bottom-sep}]
+    bottom-sep = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  \env{multifigures} 环境下方额外弹性间距。默认为 |0pt|。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{multifigures/align}
+  \begin{ccnusyntax}[emph={[1]align}]
+    align = (*<t|m|(b)>*)
+  \end{ccnusyntax}
+  图片和标签的整体对齐方式。\opt{t} 表示顶部对齐、\opt{m} 表示居中对齐、\opt{b} 表示底部对齐。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{multifigures/xshift,multifigures/hshift,multifigures/yshift,multifigures/vshift}
+  \begin{ccnusyntax}[emph={[1]xshift,hshift,yshift,vshift}]
+    xshift = (*\meta{dimension}*)
+    hshift = (*\meta{dimension}*)
+    yshift = (*\meta{dimension}*)
+    vshift = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  图片和标签整体的水平和垂直的偏移量。\opt{xshift} 和 \opt{hshift} 同义,表示水平;\opt{yshift} 和 \opt{vshift} 同义,表示垂直。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{multifigures/label-xshift,multifigures/label-hshift,multifigures/label-yshift,multifigures/label-vshift}
+  \begin{ccnusyntax}[emph={[1]xshift,hshift,yshift,vshift}]
+    label-xshift = (*\meta{dimension}*)
+    label-hshift = (*\meta{dimension}*)
+    label-yshift = (*\meta{dimension}*)
+    label-vshift = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  标签相对图片的水平和垂直的偏移量。\opt{label-xshift} 和 \opt{label-hshift} 同义,表示水平;\opt{label-yshift} 和 \opt{label-vshift} 同义,表示垂直。
+\end{function}
+
+
+
+
+\begin{function}[updated = 2022-08-28]{textfigure}
+  \begin{ccnusyntax}[emph={[1]textfigure}]
+    textfigure = (*\marg{键值列表}*)
+    textfigure/(*\meta{key}*) = (*\meta{value}*)
+  \end{ccnusyntax}
+  该选项包含多个子项目。用于设置 \tn{textfigure} 命令。可以在 \tn{examsetup} 中使用,也可以在 \tn{textfigure} 命令的可选参数中使用。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{textfigure/fig-pos}
+  \begin{ccnusyntax}[emph={[1]fig-pos}]
+    fig-pos = (*\meta{postion}*)
+  \end{ccnusyntax}
+  图片相对于文本的方位。方位可选参数见下列表,默认为 \opt{right}
+\end{function}
+\begin{itemize}
+  \item \opt{top}:图片在文本上方
+  \item \opt{bottom}:图片在文本下方
+  \item \opt{left}:图片在文本左边,垂直中心对齐
+  \item \opt{right}:图片在文本右边,垂直中心对齐
+  \item \opt{top-left}:图片在文本的左上方
+  \item \opt{top-center}:图片在文本的上方,位于整行的水平中心
+  \item \opt{top-right}:图片在文本的右上方
+  \item \opt{top-flushright}:图片在文本的右上方,位于水平末端
+  \item \opt{bottom-left}:图片在文本的左下方
+  \item \opt{bottom-center}:图片在文本的下方,位于整行的水平中心
+  \item \opt{bottom-right}:图片在文本的右下方
+  \item \opt{bottom-flushright}:图片在文本的右下方,位于水平末端
+  \item \opt{left-top}:图片在文本左边,顶部对齐
+  \item \opt{left-center}:等价于 \opt{left}
+  \item \opt{left-bottom}:图片在文本左边,底部对齐
+  \item \opt{right-top}:图片在文本右边边,顶部对齐
+  \item \opt{right-center}:等价于 \opt{right}
+  \item \opt{right-bottom}:图片在文本右边,底部对齐
+\end{itemize}
+
+
+\begin{function}[added = 2022-08-28]{textfigure/xshift,textfigure/hshift,textfigure/yshift,textfigure/vshift}
+  \begin{ccnusyntax}[emph={[1]xshift,hshift,yshift,vshift}]
+    xshift = (*\meta{dimension}*)
+    hshift = (*\meta{dimension}*)
+    yshift = (*\meta{dimension}*)
+    vshift = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  图片和文本整体的水平和垂直的偏移量。\opt{xshift} 和 \opt{hshift} 同义,表示水平;\opt{yshift} 和 \opt{vshift} 同义,表示垂直。\opt{yshift} 的默认值为 |.5\baselineskip|。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{textfigure/figure-xshift,textfigure/figure-hshift,textfigure/figure-yshift,textfigure/figure-vshift}
+  \begin{ccnusyntax}[emph={[1]xshift,hshift,yshift,vshift}]
+    figure-xshift = (*\meta{dimension}*)
+    figure-hshift = (*\meta{dimension}*)
+    figure-yshift = (*\meta{dimension}*)
+    figure-vshift = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  图片相对于文本的水平和垂直的偏移量。\opt{figure-xshift} 和 \opt{figure-hshift} 同义,表示水平;\opt{figure-yshift} 和 \opt{figure-vshift} 同义,表示垂直。
+\end{function}
+
+
+\begin{function}[added = 2022-08-28]{textfigure/top-sep}
+  \begin{ccnusyntax}[emph={[1]top-sep}]
+    top-sep = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  \tn{textfigure} 命令上方弹性间距。默认为 |0pt|。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{textfigure/bottom-sep}
+  \begin{ccnusyntax}[emph={[1]bottom-sep}]
+    bottom-sep = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  \tn{textfigure} 命令下方弹性间距。默认为 |1.5ex plus .5ex minus 0.5ex|。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{textfigure/text-width}
+  \begin{ccnusyntax}[emph={[1]text-width}]
+    text-width = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  文本部分的 \env{varwidth} 宽度。默认为 |\columnwidth|。但有时需要手动输入 \kvopt{text-width}{\textbackslash columnwidth} 才会变成整行,比如解答题。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{textfigure/figure-width}
+  \begin{ccnusyntax}[emph={[1]figure-width}]
+    figure-width = (*\meta{dimension}*)
+  \end{ccnusyntax}
+  图片部分的 \env{varwidth} 宽度。默认为 |\columnwidth|。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{textfigure/ratio,textfigure/text-ratio}
+  \begin{ccnusyntax}[emph={[1]ratio,text-ratio}]
+    ratio = (*\meta{比例}*)
+    text-ratio = (*\meta{比例}*)
+  \end{ccnusyntax}
+  图片部分占比。默认为 |0.95|。有时 |1| 的效果并不是整行,这主要和使用了 \env{varwidth} 环境有关,此时建议改 \opt{text-width}。
+\end{function}
+
+\begin{function}[added = 2022-08-28]{textfigure/top}
+  \begin{ccnusyntax}[emph={[1]top}]
+    top = (*\meta{integer}*)
+  \end{ccnusyntax}
+  \kvopt{fig-pos}{left-top} 时,图片顶部从文本的第几行开始排,效果和 \pkg{wrapstuff} 宏包的 \opt{top} 键值效果类似。
 \end{function}
\ No newline at end of file

Modified: trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/exam-zh-doc-setup.tex
===================================================================
--- trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/exam-zh-doc-setup.tex	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/exam-zh-doc-setup.tex	2022-08-28 19:54:12 UTC (rev 64219)
@@ -6,6 +6,7 @@
 \usepackage{../exam-zh-question}
 \usepackage{../exam-zh-symbols}
 \usepackage{../exam-zh-chinese-english}
+\usepackage{../exam-zh-textfigure}
 
 \ExplSyntaxOn
 \NewDocumentCommand \examsetup { m }
@@ -32,9 +33,9 @@
 \title{\textcolor{MaterialIndigo800}{%
   \textbf{exam-zh: 高考试卷 \LaTeX \xpinyin[font=\sffamily,format=\color{MaterialIndigo800}]{模}{mu2}板}}}
 \author{李泽平,夏康玮,郭李军}
-\date{2022/08/15\quad v0.1.18%
+\date{2022/08/28\quad v0.1.19%
   \thanks{%
-    \url{https://gitee.com/zepinglee/exam-zh}
+    \url{https://gitee.com/xkwxdyy/exam-zh}
   }
 }
 
@@ -61,4 +62,11 @@
       \rule[-0.7em]{0pt}{2em} \\\hline
     \end{tabular}
   }
-\ExplSyntaxOff
\ No newline at end of file
+\ExplSyntaxOff
+
+\AddToHook{env/latexexample/after}
+  {%
+    \examsetup{
+      question/index=1
+    }
+  }
\ No newline at end of file

Modified: trunk/Master/texmf-dist/doc/xelatex/exam-zh/doc/exam-zh-doc.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/xelatex/exam-zh/examples/example-multiple.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/xelatex/exam-zh/examples/example-multiple.tex
===================================================================
--- trunk/Master/texmf-dist/doc/xelatex/exam-zh/examples/example-multiple.tex	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/doc/xelatex/exam-zh/examples/example-multiple.tex	2022-08-28 19:54:12 UTC (rev 64219)
@@ -316,14 +316,18 @@
 
 % 20.
 \begin{problem}[points = 12]
-  如图,在三棱锥 $A$-$BCD$ 中,$\text{平面} ABD \perp \text{平面} BCD$,
-  $AB = AD$,$O$ 为 $BD$ 的重点。
-  \begin{enumerate}
-    \item 证明:$OA \perp CD$;
-    \item 若 $\triangle OCD$ 是变长为 $1$ 的等边三角形,点 $E$ 在棱 $AD$ 上,
-      $DE = 2 EA$,且二面角 $E$-$BC$-$D$ 的大小为 \ang{45},
-      求三棱锥 $A$-$BCD$ 的体积。
-  \end{enumerate}
+  \textfigure[text-width=\columnwidth, fig-pos=bottom-flushright]{
+    如图,在三棱锥 $A$-$BCD$ 中,$\text{平面} ABD \perp \text{平面} BCD$,
+    $AB = AD$,$O$ 为 $BD$ 的重点。
+    \begin{enumerate}
+      \item 证明:$OA \perp CD$;
+      \item 若 $\triangle OCD$ 是变长为 $1$ 的等边三角形,点 $E$ 在棱 $AD$ 上,
+        $DE = 2 EA$,且二面角 $E$-$BC$-$D$ 的大小为 \ang{45},
+        求三棱锥 $A$-$BCD$ 的体积。
+    \end{enumerate}
+  }{
+    \includegraphics[width=5cm]{example-image.png}
+  }
 \end{problem}
 
 % 21.

Modified: trunk/Master/texmf-dist/doc/xelatex/exam-zh/examples/example-single.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/xelatex/exam-zh/examples/example-single.tex
===================================================================
--- trunk/Master/texmf-dist/doc/xelatex/exam-zh/examples/example-single.tex	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/doc/xelatex/exam-zh/examples/example-single.tex	2022-08-28 19:54:12 UTC (rev 64219)
@@ -294,14 +294,18 @@
 
 % 20.
 \begin{problem}[points = 12]
-  如图,在三棱锥 $A$-$BCD$ 中,$\text{平面} ABD \perp \text{平面} BCD$,
-  $AB = AD$,$O$ 为 $BD$ 的重点。
-  \begin{enumerate}
-    \item 证明:$OA \perp CD$;
-    \item 若 $\triangle OCD$ 是变长为 $1$ 的等边三角形,点 $E$ 在棱 $AD$ 上,
-      $DE = 2 EA$,且二面角 $E$-$BC$-$D$ 的大小为 \ang{45},
-      求三棱锥 $A$-$BCD$ 的体积。
-  \end{enumerate}
+  \textfigure{
+    如图,在三棱锥 $A$-$BCD$ 中,$\text{平面} ABD \perp \text{平面} BCD$,
+    $AB = AD$,$O$ 为 $BD$ 的重点。
+    \begin{enumerate}
+      \item 证明:$OA \perp CD$;
+      \item 若 $\triangle OCD$ 是变长为 $1$ 的等边三角形,点 $E$ 在棱 $AD$ 上,
+        $DE = 2 EA$,且二面角 $E$-$BC$-$D$ 的大小为 \ang{45},
+        求三棱锥 $A$-$BCD$ 的体积。
+    \end{enumerate}
+  }{
+    \includegraphics[width=3cm]{example-image.png}
+  }
 \end{problem}
 
 % 21.

Modified: trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-chinese-english.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-chinese-english.sty	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-chinese-english.sty	2022-08-28 19:54:12 UTC (rev 64219)
@@ -1,7 +1,7 @@
 %
 % Copyright (c) 2022 Kangwei Xia, Lijun Guo
 % Released under the LaTeX Project Public License v1.3c License.
-% Repository: https://gitee.com/zepinglee/exam-zh
+% Repository: https://gitee.com/xkwxdyy/exam-zh
 %
 
 \NeedsTeXFormat{LaTeX2e}
@@ -8,7 +8,7 @@
 
 \RequirePackage{expl3}
 
-\ProvidesExplPackage {exam-zh-chinese-english} {2022-08-15} {v0.1.18}
+\ProvidesExplPackage {exam-zh-chinese-english} {2022-08-28} {v0.1.19}
   {exam-zh chinese and english module}
 
 \PassOptionsToPackage { tcolorbox } { most }

Modified: trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-choices.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-choices.sty	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-choices.sty	2022-08-28 19:54:12 UTC (rev 64219)
@@ -9,7 +9,7 @@
 \RequirePackage{expl3}
 \RequirePackage{xparse}
 
-\ProvidesExplPackage {exam-zh-choices} {2022-08-15} {v0.1.18}
+\ProvidesExplPackage {exam-zh-choices} {2022-08-28} {v0.1.19}
   {exam-zh choices module}
 
 \dim_new:N \l__examzh_choices_column_sep_dim
@@ -36,7 +36,13 @@
     label-sep   .dim_set:N = \l__examzh_choices_label_sep_dim ,
     label-width .dim_set:N = \l__examzh_choices_label_width_dim ,
     max-columns .int_set:N = \l__examzh_choices_max_columns_int ,
-    index       .int_set:N = \l__examzh_choices_item_index_int
+    index       .int_set:N = \l__examzh_choices_item_index_int,
+    % 环境上方的额外距离
+    top-sep .skip_set:N = \l__examzh_choices_top_sep_skip,
+    % 环境下方的额外距离
+    bottom-sep .skip_set:N = \l__examzh_choices_bottom_sep_skip,
+    % 若不是单行排版,则可以控制行之间的额外间距
+    linesep .skip_set:N = \l__examzh_choices_line_sep_skip
   }
 
 \keys_set:nn { exam-zh / choices }
@@ -45,11 +51,14 @@
     columns     = 0 ,
     label       = \Alph*. ,
     label-pos   = auto ,
-    label-align = right ,
+    label-align = left ,
     label-sep   = .5em ,
     label-width = 0pt ,
     max-columns = 4 ,
     index       = 1,
+    top-sep     = 0pt,
+    bottom-sep  = 0pt,
+    linesep     = 0pt plus .5ex
   }
 
 \NewDocumentCommand \setchoices { m }
@@ -83,6 +92,7 @@
 
 \NewDocumentEnvironment { choices } { O { } +b }
   {
+    \keys_set:nn { exam-zh / choices } {#1}
     \par \nopagebreak
     % 严格禁止孤行和寡行
     \int_set:Nn \clubpenalty { 10000 }
@@ -89,11 +99,12 @@
     \int_set:Nn \widowpenalty { 10000 }
     % 尽量避免在选项中间换行
     \int_set:Nn \interlinepenalty { 301 }
+    \vspace* { \l__examzh_choices_top_sep_skip }
     \noindent
-    \dim_set_eq:NN \l__examzh_choices_total_width_dim \linewidth
+    % \dim_set_eq:NN \l__examzh_choices_total_width_dim \linewidth
+    \dim_set:Nn \l__examzh_choices_total_width_dim { \linewidth - \leftskip - \rightskip }
     \int_zero:N \l__examzh_choices_columns_int
     \dim_zero:N \l__examzh_choices_label_width_dim
-    \keys_set:nn { exam-zh / choices } {#1}
   }
   {
     % 用 \item 分割选项
@@ -119,6 +130,7 @@
     \__examzh_print_choices:N \l__examzh_choices_seq
     % 输出正确选项
     \__examzh_print_correctchoice:
+    \vspace* { \l__examzh_choices_bottom_sep_skip }
   }
 
 % 用来存正确选项的序号(entry)
@@ -368,7 +380,9 @@
           { \l__examzh_choices_current_col_int } > { \l__examzh_choices_columns_int }
           {
             % \par \noindent
-            \newline
+            \\[ \l__examzh_choices_line_sep_skip ]
+            % \newline
+            % \skip_vertical:N \l__examzh_choices_line_sep_skip
             \int_set:Nn \l__examzh_choices_current_col_int {1}
           }
         % TODO 为什么 > 1 才加呢? 这样的话第 1 列和第 2 列之间就没有这个间距?
@@ -386,13 +400,16 @@
 
 \coffin_new:N \l__examzh_choices_item_coffin
 \coffin_new:N \l__examzh_choices_label_coffin
-
+% \box_new:N \l__examzh_choices_item_box
+% \box_new:N \l__examzh_choices_label_box
 \cs_new:Npn \__examzh_print_single_choice:nn #1#2
   {
     % 选项标签
     \__examzh_choices_make_label_coffin:n {#1}
+    % \__examzh_choices_make_label_box:n {#1}
     % 选项内容
     \__examzh_choices_make_item_coffin:n {#2}
+    % \__examzh_choices_make_item_box:n {#2}
     % 合并选项的标签和内容
     \str_case:Vn \l__examzh_choices_label_pos_tl
       {
@@ -399,39 +416,100 @@
         { top-left }
           {
             \coffin_join:NnnNnnnn
+              \l__examzh_choices_label_coffin {r} {H}
               \l__examzh_choices_item_coffin  {l} {H}
-              \l__examzh_choices_label_coffin {r} {H}
-              { - \l__examzh_choices_label_sep_dim }
+              { \l__examzh_choices_label_sep_dim }
               { 0pt }
+            % \hbox_set:Nn \l__examzh_choices_item_box
+            %   {
+            %     \box_use_drop:N \l__examzh_choices_label_box
+            %     \kern \l__examzh_choices_label_sep_dim
+            %     \box_use_drop:N \l__examzh_choices_item_box
+            %   }
           }
         { left }
           {
             \coffin_join:NnnNnnnn
+              \l__examzh_choices_label_coffin {r} {vc}
               \l__examzh_choices_item_coffin  {l} {vc}
-              \l__examzh_choices_label_coffin {r} {vc}
-              { - \l__examzh_choices_label_sep_dim }
+              { \l__examzh_choices_label_sep_dim }
               { 0pt }
+            % \hbox_set:Nn \l__examzh_choices_item_box
+            %   {
+            %     \box_move_down:nn
+            %       {
+            %         (
+            %           \box_ht:N \l__examzh_choices_label_box -
+            %           \box_dp:N \l__examzh_choices_label_box -
+            %           \box_ht:N \l__examzh_choices_item_box +
+            %           \box_dp:N \l__examzh_choices_item_box
+            %         ) / 2
+            %       }
+            %       { \box_use_drop:N \l__examzh_choices_label_box }
+            %     \kern \l__examzh_choices_label_sep_dim
+            %     \box_use_drop:N \l__examzh_choices_item_box
+            %   }
           }
         { bottom }
           {
             \coffin_join:NnnNnnnn
+              \l__examzh_choices_label_coffin {hc} {t}
               \l__examzh_choices_item_coffin  {hc} {b}
-              \l__examzh_choices_label_coffin {hc} {t}
               { 0pt }
               % { - \l__examzh_choices_label_sep_dim }
               { 0pt }
+            % \hbox_set:Nn \l__examzh_choices_item_box
+            %   {
+            %     % \vbox_top:n
+            %     %   {
+            %     %     \box_use:N \l__examzh_choices_item_box
+            %     %     \nointerlineskip
+            %     %     % \kern \l__examzh_choices_label_sep_dim 
+            %     %     \box_move_left:nn
+            %     %       {
+            %     %         (
+            %     %           \box_wd:N \l__examzh_choices_label_box -
+            %     %           \box_wd:N \l__examzh_choices_item_box
+            %     %         ) / 2
+            %     %       }
+            %     %       { \box_use_drop:N \l__examzh_choices_label_box }
+            %     %       \box_clear:N \l__examzh_choices_item_box
+            %     %   }
+            %     \hbox_set:Nn \l__examzh_choices_item_box
+            %       {
+            %         \box_use:N \l__examzh_choices_item_box
+            %         \kern \dim_eval:n
+            %           {
+            %             ( - \box_wd:N \l__examzh_choices_label_box
+            %               -  \box_wd:N \l__examzh_choices_item_box ) / 2 
+            %           }
+            %         \box_move_down:nn
+            %           {
+            %             \box_ht:N \l__examzh_choices_label_box +
+            %             \box_dp:N \l__examzh_choices_item_box
+            %             % + \l__examzh_choices_label_sep_dim 
+            %           }
+            %           { \box_use_drop:N \l__examzh_choices_label_box }
+            %         \box_clear:N \l__examzh_choices_item_box
+            %       }
+            %   }
           }
       }
     % 输出合并后
-    \coffin_typeset:Nnnnn \l__examzh_choices_item_coffin {l} {H} {0pt} {0pt}
+    % \coffin_typeset:Nnnnn \l__examzh_choices_item_coffin {l} {H} {0pt} {0pt}
+    \coffin_typeset:Nnnnn \l__examzh_choices_label_coffin {l} {H} {0pt} {0pt}
     \coffin_clear:N \l__examzh_choices_item_coffin
     \coffin_clear:N \l__examzh_choices_label_coffin
+    % \box_use_drop:N \l__examzh_choices_item_box
   }
 
 % 将标签内容存入 coffin
 \cs_new:Npn \__examzh_choices_make_label_coffin:n #1
+% 将标签内容存入 box
+% \cs_new:Npn \__examzh_choices_make_label_box:n #1
   {
     \hcoffin_set:Nn \l__examzh_choices_label_coffin
+    % \hbox_set:Nn \l__examzh_choices_label_box
       {
         \hbox_to_wd:nn { \l__examzh_choices_label_width_dim }
           { \__examzh_choices_make_label:n {#1} \strut }
@@ -452,10 +530,13 @@
 
 % 将选项内容存入 coffin
 \cs_new:Npn \__examzh_choices_make_item_coffin:n #1
+% 将选项内容存入 box
+% \cs_new:Npn \__examzh_choices_make_item_box:n #1
   {
     \hcoffin_set:Nn \l__examzh_choices_item_coffin
+    % \hbox_set:Nn \l__examzh_choices_item_box
       {
-        % 优先尝试使用 hbox,这是因为在 \vcoffin_set 外部能保留原来的 \linewidth 和
+        % 优先尝试使用 hbox,这是因为在 \vbox_set 外部能保留原来的 \linewidth 和
         % \textwidth,方便用户在 \includegraphics 中使用
         \hbox_set:Nn \l_tmpa_box {#1}
         % 若盒子的自然高度大于 2 行,且深度为 0pt,设置为插图模式
@@ -468,9 +549,17 @@
           { \bool_set_true:N \l__examzh_choices_figure_mode_bool }
         \vcoffin_set:Nnn \l_tmpa_coffin
           { \l__examzh_choices_item_width_dim }
+        % \vbox_set:Nn \l_tmpa_box
           {
+            % \dim_set_eq:NN \parskip \c_zero_dim
+            % \dim_set_eq:NN \parindent \listparindent
+            \dim_set_eq:NN \hsize \l__examzh_choices_item_width_dim
+            \dim_set_eq:NN \linewidth \hsize
+            \dim_set_eq:NN \columnwidth \hsize
             \dim_set_eq:NN \parskip \c_zero_dim
             \dim_set_eq:NN \parindent \listparindent
+            \dim_set:Nn \leftskip { 0pt }
+            \dim_set:Nn \rightskip { 0pt }
             \noindent
             % \strut
             % 若标签在底部,将图片居中对齐。
@@ -485,9 +574,15 @@
           }
         \dim_set:Nn \l_tmpa_dim { \coffin_ht:N \l_tmpa_coffin }
         \bool_if:NT \l__examzh_choices_figure_mode_bool
+        % \dim_set:Nn \l_tmpa_dim { \box_ht:N \l_tmpa_box }
+        % \bool_if:NTF \l__examzh_choices_figure_mode_bool
+        %   {
+        %     \box_move_up:nn { \l_tmpa_dim - 0.7 \baselineskip } { \box_use_drop:N \l_tmpa_box }
+        %   }
           {
             \coffin_set_horizontal_pole:Nnn \l_tmpa_coffin {T}
               { \l_tmpa_dim - 0.7 \baselineskip }
+            % \vbox_top:n { \vbox_unpack_drop:N \l_tmpa_box }
           }
         \coffin_typeset:Nnnnn \l_tmpa_coffin {l} {T} {0pt} {0pt}
         \coffin_clear:N \l_tmpa_coffin

Modified: trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-font.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-font.sty	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-font.sty	2022-08-28 19:54:12 UTC (rev 64219)
@@ -1,7 +1,7 @@
 %
 % Copyright (c) 2022 Zeping Lee and AlphaZTX
 % Released under the LaTeX Project Public License v1.3c License.
-% Repository: https://gitee.com/zepinglee/exam-zh
+% Repository: https://gitee.com/xkwxdyy/exam-zh
 %
 
 \NeedsTeXFormat{LaTeX2e}
@@ -9,7 +9,7 @@
 \RequirePackage{expl3}
 \RequirePackage{xparse}
 
-\ProvidesExplPackage {exam-zh-font} {2022-08-15} {v0.1.18}
+\ProvidesExplPackage {exam-zh-font} {2022-08-28} {v0.1.19}
   {exam-zh font module}
 
 \RequirePackage { unicode-math }
@@ -456,7 +456,7 @@
     \setmathfont { \g__examzh_font_font_name_stix_math_tl }
       [
         Extension    = .otf,
-        range        = { \complement } ,
+        range        = { \complement, \bigstar } ,
       ]
     \setmathrm { NewCM10 }
       [
@@ -495,7 +495,7 @@
     \setmathfont { \g__examzh_font_font_name_stix_math_tl }
       [
         Extension    = .otf,
-        range        = { \complement } ,
+        range        = { \complement, \bigstar } ,
       ]
     \setmathrm { lmroman10 }
       [
@@ -600,7 +600,7 @@
   \setmathfont { \g__examzh_font_font_name_stix_math_tl }
     [
       Extension    = .otf,
-      range        = { \complement } ,
+      range        = { \complement, \bigstar } ,
     ]
   \message
     {
@@ -638,7 +638,7 @@
     \setmathfont { \g__examzh_font_font_name_stix_math_tl }
       [
         Extension    = .otf,
-        range        = { \complement } ,
+        range        = { \complement, \bigstar } ,
       ]
   }
 

Modified: trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-question.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-question.sty	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-question.sty	2022-08-28 19:54:12 UTC (rev 64219)
@@ -1,7 +1,7 @@
 %
 % Copyright (c) 2022 Zeping Lee
 % Released under the LaTeX Project Public License v1.3c License.
-% Repository: https://gitee.com/zepinglee/exam-zh
+% Repository: https://gitee.com/xkwxdyy/exam-zh
 %
 
 \NeedsTeXFormat{LaTeX2e}
@@ -9,7 +9,7 @@
 \RequirePackage{expl3}
 \RequirePackage{xparse}
 
-\ProvidesExplPackage {exam-zh-question} {2022-08-15} {v0.1.18}
+\ProvidesExplPackage {exam-zh-question} {2022-08-28} {v0.1.19}
   {exam-zh question module}
 
 
@@ -755,6 +755,7 @@
       { \bool_set_true:N \l__examzh_fillin_paren_banjiao_bool },
     paren-type / quanjiao .code:n = 
       { \bool_set_false:N \l__examzh_fillin_paren_banjiao_bool },
+    depth .dim_set:N = \l__examzh_fillin_line_depth_dim
   }
 \keys_set:nn { exam-zh / fillin }
   {
@@ -767,7 +768,8 @@
     no-answer-counter-index  = 1,
     no-answer-counter-label  = \arabic*,
     paren-type               = banjiao,
-    width-type               = fill,
+    width-type               = normal,
+    depth                    = 0.4em
   }
 
 \keys_define:nn { exam-zh }
@@ -801,7 +803,9 @@
             }
             {
               % 不显示答案
-              \__examzh_fillin_no_answer_typeset:
+              \IfBooleanTF {#1}
+                { \__examzh_fillin_no_answer_breakble_typeset: }
+                { \__examzh_fillin_no_answer_unbreakble_typeset: }
             }
         }
         {
@@ -821,7 +825,9 @@
             }
             {
               % 不显示答案
-              \__examzh_fillin_no_answer_typeset:
+              \IfBooleanTF {#1}
+                { \__examzh_fillin_no_answer_breakble_typeset: }
+                { \__examzh_fillin_no_answer_unbreakble_typeset: }
             }
         }
     \group_end:
@@ -832,13 +838,13 @@
     There~is~no~such~noanswertype~named~#1!\\
     Please~read~the~manual~carefully!
   }
-\cs_new:Npn \__examzh_fillin_no_answer_typeset:
+\cs_new:Npn \__examzh_fillin_no_answer_unbreakble_typeset:
   {
     \str_case:VnF \l__examzh_fillin_no_answer_type_str
       {
         { blacktriangle } { \__examzh_fillin_no_answer_typeset_blacktriangle: }
         { counter } { \__examzh_fillin_no_answer_typeset_counter: }
-        { none } { \__examzh_fillin_no_answer_typeset_none: }
+        { none } { \__examzh_fillin_output_unbreakable_F: }
       }
       {
         \msg_error:nnx { exam-zh / fillin } { no-such-noanswertype }
@@ -845,6 +851,19 @@
           { \l__examzh_fillin_no_answer_type_str }
       }
   }
+\cs_new:Npn \__examzh_fillin_no_answer_breakble_typeset:
+  {
+    \str_case:VnF \l__examzh_fillin_no_answer_type_str
+      {
+        { blacktriangle } { \__examzh_fillin_no_answer_typeset_blacktriangle: }
+        { counter } { \__examzh_fillin_no_answer_typeset_counter: }
+        { none } { \__examzh_fillin_output_breakable_F: }
+      }
+      {
+        \msg_error:nnx { exam-zh / fillin } { no-such-noanswertype }
+          { \l__examzh_fillin_no_answer_type_str }
+      }
+  }
 \cs_new:Npn \__examzh_fillin_no_answer_typeset_blacktriangle:
   {
     \__examzh_fillin_without_judge:n { \__examzh_fillin_blacktriangle: }
@@ -856,10 +875,6 @@
       { \__examzh_fillin_the_label: }
       % { \int_eval:n { \g__examzh_fillin_no_answer_counter_int - 1 } }
   }
-\cs_new:Npn \__examzh_fillin_no_answer_typeset_none:
-  {
-    \__examzh_fillin_output_F:
-  }
 \cs_new:Npn \__examzh_fillin_without_judge:n #1
   {
     % \ULdepth 是 \uline 的下划线的深度
@@ -887,7 +902,7 @@
         \__examzh_fillin_output_T:
       }
       { 
-        \__examzh_fillin_output_F:
+        \__examzh_fillin_output_unbreakable_F:
       }
   }
 \cs_new:Npn \__examzh_fillin_breakline:n #1
@@ -900,7 +915,7 @@
         \__examzh_fillin_output_breakline_T:
       }
       { 
-        \__examzh_fillin_output_F:
+        \__examzh_fillin_output_breakable_F:
       }
   }
 \msg_new:nnn { exam-zh } { no-fillin-type }
@@ -940,14 +955,14 @@
   {
     The~type~:~#1~ cannot~be~used~in~breakable~fillin~cmd.
   }
-\cs_new:Npn \__examzh_fillin_output_F:
+\cs_new:Npn \__examzh_fillin_output_breakable_F:
   {
     \str_case:VnF \l__examzh_fillin_type_str
       {
-        { line } { \__examzh_fillin_uline_F: }
-        { paren } { \__examzh_fillin_paren_F: }
+        { line } { \__examzh_fillin_uline_breakable_F: }
+        { paren } { \__examzh_fillin_paren_breakable_F: }
         { circle } { \__examzh_fillin_circle_F: }
-        { blank } { \__examzh_fillin_blank_F: }
+        { blank } { \__examzh_fillin_blank_breakable_F: }
         { rectangle } { \__examzh_fillin_rectangle_F: }
       }
       {
@@ -955,9 +970,26 @@
           { \l__examzh_fillin_type_str }
       }
   }
+\cs_new:Npn \__examzh_fillin_output_unbreakable_F:
+  {
+    \str_case:VnF \l__examzh_fillin_type_str
+      {
+        { line } { \__examzh_fillin_uline_unbreakable_F: }
+        { paren } { \__examzh_fillin_paren_unbreakable_F: }
+        { circle } { \__examzh_fillin_circle_F: }
+        { blank } { \__examzh_fillin_blank_unbreakable_F: }
+        { rectangle } { \__examzh_fillin_rectangle_F: }
+      }
+      {
+        \msg_error:nnx { exam-zh } { no-fillin-type }
+          { \l__examzh_fillin_type_str }
+      }
+  }
 \cs_new:Npn \__examzh_fillin_uline_T:
   {
-    \uline
+    % \uline
+    \CJKunderline*
+      [ depth = \l__examzh_fillin_line_depth_dim ]
       {
         \hspace* { 0.5em plus .5em minus .5em }
         \dim_compare:nNnTF { \l__examzh_question_answer_depth_dim } > { 0.2em }
@@ -970,11 +1002,18 @@
         \hspace* { 0.5em plus .5em minus .5em }
       }
   }
-\cs_new:Npn \__examzh_fillin_uline_F:
+\cs_new:Npn \__examzh_fillin_uline_breakable_F:
   {
     % \uline { \hspace* { \l__examzh_fillin_F_width_dim } } 
     \__examzh_fillin_breakable_hspace:NN \CJKunderline \allowbreak
   }
+\cs_new:Npn \__examzh_fillin_uline_unbreakable_F:
+  {
+    \unskip
+    \hspace* { 0.5em plus .5em minus .5em }
+    \uline { \hspace* { \l__examzh_fillin_F_width_dim } }
+    \ignorespaces
+  }
 % \cs_new:Nn \__examzh_fillin_uline:
   % {
     % \bgroup
@@ -1006,6 +1045,7 @@
 \cs_new:Npn \__examzh_fillin_uline_breakline_T:
   {
     \CJKunderline*
+      [ depth = \l__examzh_fillin_line_depth_dim ]
     % \uline
     % \__examzh_fillin_uline:
       {
@@ -1018,6 +1058,7 @@
   }
 \cs_new:Npn \__examzh_fillin_paren_T:
   {
+    \unskip
     \bool_if:NTF \l__examzh_fillin_paren_banjiao_bool
       {
         (
@@ -1037,9 +1078,11 @@
           \hspace* { 0.5em plus .5em minus .5em }
         )
       }
+    \ignorespaces
   }
 \cs_new:Npn \__examzh_fillin_paren_breakline_T:
   {
+    \unskip
     \bool_if:NTF \l__examzh_fillin_paren_banjiao_bool
       {
         (
@@ -1059,6 +1102,7 @@
           \hspace* { 0.5em plus .5em minus .5em }
         )
       }
+    \ignorespaces
   }
 \box_new:N \c__examzh_banjiao_right_brace_box
 \box_new:N \c__examzh_quanjiao_right_brace_box
@@ -1068,8 +1112,10 @@
   { \box_wd:N \c__examzh_banjiao_right_brace_box }
 \dim_const:Nn \c__examzh_quanjiao_right_brace_width_dim  % (
   { \box_wd:N \c__examzh_quanjiao_right_brace_box }
-\cs_new:Npn \__examzh_fillin_paren_F:
+\cs_new:Npn \__examzh_fillin_paren_breakable_F:
   {
+    \unskip
+    \hspace* { 0.5em plus .5em minus .5em }
     \bool_if:NTF \l__examzh_fillin_paren_banjiao_bool
       {
         ( \__examzh_fillin_breakable_hspace:NN \use:n \nobreak \kern-\c__examzh_banjiao_right_brace_width_dim ) \allowbreak
@@ -1077,28 +1123,49 @@
       {
         ( \__examzh_fillin_breakable_hspace:NN \use:n \nobreak \kern-\c__examzh_quanjiao_right_brace_width_dim )\allowbreak
       }
+    \ignorespaces
   }
+\cs_new:Npn \__examzh_fillin_paren_unbreakable_F:
+  {
+    \unskip
+    \hspace* { 0.5em plus .5em minus .5em }
+    \bool_if:NTF \l__examzh_fillin_paren_banjiao_bool
+      {
+        ( \hspace* { \l__examzh_fillin_F_width_dim } )
+      }
+      {
+        ( \hspace* { \l__examzh_fillin_F_width_dim } )
+      }
+    \ignorespaces
+  }
 \cs_new:Npn \__examzh_fillin_blank_T:
   {
+    \unskip
     \hspace* { 0.5em plus .5em minus .5em }
     \group_begin:
       \box_use_drop:N \l_tmpa_box
     \group_end: 
-    \hspace* { 0.5em plus .5em minus .5em }
+    \ignorespaces
   }
 \cs_new:Npn \__examzh_fillin_blank_breakline_T:
   {
+    \unskip
     \hspace* { 0.5em plus .5em minus .5em }
     \group_begin:
       \l_tmpa_tl 
     \group_end:
-    \hspace* { 0.5em plus .5em minus .5em }
+    \ignorespaces
   }
-\cs_new:Npn \__examzh_fillin_blank_F:
+\cs_new:Npn \__examzh_fillin_blank_breakble_F:
   {
     % \hspace* { \l__examzh_fillin_F_width_dim }
     \__examzh_fillin_breakable_hspace:NN \use:n \allowbreak
   }
+\cs_new:Npn \__examzh_fillin_blank_unbreakble_F:
+  {
+    \hspace* { \l__examzh_fillin_F_width_dim }
+    % \__examzh_fillin_breakable_hspace:NN \use:n \allowbreak
+  }
 \tikzset
   {
     fillin-circle/.style = 
@@ -1235,6 +1302,7 @@
 \keys_define:nn { exam-zh / solution }
   {
     show-solution .bool_set:N = \l__examzh_solution_show_bool,
+    show-answer .bool_set:N = \l__examzh_solution_show_bool,
     show-qed      .bool_set:N = \l__examzh_solution_show_qed_bool,
     qedsymbol     .tl_set:N = \l__examzh_solution_qedsymbol_tl,
     label-content  .tl_set:N   = \l__examzh_solution_label_content_tl,

Modified: trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-symbols.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-symbols.sty	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-symbols.sty	2022-08-28 19:54:12 UTC (rev 64219)
@@ -1,7 +1,7 @@
 %
 % Copyright (c) 2022 Kangwei Xia
 % Released under the LaTeX Project Public License v1.3c License.
-% Repository: https://gitee.com/zepinglee/exam-zh
+% Repository: https://gitee.com/xkwxdyy/exam-zh
 %
 
 \NeedsTeXFormat{LaTeX2e}
@@ -8,7 +8,7 @@
 
 \RequirePackage{expl3}
 
-\ProvidesExplPackage {exam-zh-symbols} {2022-08-15} {v0.1.18}
+\ProvidesExplPackage {exam-zh-symbols} {2022-08-28} {v0.1.19}
   {exam-zh symbols module}
 
 \RequirePackage { tikz }

Added: trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-textfigure.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-textfigure.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-textfigure.sty	2022-08-28 19:54:12 UTC (rev 64219)
@@ -0,0 +1,651 @@
+%
+% Copyright (c) 2022 Kangwei Xia
+% Released under the LaTeX Project Public License v1.3c License.
+% Repository: https://gitee.com/xkwxdyy/exam-zh
+%
+\NeedsTeXFormat{LaTeX2e}
+
+\RequirePackage{expl3}
+
+\ProvidesExplPackage {exam-zh-textfigure} {2022-08-28} {v0.1.19}
+  {exam-zh text with figure module}
+
+\RequirePackage { wrapstuff }
+\RequirePackage { tabularray }
+\RequirePackage { varwidth }
+\RequirePackage { graphicx }
+\RequirePackage { filehook }
+
+\AtEndOfPackageFile* { exam-zh-choices }
+  {
+    \AddToHook { env / choices / before }
+      { \wrapstuffclear }
+  }
+
+%% multifigures 环境,排版多张图片 %%
+
+% \begin{multifigures}
+%   \item[题 9 图:勾股数] \includegraphics[width=3cm]{example-image.png}
+%   \item[题 11 图:圆锥曲线] \includegraphics[width=3cm]{example-image.png}
+% \end{multifigures}
+
+% 图片相对于 label 的方位
+\str_new:N \l__examzh_multifigures_figure_position_str
+% coffin type 的对齐方式
+\str_new:N \l__examzh_multifigures_coffin_align_str
+
+
+\keys_define:nn { exam-zh / multifigures }
+  {
+    % 每行多少个(等价于有多少列)
+    columns .int_set:N = \l__examzh_multifigures_column_int,
+    % 图片相对于文字的位置(上下左右)
+    fig-pos .choices:nn =
+      { top, above, bottom, below, left, right }
+      { \str_set:Nx \l__examzh_multifigures_figure_position_str { \l_keys_choice_tl } },
+    % 环境上方的额外距离
+    top-sep .skip_set:N = \l__examzh_multifigures_top_sep_skip,
+    % 环境下方的额外距离
+    bottom-sep .skip_set:N = \l__examzh_multifigures_bottom_sep_skip,
+    % 整体的偏移量
+    xshift .dim_set:N = \l__examzh_multifigures_xshift_dim,
+    hshift .dim_set:N = \l__examzh_multifigures_xshift_dim,
+    yshift .dim_set:N = \l__examzh_multifigures_yshift_dim,
+    vshift .dim_set:N = \l__examzh_multifigures_yshift_dim,
+    % label 的偏移量
+    label-xshift .dim_set:N = \l__examzh_multifigures_label_xshift_dim,
+    label-hshift .dim_set:N = \l__examzh_multifigures_label_xshift_dim,
+    label-yshift .dim_set:N = \l__examzh_multifigures_label_yshift_dim,
+    label-vshift .dim_set:N = \l__examzh_multifigures_label_yshift_dim,
+    % 对齐方式
+    align .choices:nn = 
+      { t, m, b }
+      { \str_set:Nx \l__examzh_multifigures_coffin_align_str { \l_keys_choice_tl } }
+  }
+\keys_set:nn { exam-zh / multifigures }
+  {
+    columns      = 3,
+    fig-pos      = above,
+    label-xshift = 0pt,
+    label-yshift = 0pt,
+    align        = b,
+    top-sep      = 1ex plus .5ex minus .5ex,
+    bottom-sep   = 0pt,
+  }
+
+% item 的 index 指标(即第几个 item)
+\int_new:N \l__examzh_multifigures_item_index_int
+% 将拼接后的 coffin 存到 seq 里
+\seq_new:N \l__examzh_multifigures_store_seq
+% 上面的 seq 的 item 数
+\int_new:N \l__examzh_multifigures_store_seq_item_int
+% 最终放在 tblr 里的内容
+\tl_new:N \l__examzh_multifigures_tblr_content_tl
+
+\NewDocumentEnvironment { multifigures } { O{ } +O{ } }
+  {
+    \group_begin:
+      \RenewDocumentCommand \item { O{ } }
+        { \__examzh_multifigures_item:n {##1} }
+      \int_set:Nn \l__examzh_multifigures_item_index_int {0}
+      \seq_clear:N \l__examzh_multifigures_store_seq
+      \tl_clear:N \l__examzh_multifigures_tblr_content_tl
+      \keys_set:nn { exam-zh / multifigures } {#1}
+  }
+  {
+      % 结束收集
+        \unskip
+      \end{varwidth}
+      \hcoffin_set_end:
+      % 拼接 label 和 figure
+      \__examzh_multifigures_coffin_join:
+      % 输出
+      \__examzh_multifigures_coffin_typeset:n {#2}
+      % \par \int_use:N \l__examzh_multifigures_item_index_int
+    \group_end:
+  }
+% 拼接 label 和 figure
+\cs_new:Npn \__examzh_multifigures_coffin_join:
+  {
+    \int_step_inline:nn { \l__examzh_multifigures_item_index_int }
+      {
+        \__examzh_multifigures_coffin_join_position_set:n {##1}
+        \seq_gput_right:Nn \l__examzh_multifigures_store_seq
+          {
+            \__examzh_multifigures_coffin_align_set:n {##1}
+          }
+      }
+  }
+\cs_new:Npn \__examzh_multifigures_coffin_align_set:n #1
+  {
+    \str_case:Vn \l__examzh_multifigures_coffin_align_str
+      {
+        {t} { \__examzh_multifigures_coffin_align_set_t:n {#1} }
+        {m} { \__examzh_multifigures_coffin_align_set_m:n {#1} }
+        {b} { \__examzh_multifigures_coffin_align_set_b:n {#1} }
+      }
+  }
+\cs_new:Npn \__examzh_multifigures_coffin_align_set_t:n #1
+  {
+    \coffin_typeset:cnnnn
+      { l__examzh_multifigures_figure_ \int_to_roman:n { #1 } _coffin }
+      { l } { t }  % align = t
+      { \l__examzh_multifigures_xshift_dim } { \l__examzh_multifigures_yshift_dim + 1em }
+  }
+\cs_new:Npn \__examzh_multifigures_coffin_align_set_m:n #1
+  {
+    \coffin_typeset:cnnnn
+      { l__examzh_multifigures_figure_ \int_to_roman:n { #1 } _coffin }
+      { l } { vc }  % align = m
+      { \l__examzh_multifigures_xshift_dim } { \l__examzh_multifigures_yshift_dim }
+  }
+\cs_new:Npn \__examzh_multifigures_coffin_align_set_b:n #1
+  {
+    \coffin_typeset:cnnnn
+      { l__examzh_multifigures_figure_ \int_to_roman:n { #1 } _coffin }
+      { l } { b }   % align = b
+      { \l__examzh_multifigures_xshift_dim } { \l__examzh_multifigures_yshift_dim }
+  }
+\cs_new:Npn \__examzh_multifigures_coffin_join_position_set:n #1
+  {
+    \use:c { __examzh_multifigures_coffin_join_position_set_ \l__examzh_multifigures_figure_position_str :n } {#1}
+  }
+\cs_new:Npn \__examzh_multifigures_coffin_join_position_set_top:n #1
+  {
+    \coffin_join:cnncnnnn
+      { l__examzh_multifigures_figure_ \int_to_roman:n {#1} _ coffin }
+      { hc } { b }
+      { l__examzh_multifigures_label_ \int_to_roman:n {#1} _ coffin }
+      { hc } { t }
+      { \l__examzh_multifigures_label_xshift_dim }
+      { \l__examzh_multifigures_label_yshift_dim - 6pt }
+  }
+\cs_set_eq:NN 
+  \__examzh_multifigures_coffin_join_position_set_above:n 
+  \__examzh_multifigures_coffin_join_position_set_top:n
+\cs_new:Npn \__examzh_multifigures_coffin_join_position_set_bottom:n #1
+  {
+    \coffin_join:cnncnnnn
+      { l__examzh_multifigures_figure_ \int_to_roman:n {#1} _ coffin }
+      { hc } { t }
+      { l__examzh_multifigures_label_ \int_to_roman:n {#1} _ coffin }
+      { hc } { b }
+      { \l__examzh_multifigures_label_xshift_dim }
+      { \l__examzh_multifigures_label_yshift_dim + 6pt }
+  }
+\cs_set_eq:NN 
+  \__examzh_multifigures_coffin_join_position_set_below:n 
+  \__examzh_multifigures_coffin_join_position_set_bottom:n
+\cs_new:Npn \__examzh_multifigures_coffin_join_position_set_left:n #1
+  {
+    \coffin_join:cnncnnnn
+      { l__examzh_multifigures_figure_ \int_to_roman:n {#1} _ coffin }
+      { l } { vc }
+      { l__examzh_multifigures_label_ \int_to_roman:n {#1} _ coffin }
+      { r } { vc }
+      { \l__examzh_multifigures_label_xshift_dim - 6pt }
+      { \l__examzh_multifigures_label_yshift_dim }
+  }
+\cs_new:Npn \__examzh_multifigures_coffin_join_position_set_right:n #1
+  {
+    \coffin_join:cnncnnnn
+      { l__examzh_multifigures_figure_ \int_to_roman:n {#1} _ coffin }
+      { r } { vc }
+      { l__examzh_multifigures_label_ \int_to_roman:n {#1} _ coffin }
+      { l } { vc }
+      { \l__examzh_multifigures_label_xshift_dim + 2pt }
+      { \l__examzh_multifigures_label_yshift_dim }
+  }
+\cs_new:Npn \__examzh_multifigures_coffin_typeset:n #1
+  {
+    \__examzh_multifigures_coffin_typeset_count:
+    \seq_map_indexed_inline:Nn \l__examzh_multifigures_store_seq
+      % ##1: index
+      % ##2: content
+      {
+        \int_compare:nNnTF { \int_mod:nn {##1} { \l__examzh_multifigures_column_int } } = {0}
+          {
+            \tl_gput_right:Nn \l__examzh_multifigures_tblr_content_tl { ##2 \\ }
+          }
+          {
+            \tl_gput_right:Nn \l__examzh_multifigures_tblr_content_tl { ##2 & }
+          }
+      }
+    % 如果 seq 的 item 比 column 多且不整除 column 的话,要补 &
+    \int_compare:nNnT { \l__examzh_multifigures_store_seq_item_int } > { \l__examzh_multifigures_column_int }
+      {
+        \int_compare:nNnF { \l__examzh_multifigures_item_num_mod_column_left_int } = { 0 }
+          {
+            \tl_gput_right:Nx \l__examzh_multifigures_tblr_content_tl
+              {
+                \prg_replicate:nn { \l__examzh_multifigures_item_num_mod_column_left_int -1 } {&}
+              }
+            % \int_use:N \l__examzh_multifigures_item_num_mod_column_left_int
+          }
+      }
+    \par 
+    \vspace*{ \l__examzh_multifigures_top_sep_skip }
+    \noindent \centering
+    % \SetTblrInner
+    %   {
+    %     rowsep = 4pt,
+    %     % colsep = 0pt
+    %   }
+    \begin{tblr}
+      [ expand = \l__examzh_multifigures_tblr_content_tl ]
+      {
+        width = \textwidth,
+        cells = {c},
+        column{1} = {leftsep = 0pt},
+        column{Z} = {rightsep = 0pt},
+        rows = 
+          {
+            abovesep = 0pt,
+            belowsep = 0pt,
+          },
+        % vlines,hlines,
+        #1
+      }
+      \l__examzh_multifigures_tblr_content_tl
+    \end{tblr}
+    \vspace*{ \l__examzh_multifigures_bottom_sep_skip }
+    \par
+  }
+\int_new:N \l__examzh_multifigures_item_num_mod_column_left_int
+\cs_new:Npn \__examzh_multifigures_coffin_typeset_count:
+  {
+    % 计算 seq 有多少项
+    \int_set:Nn \l__examzh_multifigures_store_seq_item_int
+      { \seq_count:N \l__examzh_multifigures_store_seq }
+    % seq 项数小于 column 的话,column 设置为 seq 项数
+    \int_compare:nNnTF { \l__examzh_multifigures_store_seq_item_int } < { \l__examzh_multifigures_column_int }
+      { \int_set_eq:NN \l__examzh_multifigures_column_int \l__examzh_multifigures_store_seq_item_int }
+      {
+        % 计算 \l__examzh_multifigures_store_seq_item_int mod \l__examzh_multifigures_column_int 的余数,用于补 &
+        \int_set:Nn \l__examzh_multifigures_item_num_mod_column_left_int { \int_mod:nn { \l__examzh_multifigures_store_seq_item_int } { \l__examzh_multifigures_column_int } }
+      }
+  }
+\cs_new:Npn \__examzh_multifigures_item:n #1
+  {
+    % 增加指标(g 是关键)
+    \int_gincr:N \l__examzh_multifigures_item_index_int
+    % 新建 coffin
+    \__examzh_multifigures_item_new_coffin:
+    % 储存 label(一直出不来的原因是因为没改成 gset)
+    \hcoffin_gset:cn { l__examzh_multifigures_label_ \int_to_roman:n { \l__examzh_multifigures_item_index_int } _coffin } {#1}
+    % 储存 figure
+    \int_compare:nNnF { \l__examzh_multifigures_item_index_int } = {1}
+      {
+          \unskip
+          \end{varwidth}
+        % 结束上一个 item 的收集
+        \hcoffin_set_end:
+      }
+    % 收集
+    \hcoffin_set:cw { l__examzh_multifigures_figure_ \int_to_roman:n { \l__examzh_multifigures_item_index_int } _coffin }
+      \begin{varwidth}{\hsize}
+        \ignorespaces
+  }
+
+% 新建 coffin
+\cs_new:Npn \__examzh_multifigures_item_new_coffin:
+  {
+    % 放图片的 coffin
+    \coffin_if_exist:cF { l__examzh_multifigures_figure_ \int_to_roman:n { \l__examzh_multifigures_item_index_int } _coffin }
+      { \coffin_new:c { l__examzh_multifigures_figure_ \int_to_roman:n { \l__examzh_multifigures_item_index_int } _coffin } }
+    % 放 label 的 coffin
+    \coffin_if_exist:cF { l__examzh_multifigures_label_ \int_to_roman:n { \l__examzh_multifigures_item_index_int } _coffin }
+      { \coffin_new:c { l__examzh_multifigures_label_ \int_to_roman:n { \l__examzh_multifigures_item_index_int } _coffin } }
+  }
+
+
+
+%% \textfigure 
+
+
+\coffin_new:N \l__examzh_textfigure_text_coffin        % 用于存文本
+\coffin_new:N \l__examzh_textfigure_figure_coffin         % 用于存图片
+
+\str_new:N \l__examzh_textfigure_current_figure_position_str    % 用来存当前的 anchor值
+
+\fp_new:N \l__examzh_textfigure_text_ratio_fp              % 文本的比例
+
+\dim_new:N \l__examzh_textfigure_text_width_dim            % 文本的宽度
+\dim_new:N \l__examzh_textfigure_text_coffin_width_dim     % 文本c offin 的宽度
+\dim_new:N \l__examzh_textfigure_figure_width_dim      % 图片的 varwidth 环境的宽度
+
+% 用于 top-center, top-right, bottom-center, bottom-right 的水平偏移量储存
+\dim_new:N \l__examzh_textfigure_figure_coffin_horizontal_transform_dim
+\dim_new:N \l__examzh_textfigure_tmpa_dim              % 临时变量
+
+\skip_new:N \l__examzh_textfigure_tmpa_skip            % 临时变量
+
+
+\keys_define:nn { exam-zh }
+  {
+    textfigure  .meta:nn = { exam-zh / textfigure } {#1}
+  }
+
+\keys_define:nn { exam-zh / textfigure }
+  {
+    % fig-pos为图片位于文本的方位
+    fig-pos .choices:nn =
+      { 
+        left , right , top , bottom ,
+        top-left , top-right , top-center ,
+        top-flushright , bottom-flushright , 
+        bottom-left , bottom-right , bottom-center ,
+        right-top , right-bottom , right-center ,
+        left-top , left-bottom , left-center
+      }
+      {
+        \str_set:NV \l__examzh_textfigure_current_figure_position_str \l_keys_choice_tl
+      },
+    % figure-yshift:调整图片的垂直额外偏移量
+    figure-yshift .dim_set:N = \l__examzh_textfigure_figure_yshift_dim,
+    figure-vshift .dim_set:N = \l__examzh_textfigure_figure_yshift_dim,
+    % figure-xshift:调整图片的水平额外偏移量
+    figure-xshift .dim_set:N = \l__examzh_textfigure_figure_xshift_dim,
+    figure-hshift .dim_set:N = \l__examzh_textfigure_figure_xshift_dim,
+    % yshift:调整整体的垂直额外偏移量
+    yshift .dim_set:N = \l__examzh_textfigure_yshift_dim,
+    vshift .dim_set:N = \l__examzh_textfigure_yshift_dim,
+    % xshift:调整整体的水平额外偏移量
+    xshift .dim_set:N = \l__examzh_textfigure_xshift_dim,
+    hshift .dim_set:N = \l__examzh_textfigure_xshift_dim,
+    % text-width:手动设置文本的 varwidth 环境的宽度
+    text-width .dim_set:N = \l__examzh_textfigure_text_width_dim,
+    % figure-width:手动设置 figure 的 varwidth 环境的宽度
+    figure-width .dim_set:N = \l__examzh_textfigure_figure_width_dim,
+    % ratio / text-ratio:文本 coffin 占行宽的比例,范围0-1
+    ratio .fp_set:N = \l__examzh_textfigure_text_ratio_fp,
+    text-ratio .fp_set:N = \l__examzh_textfigure_text_ratio_fp,
+    % 环境上方的额外距离
+    top-sep .skip_set:N = \l__examzh_textfigure_top_sep_skip,
+    % 环境下方的额外距离
+    bottom-sep .skip_set:N = \l__examzh_textfigure_bottom_sep_skip,
+    % 类似于 wrapstuff 的 top
+    top .int_set:N = \l__examzh_textfigure_top_int
+  }
+
+\keys_set:nn { exam-zh / textfigure }
+  {
+    fig-pos         = right,
+    yshift          = .5\baselineskip,
+    text-width      = \columnwidth,
+    figure-width    = \columnwidth,
+    text-ratio      = 0.95,
+    top-sep         = 0pt,
+    bottom-sep      = 1.5ex plus .5ex minus 0.5ex,
+    top             = 0
+  }
+
+
+% 【已解决】判断anchor是不是west或者east,是的话就自动调整调整一下text-ratio
+% - 问题在于要知道key-val设置了什么anchor才能判断
+% - 但是这个key-val设置和手动设置ratio是同一接口
+% - 理想是:
+%   - 先用户设置anchor
+%   - 然后自动判断是否是west或者east,并自动调整ratio
+%    【思考】其实也就是说anchor的时候要判断是否是east和west来设置ratio(关键)
+%   - 然后用户手动的话以手动的为准
+% 【解决关键】既然不可能中途处理,那只能在 key-val 设置的时候就要处理掉这个自动的ratio,所以重新设计了anchor键值代码
+
+\NewDocumentCommand{ \textfigure }{ O{} +m +m }
+  {
+    \group_begin:
+      \keys_set:nn { exam-zh / textfigure } {#1}
+      \par 
+      \vspace*{ \l__examzh_textfigure_top_sep_skip }
+      \noindent
+      \__examzh_textfigure_output:nn {#2} {#3}
+      \vspace*{ \l__examzh_textfigure_bottom_sep_skip }
+    \group_end:
+  }
+
+
+% 最终的拼接命令
+\cs_new:Npn \__examzh_textfigure_output:nn #1#2
+  {
+    \__examzh_textfigure_text_width_dim_set:
+    % issue:https://gitee.com/xkwxdyy/text-figure/issues/I4RVQX
+    % 关键点在于要离开垂直模式
+    % https://ask.latexstudio.net/ask/question/7238.html
+    \mode_leave_vertical:
+    % 将内容存到 coffin 中
+    \__examzh_textfigure_coffin_store:nn {#1}{#2}
+    % coffin 的拼接
+    \__examzh_textfigure_coffin_join:
+    % coffin 的 typeset
+    \__examzh_textfigure_coffin_typeset:
+  }
+\cs_new:Npn \__examzh_textfigure_text_width_dim_set:
+  {
+    % \str_case:VnT \l__examzh_textfigure_current_figure_position_str 
+    %   {
+    %     {bottom-flushright} {}
+    %     {bottom-left} {}
+    %     {bottom-right} {}
+    %     {bottom-center} {}
+    %   }
+    %   { \fp_set:Nn \l__examzh_textfigure_text_ratio_fp {1} }
+    % \fp_compare:nNnF { \l__examzh_textfigure_text_ratio_fp } = { 1 }
+    %   {
+    %     \str_case:VnT \l__examzh_textfigure_current_figure_position_str 
+    %       {
+    %         {left} {}
+    %         {right} {}
+    %         {left-center} {}
+    %         {right-center} {}
+    %         {right-top} {}
+    %         {right-bottom} {}
+    %         {left-top} {}
+    %         {left-bottom} {}
+    %       }
+    %       { \fp_set:Nn \l__examzh_textfigure_text_ratio_fp {0.7} }
+    %   }
+    \dim_set_eq:NN \l__examzh_textfigure_tmpa_dim  \l__examzh_textfigure_text_width_dim
+    \dim_set:Nn \l__examzh_textfigure_text_width_dim
+      {
+        \l__examzh_textfigure_tmpa_dim * \dim_ratio:nn { \fp_use:N \l__examzh_textfigure_text_ratio_fp pt } { 1 pt }
+      }
+  }
+\cs_new:Npn \__examzh_textfigure_coffin_store:nn #1#2
+  {
+    \hcoffin_set:Nn \l__examzh_textfigure_text_coffin 
+      {
+        \begin{varwidth}{ \l__examzh_textfigure_text_width_dim }
+          \dim_set:Nn \parindent {2em}
+          \ignorespaces
+          #1
+          \unskip
+        \end{varwidth}
+      }
+    \hcoffin_set:Nn \l__examzh_textfigure_figure_coffin 
+      {
+        \begin{varwidth}{ \l__examzh_textfigure_figure_width_dim }
+          \centering
+          \ignorespaces
+          #2
+          \unskip
+        \end{varwidth}
+      }
+  }
+\cs_new:Npn \__examzh_textfigure_coffin_join:
+  {
+    \use:c { __examzh_textfigure_fig_pos_set_ \l__examzh_textfigure_current_figure_position_str :NN }
+      \l__examzh_textfigure_text_coffin
+      \l__examzh_textfigure_figure_coffin
+  }
+\cs_new:Npn \__examzh_textfigure_coffin_typeset:
+  {
+    \coffin_typeset:Nnnnn \l__examzh_textfigure_text_coffin
+      { l } { t } 
+      { \l__examzh_textfigure_xshift_dim } 
+      { \l__examzh_textfigure_yshift_dim }
+  }
+
+% top表示位于文本正上方
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_top:NN } #1#2
+  {
+    \coffin_join:NnnNnnnn
+      #1 { t } { hc }
+      #2 { b } { hc }
+      { \l__examzh_textfigure_figure_xshift_dim } 
+      { 1em + \l__examzh_textfigure_figure_yshift_dim }
+  }
+% top-center表示位于文本上方,但是处于水平的中线处
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_top-center:NN } #1#2
+  {
+    \dim_set:Nn \l__examzh_textfigure_tmpa_dim 
+      { \coffin_wd:N #1 }
+    \dim_set:Nn \l__examzh_textfigure_figure_coffin_horizontal_transform_dim
+      {
+        \linewidth * \dim_ratio:nn { 1 pt } { 2 pt } 
+        - 
+        \l__examzh_textfigure_tmpa_dim * \dim_ratio:nn { 1 pt } { 2 pt } 
+      }
+    \coffin_join:NnnNnnnn
+      #1 { t } { hc }
+      #2 { b } { hc }
+      { \l__examzh_textfigure_figure_coffin_horizontal_transform_dim + \l__examzh_textfigure_figure_xshift_dim } 
+      { 1em + \l__examzh_textfigure_figure_yshift_dim }
+  }
+% bottom-center表示位于文本下方,但是处于水平的中线处
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_bottom-center:NN } #1#2
+  {
+    \dim_set:Nn \l__examzh_textfigure_tmpa_dim 
+      { \coffin_wd:N #1 }
+    \dim_set:Nn \l__examzh_textfigure_figure_coffin_horizontal_transform_dim
+      {
+        \linewidth * \dim_ratio:nn { 1 pt } { 2 pt } 
+        - 
+        \l__examzh_textfigure_tmpa_dim * \dim_ratio:nn { 1 pt } { 2 pt } 
+      }
+    \coffin_join:NnnNnnnn
+      #1 { b } { hc }
+      #2 { t } { hc }
+      { \l__examzh_textfigure_figure_coffin_horizontal_transform_dim + \l__examzh_textfigure_figure_xshift_dim }
+      { -1em + \l__examzh_textfigure_figure_yshift_dim }
+  }
+% bottom 表示位于文本正下方
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_bottom:NN } #1#2
+  {
+    \coffin_join:NnnNnnnn
+      #1 { b } { hc }
+      #2 { t } { hc }
+      { \l__examzh_textfigure_figure_xshift_dim }
+      { -1em + \l__examzh_textfigure_figure_yshift_dim }
+  }
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_left:NN } #1#2
+  {
+    \coffin_join:NnnNnnnn
+      #1 { vc } { l }
+      #2 { vc } { r }
+      { -1em + \l__examzh_textfigure_figure_xshift_dim }
+      { \l__examzh_textfigure_figure_yshift_dim }
+  }
+\cs_set_eq:cc { __examzh_textfigure_fig_pos_set_left-center:NN } { __examzh_textfigure_fig_pos_set_left:NN }
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_left-top:NN } #1#2
+  {
+    \dim_set:Nn \l__examzh_textfigure_tmpa_dim
+      { \baselineskip * \dim_ratio:nn { \int_use:N \l__examzh_textfigure_top_int pt } { 1pt } }
+    \coffin_join:NnnNnnnn
+      #1 { t } { l }
+      #2 { t } { r }
+      { -1em + \l__examzh_textfigure_figure_xshift_dim }
+      { - \l__examzh_textfigure_tmpa_dim + \l__examzh_textfigure_figure_yshift_dim }
+  }
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_left-bottom:NN } #1#2
+  {
+    \coffin_join:NnnNnnnn
+      #1 { b } { l }
+      #2 { b } { r }
+      { -1em + \l__examzh_textfigure_figure_xshift_dim } 
+      { 0pt + \l__examzh_textfigure_figure_yshift_dim }
+  }
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_right-top:NN } #1#2
+  {
+    \dim_set:Nn \l__examzh_textfigure_tmpa_dim
+      { \baselineskip * \dim_ratio:nn { \int_use:N \l__examzh_textfigure_top_int pt } { 1pt } }
+    \coffin_join:NnnNnnnn
+      #1 { t } { r }
+      #2 { t } { l }
+      { 1em + \l__examzh_textfigure_figure_xshift_dim }
+      { - \l__examzh_textfigure_tmpa_dim + \l__examzh_textfigure_figure_yshift_dim }
+  }
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_right-center:NN } #1#2
+  {
+    \coffin_join:NnnNnnnn
+      #1 { vc } { r }
+      #2 { vc } { l }
+      { 1em + \l__examzh_textfigure_figure_xshift_dim } 
+      { 0pt + \l__examzh_textfigure_figure_yshift_dim }
+  }
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_right-bottom:NN } #1#2
+  {
+    \coffin_join:NnnNnnnn
+      #1 { b } { r }
+      #2 { b } { l }
+      { 1em + \l__examzh_textfigure_figure_xshift_dim }
+      { 0pt + \l__examzh_textfigure_figure_yshift_dim }
+  }
+\cs_set_eq:cc { __examzh_textfigure_fig_pos_set_right:NN } { __examzh_textfigure_fig_pos_set_right-center:NN }
+% top-flushright:文本上方,水平方向是在行尾
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_top-flushright:NN } #1#2
+  {
+    \dim_set:Nn \l__examzh_textfigure_tmpa_dim 
+      { \coffin_wd:N #1 }
+    \dim_set:Nn \l__examzh_textfigure_figure_coffin_horizontal_transform_dim
+      { \linewidth - \l__examzh_textfigure_tmpa_dim }
+    \coffin_join:NnnNnnnn
+      #1 { t } { r }
+      #2 { b } { r }
+      { \l__examzh_textfigure_figure_coffin_horizontal_transform_dim  + \l__examzh_textfigure_figure_xshift_dim }
+      { 1em + \l__examzh_textfigure_figure_yshift_dim }
+  }
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_top-right:NN } #1#2
+  {
+    \coffin_join:NnnNnnnn
+      #1 { t } { r }
+      #2 { b } { r }
+      { \l__examzh_textfigure_figure_xshift_dim }
+      { 1em + \l__examzh_textfigure_figure_yshift_dim }
+  }
+% bottom-flushright:文本下方,水平方向在行尾
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_bottom-flushright:NN } #1#2
+  {
+    \dim_set:Nn \l__examzh_textfigure_tmpa_dim 
+      { \coffin_wd:N #1 }
+    \dim_set:Nn \l__examzh_textfigure_figure_coffin_horizontal_transform_dim
+      { \linewidth - \l__examzh_textfigure_tmpa_dim  }
+    \coffin_join:NnnNnnnn
+      #1 { b } { r }
+      #2 { t } { r }
+      { \l__examzh_textfigure_figure_coffin_horizontal_transform_dim + \l__examzh_textfigure_figure_xshift_dim }
+      { -1em + \l__examzh_textfigure_figure_yshift_dim }
+  }
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_bottom-right:NN } #1#2
+  {
+    \coffin_join:NnnNnnnn
+      #1 { b } { r }
+      #2 { t } { r }
+      { \l__examzh_textfigure_figure_xshift_dim }
+      { -1em + \l__examzh_textfigure_figure_yshift_dim }
+  }
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_top-left:NN } #1#2
+  {
+    \coffin_join:NnnNnnnn
+      #1 { t } { l }
+      #2 { b } { l }
+      { 0pt + \l__examzh_textfigure_figure_xshift_dim }
+      { 1em + \l__examzh_textfigure_figure_yshift_dim }
+  }
+\cs_new_protected:cpn { __examzh_textfigure_fig_pos_set_bottom-left:NN } #1#2
+  {
+    \coffin_join:NnnNnnnn
+      #1 { b } { l }
+      #2 { t } { l }
+      { 0pt + \l__examzh_textfigure_figure_xshift_dim }
+      { -1em + \l__examzh_textfigure_figure_yshift_dim }
+  }
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh-textfigure.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh.cls	2022-08-28 19:53:35 UTC (rev 64218)
+++ trunk/Master/texmf-dist/tex/latex/exam-zh/exam-zh.cls	2022-08-28 19:54:12 UTC (rev 64219)
@@ -1,12 +1,12 @@
 %
 % Copyright (c) 2022 Zeping Lee
 % Released under the LaTeX Project Public License v1.3c License.
-% Repository: https://gitee.com/zepinglee/exam-zh
+% Repository: https://gitee.com/xkwxdyy/exam-zh
 %
 
 \NeedsTeXFormat{LaTeX2e}[2017/04/15]
 \RequirePackage{expl3}
-\ProvidesExplClass {exam-zh} {2022-08-15} {v0.1.18} {LaTeX template for Chinese exam}
+\ProvidesExplClass {exam-zh} {2022-08-28} {v0.1.19} {LaTeX template for Chinese exam}
 
 % 检查 LaTeX2e kernel 版本
 \msg_new:nnn { exam-zh } { latex-too-old }
@@ -86,6 +86,7 @@
 \RequirePackage { exam-zh-choices }
 \RequirePackage { exam-zh-symbols }
 \RequirePackage { exam-zh-chinese-english }
+\RequirePackage { exam-zh-textfigure }
 
 \AtEndPreamble
   {
@@ -182,8 +183,9 @@
 
 \NewDocumentCommand { \ExamPrintAnswer } { }
   {
-    \clist_use:Nn \g__examzh_print_answer_cmd_set_clist {}
-    \clist_if_empty:NF \g__examzh_print_answer_keys_set_clist
+    \clist_if_exist:NT \g__examzh_print_answer_cmd_set_clist
+      { \clist_use:Nn \g__examzh_print_answer_cmd_set_clist {} }
+    \clist_if_exist:NT \g__examzh_print_answer_keys_set_clist
       {
         \keys_set:nx { exam-zh }
           { \g__examzh_print_answer_keys_set_clist }
@@ -499,8 +501,13 @@
 \dim_set:Nn \lineskiplimit { .5em }
 \skip_set:Nn \lineskip { .5em }
 
+% 增加对 minipage 的处理
+% https://tex.stackexchange.com/a/358080/246645
+\dim_set:Nn \normallineskiplimit { .5em }
+\skip_set:Nn \normallineskip { .5em }
 
 
+
 % 设置 enumitem 列表格式
 \keys_define:nn { exam-zh / list }
   {
@@ -534,9 +541,14 @@
 
 \setlist[enumerate, 2]
   {
-    left       = 2em,
-    labelsep   = 0pt,
-    label      = { ( \arabic * ) }
+    % labelindent = *,
+    leftmargin  = 0pt, 
+    widest      = 0,
+    itemindent  = 4em,
+    labelsep    = 0pt,
+    % labelwidth  = 2em,
+    listparindent = \parindent,
+    label       = {( \arabic * )},
   }
 
 % 多种方法: method环境
@@ -1193,7 +1205,7 @@
   }
 \keys_set:nn { exam-zh / page }
   {
-    show-columnline  = true,
+    show-columnline  = false,
     columnline-width = 0.4pt
   }
 



More information about the tex-live-commits mailing list.