这个问题涉及到 TeX 的内部处理,最好读过 TeX by topic 的第 1、2 章
首先说说 TeX 是怎样处理一个输入行的。
TeX 从文件中读入一行,去掉行终止符(catcode=5),去掉行尾空格,插入 \endlinechar,一般为 return 字符(ASCII 13)。
然后逐个读取字符,当遇到控制词(转义符+一串catcode=11的字符)或控制空格(转义符+空格字符ASCII 32)时进入状态 S,此状态后续的空格符(catcode=10)被忽略,如果在这个状态遇到行终止符,则连同这个行终止符及本行未读入的字符都被忽略了。
问题出现在 \newenvironment 这一行。
当读到控制序列 \let 后,进入状态 S,随即遇到行终止符 ^^M(ASCII 13),它连同这行未处理的字符都被忽略了。所以正常情况下,一直到文件的结束 TeX 都没有遇到与 { 匹配的那个 }。
但为什么你的没有报错呢?是因为你之前把 ^^M 的 catcode 设置为 10 了,这是空格的 catcode,而不是行结束符(catcode=5)的。如果你把之前的 ^^M 的 catcode 设为 5,就会得到 low-level 的错误。
为了正确定义这个环境,需首先修改 ^^M 的 catcode,然后定义完再恢复:
\catcode`\^^M=13 % 这里最好使用注释符
\newenvironment{makeEnterMacro}{\catcode`\^^M\active \let^^M\LaTeX\relax}{\catcode`\^^M=5 }% 同上
\catcode`\^^M=5 % 同上MWE:
\documentclass[UTF8]{ctexart}\pagestyle{empty}
\begin{document}
\catcode`\^^M=13 %
\newenvironment{makeEnterMacro}{\catcode`\^^M\active \let^^M\LaTeX\relax}{\catcode`\^^M=5 }%
\catcode`\^^M=5 %
\begin{makeEnterMacro}
此环境
怎么就出错了呢
\end{makeEnterMacro}
\end{document}得到了想要的结果:
另外,如果你更新到了最新的 LaTeX 发行版(2022-06-01),则可以直接修改 \obeyedline,然后使用 \obeylines:
\makeatletter
\newenvironment{mychoices}
{\def\obeyedline{\@ifnextchar\end{\par}{\item}}\obeylines
\begin{itemize}}
{\end{itemize}}
\makeatother
\begin{mychoices}
选
项
\end{mychoices}







问 环境中修改回车符的行为