使用编程代码的 Latex 中未定义的控制序列

使用编程代码的 Latex 中未定义的控制序列

问题:

收到错误消息Undefined control sequence. (\end{document}..).当我包含以下打印出格式化编程代码的代码时,会发生这种情况。如果我删除此代码,问题就会消失。

最小工作示例(MWE):

\documentclass{studentlitteratur} 
\usepackage{lipsum} 
\usepackage{listings} 
\mdfdefinestyle{mdlistingstyle}{} 
\mdtheorem[style=mdlistingstyle]{sourcecode}[chapter]{Kodexempel} 
\begin{document} 
\part{Title} 
\begin{sourcecode} 
\end{sourcecode} 
\lipsum[1-3] 
\begin{sourcecode} 
\end{sourcecode} 
\end{document}

.cls 内容可在此处获取: http://pastebin.com/w1HVnM9L

.sty 内容可在此处获取: http://pastebin.com/YGTedA7q

错误信息:

./studentlitteratur.tex:13: Undefined control sequence.
<argument> \protect \bbl@restore@actives delz
                                         i\protect \hspace  {0.5em} title
l.13 \end{document}

期望的结果:

删除错误信息并获取正确的代码。

答案1

MWE(感谢@TorbjørnT.)重现了您的错误:

\documentclass{memoir}
\usepackage{lipsum}
\usepackage[swedish]{babel}
\usepackage{listings}
  \makeatletter
  \makepsmarks{headings}{%
  \def\partmark##1{\markboth{%
      \partname~\thepart\hspace{0.5em} ##1}{}}%
  }
  \makeevenhead{headings}{\MakeLowercase{\leftmark}}{}{}
  \pagestyle{headings}
  \makeatother
\begin{document}
\part{Title}
\lipsum
\end{document}

你也是可以通过篡改从您的自定义文档类中勒索此内容。事实上,缩进的行几乎是逐字逐句地从中获取的。

有多种方法可以使该示例编译:

  • 省略babel
  • 省略listings
  • 省略~
  • 省略\MakeLowercase

使用具有完全相同行为的较短示例,可以在不同的、更简单的上下文中产生完全相同的错误:

\documentclass{standalone}
\usepackage[english]{babel} % the language is irrelevant
\usepackage{listings}
\begin{document}
\MakeLowercase{A~Z}
\end{document}

一个简单的解决方案是~用其同义词替换\nobreakspace,例如:

\makepsmarks{headings}{%
\def\partmark##1{\markboth{%
    \partname\nobreakspace \thepart\hspace{0.5em} ##1}{}}%
}

这会大概修复你的文档类别。

更优雅的解决方案需要确切地了解listings和如何babel交互,即研究它们的源代码。我不会这么做。我浏览了代码,listings似乎有一些与角色行为相关的注释~,如果你想深入研究它的话。

相关内容