Se alguém estiver em um tabular
ambiente, como pode ter certeza de que a linha anterior terminou (com \\
)?
Pode-se querer adicionar \hline
ou fazer alguma outra coisa apenas no início de uma nova linha.
Se alguém adicionar \\
antes, isso poderá adicionar uma linha vazia adicional indesejada.
Portanto , a questão é, em comparação com \clearpage
vs. \newpage
, se existe um comando semelhante para tabular
\???
vs.\\
Responder1
A seguir, é apresentada uma macro t
abular n
ew ine que verifica se ela é seguida pelo uso de . Como deixa o "token espreitado" no fluxo de entrada, os concatenados chamados são todos ignorados, exceto o último: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}
Isso remove a especificação de argumento opcional que acompanha o arquivo \\
. Não tenho certeza se isso é necessário.
Responder2
Apenas para ilustrar a sugestão que fiz emum comentário:
% 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 Carlislecomentou, o \ifvmode
teste não funciona se p
colunas do tipo - forem usadas, porque o TeX também está no modo vertical nessas colunas. Observe que, mais precisamente, TeX éinternomodo vertical tanto dentro p
de colunas do tipo quanto entre as linhas de um alinhamento (O TeXbook, pág. 282), portanto um \ifinner
exame complementar também não ajudaria. Uma distinção que funcionaem situações simplesé baseado no nível atual do grupo, que pode ser consultado por meio da primitiva e-TeX \currentgrouplevel
.
O código a seguir é apenas uma prova de conceito: não faz sentido refiná-lo, a menos que você saiba o contexto preciso no qual ele será usado.
% 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}
Você pode descomentar os comandos de diagnóstico para obter informações adicionais sobre o que está acontecendo.
Responder3
Principalmente você pode usar o primitivo TeX \crcr
para conseguir isso. \crcr
age como \cr
se o comando anterior fosse, \cr
nesse caso, não faz nada.
Esta é a razão pela qual o látex pode ignorar a \\
no final da linha final.
o único problema é que, se você terminar a linha anterior com \crcr
então, é como se tivesse terminado com, \cr
em vez de \\
, mas na maioria dos casos isso resulta na mesma coisa.