![La subsección arroja un error de LaTeX: no hay ninguna línea aquí para finalizar](https://rvso.com/image/405375/La%20subsecci%C3%B3n%20arroja%20un%20error%20de%20LaTeX%3A%20no%20hay%20ninguna%20l%C3%ADnea%20aqu%C3%AD%20para%20finalizar.png)
Tengo comandos section
y subsection
en mi código LaTeX que se describen a continuación. Estos están incluidos en el archivo 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}%
}
Cuando intento usar estos comandos en la siguiente configuración, encontré un error:
\documentclass{foo}
\begin{document}
\begin{aside}
\section{foo}
bar
~
\section{foo}
\subsection{bar}
\end{aside}
\end{document}
Específicamente el error que estoy encontrando es:
LaTeX Error: There's no line here to end.
l.55 \subsection{foo}
¿Qué está pasando aquí?
Respuesta1
El problema que ves es porque usas \obeycr
. El efecto de \obeycr
es (más o menos) el mismo que agregar \\
al final de cada línea de entrada, por lo que dentro de su aside
entorno es como si hubiera escrito:
\section{foo}\\
bar\\
~\\
\section{foo}\\
\subsection{bar}\\
En el cuerpo del texto, en circunstancias habituales, el comando \\
implica un salto de línea. Sin embargo, este comando realiza algunas comprobaciones de cordura y genera un error cuando no hay una línea para finalizar, que es precisamente el error que ve. Más específicamente, cuando usa el comando \\
en modo vertical (después de \par
), se genera el error porque no puede hacer un salto de línea en modo vertical. Una forma muy rápida de cometer ese error es:
\documentclass{article}
\begin{document}
\\
\end{document}
porque cuando comienza el documento TeX está en modo vertical, y luego usas \\
. Para corregir el error, simplemente escriba algo antes del archivo \\
.
Ves ese error con tu definición porque tu \subsection
comando lo hace \par
después de escribir el título de la subsección (y lo \vspace
que sigue no cambia el modo de TeX), y justo después hay un final de línea (por lo tanto, a \\
), y ya sabemos lo que sucede en este caso. Para solucionar este problema, simplemente puede agregar un carácter de comentario después \subsection{bar}
, luego TeX no insertará el carácter de final de línea.
Una forma más práctica de solucionar este problema es agregar este \removecr
comando al final de la definición de \subsection
:
{\makeatletter\obeycr%
\gdef\removecr{\@ifnextchar^^M{\@gobblecr}{}}%
\def\@gobblecr^^M{}}
luego buscará un final de línea (¡sólo uno!) y lo eliminará, si lo encuentra.
Aquí hay un ejemplo compilable:
\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}
Tenga en cuenta también que tenía varios extremos de línea desprotegidos que generaban espacios falsos (agregue %
al final de la línea para deshacerse de ellos). Tampoco es necesario guardar la definición de \section
porque se restaura automáticamente al final del entorno. Lo mismo ocurre con el efecto de \obeycr
.
te recomiendo muchonousar \obeycr
. Te causará más problemas de los que resolverá. Además, la forma en que está redefiniendo la sección rompe muchas de las funcionalidades de sección de LaTeX...