%
% 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