我有一个LaTeX文档,它基本上是一个很大的enumerate环境,包含数百个项目。我希望能够发出类似的命令

\printitems{2,5,12,45-48}

只会输出要求的项目。

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

我可以将item的列表替换为环境列表,例如
\begin{myitem}
...
\end{myitem}

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

使用\newcounter等,如果它有助于实现我的目的-能够仅打印具有给定编号的某些项目而无需剪切和粘贴。如果需要,我可以将项目放在一个文件中,而\printitems命令在另一个文件中。

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

最佳答案

好吧,那么,我们开始吧。

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

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

%%首先,我正在使用expl3包来执行大多数此类编码。使某些事情变得容易。

\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn

%% Here's the function to loop over comma-list range input like -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:
}

%% And the auxiliary function to return whether the input argument is contained within the range:

\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} {
\项目#1
} {
\stepcounter {enumi}
}
}

%%以及带有range参数的枚举环境:

\newenvironment {someitems} [1] {
\tl_set:Nn\l_item_range_tl {#1}
\begin {列举}
} {
\end {枚举}
}
\ExplSyntaxOff

%%最后,举一个例子:

\begin {document}
\begin {someitems} {-2,4-6,8,10-}
\numitem {one}\numitem {two}\numitem {three}
\numitem {four}\numitem {5}\numitem {six}
\numitem {七个}\numitem {八个}\numitem {九}
\numitem {ten}\numitem {eleven}
\end {someitems}
\end {document}

关于list - 从LaTeX的列表中仅选择一些项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2389081/

10-11 14:34