Если вы находитесь в tabular
среде, как вы можете убедиться, что предыдущая строка закончилась (на \\
)?
Возможно, кто-то захочет добавить \hline
или сделать что-то еще только в начале новой строки.
Если добавить что-то \\
раньше, это может добавить нежелательную, дополнительную пустую строку.
Итак, вопрос в том, существует ли аналогичная команда для vs. по сравнению с \clearpage
vs. ?\newpage
tabular
\???
\\
решение1
Ниже представлен макрос t
abular n
ew l
ine \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}
Это удаляет необязательную спецификацию аргумента, которая сопровождает \\
. Не уверен, нужно ли это.
решение2
Просто чтобы проиллюстрировать предложение, которое я сделал вкомментарий:
% 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}
Редактировать:Как Дэвид Карлайлзаметил, \ifvmode
тест не работает, если p
используются столбцы типа -, потому что TeX находится в вертикальном режиме и в этих столбцах. Обратите внимание, что, точнее, TeX находится ввнутреннийвертикальный режим как внутри p
столбцов типа А, так и между строками выравнивания (TeXbook, стр. 282), поэтому дополнительный \ifinner
тест тоже не поможет. Различие, которое работаетв простых ситуацияхоснован на текущем уровне группы, запрос о котором можно сделать с помощью примитива e-TeX \currentgrouplevel
.
Следующий код — всего лишь доказательство концепции: нет смысла его совершенствовать, если вы не знаете точного контекста, в котором он будет использоваться.
% 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}
Вы можете раскомментировать диагностические команды, чтобы получить дополнительную информацию о происходящем.
решение3
В большинстве случаев для достижения этой цели можно использовать примитив TeX \crcr
. \crcr
действует так же, как \cr
если бы предыдущая команда не была , \cr
в этом случае он ничего не делает.
Это основная причина того, что латекс может игнорировать a \\
в конце последнего ряда.
единственная загвоздка в том, что если вы заканчиваете предыдущую строку на , \crcr
то это выглядит так, как будто она закончилась на \cr
, а не на \\
, но в большинстве случаев это одно и то же.