![サブセクションでLaTeXエラーが発生します: 終了する行がありません](https://rvso.com/image/405375/%E3%82%B5%E3%83%96%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7LaTeX%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%99%3A%20%E7%B5%82%E4%BA%86%E3%81%99%E3%82%8B%E8%A1%8C%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93.png)
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 のセクション機能の多くが機能しなくなります...