LaTeX 如何实现环境?

LaTeX 如何实现环境?

你知道 LaTeX 如何实现环境吗?更准确地说,

\newenvironment{<env-name>}[<n-args>][<default>]{<begin-code>}{<end-code>}

就 TeX 命令而言(即,LaTeX 命令\newenvironment在 TeX 中是如何定义的)?

答案1

该命令\newenvironment{<env-name>}[<n-args>][<default>]{<begin-code>}{<end-code>}相当于:

\newcommand{\<env-name>}[<n-args>][<default>]{<begin-code>}
\newcommand{\end<env-name>}{<end-code>}

原因是\begin{<env-name>}...\end{<env-name>}转移到

<check whether the command \<env-name> exists
\begingroup
\csname <env-name>\endcsname % this is a way to call macro \<env-name> by its name
...
<check whether the inner-most environment is really <env-name>
\csname end<env-name>\endcsname % calls \end<env-name>
\endgroup

问题是您无法这样做,因此实际上使用\newcommand{\#1}...命令来解决这个问题。\csname...\endcsname\newenvironment

的确切定义\newenvironment非常复杂,因为 的存在*(表示在没有 的情况下定义的环境\long)、[<n-args>]和的存在[<default>]必须经过测试,这在 LaTeX 术语中意味着很多内部宏。要探索详细信息,您可以运行以下显示宏定义的简短源代码:

\documentclass{article}
\begin{document}
\parindent0pt
\parskip2ex
\makeatletter
\ttfamily
\meaning\newenvironment   % <-- put any macro name here
\par
\meaning\newcommand   % <-- put any macro name here
\makeatother
\end{document}

相关内容