サブセクションでLaTeXエラーが発生します: 終了する行がありません

サブセクションでLaTeXエラーが発生します: 終了する行がありません

section私の LaTeX コードには、次のように記述されたおよびコマンドがあります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を実行し(その後に続く は TeX のモードを変更しない)、その直後に行末 (つまり) があるためです。この場合に何が起こるかは既にわかっています。この問題を回避するには、 の後にコメント文字を追加するだけで、TeX は行末文字を挿入しません。\par\vspace\\\subsection{bar}

これを回避するより便利な方法は、\removecrの定義の最後にこのコマンドを追加することです\subsection

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

次に、1 つの (1 つのみ!) 行末を検索し、見つかった場合はそれを削除します。

コンパイル可能な例を次に示します。

\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 のセクション機能の多くが機能しなくなります...

関連情報