表形式: ある表形式のディメンションを別の表形式に結合します

表形式: ある表形式のディメンションを別の表形式に結合します

tabular列の幅をすべての行の中で最も幅の広い要素に設定します。

tabular2 つ以上の個別の を設定し、それぞれの列幅を考慮して最大のものを選択することは可能ですか?

たとえば、tabular追加の段落テキストで表を分割し、次のページに渡っているかのように表を続行したい場合longtable(列幅は同じで、ヘッダーを繰り返す可能性があります)、これは可能ですか?

答え1

アイデアは、一連の特別な列タイプを作成し、この列タイプが表に表示されるたびに常に同じ幅になるようにすることです。これには、ドキュメントを 2 回実行する必要があります。最初の実行で計算された幅は、aux ファイルに保存されます。

注: 列を狭くしたい場合は、aux ファイルを削除するか、少なくとも \AtEndDocument をコメント アウトする必要があります。

\documentclass{article}
\usepackage{array}

\newsavebox{\tempbox}% \box0 etc. used

\makeatletter
\newcommand{\saveWidth}[1]% #1=column name (A,B,...)
{\immediate\write\@auxout{\string\initWidth{#1}{\the\csname Width#1\endcsname}}}

\newcommand{\initWidth}[2]% #1=column name (A,B,...), #2=the width
{\@ifundefined{Width#1}{}{\global\csname Width#1\endcsname=#2\relax}}
\makeatother

\newlength{\WidthA}% one for each column type
\newlength{\WidthB}
\newlength{\WidthC}

\AtEndDocument{\saveWidth{A}\saveWidth{B}\saveWidth{C}}

\newcolumntype{A}{>{\savebox{\tempbox}\bgroup}{l}<{\egroup%
  \ifdim\wd\tempbox>\WidthA \global\WidthA=\wd\tempbox\fi%
  \makebox[\WidthA][l]{\usebox\tempbox}}}

\newcolumntype{B}{>{\savebox{\tempbox}\bgroup}{c}<{\egroup%
  \ifdim\wd\tempbox>\WidthB \global\WidthB=\wd\tempbox\fi%
  \makebox[\WidthB][c]{\usebox\tempbox}}}

\newcolumntype{C}{>{\savebox{\tempbox}\bgroup}{r}<{\egroup%
  \ifdim\wd\tempbox>\WidthC \global\WidthC=\wd\tempbox\fi%
  \makebox[\WidthC][r]{\usebox\tempbox}}}

\begin{document}
\noindent\begin{tabular}{ABC}
left & center & right\\
wide left & wide center  & wide right
\end{tabular}

\medskip
Some text here.
\medskip

\noindent\begin{tabular}{ABC}
left & center & right\\
\end{tabular}

\medskip
Some text here.
\medskip

\noindent\begin{tabular}{ABC}
very wide left & very wide center & very wide right\\
\end{tabular}

\end{document}

新しい列を簡単に作成できるようにするために、\newcolumnwidth{<name>}{l/c/r}(それ自体はかなり醜いですが)を追加しました。

\newcommand{\newcolumnwidth}[2]% #1=new column type, #2=l/c/r
{\expandafter\newlength\csname Width#1\endcsname%
 \AtEndDocument{\saveWidth{#1}}%
 \newcolumntype{#1}{>{\savebox{\tempbox}\bgroup}{#2}<{\egroup%
  \ifdim\wd\tempbox>\csname Width#1\endcsname \global\csname Width#1\endcsname=\wd\tempbox\fi%
  \makebox[\csname Width#1\endcsname][#2]{\usebox\tempbox}}}}

\newcolumnwidth{A}{l}
\newcolumnwidth{B}{c}
\newcolumnwidth{C}{r}

答え2

私が採用するアプローチは、tabbing環境内で行われるものと似ています。タブ ストップを定義する最初の行を設定し、\killその行が表示されないようにします。後続の行では、最初の行がなくてもこれらのタブ ストップが使用されます。

ここに画像の説明を入力してください

\documentclass{article}

\begin{document}

\noindent
\begin{tabular}{l c r}
  left      & center      &      right \\
  wide left & wide center & wide right
\end{tabular}

\medskip

Some text here.

\medskip

\noindent
\begin{tabular}{l c r}
  \phantom{wide left} &
    \phantom{wide center} & 
    \phantom{wide right} \\[-\normalbaselineskip]% Similar to \kill
  left      & center      &      right
\end{tabular}

\end{document}

上記の例の「\killrow 」は、両方のテーブルにわたって最も幅の広い要素を 内に配置し\phantom、行の高さは という形式の改行を使用して削除されます\\[-\normalbaselineskip]

非表示にするコンテンツが非常に高い場合は、 を使用します\hphantom。垂直方向の罫線のオーバープリントが気になる場合は、 を使用しないでください(素晴らしいbooktabs\kill)または「行」に各列要素を挿入します。\multicolumn{1}{l}{...} それなし垂直のルール。

関連情報