Unterabschnitt wirft LaTeX-Fehler aus: Hier gibt es keine Zeile zum Beenden

Unterabschnitt wirft LaTeX-Fehler aus: Hier gibt es keine Zeile zum Beenden

Ich habe sectionund subsectionBefehle in meinem LaTeX-Code wie folgt beschrieben. Diese sind in der Stildatei enthalten 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}%
}

Beim Versuch, diese Befehle in der folgenden Einstellung zu verwenden, ist ein Fehler aufgetreten:

\documentclass{foo}

\begin{document}
\begin{aside}
\section{foo}
bar
~
\section{foo}
\subsection{bar}
\end{aside}
\end{document}

Im Einzelnen ist der Fehler, auf den ich stoße, folgender:

LaTeX Error: There's no line here to end.

l.55 \subsection{foo}

Was läuft hier schief?

Antwort1

Das Problem, das Sie sehen, liegt daran, dass Sie verwenden \obeycr. Die Wirkung von \obeycrist (ungefähr) dieselbe wie das Hinzufügen \\am Ende jeder Eingabezeile. In Ihrer asideUmgebung ist es also so, als hätten Sie Folgendes eingegeben:

\section{foo}\\
bar\\
~\\
\section{foo}\\
\subsection{bar}\\

Im Textkörper \\bedeutet der Befehl unter normalen Umständen einen Zeilenumbruch. Dieser Befehl führt jedoch eine Plausibilitätsprüfung durch und löst einen Fehler aus, wenn keine Zeile zum Beenden vorhanden ist, was genau der Fehler ist, den Sie sehen. Genauer gesagt, wenn Sie den Befehl \\im vertikalen Modus (nach einem \par) verwenden, wird der Fehler ausgelöst, weil Sie im vertikalen Modus keinen Zeilenumbruch machen können. Eine sehr schnelle Möglichkeit, diesen Fehler zu verursachen, ist:

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

weil sich TeX am Anfang des Dokuments im vertikalen Modus befindet und Sie dann verwenden \\. Um den Fehler zu beheben, geben Sie einfach etwas vor dem ein \\.

Sie sehen diesen Fehler bei Ihrer Definition, weil Ihr \subsectionBefehl dies tut, \parnachdem der Unterabschnittstitel geschrieben wurde (und das \vspace, was folgt, ändert den TeX-Modus nicht) und direkt danach ein Zeilenende (also ein \\) kommt, und wir wissen bereits, was in diesem Fall passiert. Um dieses Problem zu umgehen, können Sie einfach ein Kommentarzeichen nach einfügen \subsection{bar}, dann fügt TeX das Zeilenendezeichen nicht ein.

Eine praktischere Möglichkeit, dies zu umgehen, besteht darin, diesen \removecrBefehl am Ende der Definition von hinzuzufügen \subsection:

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

dann wird nach einem (nur einem!) Zeilenende gesucht und dieses entfernt, falls es gefunden wird.

Hier ist ein kompilierbares Beispiel:

\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}

Beachten Sie auch, dass Sie mehrere ungeschützte Zeilenenden hatten, die falsche Leerzeichen erzeugten (fügen Sie %am Ende der Zeile hinzu, um diese zu entfernen). Sie müssen die Definition von auch nicht speichern, \sectionda sie am Ende der Umgebung automatisch wiederhergestellt wird. Dasselbe gilt für die Wirkung von \obeycr.

Ich empfehle Sie sehrnichtverwenden \obeycr. Es wird Ihnen mehr Probleme bereiten als es löst. Außerdem unterbricht die Art und Weise, wie Sie Abschnitte neu definieren, viele Abschnittsfunktionen von LaTeX ...

verwandte Informationen