我尝试在环境中本地更改 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}