如何控制扩展顺序来从前缀和命令定义变量?

如何控制扩展顺序来从前缀和命令定义变量?

以下是使用九个变量进行基本算术的命令。

\documentclass{article}
\usepackage{xfp}

\newcommand\functesta[9]{
    \edef\myvara{#1}
    \edef\myvarb{#2}
    \edef\myvarc{#3}
    \edef\myvard{#4}
    \edef\myvare{#5}
    \edef\myvarf{#6}
    \edef\myvarg{#7}
    \edef\myvarh{#8}
    \edef\myvari{#9}
    $\inteval{\myvara + \myvarb - \myvarc + \myvard - \myvare + \myvarf - \myvarg + \myvarh - \myvari}$
}

\begin{document}
\functesta{1}{2}{3}{4}{5}{6}{7}{8}{100}
\end{document}
-94

我尝试将 9 行定义缩减为一个 for 循环,但没有成功。我的意图是,当循环迭代 1 到 9 时,它会\alphalph{\iteration}先扩展,然后与 组合\myvarx\myvarxa, \myvarxb, ..., \myvarxi。以同样的方式#\iteration会扩展#1#9。但是我可能语法错误。

\documentclass{article}
\usepackage{xfp}
\usepackage{pgffor}
\usepackage{alphalph}

\newcommand\functestb[9]{
    \foreach \iteration in {1,...,9} {
        \edef\expandafter\myvarx\alphalph{\iteration}{#\iteration}
    }
    $\inteval{\myvarxa + \myvarxb - \myvarxc + \myvarxd - \myvarxe + \myvarxf - \myvarxg + \myvarxh - \myvarxi}$
}

\begin{document}
\functestb{1}{2}{3}{4}{5}{6}{7}{8}{100}
\end{document}
! Illegal parameter number in definition of \functestb.

然后我#\iteration用一个常量替换它,看看其余代码是否正确。没有。实现我想要的正确方法是什么?我没有直接访问的原因#1#9我将编写一个更复杂的命令,其中给定的九个数字需要保存和更改多次。如果可以在 LaTeX 中这样做,我愿意接受其他替代方案,例如将列表作为参数传递或在命令中生成列表。

\documentclass{article}
\usepackage{xfp}
\usepackage{pgffor}
\usepackage{alphalph}

\newcommand\functestb[9]{
    \foreach \iteration in {1,...,9} {
        \edef\expandafter\myvarx\alphalph{\iteration}{17}
    }
    $\inteval{\myvarxa + \myvarxb - \myvarxc + \myvarxd - \myvarxe + \myvarxf - \myvarxg + \myvarxh - \myvarxi}$
}

\begin{document}
\functestb{1}{2}{3}{4}{5}{6}{7}{8}{100}
\end{document}
! Undefined control sequence.

答案1

这可能不是我会做的事情,但您可以使用\pgffor的功能来扩展参数列表并对其进行计数。

\documentclass{article}
\usepackage{xfp}
\usepackage{pgffor}
\usepackage{alphalph}

\newcommand\functesta[9]{%
  \edef\myvara{#1}%
  \edef\myvarb{#2}%
  \edef\myvarc{#3}%
  \edef\myvard{#4}%
  \edef\myvare{#5}%
  \edef\myvarf{#6}%
  \edef\myvarg{#7}%
  \edef\myvarh{#8}%
  \edef\myvari{#9}%
  $\inteval{\myvara + \myvarb - \myvarc + \myvard - \myvare + \myvarf - \myvarg + \myvarh - \myvari}$%
}

\newcommand\functestb[9]{%
  \foreach [count=\ino,expand list=true] \iteration in {#1,#2,#3,#4,#5,#6,#7,#8,#9} {% \xdef is needed as we want to use the definitions outside the loop
    \expandafter\xdef\csname myvarx\alphalph{\ino}\endcsname{\iteration}%
  }%
  $\inteval{\myvarxa + \myvarxb - \myvarxc + \myvarxd - \myvarxe + \myvarxf - \myvarxg + \myvarxh - \myvarxi}$%
}

\begin{document}
\functestb{1}{2}{3}{4}{5}{6}{7}{8}{100}
\functesta{1}{2}{3}{4}{5}{6}{7}{8}{100}
\end{document}

-94 两次

答案2

我不确定您是否需要命名变量。

\documentclass{article}
%\usepackage{xfp} % no longer needed
\usepackage{alphalph}

\ExplSyntaxOn

\NewDocumentCommand\functesta{mm}
 {
  \tl_set:Nn \l_tmpa_tl { #1 }
  \regex_replace_all:nnN
   { \cP\#([0-9]+) } % find #<digits>
   { \c{seq_item:Nn} \c{l_tmpa_seq} \cB\{\1\cE\} } % replace with the seq item
   \l_tmpa_tl
  % make the sequence from the input
  \seq_set_from_clist:Nn \l_tmpa_seq { #2 }
  % evaluate
  $\int_eval:n { \tl_use:N \l_tmpa_tl }$
 }

\ExplSyntaxOff

\begin{document}

\functesta{#1+#2-#3+#4-#5+#6-#7+#8-#9}{1,2,3,4,5,6,7,8,100}

\functesta{(#1*#2+#3*#4)*#5}{1,2,3,4,5}

\functesta{#1+#2+#3+#4+#5+#6+#7+#8+#9+#10+#11}{1,2,3,4,5,6,7,8,9,10,11}

\end{document}

如您所见,该函数可以获得您喜欢的任何定义,并且其值以列表的形式给出。

诀窍是用 替换#<digits>\seq_item:N \l_tmpa_tl { <digits> }这样我们就有了一个类似的语法,但不限于九个参数,而是宏定义。

在此处输入图片描述

相关内容