Si uno está en un tabular
entorno, ¿cómo puede asegurarse de que la línea anterior haya terminado (con \\
)?
Es posible que desee agregar \hline
o hacer otras cosas solo al comienzo de una nueva línea.
Si se agrega \\
antes, podría agregar una línea vacía adicional no deseada.
Entonces la pregunta es, en comparación con \clearpage
vs. \newpage
, ¿si existe un comando similar para tabular
\???
vs. \\
?
Respuesta1
A continuación se presenta una macro t
abular n
ew ine que verifica si sigue usando . Dado que deja el "token visto" en el flujo de entrada, todas las llamadas concatenadas se ignoran, excepto la última:l
\tnl
\tnl
\@ifnextchar
\@ifnextchar
\tnl
\documentclass{article}
\makeatletter
\newcommand{\tnl}{\@ifnextchar\tnl{}{\\}}
\makeatother
\begin{document}
\begin{tabular}{ l }
one \\ two
\end{tabular}\quad
\begin{tabular}{ l }
one \tnl two
\end{tabular}
\bigskip
\begin{tabular}[t]{ l }
one \\ \\ two
\end{tabular}\quad
\begin{tabular}[t]{ l }
one \tnl \tnl two
\end{tabular}
\bigskip
\begin{tabular}[t]{ l }
one \\ \\ \\ two
\end{tabular}\quad
\begin{tabular}[t]{ l }
one \tnl \tnl \tnl two
\end{tabular}
\end{document}
Esto elimina la especificación de argumento opcional que acompaña \\
. No estoy seguro de si eso es necesario.
Respuesta2
Sólo para ilustrar la sugerencia que hice enun comentario:
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.
\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.
\newcommand*{\ensureLineHasEnded}{\ifvmode \else \expandafter \\\fi}
\newcommand*{\NLhline}{\ensureLineHasEnded\hline}
\begin{document}
\noindent
\begin{tabular}{|l|}
\hline
A one-column \texttt{tabular}, just for demo purposes. \\
\NLhline
It uses both vertical and horizontal rules (arrggh\ldots!). \\
\NLhline
But some of the \verb|\\|~commands are missing\ldots
\NLhline
\ldots yet the horizontal rules are typeset normally. \\*[6pt]
\NLhline
The \verb|\ensureLineHasEnded| can take the same optional arguments\ldots
\ensureLineHasEnded*[6pt]\hline
\ldots as the \verb|\\|~command.
\NLhline
Moreover, it works as expected when used at the end of the \texttt{tabular}.
\ensureLineHasEnded[9pt]
\end{tabular}\par
\end{document}
Editar:Como David Carlisleha comentado, la \ifvmode
prueba no funciona si p
se utilizan columnas de tipo -, porque TeX también está en modo vertical en estas columnas. Tenga en cuenta que, más precisamente, TeX esinternomodo vertical tanto dentro p
de columnas de tipo como entre las líneas de una alineación (El libro de texto, pag. 282), por lo que una \ifinner
prueba complementaria tampoco ayudaría. Una distinción que sí funcionaen situaciones simplesse basa en el nivel de grupo actual, que se puede consultar mediante la primitiva e-TeX \currentgrouplevel
.
El siguiente código es sólo una prueba de concepto: no tiene mucho sentido perfeccionarlo a menos que conozca el contexto preciso en el que se utilizará.
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.
\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.
\makeatletter
\@ifdefinable\@tabular@group@level{\newcount\@tabular@group@level}
\newcommand*\ensureLineHasEnded{%
\ifnum \currentgrouplevel>\@tabular@group@level
% % Diagnostics:
% \count@ \currentgrouplevel
% \typeout{Inserting \protect\\ at line \number\inputlineno,
% since \number\count@\space > \number\@tabular@group@level}%
\expandafter \\%
\fi
}
\newcommand*\saltAwayLevel{%
\noalign{%
\global \@tabular@group@level
\numexpr \currentgrouplevel -\@ne \relax
% % Diagnostics:
% \typeout{\number\@tabular@group@level}
}%
}
\makeatother
\newcommand*{\NLhline}{\ensureLineHasEnded\hline}
\begin{document}
With \texttt{l}~columns:
\begin{center}
\begin{tabular}{|l|}
\saltAwayLevel
\hline
A one-column \texttt{tabular}, just for demo purposes. \\%
\NLhline
It uses both vertical and horizontal rules (arrggh\ldots!). \\
\NLhline
But some of the \verb|\\|~commands are missing\ldots
% \typeout{\number\currentgrouplevel}%
\NLhline
\ldots yet the horizontal rules are typeset normally. \\*[6pt]
\NLhline
The \verb|\ensureLineHasEnded| can take the same optional arguments\ldots
\ensureLineHasEnded*[6pt]\hline
\ldots as the \verb|\\|~command. \\
\NLhline
Moreover, it works as expected when used at the end of the \texttt{tabular}.
\ensureLineHasEnded[9pt]
\end{tabular}\par
\end{center}
\bigbreak
With \texttt{p}~columns:
\begin{center}
\begin{tabular}{|p{.9\linewidth}|}
\saltAwayLevel
\hline
A one-column \texttt{tabular}, just for demo purposes. \\%
\NLhline
It uses both vertical and horizontal rules (arrggh\ldots!). \\
\NLhline
But some of the \verb|\\|~commands are missing\ldots
% \typeout{\number\currentgrouplevel}%
\NLhline
\ldots yet the horizontal rules are typeset normally. \\*[6pt]
\NLhline
The \verb|\ensureLineHasEnded| can take the same optional arguments\ldots
\ensureLineHasEnded*[6pt]\hline
\ldots as the \verb|\\|~command. \\
\NLhline
Moreover, it works as expected when used at the end of the \texttt{tabular}.
\ensureLineHasEnded[9pt]
\end{tabular}\par
\end{center}
\end{document}
Puede descomentar los comandos de diagnóstico para obtener información adicional sobre lo que está sucediendo.
Respuesta3
Principalmente puedes usar la primitiva TeX \crcr
para lograr esto. \crcr
actúa como \cr
a menos que el comando anterior fuera \cr
en cuyo caso no hace nada.
Ésta es la razón fundamental por la que el látex puede ignorar a \\
al final de la última fila.
El único inconveniente es que si terminas la fila anterior con \crcr
entonces es como si terminara con \cr
en lugar de hacerlo, \\
pero en la mayoría de los casos esto viene a ser lo mismo.