索引变量

索引变量

是否可以创建可以使用整数定义的变量。我想创建一个示例来使用,但我不知道如何开始。希望我包含的代码片段有意义。

% creates variables wk[1], wk[2], ... , wk[10]
\foreach \i in {1,2,...,10}{\newcommand\wk[\i]{}} 

% stores the value 'this is week 2' into \wk[2]
\wk[2]{this is week 2}

% outputs 'this is week 2'
\wk[2]

答案1

变量?

(La)TeX 是一种具有宏扩展/替换功能的宏语言。

您有宏、寄存器和参数。

您可以使用不将参数处理为变量的宏。

无论如何,您都需要了解宏扩展的工作原理以及执行单个扩展步骤和分配的时间顺序。

我只需使用一个宏\name,该宏将嵌套在花括号中的一系列标记作为控制序列标记的名称,并通过\csname..\endcsname构造/传递该控制序列标记,同时保留可能在\name和左花括号之间发生的内容。
该控制序列标记反过来可以(重新)定义为宏或可以扩展,就像您喜欢的那样:

\documentclass{article}
\usepackage{pgffor}

\newcommand\name{}\long\def\name#1#{\romannumeral0\innername{#1}}%
\newcommand\innername[2]{%
  \expandafter\exchange\expandafter{\csname #2\endcsname}{0 #1}%
}%
\newcommand\exchange[2]{#2#1}%

% This loop defines macros/control-word-tokens \wk[1], \wk[2], ... , \wk[10] 
% with "empty" replacement-text:
\foreach \i in {1,2,...,10}{%
   \name\newcommand*{wk[\i]}{}%
   % \foreach opens up a local scope. 
   % Thus we need to turn assignments restricted to that scope into global 
   % assignments:
   \name\name\global\let{wk[\i]}={wk[\i]}%
} %

\begin{document}

% This "stores the value 'this is week 2' into \wk[2]".
% Better: This redefines the macro \wk[2] to expand to the phrase "this is week 2".
\name\renewcommand*{wk[2]}{this is week 2}

% As there is nothing between \name and the opening brace, this just delivers the
% control-sequence-token \wk[2] which in turn gets expanded as usual while that
% expansion yields 'this is week 2':
\name{wk[2]}

% If eTeX-extensions are available, you can use \number\numexpr.. for calculations:
\name{wk[\number\numexpr(2*3)-5+1\relax]}

% this shows the definition/meaning of \wk[2] on the screen/in the .log-file:
%\name\show{wk[2]}

% this prints the meaning of \wk[2]
\texttt{\name\string{wk[2]}: \name\meaning{wk[2]}}

\end{document}

答案2

这是一个简单的版本,它利用xparse包定义一个新的类似数组的命令,其中第一个参数放在方括号中,第二个可选参数放在括号中:

\documentclass{article}
\usepackage{xparse}
\usepackage{pgffor}

\newcommand\makearray[1]{%
    \expandafter\NewDocumentCommand\csname#1\endcsname{r[]g}{%
        \IfValueTF{##2}{%
            \expandafter\def\csname #1@##1\endcsname{##2}%
        }{%
            \csname #1@##1\endcsname
        }%
    }
}

\begin{document}
\makearray{wk}

\wk[1]{this is week 1}
\wk[3]{this is week 3}

\foreach \i in {1,2,3} {\wk[\i]\par}
\end{document}

你使用它就像

\makearray{name}

定义一个新的数组命令\name。然后你可以使用

\name[key]{value}

在位置设置一个值key,并且

\name[key]

输出位置 处存储的值key。如果之前没有设置任何键,则结果为空(或者\relax更准确地说,等于 )。

因此,上述示例的输出为

这是第一周
这是第三周

答案3

因为您似乎想要在循环上下文中使用它,所以这里有一个允许在参数中使用算术表达式的实现。

我区分了设置值和检索值的阶段。您提议的语法不允许\wk扩展,因为必须检查它是否用于设置值。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\wk}{m}
 {
  \prop_item:Nf \g_garth_week_prop { \int_eval:n { #1 } }
 }
\NewDocumentCommand{\setwk}{mm}
 {
  \prop_gput:Nfn \g_garth_week_prop { \int_eval:n { #1 } } { #2 }
 }

\cs_generate_variant:Nn \prop_item:Nn { Nf }
\cs_generate_variant:Nn \prop_gput:Nnn { Nf }

\prop_new:N \g_garth_week_prop

\ExplSyntaxOff

\setwk{2}{This is week two}
\setwk{2+1}{This is week three}

\begin{document}

\wk{2}

\wk{7-2*2}

\end{document}

在此处输入图片描述

这是一个抽象层,允许您定义任意数量的数组。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\NewArray}{m}
 {
  \prop_new:c { g_garth_#1_prop }
  \cs_new_protected:cpn { set#1 } ##1 ##2
   {
    \prop_gput:cfn { g_garth_#1_prop } { \int_eval:n { ##1 } } { ##2 }
   }
  \cs_new:cpn { #1 } ##1
   {
    \prop_item:cf { g_garth_#1_prop } { \int_eval:n { ##1 } }
   }
 }

\cs_generate_variant:Nn \prop_item:Nn { cf }
\cs_generate_variant:Nn \prop_gput:Nnn { cf }

\ExplSyntaxOff

\NewArray{wk}

\setwk{2}{This is week two}
\setwk{2+1}{This is week three}

\begin{document}

\wk{2}

\wk{7-2*2}

\end{document}

相关内容