Subseção lança erro LaTeX: não há linha aqui para terminar

Subseção lança erro LaTeX: não há linha aqui para terminar

Eu tenho sectioncomandos subsectionem 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 asideambiente é 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 \subsectioncomando ocorre \pardepois de escrever o título da subseção (e o \vspaceque 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 \removecrcomando 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 \sectionporque 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...

informação relacionada