我有一个LaTeX文档,它基本上是一个很大的enumerate
环境,包含数百个项目。我希望能够发出类似的命令
\printitems{2,5,12,45-48}
只会输出要求的项目。
类似的命令
\onlyslides
是slides.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/