Wenn man sich in einer tabular
Umgebung befindet, wie kann man sicherstellen, dass die vorherige Zeile (mit \\
) endete?
Möglicherweise möchten Sie \hline
nur 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 \clearpage
vs. einen entsprechenden Befehl für vs. \newpage
gibt ?tabular
\???
\\
Antwort1
Das Folgende führt ein t
abulares n
ewine- l
Makro ein \tnl
, das überprüft, ob ihm \tnl
using folgt \@ifnextchar
. Da \@ifnextchar
das „peeked token“ im Eingabestrom verbleibt, \tnl
werden alle verketteten aufgerufenen ignoriert, mit Ausnahme des letzten:
\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 \ifvmode
Test 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
\crcr
Meistens können Sie hierfür das TeX-Grundelement verwenden . \crcr
Es verhält sich wie \cr
„es sei denn, der vorherige Befehl war“, \cr
in 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, \crcr
es so ist, als ob sie mit \cr
und nicht mit beendet worden wäre, \\
aber in den meisten Fällen läuft dies auf das Gleiche hinaus.