自動リスト/テーブルレンダリング

自動リスト/テーブルレンダリング

データ リストを自動的にレンダリングするソリューションを探しています。現在のシナリオでは、入力データは文字列のリストであり、連続した番号が付いた 3 列のリストで表示される必要があります。

+--------------+-------------+------------+
| 1  xyzxyz    | 2  sadsdasd | 3  sadasdf |
| 4  dfasdfas  | 3  23ea3ad  | 4  898sd   |
|                   .....                 |
+-----------------------------------------+

今のところ、固定数の項目 (私の場合は 30) があれば十分ですので、値を持つ 30 個の異なるマクロを定義しました。これらのマクロは、すべてがハードコードされているテンプレートによって参照されます。

もちろん、これはかなり静的なので、tex 入力が次のようにデータを定義する、より良い解決策を探しています。

\putItem{xyzxyz}
\putItem{sadsdasd}
\putItem{dfasdfas}
\putItem{23ea3ad}
\putItem{898sd}
...

誰か良いアイデアを持っていますか?

THX

答え1

\documentclass{article}

\newcommand\putItem[1]{\refstepcounter{enumi}\makebox[.3\textwidth][l]{\theenumi. #1}\hfill\ignorespaces}
\begin{document}

\begin{flushleft}
\putItem{xyzxyz}
\putItem{sadsdasd}
\putItem{dfasdfas}
\putItem{23ea3ad}
\putItem{898sd} 
\putItem{xyzxyz}
\putItem{sadsdasd}
\putItem{dfasdfas}
\putItem{23ea3ad}
\putItem{898sd}
\end{flushleft}

\end{document}

答え2

がここにありますわずか単純なコンマ区切りのリストを指定できるという点で、David Carlisle のソリューションよりも改善されています。

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

ノート:

  • 他の列挙環境内での使用を許可する場合は、カスタム カウンターを使用します。
  • カウンタは、 の呼び出しごとにリセットされます\ListTable

コード:

\documentclass{article}
\usepackage{pgffor}
\usepackage{xstring}

\newcounter{MyCounter}
\newcommand\putItem[1]{\refstepcounter{MyCounter}\makebox[.3\textwidth][l]{\theMyCounter. #1}\hfill\ignorespaces}
\begin{document}

\newcommand{\DefaultNumberOfColumns}{3}%
\newcommand{\ListTable}[2][\DefaultNumberOfColumns]{%
    % #1 = optional number of columns, defaults to \DefaultNumberOfColumns
    % #2 = common separated list
    \setcounter{MyCounter}{0}%
    \noindent
    \edef\ListMembersExpanded{#2}%
        \foreach \x in \ListMembersExpanded {%
            \IfStrEq{\x}{}{}{% Need to eliminate any empty enteries (allows for trailing comma)
                \putItem{\x}%
            }%
        }%
}%

\ListTable{%
    xyzxyz,
    sadsdasd,
    dfasdfas,
    23ea3ad,
    898sd,
    xyzxyz,
    sadsdasd,
    dfasdfas,
    23ea3ad,
    898sd,
}%

\end{document}

答え3

私の回答に基づいてデータツールを使用して複数のデータベースのコンテンツを 1 つのテーブルに配置する方法は?、私はこれを思いつきました。現在、このMWEはdata.txtファイルからデータを読み取ります。現在、

dfkdsfs
sdf
dsfdsfgsdfg
ds4543
rg
ere
r
ewrf
sfs
edfds
swdf
sdfdsfdsfdsf
rtg
435
rtgre
t546
tgr
ret
4trswe
dfdf
fdfsdf
435435rsggf
dsfds
gff
vcvx
gfgfd
asdfdsf
rt
34
32e3
~

ただし、外部ファイルは\readdef{data.txt}{\tmpa}

\def\tmpa{dfkdsfs sdf dsfdsfgsdfg ds4543 rg ere r ewrf sfs edfds swdf
sdfdsfdsfdsf rtg 435 rtgre t546 tgr ret 4trswe dfdf fdfsdf 435435rsggf
dsfds gff vcvx gfgfd asdfdsf rt 34 32e3 ~
}

最後の行のは~フィラーです (後で説明します)。また、データ エントリにはスペースがないものと想定しています。これは、OP の説明から推測したものです。マクロは、\readArrayij{\tmpa}{first}{3}として識別される 3 列の配列にデータを読み込みますfirst。部分的な行は破棄されるため、部分的な行が失われないように、データの最後に空白と改行を追加しました。

この構造はハーバートの\tabtoksアプローチを採用している(`\whiledo` を使用してプログラム的に表形式の行を作成する方法は?) を使用して、一度に 3 つの要素を表形式に追加し、この場合は、フロント エンドにインデックス識別子を追加します。

\documentclass{article}
\usepackage{readarray}
\newcounter{index}
\newcounter{mycell}
  % Based on:
  % https://tex.stackexchange.com/questions/7590/
  % how-to-programmatically-make-tabular-rows-using-whiledo
  \makeatletter
  \newcounter{tabindex}
  \newtoks\@tabtoks
  \newcommand\addtabtoks[1]{%
    \@tabtoks\expandafter{\the\@tabtoks\stepcounter{tabindex}#1}}
  \newcommand*\resettabtoks{\@tabtoks{}}
  \newcommand*\synctabindex[1]{\setcounter{tabindex}{\value{#1}}}
  \newcommand*\printtabtoks{\the\@tabtoks}
  \makeatother
\begin{document}
\readdef{data.txt}{\tmpa}
\readArrayij{\tmpa}{first}{3}

%
\resettabtoks
\setcounter{index}{0}
\setcounter{mycell}{0}
\synctabindex{index}
\whiledo{\value{index} < \numexpr\firstROWS\relax}{%

  \addtabtoks{%
    \stepcounter{mycell}
    \themycell: \arrayij{first}{\thetabindex}{1} &
    \stepcounter{mycell}
    \themycell: \arrayij{first}{\thetabindex}{2} &
    \stepcounter{mycell}
    \themycell: \arrayij{first}{\thetabindex}{3} 
    \ifthenelse{\equal{\thetabindex}{\nrows}}{\\\hline}{\\\hline}%
  }
  \addtocounter{index}{1}%
}
\begin{tabular}{|l|l|l|}
  \hline
  \printtabtoks
\end{tabular}
\end{document}

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

関連情報