使用 xtemplate 创建环境

使用 xtemplate 创建环境

这些示例xtemplate展示了如何制作文档命令,但我还没有看到任何涉及环境的内容。

如果我要使用 定义环境xtemplate,最好的方法是什么?我立即想到的两种方法是:

  1. 定义一个对象env和两个模板startend
  2. 定义两个对象,env-startenv-end

这种工作方式xtemplate给我的印象是它只关注命令;是这样吗?

答案1

正如评论中提到的,您不能直接用 定义命令或环境xtemplate。您可能想使用 来xparse实现这一点。虽然我认为从逻辑上讲,您可以为结尾部分定义一个单独的模板或实例,但我很难想象这样做的用例。您什么时候需要为环境的开头和结尾设置不同的参数?

我在环境中使用模板实例的方式是让代码\DeclareTemplateCode在环境开始时处理初始化,然后创建一个单独的函数来处理关闭。然后您定义的环境xparse只需调用这两个函数即可,这符合expl3将用户界面与编码层分开的理念。

如下图所示:

\documentclass{article}
\usepackage{xparse,xtemplate}
\usepackage{lineno}
\usepackage{lipsum}

\ExplSyntaxOn

\DeclareObjectType{test}{0}

\DeclareTemplateInterface{test}{default}{0}
{
  linenum-modulus : code = 5
}

\DeclareTemplateCode{test}{default}{0}
{
  linenum-modulus = \modulolinenumbers[#1]
}
{
  \AssignTemplateKeys
  % just something for illustration
  \linenumbers
}

\cs_new_protected:Nn \smith_testme_stop:
{
  % Do cleanup here
}

\DeclareInstance{test}{first}{default}{}

\NewDocumentEnvironment{testme}{}
{
  \UseInstance{test}{first}
}
{
  \smith_testme_stop:  
}

\ExplSyntaxOff

\begin{document}

\begin{testme}
  \lipsum[1]
\end{testme}

\lipsum[2]

\end{document} 

相关内容