Wie stellt man in einer Tabelle sicher, dass die vorherige Zeile beendet ist?

Wie stellt man in einer Tabelle sicher, dass die vorherige Zeile beendet ist?

Wenn man sich in einer tabularUmgebung befindet, wie kann man sicherstellen, dass die vorherige Zeile (mit \\) endete?

Möglicherweise möchten Sie \hlinenur am Anfang einer neuen Zeile ein Attribut hinzufügen oder andere Dinge tun.

Fügt man \\vorher etwas hinzu, entsteht unter Umständen eine unerwünschte zusätzliche Leerzeile.

Die Frage ist also, ob es im Vergleich zu \clearpagevs. einen entsprechenden Befehl für vs. \newpagegibt ?tabular \???\\

Antwort1

Das Folgende führt ein tabulares newine- lMakro ein \tnl, das überprüft, ob ihm \tnlusing folgt \@ifnextchar. Da \@ifnextchardas „peeked token“ im Eingabestrom verbleibt, \tnlwerden alle verketteten aufgerufenen ignoriert, mit Ausnahme des letzten:

Bildbeschreibung hier eingeben

\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}

Dadurch wird die optionale Argumentspezifikation entfernt, die mit einhergeht \\. Ich bin nicht sicher, ob das erforderlich ist.

Antwort2

Nur um den Vorschlag zu veranschaulichen, den ich inein Kommentar:

% 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}

Bearbeiten:Als David Carlislehat bemerktDer \ifvmodeTest funktioniert nicht, wennp wenn Spalten vom Typ - verwendet werden, da TeX auch in diesen Spalten im vertikalen Modus ist. Beachten Sie, dass TeX genauer gesagtinternvertikaler Modus sowohl innerhalbp von -Typ-Spalten als auch zwischen den Zeilen einer Ausrichtung (Das TeXbook, S. 282), so dass eine ergänzende\ifinner Test auch nicht weiterhelfen würde. Eine Unterscheidung, die funktioniertin einfachen Situationenbasiert auf der aktuellen Gruppenebene, die mit dem e-TeX-Primitiv abgefragt werden kann \currentgrouplevel.

Der folgende Code dient lediglich als Proof of Concept: Es macht wenig Sinn, ihn zu verfeinern, wenn Sie nicht den genauen Kontext kennen, in dem er verwendet werden soll.

% 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}

Sie können die Diagnosebefehle auskommentieren, um zusätzliche Informationen zu den Vorgängen zu erhalten.

Antwort3

\crcrMeistens können Sie hierfür das TeX-Grundelement verwenden . \crcrEs verhält sich wie \cr„es sei denn, der vorherige Befehl war“, \crin welchem ​​Fall nichts passiert.

Dies ist der Hauptgrund dafür, dass Latex ein „a“ \\am Ende der letzten Zeile ignorieren kann.

der einzige Haken besteht darin, dass wenn Sie die vorherige Zeile mit beenden, \crcres so ist, als ob sie mit \crund nicht mit beendet worden wäre, \\aber in den meisten Fällen läuft dies auf das Gleiche hinaus.

verwandte Informationen