这看起来像是一个简单的要求,但是在阅读了 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}