% % Copyright (c) 2024 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} {2024-02-15} {v0.2.1} {exam-zh text with figure module} \RequirePackage { tabularray } \RequirePackage { varwidth } \RequirePackage { graphicx } \RequirePackage { filehook } \file_if_exist:nT { wrapstuff.sty } { \RequirePackage { wrapstuff } \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 }, 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, parindent .dim_set:N = \l__examzh_textfigure_text_parindent_dim } \keys_set:nn { exam-zh / textfigure } { fig-pos = bottom-right, yshift = .5\baselineskip, text-width = \textwidth, figure-width = \columnwidth, text-ratio = 1, top-sep = 0pt, bottom-sep = 1.5ex plus .5ex minus 0.5ex, top = 0, parindent = 0em } % ���������������������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 { \l__examzh_textfigure_text_parindent_dim } \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 } } \endinput