
私は、\newenvironment 内で tabular* を使用して次の表を作成しました。問題なく動作しましたが、テキストを 1 つの列に折り返すことを好みます。表では、私が望むことを実現するために「ファントム」セルを使用しています。つまり、1 つの列が、他のすべての 3 つの (表示されている) 列が残すすべての利用可能な幅を占めることになります。つまり、3 つの列は、そこに書き込まれたテキストに応じて最小幅を占め、もう 1 つの列は残りの幅を占めます。合計幅は \linewidth なので、tabular ではなく tabular* を使用しました。MWE:
\documentclass{article}
\begin{document}
\begin{tabular*}{\linewidth {|c|l@{\extracolsep{\fill}}cc@{\extracolsep{0pt}}|r|r|}
minwidth& remaining width &&& minw & minw\\
x & x &&& x & x
\end{tabular*}
\end{document}
今、私が欲しいのは、2 番目の表示列 (「大きい」列) でのテキストの折り返しです。動的に調整される列のため、parbox も p のような列も使用できません。2 番目の列の列幅を読み取って、この幅の parbox を含め、行にテキストを折り返す方法がわかりません。
tabular* が現在のセルの幅を格納する長さを読み取ることは可能ですか? または、長さを指定せずに段落ボックスを含める方法はありますか?
[1] のため、tabu は使用できません。また、tabularx も動作するかもしれませんが、新しい環境に含める場合は enddef の再定義が必要です。Tabularx では別の問題が発生しましたが、今は覚えていません。必要なことが tabular* では不可能であれば、tabularx でもう一度試してみます。
[2]を読みました。lrboxの列定義で「<」と「>」を使用しても問題は解決しません。ボックスのサイズは結果の列のサイズではなく、その内容のサイズに制限されるからです。
また、zref-savepos を使用して 2 つの列の x 位置を保存し、後でその差を取得して \tabcolsep と \arrayrulewidth を減算してみました。
\documentclass{article}
\usepackage{zref-savepos}
\newlength{\auxleng}
\newsavebox{\auxbox}
\newenvironment{auxenviron}
{\begin{lrbox}{\auxbox}}{\end{lrbox}\usebox{\auxbox}\global\setlength{\auxleng}{\wd\auxbox}}
\begin{document}
\begin{tabular*}{\linewidth}{|c|l@{\extracolsep{\fill}}cc@{\extracolsep{0pt}}|r|r|}
minw & \zsaveposx{XX}remaining width &&& \zsaveposx{XXX} minw & minw\\
x & \setlength{\auxleng}{\zposx{XXX} sp}\addtolength{\auxleng}{-\zposx{XX} sp}\parbox{\auxleng}{asdf}&&& x & x
\end{tabular*}
\end{document}
...しかし、ドキュメントがコンパイルされるたびに、tabular* が 2 番目の列の位置を再計算するため、2 番目の参照は右に移動します。
答え1
パッケージがtabularx
役立ちます。 を使用しているため、と} は\newenvironment
使用できません。 は非表示になっているためです。 ただし、と は機能します。\begin{tabularx}
\end{tabularx
\end{tabularx}
\tabularx
\endtabularx
\documentclass{article}
\usepackage{tabularx}
\newenvironment{mytab}{%
\tabularx
}{%
\endtabularx
}
\begin{document}
\noindent
\begin{mytab}{\linewidth}{|c|X|r|}
minwidth& remaining width minw & minw\\
x & x & x\\
\end{mytab}
\end{document}
パッケージを介して環境の内容をキャッチすることも可能ですenviron
( \verb
stuff にはいくつかの制限があります)。テーブルの最後に謎の stuff をもっと簡単に追加できるかもしれません。
\documentclass{article}
\usepackage{tabularx}
\usepackage{environ}
\NewEnviron{mytab}{%
\expandafter\mytabaction\expandafter{\BODY}%
}
\newcommand{\mytabaction}[1]{%
\begin{tabularx}#1\end{tabularx}%
}
\begin{document}
\noindent
\begin{mytab}{\linewidth}{|c|X|r|}
minwidth& remaining width minw & minw\\
x & x & x\\
\end{mytab}
\end{document}
答え2
すでに提案されているように、tabularx
回答しますtabulary
。また、テーブルを全幅に指定する場合 (これらの方法のいずれかを使用)、段落のインデントによってインデントされていないことを確認する必要があります。そうしないと、行がいっぱいになります。したがって、テーブルの前に\noindent
または を付ける必要があり、ここでは\parindent
0 に設定されています。
tabular*
また、追加の列が必要ない場合は、既存の列の追加の列間隔を切り替えることができますが、わずかに注意が必要なのは、垂直線を再度挿入することです。
\documentclass{article}
\usepackage{tabulary}
% http://tex.stackexchange.com/questions/87097/is-it-possible-to-make-an-underfull-tabulary-spread-out/87543#87543
\makeatletter
\def\foo#1\def\TY@ratio#2#3!!{
\def\TY@checkmin{#1%
\@tempdima\TY@ratio\TY@tablewidth
\ifdim\@tempdima>\dimexpr\TY@linewidth+\hfuzz\relax
\advance\@tempdima-\TY@linewidth
\Gscale@div\@tempb\@tempdima\TY@tablewidth
\@tempdimb\TY@ratio\p@
\advance\@tempdimb-\@tempb\p@
\edef\TY@ratio{\strip@pt\@tempdimb}%
\fi
#3}}
\expandafter\foo\TY@checkmin!!
\makeatother
\begin{document}
\parindent0pt
\begin{tabular*}{\linewidth}
{|c|l@{\extracolsep{\fill}}cc@{\extracolsep{0pt}}|r|r|}
minwidth& remaining width &&& minw & minw\\
x & x &&& x & x
\end{tabular*}
\bigskip
\begin{tabular*}{\linewidth}
{|c|l!{\extracolsep{\fill}}>{\vline\kern\tabcolsep\hfill}r!{\extracolsep{0pt}}|r|}
minwidth& remaining width & minw & minw\\
x & x & x & x
\end{tabular*}
\bigskip
\begin{tabulary}
{\linewidth}{|c|L|r|r|}
minwidth& remaining width & minw & minw\\
x & x & x & x
\end{tabulary}
\end{document}
答え3
\documentclass{article}
\usepackage{tabularx}
\begin{document}
\noindent\rule{\linewidth}{1pt}
\bigskip\noindent
\begin{tabularx}{\linewidth} {|c|Xcc|r|r|}\hline
minwidth& remaining width &&& minw & minw\\
x & x &&& x & x
\end{tabularx}
\end{document}