CTeX-org / ctex-kit

Macro Packages and Scripts for Chinese TeX users
966 stars 124 forks source link

`\textcircled{<num>}` 内部判断时,未展开它的参数 `<num>` #615

Closed muzimuzhi closed 1 year ago

muzimuzhi commented 2 years ago

描述和例子

加载 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}

image

分析

使用 \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 的参数。

qinglee commented 2 years ago

这是有意设计的,因为不知道用户会喂什么参数进来,冒然展开有一定风险,处理得比较保守。这行为也与 LaTeX 的 \@text@composite 类似,都是先将参数字符串化再来判断。