![Подраздел выдает ошибку LaTeX: здесь нет строки для завершения](https://rvso.com/image/405375/%D0%9F%D0%BE%D0%B4%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%20%D0%B2%D1%8B%D0%B4%D0%B0%D0%B5%D1%82%20%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D1%83%20LaTeX%3A%20%D0%B7%D0%B4%D0%B5%D1%81%D1%8C%20%D0%BD%D0%B5%D1%82%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%D0%B4%D0%BB%D1%8F%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F.png)
У меня есть 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...