我希望设计一个方便的命令\lazycmd
,其工作原理如下(简化版本):
\newcommand{\lazycmd}[1]{%
...
}
% Use case 1.
\lazycmd{
\item one
\item two
}
% Use case 2.
\lazycmd{
custom
}
\lazycmd
预计:
- 如果参数以 开头,则在 的前面和后面添加
\begin{itemize}
和(跳过前导空格)。这是我的“正常情况”。\end{itemize}
#1
\item
- 否则,复制
#1
。这是我的“特殊情况”,因为参数将提供其自己的格式。
问题是,如何在比较中使用“\item”作为字符串,以及如何跳过任何潜在的前导空格?非常感谢!
答案1
选项一。
\newcommand\lazycmd[1]{\begingroup
\let\saveditem\item
\let\auxend\relax
\def\item{\let\item\saveditem\def\auxend{\end{itemize}}\begin{itemize}\item}%
#1%
\auxend\endgroup
}
选项二。
\newcommand\lazycmd[1]{\dolazycmd#1\endlazycmd}
\def\dolazycmd#1\endlazycmd
{\@ifnextchar\item{\def\auxend{\end{itemize}}\begin{itemize}}{\let\auxend\relax}#1\auxend}
第三个选择。
\newcommand\lazycmd[1]{\dolazycmd#1\endlazycmd}
\def\dolazycmd#1#2\endlazycmd
{\ifx\item#1
\begin{itemize}#1#2\end{itemize}%
\else
#1#2%
\fi}
答案2
您可能对expl3
基于的解决方案感兴趣:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\lazycmd}{O{\use:n} m}
{
\seq_set_split:Nnn \l_wdscxsj_lazycmd_seq { \item } { #2 }
\int_compare:nTF { \seq_count:N \l_wdscxsj_lazycmd_seq > 1 }
{ % more than one item, there was \item
\begin{itemize}
\seq_use:Nn \l_wdscxsj_lazycmd_seq { \item }
\end{itemize}
}
{
#1 { \tl_trim_spaces:n { #2 } }
}
}
\seq_new:N \l_wdscxsj_lazycmd_seq
\ExplSyntaxOff
\begin{document}
Here is some text followed by the command
\lazycmd{
\item one
\item two
}
and the same without any item
\lazycmd{
single
}
that can also be typeset in a different way
\lazycmd[\textbf]{
single
}
\end{document}