diff options
Diffstat (limited to 'macros/xetex/latex/exam-zh/tex/exam-zh-question.sty')
-rw-r--r-- | macros/xetex/latex/exam-zh/tex/exam-zh-question.sty | 185 |
1 files changed, 154 insertions, 31 deletions
diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-question.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-question.sty index dd9d76609e..40dde06024 100644 --- a/macros/xetex/latex/exam-zh/tex/exam-zh-question.sty +++ b/macros/xetex/latex/exam-zh/tex/exam-zh-question.sty @@ -9,7 +9,7 @@ \RequirePackage{expl3} \RequirePackage{xparse} -\ProvidesExplPackage {exam-zh-question} {2022-9-18} {v0.1.20} +\ProvidesExplPackage {exam-zh-question} {2023-06-01} {v0.1.25} {exam-zh question module} @@ -19,6 +19,7 @@ { \RequirePackage [ most ] { tcolorbox } } % \RequirePackage { zref-savepos } \RequirePackage { xeCJKfntef } +\RequirePackage { enumitem } % https://github.com/CTeX-org/forum/issues/264#issuecomment-1200087776 \disable@package@load { etex } @@ -45,6 +46,11 @@ % ulem 宏包重定义了 \emph,使用 \normalem 恢复 \normalem +\setlist{nosep} +\setlist + { + labelsep = 4pt, + } % question 环境相关变量 @@ -70,6 +76,7 @@ \skip_new:N \l__examzh_question_bottom_sep_skip % label 的对齐 \tl_new:N \l__examzh_question_label_align_tl +\tl_new:N \l__examzh_problem_label_align_tl \keys_define:nn { exam-zh } @@ -188,7 +195,7 @@ label .tl_set:N = \l__examzh_question_label_tl, label-align .choices:nn = { left, center, right } - { \tl_set_eq:NN \l__examzh_question_label_align_tl \l_keys_choice_tl }, + { \tl_set_eq:NN \l__examzh_problem_label_align_tl \l_keys_choice_tl }, points-prelabel .tl_set:N = \l__examzh_problem_points_prelabel_tl, points-postlabel .tl_set:N = \l__examzh_problem_points_postlabel_tl, } @@ -215,18 +222,24 @@ % 选择题和填空题的题干 \NewDocumentEnvironment { question } { O { } +b } { - \bool_set_false:N \l__examzh_question_problem_style_bool - \__examzh_question_begin:nn {#1}{#2} + % \bool_set_false:N \l__examzh_question_problem_style_bool + \group_begin: + \__examzh_question_begin:nn {#1}{#2} + \__examzh_question_end:nn {#1}{#2} + \group_end: } - { \__examzh_question_end:nn {#1}{#2} } + {} % 解答题 \NewDocumentEnvironment { problem } { O { } +b } { - \bool_set_true:N \l__examzh_question_problem_style_bool - \__examzh_problem_begin:nn {#1}{#2} + % \bool_set_true:N \l__examzh_question_problem_style_bool + \group_begin: + \__examzh_problem_begin:nn {#1}{#2} + \__examzh_problem_end:nn {#1}{#2} + \group_end: } - { \__examzh_problem_end:nn {#1}{#2} } + { } \prg_generate_conditional_variant:Nnn \int_compare:nNn { xNn } { T } \cs_new:Npn \__examzh_question_begin:nn #1#2 @@ -263,11 +276,14 @@ \list { % \int_use:N \g__examzh_question_index_int . - \__examzh_question_make_label:n + \bool_if:NTF \l__examzh_question_combine_fillin_bool { - \bool_if:NT \l__examzh_question_combine_fillin_bool + % \framebox[6em] + % \fbox + % { + \__examzh_question_make_label:n { - \tl_if_blank:VTF \l__examzh_question_combine_fillin_args_tl + \tl_if_blank:VTF \l__examzh_question_combine_fillin_args_tl { \fillin } { \use:x @@ -275,18 +291,43 @@ \exp_not:N \fillin \l__examzh_question_combine_fillin_args_tl } } + \__examzh_question_the_label: } - \int_compare:xNnT { \g__examzh_question_index_int } < { 11 } - { \phantom {1} } - \__examzh_question_the_label: + % } } + { + \__examzh_question_make_label:n + { + \__examzh_question_the_label: + } + } + % \__examzh_question_make_label:n + % { + % \bool_if:NT \l__examzh_question_combine_fillin_bool + % { + % % \makebox + % % { + % \tl_if_blank:VTF \l__examzh_question_combine_fillin_args_tl + % { \fillin } + % { + % \use:x + % { + % \exp_not:N \fillin \l__examzh_question_combine_fillin_args_tl + % } + % } + % % } + % } + % \int_compare:xNnT { \g__examzh_question_index_int } < { 11 } + % { \phantom {1} } + % \__examzh_question_the_label: + % } } { % 用 group 是为了防止 combine-fillin 的 type 影响了环境里面的 fillin 的type \group_begin: \dim_gset:Nn \topsep { 0pt } \dim_gset:Nn \partopsep { 0pt } - \dim_gset:Nn \itemsep { 0pt } + \dim_gset:Nn \itemsep { 0em } \dim_gset:Nn \parsep { 0pt } % \group_begin: % 上面 \fillin 里面的设置是局部的,这样的问题是 question 的可选参数改 type 的时候不会影响 \l__examzh_fillin_type_str 的值 @@ -371,6 +412,27 @@ \keys_set:nx { exam-zh / fillin } { \seq_use:Nn \l_tmpa_seq {,} } } } +\cs_new:Npn \__examzh_problem_begin_labelsep_labelwidth_set: + { + \str_case:Vn \l__examzh_problem_label_align_tl + { + { left } + { + \dim_gset:Nn \labelsep { .7em } + \dim_gset:Nn \labelwidth { 1.8em } + } + { center } + { + \dim_gset:Nn \labelsep { .7em } + \dim_gset:Nn \labelwidth { 1.3em } + } + { right } + { + \dim_gset:Nn \labelsep { .7em } + \dim_gset:Nn \labelwidth { 1.3em } + } + } + } \cs_new:Npn \__examzh_question_begin_labelsep_labelwidth_set: { \bool_if:NTF \l__examzh_question_combine_fillin_bool @@ -384,14 +446,32 @@ { paren } { % combin-left-paren - \dim_gset:Nn \labelsep { 2.8em } - \dim_gset:Nn \labelwidth { 4.2em } + \bool_if:NTF \l__examzh_question_show_fillin_answer_bool + { + % 显示答案 + \dim_gset:Nn \labelsep { 2.6em } + \dim_gset:Nn \labelwidth { 3.8em } + } + { + % 不显示答案 + \dim_gset:Nn \labelsep { 4.5em } + \dim_gset:Nn \labelwidth { 3.8em } + } } { line } { % combin-left-line - \dim_gset:Nn \labelsep { 2.4em } - \dim_gset:Nn \labelwidth { 3.8em } + \bool_if:NTF \l__examzh_question_show_fillin_answer_bool + { + % 显示答案 + \dim_gset:Nn \labelsep { 2.2em } + \dim_gset:Nn \labelwidth { 3.8em } + } + { + % 不显示答案 + \dim_gset:Nn \labelsep { 3.8em } + \dim_gset:Nn \labelwidth { 3.8em } + } } } { @@ -425,8 +505,44 @@ } { right } { - \dim_gset:Nn \labelsep { .7em } - \dim_gset:Nn \labelwidth { 1.3em } + \str_case:VnF \l__examzh_fillin_type_str + { + { paren } + { + % combin-left-paren + \bool_if:NTF \l__examzh_question_show_fillin_answer_bool + { + % 显示答案 + \dim_gset:Nn \labelsep { 3.8em } + \dim_gset:Nn \labelwidth { 2em } + } + { + % 不显示答案 + \dim_gset:Nn \labelsep { 5.8em } + \dim_gset:Nn \labelwidth { 2em } + } + } + { line } + { + % combin-left-line + \bool_if:NTF \l__examzh_question_show_fillin_answer_bool + { + % 显示答案 + \dim_gset:Nn \labelsep { 0.7em } + \dim_gset:Nn \labelwidth { 1.3em } + } + { + % 不显示答案 + \dim_gset:Nn \labelsep { 5.2em } + \dim_gset:Nn \labelwidth { 2em } + } + } + } + { + % combin-left-paren/line 外的 + \dim_gset:Nn \labelsep { 2.8em } + \dim_gset:Nn \labelwidth { 1.3em } + } } } } @@ -497,7 +613,7 @@ \list { % \int_use:N \g__examzh_question_index_int . - \__examzh_question_make_label:n + \__examzh_problem_make_label:n { \__examzh_question_the_label: } @@ -509,12 +625,7 @@ \dim_gset:Nn \partopsep { 0pt } \dim_gset:Nn \itemsep { 0pt } \dim_gset:Nn \parsep { 0pt } - % \group_begin: - % 上面 \fillin 里面的设置是局部的,这样的问题是 question 的可选参数改 type 的时候不会影响 \l__examzh_fillin_type_str 的值 - % 所以要把 \l__examzh_question_combine_fillin_args_tl 里关于 type 的选取出来 - \__examzh_question_begin_fillin_type_set: - \__examzh_question_begin_labelsep_labelwidth_set: - % \group_end: + \__examzh_problem_begin_labelsep_labelwidth_set: \dim_gset:Nn \leftmargin { 0pt } \dim_gset:Nn \itemindent { 2em } \dim_gset_eq:NN \listparindent \itemindent @@ -565,6 +676,15 @@ { right } { \hss \llap { #1 } } } } +\cs_new:Npn \__examzh_problem_make_label:n #1 + { + \str_case:Vn \l__examzh_problem_label_align_tl + { + { left } { \rlap { #1 } \hss } + { center } { \hss \clap { #1 } \hss } + { right } { \hss \llap { #1 } } + } + } \NewDocumentCommand \AddQuestionCounter { m m } { % 生成用户层命令 @@ -801,7 +921,7 @@ { show-answer = false, text-color = black, - show-paren = false, + show-paren = true, type = hfill } \keys_define:nn { exam-zh } @@ -872,6 +992,9 @@ % no-answer-type = counter 的计数器 \int_new:N \g__examzh_fillin_no_answer_counter_int +% 控制fillin 没答案的时候的长度由内容长度决定 +\bool_new:N \l__examzh_fillin_width_type_hidden_bool + \keys_define:nn { exam-zh / fillin } { type .code:n = @@ -888,7 +1011,7 @@ color .tl_set:N = \l__examzh_fillin_color_tl, text-color .tl_set:N = \l__examzh_fillin_text_color_tl, no-answer-type .choices:nn = - { blacktriangle, counter, none } + { blacktriangle, counter, none, hidden } { \str_set:Nx \l__examzh_fillin_no_answer_type_str { \l_keys_choice_tl } }, no-answer-counter-index .int_gset:N = \g__examzh_fillin_no_answer_counter_int, no-answer-counter-label .tl_set:N = \l__examzh_fillin_label_tl, @@ -1488,8 +1611,8 @@ \NewDocumentEnvironment { solution } { O{ } +b } { % \addvspace { \l__examzh_solution_top_sep_skip } - \vspace { \l__examzh_solution_top_sep_skip } \keys_set:nn { exam-zh / solution } {#1} + \vspace { \l__examzh_solution_top_sep_skip } % 放在这是使得 \examsetup 设置 qedsymbol 可以放在正文区 \cs_set_eq:NN \qedsymbol \l__examzh_solution_qedsymbol_tl \bool_if:NTF \l__examzh_solution_show_bool |