好的,那麼,我們走吧。
正如您在下面看到的,編碼的主要部分是解析逗號分隔的範圍輸入。之後,可以很容易地查看枚舉環境中的數字(或其他),並有條件地顯示該項目。
您可以複製並從這裏粘貼到一個空.tex
文件,它應該只是工作:
%%首先,我使用的是expl3包做大部分這種編碼的。使一些事情更容易。
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
%%這裏的函數來遍歷逗號列表範圍輸入像-2,4-6,8,10-
:
\prg_new_conditional:Nnn \i_in_range:nn {TF,T,F} {
\bool_set_false:N \l_tmpa_bool
\clist_map_inline:nn {#2} {
\parse_range:w ##1 - \q_marker - \q_nil #1 \q_nil
}
\bool_if:NTF \l_tmpa_bool \prg_return_true: \prg_return_false:
}
%%和輔助函數返回輸入參數是否包含在範圍內:
\cs_set:Npn \parse_range:w #1 - #2 - #3 \q_nil #4 \q_nil {
\tl_if_eq:nnTF {\q_marker}{#2}{
\intexpr_compare:nT {#4=#1} {\bool_set_true:N \l_tmpa_bool}
}{
\tl_if_empty:nTF {#2}{
\intexpr_compare:nT {#4>=#1} {\bool_set_true:N \l_tmpa_bool}
}{
\tl_if_empty:nTF {#1}{
\intexpr_compare:nT {#4<=#2} {\bool_set_true:N \l_tmpa_bool}
}{
\intexpr_compare:nT {#4>=#1} {
\intexpr_compare:nT {#4<=#2}
{\bool_set_true:N \l_tmpa_bool}
}
}
}
}
}
\cs_generate_variant:Nn \i_in_range:nnTF {nV}
%%這是命令輸入列表中的每個項目:
\newcommand\numitem[1]{
\i_in_range:nVTF {\value{enumi}+1}{\l_item_range_tl}{
\item #1
}{
\stepcounter{enumi}
}
}
%%,且與各種參數的羅列環境:
\newenvironment{someitems}[1]{
\tl_set:Nn \l_item_range_tl {#1}
\begin{enumerate}
}{
\end{enumerate}
}
\ExplSyntaxOff
%%最後一個例子:
\begin{document}
\begin{someitems}{-2,4-6,8,10-}
\numitem{one}\numitem{two}\numitem{three}
\numitem{four}\numitem{five}\numitem{six}
\numitem{seven}\numitem{eight}\numitem{nine}
\numitem{ten}\numitem{eleven}
\end{someitems}
\end{document}
困難的部分得到了最近在這裏討論:http://stackoverflow.com/questions/2402354/split-comma-separated-parameters-in-latex – 2010-03-09 20:37:40
循環本身很簡單;請參閱我的後一個答案,瞭解範圍解析的一個示例,從頭開始寫一些內容很麻煩。 – 2010-03-10 01:44:53