如何在环境中更改 catcode

如何在环境中更改 catcode

我尝试在环境中本地更改 catcode

\newenvironment{wse}
{
  \catcode`^=\active%
  \def^{\mathchar\numexpr"7000+`\^\relax}%
  $
}
{
  $
}

但接下来的代码

\begin{wse}
  x^2
\end{wse}

打破

! Missing control sequence inserted.

怎么了?

答案1

当您这样做时\newenvironment,的类别代码^为 7,并且不会改变\catcode`^=\active

\begingroup
\catcode`^=\active
\gdef\changehat{\def^{\mathchar\numexpr"7000+`\^\relax}}
\endgroup

\newenvironment{wse}
 {%
  \catcode`^=\active
  \changehat
  $%
 }
 {%
  $%
 }

完整示例

\documentclass{article}

\begingroup
\catcode`^=\active
\gdef\changehat{\def^{\mathchar\numexpr"7000+`\^\relax}}
\endgroup

\newenvironment{wse}
 {%
  \catcode`^=\active
  \changehat
  $%
 }
 {%
  $%
 }

\begin{document}

X$a^b$X\begin{wse}a^b\end{wse}X

\end{document}

在此处输入图片描述

一种采用\lowercase假设技巧的替代方案~是主动的。

\documentclass{article}

\newenvironment{wse}
 {%
  \catcode`^=\active
  \begingroup\lccode`~=`\^ \lowercase{\endgroup
    \def~{\mathchar\numexpr"7000+`\^\relax}}%
  $%
 }
 {%
  $%
 }

\begin{document}

X$a^b$X\begin{wse}a^b\end{wse}X

\end{document}

相关内容