给定一个可能很大的整数(最多可达 $10^12$ 或更大),是否有办法使用 metapost 在固定位置打印该数字的数字?例如,给定数字 123456789 或 2365411111,是否可以在坐标 $(i,0)$ 处打印第 $i$ 位数字?
这个想法应该符合下面代码的精神(但是不起作用)。有两个问题
- Metapost 在处理大数字时的内在限制。
- 如何处理模函数。
以下是我迄今为止尝试过的:
```
verbatimtex
\documentclass{article}
\begin{document}
etex
prologues := 3;
outputtemplate := "%j%c.eps";
n:=123;
input TEX
for i = 0 upto 3:
label(TEX(decimal (Mod(floor((n)/(10**(i))),10**i))),(20+22.7i,-7));
endfor
endfig
end
and do something similar for n=564319741369 for example
答案1
编辑:OP 已澄清数字串只是一个字符串,而不是涉及计算的东西。因此我们可以使用字符串操作,而不必使用十进制数字系统启动 mpost。
prologues := 3;
outputtemplate := "%j%c.eps";
string nstring;
nstring := "999999564319741369111111";
% input TEX % may be needed for matters unrelated to the core goal here
beginfig(1)
k:=length(nstring);
for i:=0 upto k-1:
j:= k - i - 1;% from least significant (i.e. last) to first characters
label(substring(j,j+1) of nstring,(20+22.7i,-7));
endfor
endfig
end
以上内容可能需要进行一些与如何使用 LaTeX 在上下文中插入核心问题无关的调整(例如一些btex...etex
或使用TEX()
...),但这些都是次要细节。
输出与下面相同。
编译在命令行上产生:
$ mpost onebyone.mp
This is MetaPost, version 2.02 (TeX Live 2023) (kpathsea version 6.3.5)
(/usr/local/texlive/2023/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2023/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./onebyone.mp [1{psfonts.map}<
cmr10.pfb>] )
1 output file written: onebyone1.eps
Transcript written on onebyone.log.
初始答案。基于对 的误解,n
认为 确实要被视为数字变量。因此这需要-numbersystem=decimal
。
prologues := 3;
outputtemplate := "%j%c.eps";
n:=999999564319741369111111;
% input TEX % not needed after all
beginfig(1)
i:=0;
forever:;% somehow the ; is mandatory here
m:=floor(n/10);
digit:=n-10m;
label(decimal (digit),(20+22.7i,-7));
i:=i+1;
n:=m;
exitif(n=0);
endfor
endfig
end
使用 进行编译mpost -numbersystem=decimal test
。在我的系统上生成:
$ mpost -numbersystem=decimal test
This is MetaPost, version 2.02 (TeX Live 2023) (kpathsea version 6.3.5)
(/usr/local/texlive/2023/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2023/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./test.mp [1{psfonts.map}<cmr1
0.pfb>] )
1 output file written: test1.eps
Transcript written on test.log.
这是屏幕截图:
数字按从低到高的顺序输出,我相信这与您的初始尝试相符。使用20-22.7i
不同的顺序排列它们。
另一种方法是在 TEX 内部调用带有两个参数 N 和一个“字符串”的 TeX 宏,并从字符串中提取第 N 项。
(在编辑中我删除了TEX
不需要的用法)