![为什么这个 \def 没有按预期工作?](https://linux22.com/image/283274/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E4%B8%AA%20%5Cdef%20%E6%B2%A1%E6%9C%89%E6%8C%89%E9%A2%84%E6%9C%9F%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
我在使用 \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