expl3 是否为此提供了更好的策略?

expl3 是否为此提供了更好的策略?

现在,我正在定义一个专门的浮动环境

\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来解决这个问题。

相关内容