2010-03-05 44 views
8

我有一個LaTeX文檔,它基本上是一個大的enumerate環境,有幾百個項目。我希望能夠發出像從LaTeX列表中只選擇一些項目

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

這將只輸出請求的項目。

一個類似的命令\onlyslidesslides.cls的一部分,但我無法弄清楚那裏發生了什麼,並適應我的需要。

我可以用環境的列表取代的item的名單,像

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

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

\newcounter等,如果它有助於達到我的目的—能夠只打印一些物品給定數沒有剪切和粘貼。如果需要,我可以在一個文件中包含項目,並在另一個文件中包含\printitems命令。

我不能把數字放在文件—文件不斷變化,我需要自動枚舉。

回答

1

這樣做的困難(或更確切地說,非平凡的)部分是解析逗號分隔的輸入。幾個包已經實現了這個;也許lipsum的實現很簡單,可以爲你的目的提取。

之後,每次您點擊某個項目並顯示內容時,這只是一個計數器的問題,具體取決於解析逗號列表的方式。

+0

困難的部分得到了最近在這裏討論:http://stackoverflow.com/questions/2402354/split-comma-separated-parameters-in-latex – 2010-03-09 20:37:40

+0

循環本身很簡單;請參閱我的後一個答案,瞭解範圍解析的一個示例,從頭開始寫一些內容很麻煩。 – 2010-03-10 01:44:53

1

首先使用Foreach功能分割在

Split comma-separated parameters in LaTeX

給出一個逗號分隔的列表可以通過去除恆定參數#2使用簡化它。

然後定義你的項目如下(這是建立在TeX的哈希的方式):在的foreach使用

\@namedef{item_1}{This is item 1} 
\@namedef{item_2}{This is item 2} 
\@namedef{item_3}{This is item 3} 

定義一個函數:

\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}} 
+1

啊,我沒有看到你需要動態數字。我想這個答案是不是真的幫助你。抱歉。 – 2010-03-09 16:34:57

+0

幾乎在那裏。兩件事:1)我可以有幾百個這樣的namedefs嗎?我知道TeX中的一些資源相當有限。 2)我可以從計數器構建它們,例如\ def \ myitem#1 {\ namedef {item_ \ themycounter} {#1}}? (因爲我必須有自動編號。) – AVB 2010-03-09 16:41:37

+0

我無法回答第二個問題(但我認爲它應該可行),但第一個問題肯定有效(我有5500個將郵件列入郵件列表的電子郵件) – 2010-03-09 18:41:33

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} 
+0

安裝expl3包 - 它的工作原理! – AVB 2010-03-12 21:14:52

+0

很高興聽到它:) – 2010-03-13 16:39:58

相關問題