这些示例xtemplate
展示了如何制作文档命令,但我还没有看到任何涉及环境的内容。
如果我要使用 定义环境xtemplate
,最好的方法是什么?我立即想到的两种方法是:
- 定义一个对象
env
和两个模板start
和end
。 - 定义两个对象,
env-start
和env-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}