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

时间:2010-03-05 18:38:43

标签: list select latex

我有一个LaTeX文档,它基本上是一个大的enumerate环境,有几百个项目。我希望能够发出像

这样的命令
\printitems{2,5,12,45-48}

将仅输出所请求的项目。

类似的命令\onlyslidesslides.cls的一部分,但我无法弄清楚那里发生了什么并使其适应我的需要。

我可以将item的列表替换为环境列表,例如

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

\begin{myitem}
...
\end{myitem}
如果它有助于实现我的目的,那么

使用\newcounter等等 - 能够仅打印具有给定数字的某些项目而不进行剪切和粘贴。我可以将这些项目放在一个文件中,如果需要,可以将\printitems命令放在另一个文件中。

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

3 个答案:

答案 0 :(得分:3)

好吧,那么,我们走了。

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

您可以从此处复制并粘贴到空的.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}

答案 1 :(得分:1)

执行此操作的困难(或更确切地说,非平凡)部分是解析逗号分隔的输入。几个包实现了这一点;也许lipsum的实现很简单,可以为你的目的提取。

之后,每次点击一个项目时都会踩到一个计数器,并根据逗号列表的解析方式显示或不显示内容。

答案 2 :(得分:1)

首先使用foreach函数拆分

中给出的逗号分隔列表

Split comma-separated parameters in LaTeX

您可以通过删除使用的常量参数#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.
    }%
}

上次定义printitems

\def\printitems#1{\foreach{\printSingleItem}{#1}}