ConTeXt:无法在自定义启动-停止环境中使用 \starttyping

ConTeXt:无法在自定义启动-停止环境中使用 \starttyping

我想要一个带有参数的自定义启动-停止环境。\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}

相关内容