Cómo tener 2 matrices de variables en un documento

Cómo tener 2 matrices de variables en un documento

He usado un ejemplo de

Crear una matriz de variables

Agregando un nuevo \newcommandcomo en el siguiente código:

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

La primera llamada de gettextdará una respuesta correcta:Uno, dos, tres. Pero el segundo gettextobtendrá los mismos datos que getnewtextlos anteriores:Cuatro cinco SEIS.

¿Cómo puedo volver a ser como antes?Uno, dos, tres? Gracias.

Respuesta1

Puede mantener tantas matrices (en realidad, listas de propiedades) como desee, con una interfaz coherente con 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}

Hay una matriz "predeterminada", a la que se accede sin el argumento opcional para \additem, \setitemo \getitem; Tan pronto como use el argumento opcional para \additemo \setitem, se asigna una nueva matriz para usar con \getitem.

ingrese la descripción de la imagen aquí

Respuesta2

Utilice newtext#1etc. en lugar de text#1etc. en la segunda lista. Estos son nombres de macros definitorios. Quiere que sean únicos o sobrescribirá las definiciones antiguas.

Ah, y no lo utilices \\para romper líneas en contextos normales (fuera de tabular, arrayetc.).

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

información relacionada