使用 \item 作为比较的字符串

使用 \item 作为比较的字符串

我希望设计一个方便的命令\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}

在此处输入图片描述

相关内容