
Я пытался найти ответ на этот вопрос, но на данный момент не имею ни малейшего представления, как это сделать.
Я хочу создать новую команду, которая заполняет некоторые строки таблицы на основе заданного списка переменной длины, например
\makeTabularRows{item1, item2, item3}
Результатом этого должно быть
\multicolumn{3}{c}{item1} & \\
\multicolumn{3}{c}{item2} & \\
\multicolumn{3}{c}{item3} &
Так что это вписывается в табличную форму
\begin{tabular}{lclr}
\makeTabularRows{item1, item2, item3}
\end{tabular}
Я нашел много частичных решений, например, это короткое
\newcommand{\makeTabularRows}[1]{%
\def\nextitem{\def\nextitem{.}}%
\@for \el:=#1\do{\nextitem\el}%
}
для вставки точек между элементами и другие решения, которые выглядят более сложными, например, для создания перечисления. Я обнаружил, что одной из проблем является включение знака &, и мои тесты показали мне, что даже вставка \\, похоже, невозможна. Я теряюсь в поисках решения для табличного, если оно есть.
Есть идеи, как это можно сделать?
решение1
Вот подход с расширяемым циклом. По какой-то причине большинство xinttools
объектов предназначены для входов типа {item1}{item2}{item3}
; если кто-то предпочитает, item1, item2, item3
то нужно применить \xintCSVtoList
как здесь в \makeRows
команде.
Я упомянул \xintFor
в комментарии, но я не прочитал вопрос достаточно внимательно (извините) ... \multicolumn
это зверь, который действительно хочет быть первым в своей ячейке (после расширения). Макрос \xintFor
выполняет некоторые (не глобальные) назначения, поэтому он не является подходящим инструментом здесь.
\documentclass{article}
\usepackage{xinttools}
\newcommand\makeOneRow [1]{\multicolumn{3}{c}{#1} & \\ }
\newcommand\makeRows [1]{%
\xintApplyUnbraced {\makeOneRow}{\xintCSVtoList{#1}}%
}%
\begin{document}
\begin{tabular}{lclr}
\makeRows{item1, item2, item3}
\end{tabular}
\end{document}
Если бы вы хотели \multicolumn
во второй ячейке, это бы сработало:
\xintFor #1 in {item1, item2, item3}\do
{& \multicolumn{3}{c}{#1}\\}
и если вы поместите это в \newcommand\makeTabularRows
место, где #1
будет CSV-файл элементов, вам нужно использовать \xintFor ##1 in {#1} \do {...}
.