子节抛出 LaTeX 错误:此处没有结束行

子节抛出 LaTeX 错误:此处没有结束行

我的 LaTeX 代码中有sectionsubsection命令,描述如下。这些都包含在样式文件中foo.cls

\newenvironment{aside}{%
  \let\oldsection\section
  \renewcommand{\section}[1]{
    \par\vspace{\baselineskip}{\Large\headingfont\color{headercolor} ##1}
  }
  \begin{textblock}{3.6}(1.5, 4.33)
  \begin{flushright}
  \obeycr
}{%
  \restorecr
  \end{flushright}
  \end{textblock}
  \let\section\oldsection
}

\renewcommand{\section}[1]{
  \par\vspace{\parskip}
  {%
    \LARGE\headingfont\color{headercolor}%
    \@sectioncolor #1%
  }
  \par\vspace{\parskip}
}

\renewcommand{\subsection}[1]{
  \par\vspace{.5\parskip}%
  {\Large\headingfont\color{headercolor} #1}
  \par\vspace{.25\parskip}%
}

当我尝试在以下设置中使用这些命令时,遇到了错误:

\documentclass{foo}

\begin{document}
\begin{aside}
\section{foo}
bar
~
\section{foo}
\subsection{bar}
\end{aside}
\end{document}

具体来说我遇到的错误是:

LaTeX Error: There's no line here to end.

l.55 \subsection{foo}

这里出了什么问题?

答案1

您看到的问题是因为您使用了\obeycr。 的效果(大致)与在每行输入的末尾\obeycr添加 相同,因此在您的环境中,就像您输入了以下内容一样:\\aside

\section{foo}\\
bar\\
~\\
\section{foo}\\
\subsection{bar}\\

在文本主体中,通常情况下,该命令\\表示换行。但是,此命令会进行一些健全性检查,并在没有行要结束时引发错误,这正是您看到的错误。更具体地说,当您\\在垂直模式下(在 之后\par)使用该命令时,会引发错误,因为您无法在垂直模式下进行换行。一种非常快速的产生该错误的方法是:

\documentclass{article}
\begin{document}
\\
\end{document}

因为当文档开始时 TeX 处于垂直模式,然后您使用\\。要修复错误,只需在 之前键入一些内容即可\\

您在定义中看到该错误是因为您的\subsection命令\par在写入小节标题后执行了该操作(并且\vspace后面的 不会更改 TeX 的模式),而紧接着有一个行结束符(因此是\\),我们已经知道在这种情况下会发生什么。要解决此问题,您只需在 后添加注释字符\subsection{bar},然后 TeX 将不会插入行结束符。

解决这个问题的更方便的方法是\removecr在定义的末尾添加此命令\subsection

{\makeatletter\obeycr%
 \gdef\removecr{\@ifnextchar^^M{\@gobblecr}{}}%
 \def\@gobblecr^^M{}}

然后它将寻找一个(仅一个!)行结尾,如果找到则将其删除。

这是一个可编译的示例:

\documentclass{article}
{\makeatletter\obeycr%
 \gdef\removecr{\@ifnextchar^^M{\@gobblecr}{}}%
 \def\@gobblecr^^M{}}
\newenvironment{aside}{%
  \renewcommand{\section}[1]{%
    \par \vspace{\baselineskip}{\LARGE ##1}}%
  \renewcommand{\subsection}[1]{%
    \par \vspace{.5\parskip}%
      {\Large #1}%
    \par \vspace{.25\parskip}\removecr}
  \begin{flushright}%
    \obeycr
}{\end{flushright}}
\begin{document}
\begin{aside}
\section{foo}
bar
~
\section{foo}
\subsection{bar}
\end{aside}
\end{document}

还要注意,您有几个未受保护的行尾会产生虚假空格(%在行尾添加即可消除这些空格)。您也不需要保存的定义,\section因为它会在环境结束时自动恢复。 的效果也是如此\obeycr

我强烈推荐你使用\obeycr。它给你带来的问题比它解决的问题还多。此外,你重新定义部分的方式破坏了 LaTeX 的许多分段功能……

相关内容