这是我的第一个问题,因此任何帮助都将不胜感激。
我想要实现如图所示的缩进效果:
可以通过以下方式获得:
\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
\tab
catcode
.
我已经编辑以允许在文本模式和数学模式处理之间切换。
$$
在我的重新编辑中,我解决了数学模式中出现的杂散线问题(需要取消\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 中替换来实现。