如何使用 ConTeXt 中的参数进行简单的算术运算?

如何使用 ConTeXt 中的参数进行简单的算术运算?

这看起来像是一个简单的要求,但是在阅读了 wiki 并在 Google 上搜索答案后,我不知道如何用 ConTeXt 表达它。

我想要做的是定义一个带有两个参数(或一个参数 + 一个默认值)n 和 m 的宏,它以一种颜色重复一个符号 n 次,以另一种颜色重复 mn 次。但是我怎样才能告诉 (Con)TeX(t) 减去 mn 而不是逐字输入 mn?

以下是我所指的一些伪示例:

\define[2]\putsymbols{\dorecurse{#1}{Symbol-in-color-A}\dorecurse{#2-#1}{Symbol-in-color-B}}

所以当我输入时,\putsymbols[3][5] 它会产生 3 个颜色 A 的符号和 2 个颜色 B 的符号

答案1

使用基于 lua 的解决方案通常比弄清楚 TeX 算法更容易。

\define\PutSymbols{\dodoubleempty\doPutSymbols}
\def\doPutSymbols[#1][#2]#3{\ctxlua{userdata.putsymbols(#1, #2, [===[#3]===])}}

\startluacode
  userdata = userdata or {}

  function userdata.putsymbols(n, m, s)
    for i = 1,n do
      context.color({"darkred"}, s)
    end
    for i = n+1,m do
      context.color({"darkblue"}, s)
    end
  end
\stopluacode

\starttext
\PutSymbols[3][8]{*}
\stoptext

这使

在此处输入图片描述

答案2

假设我明白了你在追求什么......这里有一个建议,可能会做你想做的事:

\def\PutSymbols{\dodoubleempty\doPutSymbols}

\def\doPutSymbols[#1][#2]#3{%
  \iffirstargument
     \dorecurse{\the\numexpr #1\relax}{\color[darkred]{#3}}
  \else
    \dorecurse{1}{#3}
  \fi%
  \ifsecondargument
    \dorecurse{\the\numexpr #2-#1\relax}{\color[darkblue]{#3}}
  \else
    \dorecurse{1}{\color[darkblue]{#3}}
  \fi%
}

\starttext

\PutSymbols[3][8]{*}

\stoptext

您可能需要添加一些检查以确保您的输入有效(参数是否为数字,i #2 > #1 等)

结果:

在此处输入图片描述

答案3

您可以使用经典的纯 TeX 方法,因为 ConTeXt 知道纯 TeX 宏和 TeX 原语:

\newcount\symbolnum  
\def\putsymbols[#1][#2]#3{%
   \symbolnum=0
   \loop              
      \advance\symbolnum by1
      \color[red]{#3}%
      \ifnum\symbolnum<#1 \repeat
   \it
   \loop
      \advance\symbolnum by1
      \color[blue]{#3}%
      \ifnum\symbolnum<#2 \repeat
}         
\putsymbols[3][7]{X}

相关内容