Подраздел выдает ошибку LaTeX: здесь нет строки для завершения

Подраздел выдает ошибку LaTeX: здесь нет строки для завершения

У меня есть sectionи subsectionкоманды в моем коде LaTeX, описанные следующим образом. Они включены в файл стиля, 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команда делает это \parпосле записи заголовка подраздела (и \vspaceследующее не меняет режим TeX), и сразу после этого идет конец строки (следовательно \\), и мы уже знаем, что происходит в этом случае. Чтобы обойти эту проблему, вы можете просто добавить символ комментария после \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. Это создаст вам больше проблем, чем решит. Кроме того, способ, которым вы переопределяете section, нарушает многие функции секционирования LaTeX...

Связанный контент