为命令和环境编写名称

为命令和环境编写名称

我有一些作为命令和环境实现的功能。

\NewDocumentCommand{\dkmKtlog}{ O{0.3cm} m m }
  {
    DO THIS
  }

\NewDocumentEnvironment{dkmKtlog}{ O{0.3cm} m }
  { DO THAT }
    { CLOSE THAT }

已经决定命名它们的最佳方法是让命令以通常的 开头,\而环境版本只使用不带 的名称\。这是一种明智的做法吗?或者是否有一些标准方法可以解决所有这些问题?

答案1

latex 环境foo通过两个命令\foo和来实现\endfoo

如果您尝试建议的代码,那么您将收到环境已定义的错误

\documentclass{article}
\NewDocumentCommand{\dkmKtlog}{ O{0.3cm} m m }
  {
    DO THIS
  }

\NewDocumentEnvironment{dkmKtlog}{ O{0.3cm} m }
  { DO THAT }
    { CLOSE THAT }
\begin{document}

\end{document}

生产

! LaTeX cmd Error: Environment 'dkmKtlog' already defined.

For immediate help type H <return>.
 ...                                              
                                                  
l.9     { CLOSE THAT }
                      
? 

原则上可以\dkmKtlog检测到它处于环境的开始代码中,从而改变其行为,例如 beamer 可以拥有它\begin{frame}\frame{....}但它会导致非标准接口,因此并不真正推荐。

答案2

可能您不需要额外定义环境:

使用许多宏,您可以同时执行\macro{<argument>}\begin{macro}{<argument>}...\end{macro},这\begin{macro}{<argument>}只是\macro{<argument>}在组/本地范围内调用的一种更微妙的方式。

以防万一,您\end{macro}\relax需要定义\endmacro“手动”。

例如,\begingroup\bfseries...\endgroup您可以这样做\begin{bfseries}...\end{bfseries}

然而,当环境启动一种机制时,情况就不同了,该机制本身不仅处理环境的参数,而且还处理本地范围内环境主体的标记,例如,通过处理-type -argumentverbatim定义的环境。\NewDocumentEnvironmentb

相关内容