%% Copyright (C) 2020-2022 by Nan Geng <nangeng@nwafu.edu.cn> %% -------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either %% version 1.3c of this license or (at your option) any later %% version. This version of this license is in %% http://www.latex-project.org/lppl/lppl-1-3c.txt %% and the latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.3 or later is part of all distributions of %% LaTeX version 2005/12/01 or later. %% %% This work has the LPPL maintenance status "maintained". %% %% The Current Maintainer of this work is Nan Geng. %% %% -------------------------------------------------------------------------- %% \NeedsTeXFormat{LaTeX2e}[2020/10/01] \RequirePackage{expl3} \ProvidesExplPackage{circledtext}{2024-09-09}{v1.1.1} {Typeset circled text with l3draw} \RequirePackage { xtemplate, l3keys2e, l3draw, xparse } % ä¿è¯TeXLiveçš„å‘下兼容 \cs_if_free:NT \box_ht_plus_dp:N { \cs_new_protected:Npn \box_ht_plus_dp:N #1 { \tex_dimexpr:D \box_ht:N #1 + \box_dp:N #1 \scan_stop: } } % 带圈文å—ç”¨æˆ·æŽ¥å£ % #1 *å·å‘½ä»¤ï¼Œå®žçŽ°é˜´æ–‡ % #2 æ ¼å¼é€‰é¡¹ % #3 æ–‡å— \NewDocumentCommand{\circledtext}{ s O{} m } { \group_begin: \IfBooleanTF{ #1 } { \bool_set_true:N \l__circledtext_negative_bool }{ \bool_set_false:N \l__circledtext_negative_bool } \__circledtext_handle:nn { #2 } { #3 } \group_end: } % 是å¦åç™½æ ‡å¿— \bool_new:N \l__circledtext_negative_bool % 基å—符盒å \box_new:N \l__circledtext_basebox_box % å—符盒å类型 \tl_new:N \l__circledtext_char_box_type_tl % å—符盒å类型列表 \clist_new:N \g__circledtext_char_box_list_clist % ç¼©æ”¾æ–¹å¼ \tl_new:N \l__circledtext_resize_method_tl % 缩放方å¼åˆ—表 \clist_new:N \g__circledtext_resize_method_clist % 基å—ç¬¦ç›’åæ£æ–¹å½¢è¿žé•¿ \dim_new:N \l__circledtext_char_box_size_dim % 基å—ç¬¦ç›’åæ£æ–¹å½¢å¤–æŽ¥åœ†åŠå¾„ \dim_new:N \l__circledtext_char_box_radius_dim % 基å—符宽度 \dim_new:N \l__circledtext_char_width_dim % 基å—符高度 \dim_new:N \l__circledtext_char_height_dim % å—符(串)ç›’å宽度 \dim_new:N \l__circledtext_box_width_dim % å—符(串)ç›’å高度 \dim_new:N \l__circledtext_box_height_dim % å—符(串)外框线宽 \dim_new:N \l__circledtext_box_linewidth_dim % å—符(串)内部åå—ã€ç±³å—装饰线线宽 \dim_new:N \l__circledtext_cross_linewidth_dim % å—符(串)深度(å¸¦æ ¼å¼) \dim_new:N \l__circledtext_char_dp_dim % å—符(串)ç›’å容器 \coffin_new:N \l__circledtext_str_box_coffin % å—符框盒å容器 \coffin_new:N \l__circledtext_box_coffin % å—符盒å容器 \coffin_new:N \l__circledtext_char_coffin % 临时盒å容器 \coffin_new:N \l__circledtext_tmpa_coffin % 临时盒å容器 \coffin_new:N \l__circledtext_tmpb_coffin % 基å—符宽度 \dim_new:N \charboxwd % 基å—符高度 \dim_new:N \charboxht % 待处ç†å—符(串) \tl_new:N \l__circledtext_chars_tl % å—符(串)æŽ’ç‰ˆæ ¼å¼ \tl_new:N \l__circledtext_character_format_tl % 内部åå—ã€ç±³å—装饰线颜色点边框颜色比例 \int_new:N \l__circledtext_cross_color_ratio_int \int_set:Nn \l__circledtext_cross_color_ratio_int { 30 } % å—符(串)çš„å—形类型(实线ã€è™šçº¿ç‰) \int_new:N \l__circledtext_charstroke_type_int % å—体自身缩放比例 \fp_new:N \l__circledtext_char_shrink_fp % 填充色辅助函数 \cs_new_nopar:Nn \__circledtext_aux_color_boxfill: { } % ç›’åç”±l3draw实现, % 设计æ€è·¯å’Œéƒ¨åˆ†æºç æ¥è‡ªzitieå®åŒ…(\url{https://www.ctan.org/pkg/zitie})。 % 颜色命å函数 % #1 颜色åç§° % #2 é¢œè‰²è¡¨è¾¾å¼ \cs_set_nopar:Npn \__circledtext_color_select:nn #1#2 { \color_set:nn {#1} {#2} } \cs_generate_variant:Nn \__circledtext_color_select:nn {nx} % 颜色命å函数 % #1 颜色åç§° % #2 颜色空间 % #3 颜色分é‡å€¼ \cs_set_nopar:Npn \__circledtext_color_select:nnn #1#2#3 { \color_set:nnn {#1} {#2} {#3} } \cs_generate_variant:Nn \__circledtext_color_select:nnn {nnx} % 计算基å—符的宽和高 \cs_new:Npn \__circledtext_calc_basechar_w_h: { \dim_set:Nn \l__circledtext_char_width_dim { \box_wd:N \l__circledtext_basebox_box } \dim_set:Nn \l__circledtext_char_height_dim { \box_ht_plus_dp:N \l__circledtext_basebox_box } } % ç›’å容器总高度计算函数 \cs_new_nopar:Npn \__circledtext_coffin_ht_plus_dp:N #1 { \coffin_ht:N #1 + \coffin_dp:N #1 } % 计算基å—符外框大å°(å¤–æŽ¥æ£æ–¹å½¢è¾¹é•¿å’Œå¤–接圆åŠå¾„) \cs_new:Npn \__circledtext_calc_char_box_size: { % 设置基å—ç¬¦æ ¼å¼çš„基å—符盒å \hbox_set:Nn \l_tmpa_box { \tl_use:N \l__circledtext_character_format_tl \tl_use:N \c__circledtext_basechar_tl } % ç›’å宽度 \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box } % ç›’å高度 \dim_set:Nn \l_tmpb_dim { \box_ht_plus_dp:N \l_tmpa_box } % ç›’åæ·±åº¦ \dim_set:Nn \l__circledtext_char_dp_dim { \box_dp:N \l_tmpa_box } % æ£æ–¹å½¢è¾¹é•¿ \dim_compare:nNnTF \l_tmpa_dim > \l_tmpb_dim { \dim_set_eq:NN \l__circledtext_char_box_size_dim \l_tmpa_dim } { \dim_set_eq:NN \l__circledtext_char_box_size_dim \l_tmpb_dim } % 设置基å—ç¬¦ç›’åæ£æ–¹å½¢å®½å’Œé«˜(相ç‰) \dim_set_eq:NN \charboxwd \l__circledtext_char_box_size_dim \dim_set_eq:NN \charboxht \l__circledtext_char_box_size_dim % 外接圆åŠå¾„ \dim_set:Nn \l__circledtext_char_box_radius_dim { \fp_to_dim:n { \fp_eval:n { \l__circledtext_char_box_size_dim * sqrt(2)/ 2 } } } } % å—ç¬¦ç›’åæž„é€ ç±»åž‹å‡½æ•°å称生æˆå‡½æ•° % åç§°ä¸6ä¸ªå‚æ•°åˆ†åˆ«è¡¨ç¤ºï¼š % #1 左下角xåæ ‡ % #2 左下角yåæ ‡ % #3 å³ä¸Šè§’xåæ ‡ % #4 å³ä¸Šè§’yåæ ‡ % #5 xæ–¹å‘缩放比例(扩展ä¿ç•™å‚æ•°) % #6 yæ–¹å‘缩放比例(扩展ä¿ç•™å‚æ•°) \cs_new_nopar:Npn \__circledtext_char_box_type:n #1 { __circledtext_char_box_construct_type_ #1 :nnnnnn } % å—ç¬¦ç›’åæž„é€ ç±»åž‹å‡½æ•°å称命令生æˆå‡½æ•° % å称命令ä¸6ä¸ªå‚æ•°åˆ†åˆ«è¡¨ç¤ºï¼š % #1 左下角xåæ ‡ % #2 左下角yåæ ‡ % #3 å³ä¸Šè§’xåæ ‡ % #4 å³ä¸Šè§’yåæ ‡ % #5 xæ–¹å‘缩放比例(扩展ä¿ç•™å‚æ•°) % #6 yæ–¹å‘缩放比例(扩展ä¿ç•™å‚æ•°) \cs_new_nopar:Npn \__circledtext_char_box_type_c:n #1 { \use:c { __circledtext_char_box_construct_type_ #1 :nnnnnn } } % å—ç¬¦ç›’åæž„é€ ç±»åž‹å‡½æ•°ç”Ÿæˆå™¨å‡½æ•° % #1 类型åç§° \cs_new:Npn \__circledtext_new_char_box_construct:nn #1 { % 将类型åç§°è®°å…¥clist \clist_put_right:Nn \g__circledtext_char_box_list_clist {#1} % 类似\cs_new:cn __circledtext_char_box_construct_type_none:nnnnnn \cs_new:cn { \__circledtext_char_box_type:n {#1} } } \cs_generate_variant:Nn \__circledtext_new_char_box_construct:nn { V } \cs_generate_variant:Nn \__circledtext_new_char_box_construct:nn { x } % 定义å—符边框盒å类型 % æ— è¾¹æ¡† \__circledtext_new_char_box_construct:nn { none } { } % å¡«å……æ£æ–¹å½¢ \__circledtext_new_char_box_construct:nn { __filledsquare } { \cs_if_eq:NNF \__circledtext_aux_color_boxfill: \c_empty_tl { \__circledtext_aux_color_boxfill: \draw_scope_begin: \bool_if:NTF \l__circledtext_negative_bool { \color_fill:n { circledtextcharcolor } }{ \color_fill:n { circledtextboxfill } } \draw_transform_shift:n { (#3-#3*#5)/2, (#4-#4*#6)/2 } \draw_path_rectangle:nn { #1, #2 } { #3*#5, #4*#6 } \draw_path_use_clear:n { fill } \draw_scope_end: } } % åè‰²å¡«å……æ£æ–¹å½¢ \__circledtext_new_char_box_construct:nn { __negfilledsquare } { \cs_if_eq:NNF \__circledtext_aux_color_boxfill: \c_empty_tl { \__circledtext_aux_color_boxfill: \draw_scope_begin: \bool_if:NTF \l__circledtext_negative_bool { \color_fill:n { circledtextboxfill } }{ \color_fill:n { circledtextcharcolor } } \draw_transform_shift:n { (#3-#3*#5)/2, (#4-#4*#6)/2 } \draw_path_rectangle:nn { #1, #2 } { #3*#5, #4*#6 } \draw_path_use_clear:n { fill } \draw_scope_end: } } % æ£æ–¹å½¢å¡«å……内切圆 \__circledtext_new_char_box_construct:nn { __innerfilledcircle } { \cs_if_eq:NNF \__circledtext_aux_color_boxfill: \c_empty_tl { \__circledtext_aux_color_boxfill: \draw_scope_begin: \bool_if:NTF \l__circledtext_negative_bool { \color_fill:n { circledtextcharcolor } }{ \color_fill:n { circledtextboxfill } } \draw_path_circle:nn { #3/2, #4/2 } { #3*#5/2 } \draw_path_use_clear:n { fill } \draw_scope_end: } } % æ£æ–¹å½¢å¡«å……外接圆 \__circledtext_new_char_box_construct:nn { __outerfilledcircle } { \cs_if_eq:NNF \__circledtext_aux_color_boxfill: \c_empty_tl { \__circledtext_aux_color_boxfill: \draw_scope_begin: \bool_if:NTF \l__circledtext_negative_bool { \color_fill:n { circledtextcharcolor } }{ \color_fill:n { circledtextboxfill } } \draw_path_circle:nn { #3/2, #4/2 } { \l__circledtext_char_box_radius_dim*#5 } \draw_path_use_clear:n { fill } \draw_scope_end: } } % æ— åè‰²åº•å±‚å¡«å……æ£æ–¹å½¢ \__circledtext_new_char_box_construct:nn { __lowerfilledsquare } { \draw_scope_begin: \color_fill:n { lowerbgboxfill } \draw_transform_shift:n { (#3-#3*#5)/2, (#4-#4*#6)/2 } \draw_path_rectangle:nn { #1, #2 } { #3*#5, #4*#6 } \draw_path_use_clear:n { fill } \draw_scope_end: } % æ— åè‰²ä¸Šå±‚å¡«å……æ£æ–¹å½¢ \__circledtext_new_char_box_construct:nn { __upperfilledsquare } { \draw_scope_begin: \color_fill:n { upperbgboxfill } \draw_transform_shift:n { (#3-#3*#5)/2, (#4-#4*#6)/2 } \draw_path_rectangle:nn { #1, #2 } { #3*#5, #4*#6 } \draw_path_use_clear:n { fill } \draw_scope_end: } % æ— åè‰²é˜´å½±å¡«å……æ£æ–¹å½¢ \__circledtext_new_char_box_construct:nn { __shadowfilledsquare } { \draw_scope_begin: \color_fill:n { shadowboxfill } \draw_transform_shift:n { (#3-#3*#5)/2 + \charboxwd * 0.1, (#4-#4*#6)/2 - \charboxht * 0.1 } \draw_path_rectangle:nn { #1, #2 } { #3*#5, #4*#6 } \draw_path_use_clear:n { fill } \draw_scope_end: } % æ— å色底层填充内切圆 \__circledtext_new_char_box_construct:nn { __innerlowerfilledcircle } { \draw_scope_begin: \color_fill:n { lowerbgboxfill } \draw_path_circle:nn { #3/2, #4/2 } { #3*#5/2 } \draw_path_use_clear:n { fill } \draw_scope_end: } % æ— å色上层填充内切圆 \__circledtext_new_char_box_construct:nn { __innerupperfilledcircle } { \draw_scope_begin: \color_fill:n { upperbgboxfill } \draw_path_circle:nn { #3/2, #4/2 } { #3*#5/2 } \draw_path_use_clear:n { fill } \draw_scope_end: } % æ— å色阴影填充内切圆 \__circledtext_new_char_box_construct:nn { __innershadowfilledcircle } { \draw_scope_begin: \color_fill:n { shadowboxfill } \draw_transform_shift:n { \charboxwd*0.1, -\charboxht*0.1 } \draw_path_circle:nn { #3/2, #4/2 } { #3*#5/2 } \draw_path_use_clear:n { fill } \draw_scope_end: } % æ— å色底层填充外接圆 \__circledtext_new_char_box_construct:nn { __outerlowerfilledcircle } { \draw_scope_begin: \color_fill:n { lowerbgboxfill } \draw_path_circle:nn { #3/2, #4/2 } { \l__circledtext_char_box_radius_dim*#5 } \draw_path_use_clear:n { fill } \draw_scope_end: } % æ— å色上层填充外接圆 \__circledtext_new_char_box_construct:nn { __outerupperfilledcircle } { \draw_scope_begin: \color_fill:n { upperbgboxfill } \draw_path_circle:nn { #3/2, #4/2 } { \l__circledtext_char_box_radius_dim*#5 } \draw_path_use_clear:n { fill } \draw_scope_end: } % æ— å色阴影填充外接圆 \__circledtext_new_char_box_construct:nn { __outershadowfilledcircle } { \draw_scope_begin: \color_fill:n { shadowboxfill } \draw_transform_shift:n { \charboxwd*0.1, -\charboxht*0.1 } \draw_path_circle:nn { #3/2, #4/2 } { \l__circledtext_char_box_radius_dim*#5 } \draw_path_use_clear:n { fill } \draw_scope_end: } % æ£æ–¹å½¢è¾¹æ¡† \__circledtext_new_char_box_construct:nn { __squarebox } { \draw_scope_begin: \color_stroke:n { circledtextcharboxcolor } \draw_transform_shift:n { (#3-#3*#5)/2, (#4-#4*#6)/2 } \draw_path_rectangle:nn { #1, #2 } { #3*#5, #4*#6 } \draw_path_use_clear:n { stroke } \draw_scope_end: } % æ£æ–¹å½¢å†…切圆边框 \__circledtext_new_char_box_construct:nn { __innercirclebox } { \__circledtext_aux_color_boxfill: \draw_scope_begin: \color_stroke:n { circledtextcharboxcolor } \draw_path_circle:nn { #3/2, #4/2 } { #3*#5/2 } \draw_path_use_clear:n { stroke } \draw_scope_end: } % æ£æ–¹å½¢å¤–接圆边框 \__circledtext_new_char_box_construct:nn { __outercirclebox } { \draw_scope_begin: \color_stroke:n { circledtextcharboxcolor } \draw_path_circle:nn { #3/2, #4/2 } { \l__circledtext_char_box_radius_dim*#5 } \draw_path_use_clear:n { stroke } \draw_scope_end: } % æ£æ–¹å½¢æ–œåå—线(æ£æ–¹å½¢å¯¹è§’连线) \__circledtext_new_char_box_construct:nn { __dcross } { \draw_scope_begin: \tl_if_empty:NF \l__circledtext_dash_pattern_tl { \exp_args:No \draw_dash_pattern:nn { \l__circledtext_dash_pattern_tl } { 0pt } } \draw_linewidth:n{ \l__circledtext_cross_linewidth_dim } \color_stroke:n { circledtextcrosscolor } \draw_transform_shift:n { (#3-#3*#5)/2, (#4-#4*#6)/2 } \draw_path_moveto:n { #1 , #2 } \draw_path_lineto:n { #3*#5, #4*#6 } \draw_path_moveto:n { #1 , #4*#6 } \draw_path_lineto:n { #3 , #2*#5 } \draw_path_use_clear:n { stroke } \draw_scope_end: } % æ£æ–¹å½¢æ£åå—线(æ£æ–¹å½¢å¯¹è¾¹ä¸ç‚¹è¿žçº¿) \__circledtext_new_char_box_construct:nn { __scross } { \draw_scope_begin: \tl_if_empty:NF \l__circledtext_dash_pattern_tl { \exp_args:No \draw_dash_pattern:nn { \l__circledtext_dash_pattern_tl } { 0pt } } \draw_linewidth:n{ \l__circledtext_cross_linewidth_dim } \color_stroke:n { circledtextcrosscolor } \draw_transform_shift:n { (#3-#3*#5)/2, (#4-#4*#6)/2 } \draw_path_moveto:n { #3*#5/2, #2 } \draw_path_lineto:n { #3*#5/2, #4*#6 } \draw_path_moveto:n { #1 , #4*#6/2 } \draw_path_lineto:n { #3*#5 , #4*#6/2 } \draw_path_use_clear:n { stroke } \draw_scope_end: } % 内切圆斜åå—线(éœ€è¦æ±‚交点) \__circledtext_new_char_box_construct:nn { __innerdcross } { \draw_scope_begin: \tl_if_empty:NF \l__circledtext_dash_pattern_tl { \exp_args:No \draw_dash_pattern:nn { \l__circledtext_dash_pattern_tl } { 0pt } } \draw_linewidth:n{ \l__circledtext_cross_linewidth_dim } \color_stroke:n { circledtextcrosscolor } \draw_path_moveto:n { \draw_point_intersect_line_circle:nnnnn { #1, #2 } % line's first point { #3, #4 } % line's second point { #3/2, #4/2 } { #3*#5/2 } {1} % index of intersect } \draw_path_lineto:n { \draw_point_intersect_line_circle:nnnnn { #1, #2 } % line's first point { #3, #4 } % line's second point { #3/2, #4/2 } { #3*#5/2 } {2} % index of intersect } \draw_path_moveto:n { \draw_point_intersect_line_circle:nnnnn { #1, #4 } % line's first point { #3, #2 } % line's second point { #3/2, #4/2 } { #3*#5/2 } {1} % index of intersect } \draw_path_lineto:n { \draw_point_intersect_line_circle:nnnnn { #1, #4 } % line's first point { #3, #2 } % line's second point { #3/2, #4/2 } { #3*#5/2 } {2} % index of intersect } \draw_path_use_clear:n { stroke } \draw_scope_end: } % 外接圆æ£åå—线(éœ€è¦æ±‚交点) \__circledtext_new_char_box_construct:nn { __outercross } { \draw_scope_begin: \tl_if_empty:NF \l__circledtext_dash_pattern_tl { \exp_args:No \draw_dash_pattern:nn { \l__circledtext_dash_pattern_tl } { 0pt } } \draw_linewidth:n{ \l__circledtext_cross_linewidth_dim } \color_stroke:n { circledtextcrosscolor } \draw_path_moveto:n { \draw_point_intersect_line_circle:nnnnn { #3/2, #2 } % line's first point { #3/2, #4 } % line's second point { #3/2, #4/2 } { \l__circledtext_char_box_radius_dim*#5 } {1} % index of intersect } \draw_path_lineto:n { \draw_point_intersect_line_circle:nnnnn { #3/2, #2 } % line's first point { #3/2, #4 } % line's second point { #3/2, #4/2 } { \l__circledtext_char_box_radius_dim*#5 } {2} % index of intersect } \draw_path_moveto:n { \draw_point_intersect_line_circle:nnnnn { #1, #4/2 } % line's first point { #3, #4/2 } % line's second point { #3/2, #4/2 } { \l__circledtext_char_box_radius_dim*#5 } {1} % index of intersect } \draw_path_lineto:n { \draw_point_intersect_line_circle:nnnnn { #1, #4/2 } % line's first point { #3, #4/2 } % line's second point { #3/2, #4/2 } { \l__circledtext_char_box_radius_dim*#5 } {2} % index of intersect } \draw_path_use_clear:n { stroke } \draw_scope_end: } % 填充内切圆å åŠ å†…åˆ‡åœ†è¾¹æ¡† \__circledtext_new_char_box_construct:nn { o } { \__circledtext_char_box_type_c:n { __innerfilledcircle } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __innercirclebox } {#1} {#2} {#3} {#4} {#5} {#6} } % 填充内切圆å åŠ æ£æ–¹å½¢æ£åå—线与内切圆边框 \clist_map_variable:nNn {o+,+o} \l_tmpa_tl { \__circledtext_new_char_box_construct:Vn \l_tmpa_tl { \__circledtext_char_box_type_c:n { __innerfilledcircle } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __scross } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __innercirclebox } {#1} {#2} {#3} {#4} {#5} {#6} } } % 填充内切圆å åŠ å†…åˆ‡åœ†æ–œåå—线与内切圆边框 \clist_map_variable:nNn {ox,xo} \l_tmpa_tl { \__circledtext_new_char_box_construct:Vn \l_tmpa_tl { \__circledtext_char_box_type_c:n { __innerfilledcircle } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __innerdcross } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __innercirclebox } {#1} {#2} {#3} {#4} {#5} {#6} } } % 填充内切圆å åŠ å†…åˆ‡åœ†æ£æ–œåå—线与内切圆边框 \clist_map_variable:nNn {ox+,o+x,xo+,x+o,+ox,+xo} \l_tmpa_tl { \__circledtext_new_char_box_construct:Vn \l_tmpa_tl { \__circledtext_char_box_type_c:n { __innerfilledcircle } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __innerdcross } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __scross } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __innercirclebox } {#1} {#2} {#3} {#4} {#5} {#6} } } % 内切圆斜åå—线å åŠ æ£åå—线 \clist_map_variable:nNn {x+,+x} \l_tmpa_tl { \__circledtext_new_char_box_construct:Vn \l_tmpa_tl { \__circledtext_char_box_type_c:n { __innerdcross } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __scross } {#1} {#2} {#3} {#4} {#5} {#6} } } % å¡«å……æ£æ–¹å½¢å åŠ æ£æ–¹å½¢è¾¹æ¡† \__circledtext_new_char_box_construct:nn { O } { \__circledtext_char_box_type_c:n { __filledsquare } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __squarebox } {#1} {#2} {#3} {#4} {#5} {#6} } % å¡«å……æ£æ–¹å½¢å åŠ æ£æ–¹å½¢æ£åå—çº¿ä¸Žæ£æ–¹å½¢è¾¹æ¡† \clist_map_variable:nNn {O+,+O} \l_tmpa_tl { \__circledtext_new_char_box_construct:Vn \l_tmpa_tl { \__circledtext_char_box_type_c:n { __filledsquare } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __scross } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __squarebox } {#1} {#2} {#3} {#4} {#5} {#6} } } % å¡«å……æ£æ–¹å½¢å åŠ æ£æ–¹å½¢æ–œåå—çº¿ä¸Žæ£æ–¹å½¢è¾¹æ¡† \clist_map_variable:nNn {OX,XO} \l_tmpa_tl { \__circledtext_new_char_box_construct:Vn \l_tmpa_tl { \__circledtext_char_box_type_c:n { __filledsquare } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __dcross } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __squarebox } {#1} {#2} {#3} {#4} {#5} {#6} } } % å¡«å……æ£æ–¹å½¢å åŠ æ£æ–¹å½¢æ–œæ£åå—çº¿ä¸Žæ£æ–¹å½¢è¾¹æ¡† \clist_map_variable:nNn {OX+,O+X,XO+,X+O,+OX,+XO} \l_tmpa_tl { \__circledtext_new_char_box_construct:Vn \l_tmpa_tl { \__circledtext_char_box_type_c:n { __filledsquare } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __dcross } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __scross } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __squarebox } {#1} {#2} {#3} {#4} {#5} {#6} } } % æ£æ–¹å½¢æ–œåå—线å åŠ æ£åå—线 \clist_map_variable:nNn {X+,+X} \l_tmpa_tl { \__circledtext_new_char_box_construct:Vn \l_tmpa_tl { \__circledtext_char_box_type_c:n { __dcross } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __scross } {#1} {#2} {#3} {#4} {#5} {#6} } } % 内切圆å åŠ åŒå¿ƒ82%内切圆边框 \__circledtext_new_char_box_construct:nn { oo } { \__circledtext_char_box_type_c:n { __innerfilledcircle } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __innercirclebox } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __innercirclebox } {#1} {#2} {#3} {#4} {0.82} {0.82} } % åè‰²æ£æ–¹å½¢å åŠ å†…åˆ‡å¡«å……åœ† \clist_map_variable:nNn {Oo,oO} \l_tmpa_tl { \__circledtext_new_char_box_construct:Vn \l_tmpa_tl { \__circledtext_char_box_type_c:n { __negfilledsquare } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __innerfilledcircle } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __squarebox } {#1} {#2} {#3} {#4} {#5} {#6} } } % æ£æ–¹å½¢å åŠ åŒå¿ƒ82%æ£æ–¹å½¢è¾¹æ¡† \__circledtext_new_char_box_construct:nn { OO } { \__circledtext_char_box_type_c:n { __filledsquare } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __squarebox } {#1} {#2} {#3} {#4} {#5} {#6} \__circledtext_char_box_type_c:n { __squarebox } {#1} {#2} {#3} {#4} {0.82} {0.82} } % 3åŒå¿ƒåœ†å åŠ (类似ä¸å›½è±¡æ£‹æ£‹å形状) \__circledtext_new_char_box_construct:nn { ooo } { % 绘制填充外接圆阴影 \__circledtext_char_box_type_c:n { __outershadowfilledcircle } {#1} {#2} {#3} {#4} {1.0} {1.0} % 绘制填充外接圆外圈背景 \__circledtext_char_box_type_c:n { __outerlowerfilledcircle } {#1} {#2} {#3} {#4} {#5} {#6} % 绘制填充外接边环背景 \__circledtext_char_box_type_c:n { __outerupperfilledcircle } {#1} {#2} {#3} {#4} {0.88} {0.88} % 绘制填充外接圆内圈背景 \__circledtext_char_box_type_c:n { __outerlowerfilledcircle } {#1} {#2} {#3} {#4} {0.72} {0.72} % 绘制åŒè¾¹åˆ»çŽ¯çº¿ \__circledtext_char_box_type_c:n { __outercirclebox } {#1} {#2} {#3} {#4} {0.88} {0.88} \__circledtext_char_box_type_c:n { __outercirclebox } {#1} {#2} {#3} {#4} {0.72} {0.72} } % 3åŒå¿ƒæ£æ–¹å½¢å åŠ \__circledtext_new_char_box_construct:nn { OOO } { % ç»˜åˆ¶å¡«å……æ£æ–¹å½¢é˜´å½± \__circledtext_char_box_type_c:n { __shadowfilledsquare } {#1} {#2} {#3} {#4} {1.0} {1.0} % ç»˜åˆ¶å¡«å……æ£æ–¹å½¢å¤–圈背景 \__circledtext_char_box_type_c:n { __lowerfilledsquare} {#1} {#2} {#3} {#4} {#5} {#6} % ç»˜åˆ¶å¡«å……æ£æ–¹å½¢è¾¹çŽ¯èƒŒæ™¯ \__circledtext_char_box_type_c:n { __upperfilledsquare} {#1} {#2} {#3} {#4} {0.88} {0.88} % ç»˜åˆ¶å¡«å……æ£æ–¹å½¢å†…圈背景 \__circledtext_char_box_type_c:n { __lowerfilledsquare} {#1} {#2} {#3} {#4} {0.72} {0.72} % 绘制åŒè¾¹åˆ»çŽ¯çº¿ \__circledtext_char_box_type_c:n { __squarebox } {#1} {#2} {#3} {#4} {0.88} {0.88} \__circledtext_char_box_type_c:n { __squarebox } {#1} {#2} {#3} {#4} {0.72} {0.72} } \msg_new:nnn { circledtext } { box-exists } { The~ box~ type~ `#1~ not~ exists. } % 缩放类型å称生æˆå‡½æ•° \cs_new_nopar:Npn \__circledtext_resize:n #1 { __circledtext_processor_resize_ #1 :w } % 缩放类型函数å称命令生æˆå‡½æ•° \cs_new_nopar:Npn \__circledtext_resize_c:n #1 { \use:c { __circledtext_processor_resize_ #1 :w } } % 缩放代ç 生æˆå‡½æ•° % #1 dim长度å˜é‡1 % #2 dim长度å˜é‡2 % #3 缩放代ç 1 % #4 缩放代ç 2 % #5 缩放代ç 3 % 如果 #1 > 0 ,å–#3代ç % 如果 #1 <= 0 且#2 > 0 ,å–#4代ç % 如果 #1 <= 0 且#2 <= 0,å–#5代ç \cs_new:Npn \__circledtext_dim_gezero_dispatch:NNnnn #1#2 #3#4#5 { \dim_compare:nNnTF #1 > \c_zero_dim { #3 } { \dim_compare:nNnTF #2 > \c_zero_dim { #4 } { #5 } } } % 缩放代ç 生æˆå‡½æ•° % #1 dim长度å˜é‡1 % #2 dim长度å˜é‡2 % #3 缩放代ç 1 % #4 缩放代ç 2 % #5 缩放代ç 3 % #6 缩放代ç 4 % 如果 #1 > 0 且 #2 > 0 ,å–#3代ç % 如果 #1 > 0 且 #2 <= 0,å–#4代ç % 如果 #1 <= 0 且 #2 > 0 ,å–#5代ç % 如果 #1 <= 0 且 #2 <= 0,å–#6代ç \cs_new:Npn \__circledtext_dim_gezero_dispatch:NNnnnn #1#2 #3#4#5#6 { \dim_compare:nNnTF #1 > \c_zero_dim { \dim_compare:nNnTF #2 > \c_zero_dim { #3 } { #4 } } { \dim_compare:nNnTF #2 > \c_zero_dim { #5 } { #6 } } } % 缩放代ç 生æˆå‡½æ•°(分别按高度ã€å®½åº¦æˆ–实际尺寸缩放) \cs_new:Npn \__circledtext_force_size_dispatch:nnn % height, width, none { \__circledtext_dim_gezero_dispatch:NNnnn \l__circledtext_height_dim \l__circledtext_width_dim } % 缩放代ç 生æˆå‡½æ•°(分别按高宽ã€é«˜åº¦ã€å®½åº¦æˆ–实际尺寸缩放) \cs_new:Npn \__circledtext_force_size_dispatch:nnnn % both, height, width, none { \__circledtext_dim_gezero_dispatch:NNnnnn \l__circledtext_box_height_dim \l__circledtext_box_width_dim } % æž„é€ ç¼©æ”¾ç±»åž‹ \cs_new:Npn \__circledtext_new_resize_method:nn #1 { \clist_put_right:Nn \g__circledtext_resize_method_clist {#1} \cs_new:cpn { \__circledtext_resize:n {#1} } } % æ— ç¼©æ”¾ \__circledtext_new_resize_method:nn { none } { } % æŒ‰å®žé™…å‚æ•°ç¼©æ”¾ \__circledtext_new_resize_method:nn { real } { \__circledtext_force_size_dispatch:nnnn {% ç›’å宽高缩放 \coffin_resize:Nnn \l__circledtext_box_coffin \l__circledtext_box_width_dim \l__circledtext_box_height_dim } {% 指定高度为比例缩放 \coffin_scale:Nnn \l__circledtext_box_coffin { \dim_ratio:nn { \l__circledtext_box_height_dim } { \__circledtext_coffin_ht_plus_dp:N \l__circledtext_box_coffin } } { \dim_ratio:nn { \l__circledtext_box_height_dim } { \__circledtext_coffin_ht_plus_dp:N \l__circledtext_box_coffin } } } {% 指定宽度为比例缩放 \coffin_scale:Nnn \l__circledtext_box_coffin { \dim_ratio:nn { \l__circledtext_box_width_dim } { \coffin_wd:N \l__circledtext_box_coffin } } { \dim_ratio:nn { \l__circledtext_box_width_dim } { \coffin_wd:N \l__circledtext_box_coffin } } } {% 实际宽ã€é«˜æ¯”例缩放 \coffin_scale:Nnn \l__circledtext_box_coffin { \l__circledtext_x_scale_tl } { \l__circledtext_y_scale_tl } } } % 按基å—ç¬¦å‚æ•°ç¼©æ”¾ \__circledtext_new_resize_method:nn { base } { \__circledtext_force_size_dispatch:nnnn {% 按指定盒å宽高缩放 \coffin_resize:Nnn \l__circledtext_box_coffin \l__circledtext_box_width_dim \l__circledtext_box_height_dim } {% 基å—符宽高乘以高度比例缩放 \coffin_resize:Nnn \l__circledtext_box_coffin { \l__circledtext_char_width_dim * \dim_ratio:nn { \l__circledtext_box_height_dim } { \__circledtext_coffin_ht_plus_dp:N \l__circledtext_box_coffin } } { \l__circledtext_box_height_dim } } {% 基å—符宽高乘以宽度比例缩放 \coffin_resize:Nnn \l__circledtext_box_coffin { \l__circledtext_box_width_dim } { \l__circledtext_char_height_dim * \dim_ratio:nn { \l__circledtext_box_width_dim } { \coffin_wd:N \l__circledtext_box_coffin } } } {% 基å—符乘比例系数åŽç¼©æ”¾ \coffin_resize:Nnn \l__circledtext_box_coffin { \l__circledtext_x_scale_tl \l__circledtext_char_width_dim } { \l__circledtext_y_scale_tl \l__circledtext_char_height_dim } } } \msg_new:nnn { circledtext } { resize-type } { using~ `#1'~ resize. } % 笔画设置函数 \cs_new:Npn \__circledtext_chars_stroke:nn #1#2 { \special { pdf:code ~ q ~ #1 } #2 \special { pdf:code ~ Q } } % ç¬”ç”»æž„é€ å‡½æ•° \cs_new_protected:Npn \__circledtext_chars_stroke_construct:n #1 { \int_case:nn {\l__circledtext_charstroke_type_int} { {1}{ #1 } {2}{ \__circledtext_chars_stroke:nn { 1 ~ Tr ~ 0.10 ~ w ~ [] ~ 0 ~ d ~ 1 ~ J } {#1} } {3}{ \__circledtext_chars_stroke:nn { 1 ~ Tr ~ 0.10 ~ w ~ [1~1] ~ 0 ~ d ~ 1 ~ J } {#1} } {4}{ \__circledtext_chars_stroke:nn { 3 ~ Tr } {#1} } } } \cs_generate_variant:Nn \__circledtext_chars_stroke_construct:n { V } \cs_generate_variant:Nn \__circledtext_chars_stroke_construct:n { x } % key_value选项设计 \keys_define:nn { circledtext } { % 基å—符 basechar .code:n = { \tl_gset:Nx \c__circledtext_basechar_tl {#1} \__circledtext_calc_basechar_w_h: }, % å—ç¬¦æ ¼å¼ charf .code:n = { \tl_gset:Nn \l__circledtext_character_format_tl {#1} \__circledtext_calc_char_box_size: }, % charf .initial:n = \normalsize , % 边框类型 boxtype .code:n = { \exp_args:NNx \clist_if_in:NnTF \g__circledtext_char_box_list_clist {#1} { \tl_set:Nx \l__circledtext_char_box_type_tl {#1} } { \msg_error:nnx { circledtext } { box-exists } {#1} } % \__circledtext_calc_char_box_size: }, % ç¼©æ”¾æ–¹å¼ resize .code:n = { \exp_args:NNx \clist_if_in:NnTF \g__circledtext_resize_method_clist {#1} { \tl_set:Nx \l__circledtext_resize_method_tl {#1} } { \msg_error:nnx { circledtext } { resize-method } {#1} } }, % ç¼©æ”¾å‚æ•° xscale .tl_set:N = \l__circledtext_x_scale_tl , xscale .initial:n = 1 , yscale .tl_set:N = \l__circledtext_y_scale_tl , yscale .initial:n = 1 , scale .meta:n = { xscale = #1 , yscale = #1 } , width .dim_set:N = \l__circledtext_box_width_dim , height .dim_set:N = \l__circledtext_box_height_dim , % å—符边框线宽 boxlinewidth .dim_set:N = \l__circledtext_box_linewidth_dim , boxlinewidth .initial:n = 0.4pt , % åå—线线宽 crosslinewidth .dim_set:N = \l__circledtext_cross_linewidth_dim , crosslinewidth .initial:n = 0.3pt , % 边框线颜色 boxcolor .code:n = { \tl_set:Nx \l_tmpa_tl { #1 ! \int_use:N \l__circledtext_cross_color_ratio_int } \__circledtext_color_select:nn { circledtextcharboxcolor } {#1} \__circledtext_color_select:nx { circledtextcrosscolor } { \l_tmpa_tl } } , boxcolor .initial:n = black , boxcolor* .code:n = { \tl_set:Nx \l_tmpa_tl { #1 ! \int_use:N \l__circledtext_cross_color_ratio_int } \__circledtext_color_select:nnn { circledtextcharboxcolor } #1 \__circledtext_color_select:nnx { circledtextcrosscolor } \l_tmpa_tl } , % åå—线颜色点边框颜色的比例(必须在boxcoloråŽ) crosscolorratio .code:n = { \int_set:Nn \l__circledtext_cross_color_ratio_int { #1 } \__circledtext_color_select:nn { circledtextcrosscolor } { circledtextcharboxcolor ! #1 } }, crosscolorratio .initial:n = 30, % å—符颜色 charcolor .code:n = { \__circledtext_color_select:nn { circledtextcharcolor } {#1} \tl_if_eq:nnT { #1 } { black } { \__circledtext_color_select:nn { circledtextboxfill } { white } \cs_set_nopar:Npn \__circledtext_aux_color_boxfill: { \color_fill:n { white } } } } , charcolor .initial:n = black , charcolor* .code:n = { \__circledtext_color_select:nnn { circledtextcharcolor } #1 } , color .meta:n = { boxcolor = #1, crosscolor = #1, charcolor = #1 } , color* .meta:n = { boxcolor* = #1, crosscolor = #1, charcolor* = #1 } , % å—符盒å背景填充颜色 boxfill .code:n = { \exp_args:Nx \tl_if_empty:nTF {#1} { \__circledtext_color_select:nn { circledtextboxfill } { white } \cs_set_nopar:Npn \__circledtext_aux_color_boxfill: { \color_fill:n { white } } }{ \__circledtext_color_select:nn { circledtextboxfill } {#1} \cs_set_nopar:Npn \__circledtext_aux_color_boxfill: { \color_fill:n {#1} } } } , boxfill .initial:n = {} , boxfill* .code:n = { \__circledtext_color_select:nnn { circledtextboxfill } #1 \cs_set_nopar:Npn \__circledtext_aux_color_boxfill: { \color_fill:nn #1 } } , % æ— å色时底层盒å背景填充颜色 lowerbgcolor .code:n = { \exp_args:Nx \tl_if_empty:nTF {#1} { \__circledtext_color_select:nn { lowerbgboxfill } { yellow!70!red } \cs_set_nopar:Npn \__circledtext_aux_color_boxfill: { \color_fill:n { yellow!70!red } } }{ \__circledtext_color_select:nn { lowerbgboxfill } { #1 } \cs_set_nopar:Npn \__circledtext_aux_color_boxfill: { \color_fill:n { #1 } } } } , lowerbgcolor .initial:n = {} , % æ— å色时上层盒å背景填充颜色 upperbgcolor .code:n = { \exp_args:Nx \tl_if_empty:nTF {#1} { \__circledtext_color_select:nn { upperbgboxfill } { yellow!80!black } \cs_set_nopar:Npn \__circledtext_aux_color_boxfill: { \color_fill:n { yellow!80!black } } }{ \__circledtext_color_select:nn { upperbgboxfill } { #1 } \cs_set_nopar:Npn \__circledtext_aux_color_boxfill: { \color_fill:n { #1 } } } } , upperbgcolor .initial:n = {} , % ç›’å阴影填充颜色 shadowcolor .code:n = { \exp_args:Nx \tl_if_empty:nTF {#1} { \__circledtext_color_select:nn { shadowboxfill } { black!35!white } \cs_set_nopar:Npn \__circledtext_aux_color_boxfill: { \color_fill:n { black!35!white } } }{ \__circledtext_color_select:nn { shadowboxfill } { #1 } \cs_set_nopar:Npn \__circledtext_aux_color_boxfill: { \color_fill:n { #1 } } } } , shadowcolor .initial:n = {} , % ç¬”ç”»å‚æ•° charstroke .choice:, charstroke .value_required:n = true, charstroke .choices:nn = { none, solid, dashed, invisible } { \int_set_eq:NN \l__circledtext_charstroke_type_int \l_keys_choice_int }, charstroke .initial:n = none, % è™šçº¿æ ·å¼ dashpattern .tl_set:N = \l__circledtext_dash_pattern_tl , dashpattern .initial:n = { } , % å—符自身缩放比例 charshrink .fp_set:N = \l__circledtext_char_shrink_fp , charshrink .initial:n = 0.75, unknown .code:n = { \msg_error:nn { circledtext } { unknown-option } } } \msg_new:nnn { circledtext } { unknown-option } { package~ option~ "\l_keys_key_tl"~ is~ unknown. } % æ ¹æ®ç¼–译引擎设置基å—符 \sys_if_engine_xetex:TF { \keys_set:nn { circledtext } { basechar = 好, } }{ \sys_if_engine_luatex:TF { \keys_set:nn { circledtext } { basechar = 好, } }{ \keys_set:nn { circledtext } { basechar = x, } } } \keys_set:nn { circledtext } { charf = \normalsize, boxtype = o, resize = none, } % é€‰é¡¹è®¾ç½®ç”¨æˆ·æŽ¥å£ \NewDocumentCommand \circledtextset { m } { \keys_set:nn { circledtext } {#1} } % 构建å—符盒å,如å—符为空,则用基å—ç¬¦æž„é€ % #1 需è¦å¤„ç†çš„å—符(串) \cs_new:Npn \__circledtext_single_char_construct:N #1 { \tl_if_empty:NTF #1 { \hcoffin_set:Nn \l__circledtext_char_coffin { \__circledtext_single_handle:N \c__circledtext_basechar_tl } }{ \hcoffin_set:Nn \l__circledtext_char_coffin { \__circledtext_single_handle:N #1 } } } % 构建带圈文å—内部函数 % #1 选项内容 % #2 需è¦å¤„ç†çš„å—符(串) \cs_new:Npn \__circledtext_handle:nn #1#2 { \group_begin: % 选项设置 \keys_set:nn { circledtext } { #1 } % 设置å—符串 \tl_gset:Nx \l__circledtext_chars_tl {#2} % æž„é€ ç›’å \__circledtext_single_char_construct:N \l__circledtext_chars_tl % å¤åˆ¶ç›’å准备缩放与输出 \coffin_set_eq:NN \l__circledtext_box_coffin \l__circledtext_char_coffin % 测é‡ç›’å容器总高度(用内切圆则ä¸éœ€è¦) \dim_set:Nn \l_tmpa_dim { \__circledtext_coffin_ht_plus_dp:N \l__circledtext_box_coffin } % 缩放å—符盒å容器到å—ç¬¦å¤§å° \coffin_scale:Nnn \l__circledtext_box_coffin { \dim_ratio:nn { \charboxht } { \l_tmpa_dim } } { \dim_ratio:nn { \charboxht } { \l_tmpa_dim } } % æ ¹æ®æŒ‡å®šçš„æ–¹å¼ç¼©æ”¾ç›’å \__circledtext_resize_c:n { \l__circledtext_resize_method_tl } % 下沉è·ç¦»=å—符深度+外框线宽 \dim_add:Nn \l__circledtext_char_dp_dim { \l__circledtext_box_linewidth_dim } % 输出盒å(下沉深度è·ç¦») \coffin_typeset:Nnnnn \l__circledtext_box_coffin { l } { b } { 0pt } { -\l__circledtext_char_dp_dim } \group_end: } % å—符处ç†å¥æŸ„函数 % #1 需è¦å¤„ç†çš„å—符(串)å˜é‡ \cs_new:Npn \__circledtext_single_handle:N #1 { \group_begin: \tl_set:Nf \l__circledtext_curr_char_tl {#1} \__circledtext_single_construct:N \l__circledtext_curr_char_tl \group_end: } % æž„é€ å¸¦åœˆå—符 % #1 需è¦å¤„ç†çš„å—符(串)å˜é‡ \cs_new:Npn \__circledtext_single_construct:N #1 { % æŒ‰æŒ‡å®šçš„æ ¼å¼å’Œå†…å®¹æž„é€ ä¸€ä¸ªå—符盒å容器 \hcoffin_set:Nn \l__circledtext_box_coffin { \bool_if:NTF \l__circledtext_negative_bool { \color_select:n { circledtextboxfill } }{ \color_select:n { circledtextcharcolor } } \tl_use:N \l__circledtext_character_format_tl \__circledtext_chars_stroke_construct:n { #1 } } % æž„é€ å—符盒å容器边框 \__circledtext_single_box_construct: } % å—符盒ååŠè¾¹æ¡†ç»„åˆç›’åå®¹å™¨æž„é€ å‡½æ•° \cs_new:Npn \__circledtext_single_box_construct: { % æ ¹æ®æ–‡å—内容计算缩放比例 \dim_set:Nn \l_tmpa_dim { \coffin_wd:N \l__circledtext_box_coffin } \dim_set:Nn \l_tmpb_dim { \__circledtext_coffin_ht_plus_dp:N \l__circledtext_box_coffin } \dim_compare:nNnF \l_tmpa_dim > \l_tmpb_dim { \dim_set_eq:NN \l_tmpa_dim \l_tmpb_dim } % 缩放å—符盒å容器 \coffin_scale:Nnn \l__circledtext_box_coffin { \dim_ratio:nn { \charboxwd } { \l_tmpa_dim } } { \dim_ratio:nn { \charboxht } { \l_tmpa_dim } } % 按指定缩放系数对å—符盒å容器进行缩放 \coffin_scale:Nnn \l__circledtext_box_coffin { \l__circledtext_char_shrink_fp } { \l__circledtext_char_shrink_fp } % 绘制外框并拼装结果 \draw_begin: \draw_linewidth:n { \l__circledtext_box_linewidth_dim } \draw_path_scope_begin: \__circledtext_char_box_type_c:n { \l__circledtext_char_box_type_tl } { 0 } { 0 } { \charboxwd } { \charboxht } { 1.0 } { 1.0 } \draw_transform_shift:n {\charboxwd / 2.0, \charboxht / 2.0 } \draw_coffin_use:Nnn \l__circledtext_box_coffin { hc } { vc } \draw_path_scope_end: \draw_end: } \endinput