![Subseção lança erro LaTeX: não há linha aqui para terminar](https://rvso.com/image/405375/Subse%C3%A7%C3%A3o%20lan%C3%A7a%20erro%20LaTeX%3A%20n%C3%A3o%20h%C3%A1%20linha%20aqui%20para%20terminar.png)
Eu tenho section
comandos subsection
em meu código LaTeX descritos a seguir. Eles estão incluídos no arquivo de estilo 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}%
}
Quando tento usar esses comandos na seguinte configuração, encontrei um erro:
\documentclass{foo}
\begin{document}
\begin{aside}
\section{foo}
bar
~
\section{foo}
\subsection{bar}
\end{aside}
\end{document}
Especificamente, o erro que estou encontrando é:
LaTeX Error: There's no line here to end.
l.55 \subsection{foo}
O que está errado aqui?
Responder1
O problema que você vê é porque você usa \obeycr
. O efeito de \obeycr
é (aproximadamente) o mesmo que adicionar \\
no final de cada linha de entrada, então dentro do seu aside
ambiente é como se você tivesse digitado:
\section{foo}\\
bar\\
~\\
\section{foo}\\
\subsection{bar}\\
No corpo do texto, em circunstâncias normais, o comando \\
significa uma quebra de linha. No entanto, este comando faz algumas verificações de integridade e gera um erro quando não há linha para terminar, que é exatamente o erro que você vê. Mais especificamente, quando você usa o comando \\
no modo vertical (após um \par
), o erro é gerado porque você não pode quebrar a linha no modo vertical. Uma maneira muito rápida de cometer esse erro é:
\documentclass{article}
\begin{document}
\\
\end{document}
porque quando o documento começa o TeX está no modo vertical, e então você usa \\
. Para corrigir o erro, basta digitar algo antes do arquivo \\
.
Você vê esse erro com sua definição porque seu \subsection
comando ocorre \par
depois de escrever o título da subseção (e o \vspace
que se segue não altera o modo do TeX), e logo depois disso há um fim de linha (portanto, um \\
), e já sabemos o que acontece em este caso. Para contornar esse problema, você pode simplesmente adicionar um caractere de comentário depois de \subsection{bar}
, então o TeX não inserirá o caractere de final de linha.
Uma maneira mais prática de contornar isso é adicionar este \removecr
comando no final da definição de \subsection
:
{\makeatletter\obeycr%
\gdef\removecr{\@ifnextchar^^M{\@gobblecr}{}}%
\def\@gobblecr^^M{}}
então ele irá procurar por um (apenas um!) final de linha e removê-lo, se encontrado.
Aqui está um exemplo compilável:
\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}
Observe também que você tinha vários finais de linha desprotegidos que geravam espaços falsos (adicione %
no final da linha para se livrar deles). Você também não precisa salvar a definição de \section
porque ela é restaurada automaticamente ao final do ambiente. O mesmo vale para o efeito de \obeycr
.
Eu recomendo vocênãousar \obeycr
. Isso lhe causará mais problemas do que resolverá. Além disso, a maneira como você está redefinindo a seção quebra muitas funcionalidades de seccionamento do LaTeX...