2010-03-05 19 views
8

Ich habe ein LaTeX Dokument, das im Grunde eine große enumerate Umgebung ist, mit einigen hundert Einzelteilen. Ich möchte in der Lage sein, einen Befehl wiein LaTeX

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

auszugeben, die nur die angeforderten Elemente ausgeben wird.

Ein ähnlicher Befehl \onlyslides ist ein Teil von slides.cls, aber ich kann nicht herausfinden, was dort vor sich geht und es an meine Bedürfnisse anpassen.

ich die Liste des item ‚s mit einer Liste von Umgebungen ersetzen kann, wie

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

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

mit einem \newcounter usw., wenn es hilft nur mit gegebenen Zahlen einige Elemente drucken meine Absicht — der Lage zu erreichen sein ohne Ausschneiden und Einfügen. Ich kann die Elemente in einer Datei haben, und den \printitems Befehl in einem anderen, falls erforderlich.

Ich kann nicht die Zahlen in die Datei setzen — die Datei ändert sich ständig, und ich brauche die automatische Aufzählung.

Antwort

1

Der schwer (oder besser gesagt, nicht-triviale) Teil, dies zu tun, die durch Kommata getrennten Eingang Parsen. Mehrere Pakete haben dies implementiert; Vielleicht ist die Implementierung von lipsum einfach genug, um sie für Ihre Zwecke zu extrahieren.

Danach ist es nur eine Frage eines Zählers jedes Mal, treten Sie ein Element getroffen und entweder die Inhalte angezeigt werden oder nicht, je nachdem, wie die komma Liste analysiert wird.

+0

Der schwierige Teil kürzlich hier diskutiert wurde: http://stackoverflow.com/questions/2402354/split-comma-separated-parameter-in-latex –

+0

Die Schleife selbst ist einfach; Siehe meine letzte Antwort für ein Beispiel für das Range-Parsing, das von Anfang an etwas mühsam ist. –

1

Erster Einsatz der foreach-Funktion eine durch Kommata getrennte Liste in

gegeben aufzuspalten

Split comma-separated parameters in LaTeX

Sie es durch Entfernen des konstanten Parameter # vereinfachen 2 verwendet.

definieren Sie dann Ihre Artikel wie folgt (dies ist der Weg, um einen Hash in TeX zu bauen):

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

eine Funktion definieren, um in foreach verwendet werden:

\def\printSingleItem#1{% 
    \@ifundefined{item_#1}{% 
     \PackageWarning{MyPackage}{Undefined Item #1}% 
    }{% 
     \@nameuse{item_#1}% This can be more fancy here, using formatting etc. 
    }% 
} 

Last printitems definieren

\def\printitems#1{\foreach{\printSingleItem}{#1}} 
+1

Ah, ich habe nicht gesehen, dass du dynamische Zahlen brauchst. Ich denke, diese Antwort hilft dir nicht wirklich. Es tut uns leid. –

+0

Fast da. Zwei Dinge: 1) Kann ich ein paar Hundert dieser Namen haben? Ich weiß, dass einige Ressourcen in TeX ziemlich begrenzt sind. 2) Kann ich sie aus einem Zähler erstellen, wie \ def \ myitem # 1 {\ namedef {item_ \ themycounter} {# 1}}? (Weil ich automatische Nummerierung haben muss.) – AVB

+0

Ich kann die zweite Frage nicht beantworten (aber ich denke, das sollte funktionieren), aber die erste funktioniert definitiv (ich habe 5500 von denen für die Indexierung von E-Mails in einer Mailing-Liste) –

3

In Ordnung, dann, hier gehen wir.

Wie Sie unten sehen können, der Hauptteil der Codierung Parsing das Komma getrennt Bereichseingang. Danach ist es einfach zu überprüfen, welche Nummer Sie in der Enumerationsumgebung (oder was auch immer) vorhaben und das Element bedingt anzuzeigen.

Sie können von hier aus in ein leeres .tex Dokument kopieren und einfügen und es sollte einfach funktionieren:


%% Zunächst einmal, ich bin mit dem expl3 Paket meisten dieser Codierung zu tun. Macht einige Dinge leichter.

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

%% Hier ist die Funktion einer Schleife über komma Liste Bereichseingang wie -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: 
} 

%% Und die Hilfsfunktion zurückzukehren, ob das Eingabeargument im Bereich enthalten ist:

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

%% Dies ist der Befehl zur Eingabe jedes Element der Liste:

 
\newcommand\numitem[1]{ 
    \i_in_range:nVTF {\value{enumi}+1}{\l_item_range_tl}{ 
    \item #1 
    }{ 
    \stepcounter{enumi} 
    } 
} 

%% Und die enumerate-Umgebung mit einer Reihe Argument:

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

%% schließlich ein Beispiel:

 
\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

Nach der Installation der expl3 Paket - es funktioniert! – AVB

+0

Freut mich zu hören :) –