使用 xparse 进行嵌套缩进

使用 xparse 进行嵌套缩进

这是我的第一个问题,因此任何帮助都将不胜感激。

我想要实现如图所示的缩进效果:

逐项列举法

可以通过以下方式获得:

\begin{itemize}
  \item $a$
  \begin{itemize}
    \item $b1$
    \item $b2$
  \end{itemize}
  \item $c$
\end{itemize}

重点是我想要创建一个xparse \DocumentCommand接收没有$符号并由字符分隔的项目参数.并重新创建先前的项目化结构。

例如,假设命名函数名为\tab。那么,

\tab{a.\tab{b1.b2}.c}

应该给出与上面相同的结果。

希望你明白我在寻找什么。


编辑:终于得到它了,感谢\@ifnextchar

\usepackage{xparse}
\NewDocumentCommand{\tab}{>{\SplitList{.}}m}
{\begin{itemize}\ProcessList{#1}{\entry}\end{itemize}}
\makeatletter
\def\test{\@ifnextchar\tab{\relax}{\item $}}
\makeatother
\newcommand{\entry}[1]{\test#1 \ifmmode $ \fi }

感谢您的帮助。

答案1

xparse使用太复杂了。使用\@ifnextchar是可能的,但跳转到expl3可能更好:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\tab}{m}
 {
  % start an itemize (that also provides grouping for nested calls)
  \begin{itemize}
  \azpillaga_tab:n { #1 }
  % finish off
  \end{itemize}
 }

\seq_new:N \l__azpillaga_tab_input_seq

\cs_new_protected:Npn \azpillaga_tab:n #1
 {
  % split the input into components at the periods
  \seq_set_split:Nnn \l__azpillaga_tab_input_seq { . } { #1 }
  % process one item at a time
  \seq_map_inline:Nn \l__azpillaga_tab_input_seq
   {
    % check if the item starts with \tab
    \peek_meaning:NF \tab
     {% it doesn't: add \item and $
      \item $
     }
    % the item
    ##1
    % add $ if in \item
    \mode_if_math:T { $ }
   }
 }
\ExplSyntaxOff

\begin{document}
\section{Small}
\tab{a.\tab{b1.b2}.c}

\section{Big}
\tab{a.\tab{b1.\tab{b11.\tab{b112.b113}}.b2}.c.\tab{1.2}.d}

\end{document}

在此处输入图片描述

答案2

在这里,我将 设置为.活动状态\tab,并在完成后将其恢复。在 内部\tab,如果下一个标记不是嵌套的,则.可以变为,如果下一个标记是嵌套的,则 可以变为。我使用一个简单的计数器跟踪嵌套级别,并且仅在嵌套级别回到零时恢复12 定义。\item\tab\relax\tabcatcode.

我已经编辑以允许在文本模式和数学模式处理之间切换。

$$在我的重新编辑中,我解决了数学模式中出现的杂散线问题(需要取消\vspace),因此\vspace目前不需要 s,并且数学模式中的间距与真实itemize环境的间距相匹配。

在我的 MWE 中,我将文本和数学版本并排放在小页面中以便进行比较。

\documentclass{article}
\newcounter{nestlevel}
\def\mathitemize{\def\DOL{$}}
\def\textitemize{\def\DOL{}}
\textitemize
\let\svdot.
\catcode`.=\active
\newcommand\tab{\stepcounter{nestlevel}\catcode`.=\active\tabhelper}
\newcommand\tabhelper[1]{%
  \def\tabdone{F}%
  \let.\dotparse%
  \begin{itemize}%
    \item\DOL#1\if F\tabdone\DOL\fi\gdef\tabdone{T}%
  \end{itemize}%
  \addtocounter{nestlevel}{-1}%
  \if0\thenestlevel\catcode`.=12\let.\svdot\fi%
}
\makeatletter
\def\dotparse{\if F\tabdone\DOL\fi\def\tabdone{F}\@ifnextchar\tab\relax\xitem}
\makeatother
\def\xitem{\item\DOL}
\catcode`.=12
\parskip 1em
\begin{document}
\begin{minipage}{.4\textwidth}
\textitemize\tab{a.\tab{b1.\tab{b11.\tab{b112.b113}}.b2}.c.\tab{1.2}.d}
\end{minipage}
\begin{minipage}{.4\textwidth}
\mathitemize\tab{a.\tab{b1.\tab{b11.\tab{b112.b113}}.b2}.c.\tab{1.2}.d}
\end{minipage}
\end{document}

在此处输入图片描述


我想顺便补充一点,OP 禁止使用点作为其论点的一部分,因为他请求的语法会将解释.为对新的\item或嵌套的调用itemize如果如果确实需要一个点作为数据流的一部分,那么选择一个不同于.解析分隔符的字符是有意义的,这可以很容易地通过在 MWE 中替换来实现。

相关内容