以下是使用九个变量进行基本算术的命令。
\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}
答案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> }
这样我们就有了一个类似的语法,但不限于九个参数,而是宏定义。