expl3 上下文中的真正冒号

expl3 上下文中的真正冒号

我正在努力寻找在 expl3 上下文中使用冒号的好方法。该示例使用 tcolorbox 进行演示,但我在其他地方也遇到了这个问题,这些地方使用冒号来分隔参数。

\documentclass{article}
\usepackage{expl3}
\usepackage[many]{tcolorbox}

\begin{document}
\tcbset{
 minimum for equal height group in expl/.style 2 args=
   {minimum for equal height group=#1:#2}
 }

\ExplSyntaxOn
\dim_set:Nn\l_tmpa_dim{3cm}
\tl_set:Nx\l_tpma_tl{C\tl_to_str:n{:}\exp_not:N\l_tmpa_dim}


\tcbset{
  width=3cm,
  equal~height~group=C,
  %minimum~for~equal~height~group=C\c_colon_str\l_tmpa_dim,  %breaks
  %minimum~for~equal~height~group=C\tl_to_str:n{:}\l_tmpa_dim, %breaks
  %minimum~for~equal~height~group=C:\l_tmpa_dim,             %breaks
  %minimum~for~equal~height~group=C\char_generate:nn {`\:} {12}\l_tmpa_dim, %breaks
  %minimum~for~equal~height~group=\l_tpma_tl, %breaks  
  %minimum~for~equal~height~group~in~expl={C}{3cm} %works
        }

%\char_set_catcode_other:N{:}     
%\tcbset{minimum~for~equal~height~group=C:\l_tmpa_dim} %works        
%\char_set_catcode_letter:N{:}      no longer works :-((

\ExplSyntaxOff        

%\tcbset{minimum for equal height group=C:\csname l_tmpa_dim\endcsname} %works

\begin{tcolorbox}
My first box. All boxes will get 3.5cm times 3.5cm
if the content height is not too large.
\end{tcolorbox}%
\begin{tcolorbox}
My second box.
\end{tcolorbox}%

\end{document}

还有其他好主意来解决 expl3 中冒号有 catcode 字母的问题吗?

答案1

大体上,这里的问题是混合了“接口级别”:在代码级别,确实应该有明确定义的参数,并且至少应该在参数“内部”进行解析。因此,理想的做法是“不要expl3在文档级命令的参数中使用变量”。但是,这并不总是可行的。正如我们经常看到的那样,这里的问题是,您无法“动态”生成冒号,因为底层解析器需要一个文字冒号并且不进行扩展。可以使用x-type 扩展来解决这个问题

\documentclass{article}
\usepackage{expl3}
\usepackage[many]{tcolorbox}

\begin{document}
\tcbset{
 minimum for equal height group in expl/.style 2 args=
   {minimum for equal height group=#1:#2}
 }

\ExplSyntaxOn
\dim_set:Nn \l_tmpa_dim { 3cm }
\exp_args:Nx \tcbset
  {
    width = 3cm,
    equal~height~group = C,
    minimum~for~equal~height~group = C \tl_to_str:n { : } \exp_not:N \l_tmpa_dim
  }
\ExplSyntaxOff        

\begin{tcolorbox}
My first box. All boxes will get 3.5cm times 3.5cm
if the content height is not too large.
\end{tcolorbox}%
\begin{tcolorbox}
My second box.
\end{tcolorbox}%

\end{document}

V或者如果希望存储在变量中,则使用-type 扩展

\tl_set:Nx \l_tmpa_tl
  {
    width = 3cm,
    equal~height~group = C,
    minimum~for~equal~height~group = C \tl_to_str:n { : } \exp_not:N \l_tmpa_dim
  }
\exp_args:NV \tcbset \l_tmpa_tl

相关内容