當前位置:編程學習大全網 - 編程語言 - 在TeX編程中有都哪些技巧?

在TeX編程中有都哪些技巧?

我們都知道 TeX 的 \romannumeral 可以將隨後的阿拉伯數字轉化成小寫羅馬數字。\romannumeral 有這麽幾個性質:它會展開隨後的記號,直到得到壹個完整的數字為止;

如果數字不是正整數,它的展開結果為空;000 是 m,2000 是 mm,10000 是 10 個 m。是 1000 的多少倍,就是多少個 m,這是 \ltx@CarNumth 實現的最主要技巧。現在來看 \ltx@CarNumth 的定義:\ltx@CarNumth 由 \romannumeral 啟動,使用了性質 1,實現將它展開兩次就能得到結果的效果。隨後的 3 個 \expandafter 將 \ltx@GobbleNum 展開了兩次,\ltx@GobbleNum 也是由 \romannumeral 啟動的:這裏的 \LTXcmds@num 是 \number 或者 \the\numexpr,用於把參數 #1 轉換成阿拉伯數字(記作 n),跟後面的 000 連起來,由 \romannumeral 轉換成 n 個 m。\LTXcmds@GobbleNum 是個尾遞歸:用於生成 n 個 \csname LTXcmds@Gm。最後是由終止了遞歸。它展開成\LTXcmds@Gm 是吃掉壹個參數,然後返回壹個 \endcsname,結束前面的 \csname。吃掉 n 個參數之後(\ltx@CarNumth 是得到第 n 個項目,應該只吃掉 n-1 個參數,所以 \ltx@CarNumth 的定義最後有個空的分組用於占位,避免了計算),得到\ltx@zero 是字符常數 0,終止了 \romannumeral 的展開。最後由 \LTXcmds@CarNumth 完成清理工作:TeX 的最大整數是 2147483647,所以 \ltx@CarNumth 最多可以用到 2147483。但是可能遠沒有到這麽多的時候,TeX 的內存就不夠了。在我的老筆記本(T9600)上用 l3benchmark 作性能測試,\ltx@CarNumth 要比 \tl_item:nn 快壹個數量級。測試用的腳本是如果機器性能好點的話,差異可能沒這麽明顯。就說這麽壹個例子,妳要有興趣的話,可以去看看 LaTeX3 的源代碼文檔 source3.pdf,可以說是各種技巧的集大成者,比如上面測試腳本中用到的 \prg_replicate:nn 的實現就極具技巧性。

  • 上一篇:非常頭疼的C語言編程問題!!!!!!!
  • 下一篇:求算法設計,高手幫忙啊,註意是算法,不是程序
  • copyright 2024編程學習大全網