So haben Sie zwei Variablen-Arrays in einem Dokument

So haben Sie zwei Variablen-Arrays in einem Dokument

Ich habe ein Beispiel verwendet aus

Erstellen Sie ein Array von Variablen

\newcommandIndem Sie wie im folgenden Code ein neues hinzufügen :

\documentclass{article} 
\usepackage{etoolbox}

\newcounter{cnt}
\newcommand\textlist{}
\newcommand\settext[2]{%
  \csdef{text#1}{#2}}
\newcommand\addtext[1]{%
  \stepcounter{cnt}%
  \csdef{text\thecnt}{#1}}
\newcommand\gettext[1]{%
  \csuse{text#1}}

\newcounter{newcnt}
\newcommand\newtextlist{}
\newcommand\setnewtext[2]{%
  \csdef{text#1}{#2}}
\newcommand\addnewtext[1]{%
  \stepcounter{newcnt}%
  \csdef{text\thenewcnt}{#1}}
\newcommand\getnewtext[1]{%
  \csuse{text#1}}


\begin{document}

\addtext{one}
\addtext{two}
\addtext{three}
\settext{100}{one hundred}

 This is text \gettext{1} and \gettext{3}, that is text \gettext{2}.
 100 is \gettext{100}.\\

 Add new info into newtext.
\addnewtext{four}
\addnewtext{five}
\addnewtext{six}
\setnewtext{100}{seven hundred}

 This is newtext \getnewtext{1} and \getnewtext{3}, that is newtext \getnewtext{2}.

 100 is \getnewtext{100}.\\

 This is text \gettext{1} and \gettext{3}, that is text \gettext{2}.
 100 is \gettext{100}.\\

\end{document}

Der erste Aufruf von gettextergibt eine korrekte Antwort:Eins zwei drei. Aber der Zweite gettexterhält die gleichen Daten wie getnewtextdarüber:Vier fünf sechs.

Wie kann ich es wieder so machen wie vorher,Eins zwei drei? Danke schön.

Antwort1

Sie können so viele Arrays (eigentlich Eigenschaftslisten) verwalten, wie Sie möchten, mit einer konsistenten Schnittstelle mit expl3.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

% 1. The user interface
% 1a. \additem[<name>]{<text>}
\NewDocumentCommand{\additem}{ O{default} m }
 {
  \ramiza_array_add:nnn { #1 } { } { #2 }
 }
% 1b. \setitem[<name>]{<slot>}{<text>}
\NewDocumentCommand{\setitem}{ O{default} m m }
 {
  \ramiza_array_add:nnn { #1 } { #2 } { #3 }
 }
% 1c. \getitem[<name>]{<slot>}
\DeclareExpandableDocumentCommand{\getitem}{ O{default} m }
 {
  \ramiza_array_get:nn { #1 } { #2 }
 }

% 2. The internal functions
\cs_new_protected:Nn \ramiza_array_add:nnn
 {% if the array doesn't exist yet, allocate it with its related counter
  \prop_if_exist:cF { g_ramiza_array_#1_prop }
   {
    \prop_new:c { g_ramiza_array_#1_prop }
    \int_new:c { g_ramiza_array_#1_int }
   }
  \tl_if_empty:nTF { #2 }
   {% with \additem we step the counter and set the next slot
    \int_gincr:c { g_ramiza_array_#1_int }
    \prop_gput:cvn { g_ramiza_array_#1_prop } { g_ramiza_array_#1_int } { #3 }
   }
   {% with \setitem we set the requested slot
    \prop_gput:cnn { g_ramiza_array_#1_prop } { #2 } { #3 }
   }
 }
\cs_generate_variant:Nn \prop_gput:Nnn { cv }

\cs_new:Nn \ramiza_array_get:nn
 {% retrieve the requested item
  \prop_item:cn { g_ramiza_array_#1_prop } { #2 }
 }
\ExplSyntaxOff

\begin{document}

\additem{one}
\additem{two}
\additem{three}
\setitem{100}{one hundred}

This is text \getitem{1} and \getitem{3}, that is text \getitem{2}. 100 is \getitem{100}.

Add new info into newtext.
\additem[new]{four}
\additem[new]{five}
\additem[new]{six}
\setitem[new]{100}{seven hundred}

This is newtext \getitem[new]{1} and \getitem[new]{3}, that is newtext \getitem[new]{2}.

100 is \getitem[new]{100}.

This is text \getitem{1} and \getitem{3}, that is text \getitem{2}. 100 is \getitem{100}.

\end{document}

Es gibt ein „Standard“-Array, auf das Sie ohne das optionale Argument für oder zugreifen \additem; \setitemsobald \getitemSie das optionale Argument für \additemoder verwenden \setitem, wird ein neues Array zugewiesen, das mit verwendet werden kann \getitem.

Bildbeschreibung hier eingeben

Antwort2

Verwenden Sie in der zweiten Liste newtext#1etc. statt text#1etc. Dies sind definierende Makronamen. Sie müssen eindeutig sein, sonst überschreiben Sie die alten Definitionen.

Oh, und verwenden Sie es nicht, um \\Zeilen in normalen Kontexten (außerhalb usw.) zu unterbrechen.tabulararray

\documentclass{article}
\usepackage{etoolbox}

\newcounter{cnt}
\newcommand\textlist{}
\newcommand\settext[2]{%
  \csdef{text#1}{#2}}
\newcommand\addtext[1]{%
  \stepcounter{cnt}%
  \csdef{text\thecnt}{#1}}
\newcommand\gettext[1]{%
  \csuse{text#1}}

\newcounter{newcnt}
\newcommand\newtextlist{}
\newcommand\setnewtext[2]{%
  \csdef{newtext#1}{#2}}
\newcommand\addnewtext[1]{%
  \stepcounter{newcnt}%
  \csdef{newtext\thenewcnt}{#1}}
\newcommand\getnewtext[1]{%
  \csuse{newtext#1}}


\begin{document}

\addtext{one}
\addtext{two}
\addtext{three}
\settext{100}{one hundred}

 This is text \gettext{1} and \gettext{3}, that is text \gettext{2}.
 100 is \gettext{100}.

 Add new info into newtext.
\addnewtext{four}
\addnewtext{five}
\addnewtext{six}
\setnewtext{100}{seven hundred}

 This is newtext \getnewtext{1} and \getnewtext{3}, that is newtext \getnewtext{2}.

 100 is \getnewtext{100}.

 This is text \gettext{1} and \gettext{3}, that is text \gettext{2}.
 100 is \gettext{100}.

\end{document}

verwandte Informationen