summaryrefslogtreecommitdiff
path: root/macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty')
-rw-r--r--macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty123
1 files changed, 109 insertions, 14 deletions
diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty
index ef7c39ba88..05f66871c3 100644
--- a/macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty
+++ b/macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty
@@ -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,17 +92,19 @@
\NewDocumentEnvironment { choices } { O { } +b }
{
+ \keys_set:nn { exam-zh / choices } {#1}
\par \nopagebreak
% 严格禁止孤行和寡行
\int_set:Nn \clubpenalty { 10000 }
\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,52 +400,116 @@
\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
{
{ top-left }
{
\coffin_join:NnnNnnnn
- \l__examzh_choices_item_coffin {l} {H}
\l__examzh_choices_label_coffin {r} {H}
- { - \l__examzh_choices_label_sep_dim }
+ \l__examzh_choices_item_coffin {l} {H}
+ { \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_item_coffin {l} {vc}
\l__examzh_choices_label_coffin {r} {vc}
- { - \l__examzh_choices_label_sep_dim }
+ \l__examzh_choices_item_coffin {l} {vc}
+ { \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_item_coffin {hc} {b}
\l__examzh_choices_label_coffin {hc} {t}
+ \l__examzh_choices_item_coffin {hc} {b}
{ 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