length
واژه درستی نیست. توی تک ما به این بعد یا dimen
میگوییم.
هدف پاسخ زیر یک تجزیه و تحلیل است و ارائه راهحل نیست. نویسنده پاسخ وظیفه ارائه پاسخ ندارد. برنامهنویسی راهحل بر دوش پرسشکننده است.
وقتی داریم در مورد بعد صحبت میکنیم و میخواهیم به یک dimen register
یک بعد بدهیم سه حالت زیر بصورت کلی پیش میاد.
حالت نخست
بعدی که ما میدهیم از عدد و واحد تشکیل شده باشه. اعداد decimal
میتونند باشند و واحد میتونه یکی از واحدهایی که تک میفهمه باشه (در حالت دوم این واحدها ذکر شدند). در این حالت تک خطایی نمیده.
بنابرین چیزی همانند \dimen0=4.01pt
برای تک قابل فهمه.
حالت دوم
برای بعد ما عدد قرار میدهیم اما واحدی قرار نمیدهیم یا اگر واحدی وجود داره، واحدی نیست که تک اون رو میفهمه همانند \dimen0=1.2
. در این صورت تک خطای
Illegal unit of measure (pt inserted).
میدهد. واحدهایی که برای تک قابل فهم هستند بصورت زیر هست.
em, ex, in, pt, pc, cm, mm, dd, cc, bp, or sp
در واقع تک این خطا رو با چک کردن دو token
آخر یک بعد و مقایسه آن با واحدهای قابل فهمش میده. اگر سورس تک رو نگاه کنی، این کار بصورت زیر انجام میشه.
@<Scan for \(a)all other units and adjust |cur_val| and |f|...@>=
if scan_keyword("in") then set_conversion(7227)(100)
@.in@>
else if scan_keyword("pc") then set_conversion(12)(1)
@.pc@>
else if scan_keyword("cm") then set_conversion(7227)(254)
@.cm@>
else if scan_keyword("mm") then set_conversion(7227)(2540)
@.mm@>
else if scan_keyword("bp") then set_conversion(7227)(7200)
@.bp@>
else if scan_keyword("dd") then set_conversion(1238)(1157)
@.dd@>
else if scan_keyword("cc") then set_conversion(14856)(1157)
@.cc@>
else if scan_keyword("sp") then goto done
@.sp@>
else @<Complain about unknown unit and |goto done2|@>;
cur_val:=xn_over_d(cur_val,num,denom);
f:=(num*f+@'200000*remainder) div denom;@/
cur_val:=cur_val+(f div @'200000); f:=f mod @'200000;
done2:
@ @<Complain about unknown unit...@>=
begin print_err("Illegal unit of measure ("); print("pt inserted)");
@.Illegal unit of measure@>
help6("Dimensions can be in units of em, ex, in, pt, pc,")@/
("cm, mm, dd, cc, bp, or sp; but yours is a new one!")@/
("I'll assume that you meant to say pt, for printer's points.")@/
("To recover gracefully from this error, it's best to")@/
("delete the erroneous units; e.g., type `2' to delete")@/
("two letters. (See Chapter 27 of The TeXbook.)");
@:TeXbook}{\sl The \TeX book@>
error; goto done2;
end
بنابراین کاری که در این حالت میخواهی انجام بدی این هست که token
های آخر آرگومانت که حرف هستند رو با واحدهای مورد قبول تک مقایسه کنی و در صورتی که تفاوت داره نتیجه میگیری که آرگومانت بعد نیست.
حالت سوم
مقدار بعد با چیزی غیر از یک عدد شروع میشه همانند \dimen0=pt1
. در اینصورت تک خطای
Missing number, treated as zero.
میده. بنابراین در این حالت باید چک کنی که آرگومانت با یک عدد یا .
شروع میشه چونکه .5pt
هم برای تک قابل درکه.