Как в таблице убедиться, что предыдущая строка закончилась?

Как в таблице убедиться, что предыдущая строка закончилась?

Если вы находитесь в tabularсреде, как вы можете убедиться, что предыдущая строка закончилась (на \\)?

Возможно, кто-то захочет добавить \hlineили сделать что-то еще только в начале новой строки.

Если добавить что-то \\раньше, это может добавить нежелательную, дополнительную пустую строку.

Итак, вопрос в том, существует ли аналогичная команда для vs. по сравнению с \clearpagevs. ?\newpagetabular \???\\

решение1

Ниже представлен макрос tabular new line \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, а не на \\, но в большинстве случаев это одно и то же.

Связанный контент