Closed muzimuzhi closed 1 year ago
加载 xunicode-addon 后,\textcircled 的参数不是直接的数字,而是展开才得到数字的内容时(如 \textcircled{\arabic{footnote}} 相对于 \textcircled{1}),视数字对应的带圈数字 xunicode-extra.def 是否定义、当前字体是否提供,会得到错误的或不同的输出。这与 xunicode 的行为不一致。
xunicode-addon
\textcircled
\textcircled{\arabic{footnote}}
\textcircled{1}
xunicode-extra.def
xunicode
% !TeX TS-program = xelatex \documentclass{article} \usepackage{fontspec} \usepackage{xunicode-addon} \setmainfont{Source Han Serif SC} \def\test#1{% \def\xx{#1}% \textcircled{\xx}% \textcircled{#1}\quad } \begin{document} \test{1} \test{10} \test{55} \end{document}
使用 \def\xx{1} 后,\textcircled{\xx} 展开得到
\def\xx{1}
\textcircled{\xx}
\__xunadd_text_combine:NnnNNn \__xunadd_add_circle:nnNN {\textcircled}{TU}{⃝}{◯}{\xx }
接着 \__xunadd_text_combine:NnnNNn 展开得到
\__xunadd_text_combine:NnnNNn
\__xunadd_begin_hook:nn {\textcircled}{\xx } \cs_if_exist:cTF {\__xunadd_composite_cs:nnn {\textcircled}{TU}{\xx}} {...} {...} \__xunadd_end_hook:nn {\textcircled}{\xx }
因为 \__xunadd_composite_cs:Nnn 的定义中使用了 \tl_to_str:n {#3} ,所以 \cs_if_exist:cTF {\__xunadd_composite_cs:nnn {\textcircled}{TU}{\xx}} 中构建的命令是 \\TU\textcircled-\xx,而不是期望构建的 \TU\textcircled-1。这导致 \cs_if_exist:cTF 判断错误,影响后续程序行为。
\__xunadd_composite_cs:Nnn
\tl_to_str:n {#3}
\cs_if_exist:cTF {\__xunadd_composite_cs:nnn {\textcircled}{TU}{\xx}}
\\TU\textcircled-\xx
\TU\textcircled-1
\cs_if_exist:cTF
在某一步时,完全展开 \textcircled 的参数。
这是有意设计的,因为不知道用户会喂什么参数进来,冒然展开有一定风险,处理得比较保守。这行为也与 LaTeX 的 \@text@composite 类似,都是先将参数字符串化再来判断。
\@text@composite
描述和例子
加载
xunicode-addon
后,\textcircled
的参数不是直接的数字,而是展开才得到数字的内容时(如\textcircled{\arabic{footnote}}
相对于\textcircled{1}
),视数字对应的带圈数字xunicode-extra.def
是否定义、当前字体是否提供,会得到错误的或不同的输出。这与xunicode
的行为不一致。分析
使用
\def\xx{1}
后,\textcircled{\xx}
展开得到接着
\__xunadd_text_combine:NnnNNn
展开得到因为
\__xunadd_composite_cs:Nnn
的定义中使用了\tl_to_str:n {#3}
,所以\cs_if_exist:cTF {\__xunadd_composite_cs:nnn {\textcircled}{TU}{\xx}}
中构建的命令是\\TU\textcircled-\xx
,而不是期望构建的\TU\textcircled-1
。这导致\cs_if_exist:cTF
判断错误,影响后续程序行为。建议
在某一步时,完全展开
\textcircled
的参数。