Я хочу создать команду, которой я могу дать переменное количество входных данных, и она поместит их в подробный список. Что-то вроде
\myitemize{First item}{Second item}{Third item}
будет производить
В то время как что-то вроде
\myitemize{First item}{Second item}
будет производить
Я также не придирчив к форматированию. Это может быть что-то вроде
\myitemize[First item, second item, third item]{3}
Я просто не хочу вручную изменять, \begin{itemize} \end{itemize}
чтобы включить еще одну строку и еще одну \item
. Спасибо!
решение1
Первый подход реализован вМакрос, который принимает переменное количество аргументов и создает таблицу с одной строкой на аргумент. Обязательно прочтите все комментарии там. В частности, это, возможно,не очень хороший стиль разметки.
Второй подход легко реализовать expl3
(даже не нужно указывать количество элементов), например, так:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l__ryanj_tmp_seq
\cs_new_protected:Npn \ryanj_output_items:n #1
{
\seq_set_from_clist:Nn \l__ryanj_tmp_seq {#1}
\seq_use:Nn \l__ryanj_tmp_seq { \item }
}
\NewDocumentCommand \mystrangeitemize { m }
{
\begin{itemize}
\item
\ryanj_output_items:n {#1}
\end{itemize}
}
\ExplSyntaxOff
\begin{document}
\mystrangeitemize{First item, Second item, Third item,
{Item, containing, commas.}}
\end{document}
\mystrangeitemize
Также можно реализовать следующим образом:
\NewDocumentCommand \mystrangeitemize { m }
{
\begin{itemize}
\ryanj_output_items:n { {}, #1 }
\end{itemize}
}
(добавленный пустой элемент приводит \item
к выводу первой команды).
В обоих случаях, если вы хотите иметь возможность объявлять элементы, содержащие несколько абзацев ( \par
тогда токены должны быть приемлемы в аргументе \mystrangeitemize
), замените m
на +m
in \NewDocumentCommand \mystrangeitemize { m }
.
etoolbox
's \docsvlist
также можно использовать для этой цели, и вы также можете увидеть, как кто-то публикует решение, основанное на listofitems
. :-)