我的 LaTeX 代码中有section
和subsection
命令,描述如下。这些都包含在样式文件中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 的许多分段功能……