我想要一个带有参数的自定义启动-停止环境。\definestartstop
似乎无法做到这一点,但我找到了一个在邮件列表中发帖并尝试使用该代码:
\long\def\startMyEnv[#1]#2\stopMyEnv{%
\starttext
#1\blank[1cm]
#2
\stoptext
}
\let\stopMyEnv\relax
\startMyEnv[1]
\starttyping
foo
\stoptyping
\stopMyEnv
编译时会出现以下错误:
tex error > tex error on line 14 in file /.../test.tex: ! Interruption
\doifelsenextoptionalcs ...t \m_syst_action_yes #1
\let \m_syst_action_nop #2...
\buff_verbatim_typing_stop ...gparameter \c!after
\useindentnextparameter \t...
\startMyEnv ...yEnv ->\starttext #1\blank [1cm] #2
\stoptext
l.14 \stopMyEnv
当我不在\starttyping
环境内使用时它可以工作。
我还尝试做了帖子中提到的额外环绕:
\def\startMyEnv{\dosingleempty\doStartMyEnv}
\long\def\doStartMyEnv[#1]#2\stopMyEnv{%
但错误仍然相同。我做错了什么?
答案1
\start...\stoptyping
更改类别代码。将其作为参数传递给另一个宏(此处\start...\stopMyEnv
)效果不佳。因此,您不想\start...\stopMyEnv
将内容作为参数。此外,您可能还想检查可选参数是否为空。
\def\startMyEnv{\dosingleempty\dostartMyEnv}
\def\dostartMyEnv[#1]{%
\starttext
\iffirstargument
#1\blank[1cm]
\fi
}
\let\stopMyEnv\stoptext
\startMyEnv[1]
\starttyping
foo
\stoptyping
\stopMyEnv
附录: 因为不可能将逐字内容作为参数传递给宏,所以该\start...\stoptext
对也是不是定义为
\def\starttext#1\stoptext{...}
而是作为两个不带参数的单个宏(参见file-job.mkvi
)
\unexpanded\def\starttext{\clf_starttext}
\unexpanded\def\stoptext{\clf_stoptext}