LaTeX

2010-03-05 15 views
8

में किसी सूची से केवल कुछ आइटम चुनें मेरे पास एक लाटेक्स दस्तावेज़ है जो कुछ सैकड़ों आइटमों के साथ मूल रूप से एक बड़ा enumerate वातावरण है। मैंLaTeX

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

जैसे आदेश जारी करने में सक्षम होना चाहता हूं जो केवल अनुरोधित आइटम आउटपुट करेगा।

इसी तरह की कमांड \onlyslidesslides.cls का हिस्सा है, लेकिन मैं यह नहीं समझ सकता कि वहां क्या हो रहा है और इसे मेरी आवश्यकताओं के अनुरूप बना सकता है।

मैं की तरह, वातावरण की सूची के साथ item की की सूची की जगह ले सकता

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

\begin{myitem} 
... 
\end{myitem} 
एक \newcounter साथ आदि अगर यह प्राप्त करने के लिए मेरा उद्देश्य — दी गई संख्याओं के साथ ही कुछ आइटम्स मुद्रित करने के लिए सक्षम किया जा रहा में मदद करता है

कट-एंड-पेस्टिंग के बिना। यदि आवश्यक हो तो मेरे पास एक फ़ाइल में आइटम हो सकते हैं, और \printitems कमांड में अन्य हो सकते हैं।

मैं संख्या — फ़ाइल में नहीं डाल सकता है, फ़ाइल लगातार बदल रही है, और मुझे स्वचालित गणना की आवश्यकता है।

उत्तर

1

ऐसा करने का कठिन (या बल्कि, गैर-तुच्छ) हिस्सा अल्पविराम से अलग इनपुट को पार्स कर रहा है। कई पैकेजों ने इसे लागू किया है; शायद होंठम का कार्यान्वयन आपके उद्देश्यों के लिए निकालने के लिए काफी आसान है।

उसके बाद, जब भी आप कोई आइटम हिट करते हैं और या तो सामग्री प्रदर्शित करते हैं या कॉमा-सूची को कैसे पार्स किया जाता है, इस पर निर्भर करता है कि यह केवल काउंटर को कदम उठाने का मामला है।

+0

कठिन हिस्सा हाल ही में यहाँ पर चर्चा कर ली: http://stackoverflow.com/प्रश्न/2402354/विभाजित-अल्पविराम से अलग-पैरामीटर-इन-लेटेक्स –

+0

लूपिंग स्वयं आसान है; रेंज-पार्सिंग के उदाहरण के लिए मेरा उत्तरार्द्ध उत्तर देखें जो स्क्रैच से लिखने के लिए थोड़ा दर्द है। –

1

सबसे पहले उपयोग foreach समारोह

Split comma-separated parameters in LaTeX

में दिए गए एक अल्पविराम से अलग सूची आप को हटाने निरंतर पैरामीटर # 2 का इस्तेमाल किया द्वारा यह सरल बना सकते हैं विभाजित करने के लिए।

तो निम्नलिखित तरीके से अपने आइटम को परिभाषित (इस टेक्स में एक हैश निर्माण करने के लिए तरीका है):

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

आह, मैंने नहीं देखा कि आपको गतिशील संख्या की आवश्यकता है। मुझे लगता है कि यह जवाब वास्तव में आपकी मदद नहीं कर रहा है। माफ़ कीजिये। –

+0

लगभग वहां। दो चीजें: 1) क्या मेरे पास इन नामों में से कुछ सैकड़ों हो सकते हैं? मुझे पता है कि टीएक्स में कुछ संसाधन सीमित हैं। 2) क्या मैं उन्हें काउंटर से बना सकता हूं, जैसे \ def \ myitem # 1 {\ nameef {item_ \ themycounter} {# 1}}? (क्योंकि मेरे पास स्वचालित नंबर होना चाहिए।) – AVB

+0

मैं दूसरे प्रश्न का उत्तर नहीं दे सकता (लेकिन मुझे लगता है कि यह काम करना चाहिए), लेकिन पहला व्यक्ति निश्चित रूप से काम करता है (मेरे पास मेलिंग सूची में ईमेल अनुक्रमणित करने के लिए 5500 हैं) –

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} 

यह %% इनपुट करने के लिए आदेश अपनी सूची के प्रत्येक आइटम है

%% और एक सीमा के तर्क के साथ की गणना पर्यावरण:

 
\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

+0

इसे सुनकर खुशी हुई :) –

 संबंधित मुद्दे