![小節拋出 LaTeX 錯誤:這裡沒有行結束](https://rvso.com/image/405375/%E5%B0%8F%E7%AF%80%E6%8B%8B%E5%87%BA%20LaTeX%20%E9%8C%AF%E8%AA%A4%EF%BC%9A%E9%80%99%E8%A3%A1%E6%B2%92%E6%9C%89%E8%A1%8C%E7%B5%90%E6%9D%9F.png)
我的 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}\\
在正文中,通常情況下,該命令\\
意味著換行。但是,此命令會進行一些健全性檢查,並在沒有要結束的行時引發錯誤,這正是您看到的錯誤。更具體地說,當您\\
在垂直模式下使用該命令(在 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 的許多節功能...