
나는 다음의 예를 사용했습니다.
\newcommand
아래 코드와 같이 새 항목을 추가하면 됩니다 .
\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}
첫 번째 호출은 gettext
정답을 제공합니다.하나 둘 셋. 그러나 두 번째는 위와 gettext
동일한 데이터를 얻습니다 .getnewtext
넷, 다섯, 여섯.
어떻게 하면 이전처럼 되돌릴 수 있나요?하나 둘 셋? 감사합니다.
답변1
.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}
\additem
, \setitem
또는 에 대한 선택적 인수 없이 액세스하는 "기본" 배열이 있습니다 \getitem
. \additem
or 에 선택적 인수를 사용하자마자 와 \setitem
함께 사용할 새 배열이 할당됩니다 \getitem
.
답변2
두 번째 목록에서는 newtext#1
etc.보다는 etc.를 사용하십시오 . text#1
이는 매크로 이름을 정의합니다. 고유한 정의를 원하거나 이전 정의를 덮어쓰게 됩니다.
아, 그리고 일반적인 상황(외부 등 ) \\
에서는 줄바꿈을 사용하지 마세요 .tabular
array
\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}