小節拋出 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}\\

在正文中,通常情況下,該命令\\意味著換行。但是,此命令會進行一些健全性檢查,並在沒有要結束的行時引發錯誤,這正是您看到的錯誤。更具體地說,當您\\在垂直模式下使用該命令(在 a 之後\par)時,會出現錯誤,因為您無法在垂直模式下進行換行。犯這個錯誤的一個非常快速的方法是:

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

因為當文件開始時 TeX 處於垂直模式,然後你使用\\.要修復該錯誤,只需在 之前鍵入一些內容即可\\

你會在你的定義中看到這個錯誤,因為你的\subsection命令\par在寫完小節標題後執行(並且\vspace後面的命令不會改變 TeX 的模式),並且緊接著有一個行結束(因此 a \\),而我們已經知道在中發生了什麼這個案例。要解決這個問題,您可以簡單地在 後面添加一個註釋字符\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 的許多節功能...

相關內容