Я ищу решение для автоматического отображения списков данных. В текущем сценарии мои входные данные представляют собой список строк, которые должны отображаться в трехколоночном списке с последовательными номерами:
+--------------+-------------+------------+
| 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
ВотнебольшойУлучшение по сравнению с решением Дэвида Карлайла заключается в том, что можно указать простой список, разделенный запятыми:
Примечания:
- Используйте пользовательский счетчик в случае, если это позволяет использовать его в других перечисленных средах.
- Счетчик остается на месте для каждого вызова
\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}