我正在努力寻找在 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