List 仅从LaTeX中的列表中选择一些项目

List 仅从LaTeX中的列表中选择一些项目,list,select,latex,List,Select,Latex,我有一个LaTeX文档,它基本上是一个大型枚举环境,包含数百项。我希望能够发出这样的命令 \printitems{2,5,12,45-48} 它将只输出请求的项目 类似的命令\onlyslides是slides.cls的一部分,但我无法了解那里发生了什么,也无法根据我的需要进行调整 我可以用环境列表替换项目列表,如 \begin{myitem} ... \end{myitem} \begin{myitem} ... \end{myitem} 使用\新计数器等,如果有助于实现我的目的-能够只

我有一个LaTeX文档,它基本上是一个大型枚举环境,包含数百项。我希望能够发出这样的命令

\printitems{2,5,12,45-48}
它将只输出请求的项目

类似的命令\onlyslides是slides.cls的一部分,但我无法了解那里发生了什么,也无法根据我的需要进行调整

我可以用环境列表替换项目列表,如

\begin{myitem}
...
\end{myitem}

\begin{myitem}
...
\end{myitem}
使用\新计数器等,如果有助于实现我的目的-能够只打印一些带有给定数字的项目,而无需剪切和粘贴。如果需要,我可以将项目放在一个文件中,将\printitems命令放在另一个文件中


我不能把数字放在文件中-文件在不断变化,我需要自动枚举。

这样做的困难部分,或者更确切地说,非琐碎部分是解析逗号分隔的输入。有几个方案已经实现了这一点;也许lipsum的实现足够简单,可以为您的目的提取


在这之后,只需在每次点击某个项目时步进一个计数器,然后根据逗号列表的解析方式显示内容或不显示内容。

首先使用foreach函数拆分中给出的逗号分隔列表

您可以通过删除使用的常量参数2来简化它

然后按以下方式定义项目这是用TeX构建哈希的方法:

\@namedef{item_1}{This is item 1}
\@namedef{item_2}{This is item 2}
\@namedef{item_3}{This is item 3}
定义要在foreach中使用的函数:

\def\printSingleItem#1{%
    \@ifundefined{item_#1}{%
         \PackageWarning{MyPackage}{Undefined Item #1}%
    }{%
         \@nameuse{item_#1}% This can be more fancy here, using formatting etc.
    }%
}
最后定义打印项


好吧,那么,我们开始吧

如下所示,编码的主要部分是解析逗号分隔的范围输入。在这之后,就可以很容易地检查您在enumerate环境或其他环境中使用的数字,并有条件地显示该项

您可以从此处复制并粘贴到空的.tex文档中,它应该可以正常工作:

%%首先,我使用expl3包来完成大部分编码。使一些事情更容易

\documentclass{article} \usepackage{expl3} \ExplSyntaxOn %%以及用于返回输入参数是否包含在范围内的辅助函数:

\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}
啊,我没看到你需要动态数字。我想这个答案并没有真正帮助你。对不起,快到了。两件事:我能要几百个这样的名字吗?我知道德克萨斯州的一些资源相当有限。2我可以从计数器生成它们吗,比如\def\myitem1{\namedef{item\uThemyCounter}{1}?因为我必须有自动编号。我不能回答第二个问题,但我认为这应该行得通,但第一个问题肯定行得通。我有5500个用于在邮件列表中为电子邮件编制索引的问题。最近这里讨论了最难的部分:循环本身很容易;关于范围解析的示例,请参见我的后一个答案,从零开始编写这个示例有点困难。 \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}