现在,我正在定义一个专门的浮动环境
\NewDocumentEnvironment{sidebar}{ O{\fps@sidebar} }
{\edef\reserved@a{\noexpand\@xfloat{sidebar}[#1]}\reserved@a
% OTHER STUFF
}
{\end@float}
我在想,这正是所有花哨的 expl3 语法旨在简化的事情,不是吗?如果是这样,有没有“更好的”
已更新以添加 \@xfloat
是 LaTeX 内核命令(对于那些没有记住内核的人来说)。上面的代码实际上类似于如何\@float
定义处理没有可选参数的默认情况。
答案1
这看起来像一个简单的x
案例
\use:x { \exp_not:N \@xfloat { sidebar } [ #1 ] }
理想情况下,你应该\@xfloat
保护它,这更像是etoolbox
\robustify\@xfloat
以避免这种\exp_not:N
情况发生。
答案2
您可以制作自己的版本\@xfloat
注意它需要括号中的第二个参数。
\cs_new_protected:Nn \donhosek_xfloat:nn { \@xfloat{#1}[#2] }
\cs_generate_variant:Nn \donhosek_xfloat:nn { nV }
你\fps@sidebar
实际上应该是一个标记列表变量
\tl_new:Nn \donhosek_sidebar_default_tl
所以你现在可以做
\NewDocumentEnvironment{sidebar}{o}
{
\IfNoValueTF { #1 }
{% no optional argument supplied, use the default
\donhosek_xfloat:nV { sidebar } \donhosek_sidebar_default_tl
}
{% optional argument supplied
\donhosek_xfloat:nn { sidebar } { #1 }
}
}
{ \end@float }
如果你需要使用\fps@sidebar
,那么你可以将其同化为一个标记列表变量,代码将是
\cs_new_protected:Nn \donhosek_xfloat:nn { \@xfloat{#1}[#2] }
\cs_generate_variant:Nn \donhosek_xfloat:nn { nV }
\NewDocumentEnvironment{sidebar}{o}
{
\IfNoValueTF { #1 }
{% no optional argument supplied, use the default
\donhosek_xfloat:nV { sidebar } \fps@sidebar
}
{% optional argument supplied
\donhosek_xfloat:nn { sidebar } { #1 }
}
}
{ \end@float }
如果内核改变了可选参数的管理方式,您可以修改的定义\donhosek_xfloat:nn
来解决这个问题。