ctex-kit
ctex-kit copied to clipboard
`\textcircled{<num>}` 内部判断时,未展开它的参数 `<num>`
描述和例子
加载 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} 展开得到
\__xunadd_text_combine:NnnNNn \__xunadd_add_circle:nnNN {\textcircled}{TU}{⃝}{◯}{\xx }
接着 \__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 判断错误,影响后续程序行为。
建议
在某一步时,完全展开 \textcircled 的参数。
这是有意设计的,因为不知道用户会喂什么参数进来,冒然展开有一定风险,处理得比较保守。这行为也与 LaTeX 的 \@text@composite 类似,都是先将参数字符串化再来判断。