为什么这个 \def 没有按预期工作?

为什么这个 \def 没有按预期工作?

我在使用 \def 时遇到了一个奇怪的问题。我是 (La)TeX 的新手,无法解决这个问题。

我有如下的简单代码。

\documentclass[10pt,a4paper]{article}

\usepackage{listings}

\begin{document}

\lstset{
language=C++,
tabsize=4
}

\def\docend{\end{document}}

\def\codeend{\end{lstlisting}}

\begin{lstlisting}

class AClass
{
    enum Types
    {
        t_one = 1
    };
    ~AClass()
    {
        cout << _T("destructor") << endl;
    }
} 

 \end{lstlisting}

%  \codeend

\docend

使用时\codeend会出现错误“...紧急停止...未找到合法的\end...”。但是,\docend工作正常。

我犯了什么错误?(仅供参考,在 Windows 7 上使用 TeXMaker 和 Miktex 2.9。)

答案1

listings会更改 catcodes 以获取逐字列表。这意味着,不会以\end{lstlisting}正常方式执行,因为反斜杠是普通字符并且\end是字符串,而不是宏。因此,如果它隐藏在中,则会在输入文件中listings明确查找\end{lstlisting}并且找不到它\codeend

至少,该listings软件包提供了使用 创建你自己的环境的\lstnewenvironment功能,请参阅包装文档

添加:

环境cpp(如评论)可定义如下:

\documentclass[10pt,a4paper]{article}

\usepackage{listings}

\lstnewenvironment{cpp}{%
  \lstset{%
    language=C++,
    tabsize=4,
  }%
}{}

\newcommand*{\docend}{\end{document}}

\begin{document}

\begin{cpp}
class AClass
{
    enum Types
    {
        t_one = 1
    };
    ~AClass()
    {
        cout << _T("destructor") << endl;
    }
}
\end{cpp}

\docend

相关内容