expl3语法与tikz冲突的解决

最近计划使用source3的原生命令编写一个答题卡宏包,目标是实现高考答题卡的仿真,用于中学生日常测试的规范答题中。但是,在绘制圆角矩形时,由于借助了tikz宏包,这导致了系统报错,报错的代码是

报错的代码
1
2
3
4
5
6
7
8
9
\begin{tikzpicture}
\int_while_do:nNnn {\gkcolumn_columnx_int} {<} {\gkcolumn_column_int}
{
\draw [color=red, rounded corners] (\gkcolumn_start_dim,0) rectangle (\gkcolumn_end_dim,\gksheet_ht_dim);
\dim_add:Nn \gkcolumn_start_dim {\gkcolumn_wd_dim+\gkcolumnspace_wd_dim}
\dim_set:Nn \gkcolumn_end_dim{\gkcolumn_start_dim+\gkcolumn_wd_dim}
\int_add:Nn \gkcolumn_columnx_int {1}
}
\end{tikzpicture}

当我去掉圆角括号rounded corners后发现可以正常工作,但是追加上这人括号后系统再次报错。经过研究发现,主要是rounded corners中包含了一个空格,这会导致问题的产生,因为在expl3语法中,空格会被忽略,而在tikz中空格被解释为参数分隔符,这导致了tikz实际获得的是roundedcorners, 于是错误出现了。而~是不可忽略的空格,于是切换成rounded~corners后问题立刻解决。这是expl3tikz集成时的一个隐蔽陷阱,所以本文的方案为解决这一问题提供了最佳实践。

正确的代码
1
2
3
4
5
6
7
8
9
\begin{tikzpicture}
\int_while_do:nNnn {\gkcolumn_columnx_int} {<} {\gkcolumn_column_int}
{
\draw [color=red, rounded~corners] (\gkcolumn_start_dim,0) rectangle (\gkcolumn_end_dim,\gksheet_ht_dim);
\dim_add:Nn \gkcolumn_start_dim {\gkcolumn_wd_dim+\gkcolumnspace_wd_dim}
\dim_set:Nn \gkcolumn_end_dim{\gkcolumn_start_dim+\gkcolumn_wd_dim}
\int_add:Nn \gkcolumn_columnx_int {1}
}
\end{tikzpicture}