我正在尋找一種自動呈現資料清單的解決方案。在當前場景中,我的輸入資料是一個字串列表,它應該顯示在帶有序號的三列列表中:
+--------------+-------------+------------+
| 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}
...
有人有好主意嗎?
謝謝
答案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
根據我的回答如何使用datatool將多個資料庫的內容放入一張表中?,我想出了這個。目前,該 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}
將資料讀入一個標識為 的數組first
,該數組有 3 個列。部分行被丟棄,因此這就是為什麼我在資料末尾添加空白和換行符,以便部分行不會丟失。
該結構採用赫伯特\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}