環境内にいる場合、前の行が ( で)tabular
終了していることをどのように確認できますか?\\
\hline
新しい行の先頭にのみを追加したり、他の操作を実行したりしたい場合があります。
前に何かを追加すると\\
、不要な空行が追加される可能性があります。
そこで疑問なのは、\clearpage
vs.と比較して、 vs.\newpage
にも同様のコマンドがあるかどうかです。tabular
\???
\\
答え1
以下は、 が後に続くかどうかをチェックする、abular ew ine マクロを導入します。はt
入力n
ストリーム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}
これにより、 に付随するオプションの引数指定が削除されます\\
。それが必要かどうかはわかりません。
答え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 について、p. 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
\\
これが、LaTeX が最終行の末尾のa を無視できる理由の核心です。
唯一の問題は、前の行を で終了した場合、ではなく\crcr
で終了したかのようになることですが、ほとんどの場合、これは同じ結果になります。\cr
\\