我有一个LaTeX文档,它基本上是一个大的enumerate
环境,有几百个项目。我希望能够发出像
\printitems{2,5,12,45-48}
将仅输出所请求的项目。
类似的命令\onlyslides
是slides.cls
的一部分,但我无法弄清楚那里发生了什么并使其适应我的需要。
我可以将item
的列表替换为环境列表,例如
\begin{myitem}
...
\end{myitem}
\begin{myitem}
...
\end{myitem}
如果它有助于实现我的目的,那么使用\newcounter
等等 - 能够仅打印具有给定数字的某些项目而不进行剪切和粘贴。我可以将这些项目放在一个文件中,如果需要,可以将\printitems
命令放在另一个文件中。
我无法将数字放在文件中 - 文件不断变化,我需要自动枚举。
答案 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}}