タグ

ブックマーク / zrbabbler.hatenablog.com (8)

  • TeX での末尾再帰(2) - マクロツイーター

    前回において、「TeX マクロの再帰呼出が末尾再帰になる場合」の展開の様子について考察した。ここから、TeX での「末尾再帰」の定義を導くことができる―すなわち、TeX マクロの置換テキスト(展開した内容)の処理(プリミティブの実行や他のマクロの展開)において、最後に行われるものが当該マクロの展開である場合、それ(マクロの呼出)が「末尾再帰」である。 TeX の末尾再帰に関して注意すべきなのは、普通のプログラミング言語だと末尾再帰になりそうな形が TeX ではならないことがあるということである。 例えば、1 から指定の数まで順に整数を出力する*1という典型的な繰り返し処理を実装してみる。 % \countUpTo{<n>}: 1 から n までの整数を(改段落しながら)出力する \newcount\num \newcount\limitNum \def\countUpTo#1{% \num

    TeX での末尾再帰(2) - マクロツイーター
    nixeneko
    nixeneko 2017/08/05
  • \romannumeral の基本的な使い方(補足) - マクロツイーター

    (前回の続き) 来の \romannumeral さて、これまでの \romannumeral の話を見て、きっと誰もが「どうしていつも後ろにゴチャゴチャしたものがくっついているのだ」と疑問に思うであろう。これには少し複雑な事情がある。 \romannumeral プリミティブを用いると先頭完全展開ができることを解説したが、実は、このプリミティブの来の目的はそれではなく、\romannumeral は \number と同様の「整数を文字列化する」ためのプリミティブだったのである。つまり、次のような書式で使われる。 \romannumeral<整数n>そして、n が非正(0 以下)の場合、これの一回展開の結果は空列になる。これがポイントである。(なお、n が正の時は展開結果に何やらアルファベットが混ざってくるので、それほど有用ではない。)もう一度「\romannumeral トリック」

    \romannumeral の基本的な使い方(補足) - マクロツイーター
    nixeneko
    nixeneko 2017/07/21
  • LuaLaTeX で fontspec する件について - マクロツイーター

    正確にいうとなかなか fontspec してくれない件。 LuaLaTeX の前に XeLaTeX の話。奥底の解説では、XeLaTeX で「Unicode する」為に必要なパッケージを一度に読み込むには xltxtra パッケージを用いるとしていた。現在でもそれ自体は変わらないが、「当に必要なもの」に関しては、fontspec を読み込むだけで一緒に取りこまれる様になっている:例えば xunicode パッケージ、EU1 エンコーディング等である(さらに、etex や fixltx2e も該当する)。必須ではない追加機能(例えば XeTeX のロゴ等)は xltxtra 自体が提供している。従って、そういう「余分の」機能が不要であれば、xltxtra だけ読み込む代わりに fontspec だけ読み込むのでも構わない。 [sample.tex] % 文字コードは UTF-8 \docu

    nixeneko
    nixeneko 2017/01/14
  • 埋め込めないフォントを埋め込むとどうなるか - マクロツイーター

    OpenType フォントのメタ情報の中には、「そのフォントを文書中に埋め込むことがライセンス上で許可されているか」という情報を表す“fsType”という値が存在する。 OpenType specification: OS/2 table: fsType (Microsoft) 上掲の資料によると、fsType の値の意味は次のようである(抜粋)。*1 0 : Installable Embedding (インストール可能)*2 2 : Restricted License embedding (埋込禁止) 4 : Preview & Print embedding (編集禁止の場合のみ埋込可能) 8 : Editable embedding (埋込可能) dvipdfmx および PDF 出力の TeX エンジンは OpenType フォントを埋め込む機能を持っている。このとき、fsTy

    埋め込めないフォントを埋め込むとどうなるか - マクロツイーター
    nixeneko
    nixeneko 2016/10/16
  • TeX でバイナリファイルを読む話 - マクロツイーター

    TeX 言語では他の多くのプログラミング言語と同じようにファイル入出力の機能がある。例えば、LaTeX で文書ファイルを組版すると、DVI ファイル(または PDF ファイル)の他に拡張子が .aux のファイルが出力されるが、これは TeX のファイル入出力機能を用いて出力されたものである。((.aux ファイルには TeX のコードが書かれており、“2 回目”の LaTeX の実行時に \input で「プログラム」として読み込まれる。)) ところが、TeX のファイル入出力機能には大きな制限があって、「テキストファイルを行単位に読み書きする」((厳密にいうと \read は行単位ではない。e-TeX 拡張プリミティブの \lineread は厳密に行単位である。 ))ことしかできない。これはつまりバイナリファイルを「正しく」読み書きすることが原理的に不可能であることを示している。全て

    TeX でバイナリファイルを読む話 - マクロツイーター
  • それでも TeX でプログラミングしたい人のための何か (8) - マクロツイーター

    あるいは 〜私の TeX プログラム変換環境〜 かなり間が空いたが、前回の続き……だけどその前に宣伝。 TeX & LaTeX Advent Calendar TeX で騒げ、TeX で笑え 皆さんの、心をこめたネタをお待ちしております! ※初心者大歓迎。 いやマジで。 (詳細は ATND のページで) ステップ 5 : 配列変数の処理 元のプログラムはシリーズ(7)の最後に掲載した eltaso3.lua。 元のプログラムには alpha と digit という 2 つの配列変数を用いている。*1残念ながら、TeX には配列という機能はない((ちなみに、TeX において「配列」というと、普通はデータ型でなくて組版機能の alignment のこと(\halign 等)を指す。))ので、何か別の手段でその機能を実現する必要がある。ここでは「名前参照」を用いて擬似的な配列変数を作る方法を説明

    それでも TeX でプログラミングしたい人のための何か (8) - マクロツイーター
    nixeneko
    nixeneko 2016/03/19
  • TeX のループ構文 - マクロツイーター

    TeX は if 以外の実行制御を全てマクロ展開で行う」という前置きをおいて、再帰による繰り返し処理の話をしてきた。ところが、実は、TeX にも繰り返し処理用の「構文」らしきものがある。それは \loop...\if...\repeat というもので、丁度 C 言語(やその書式を受け継ぐ言語)の do ... while(...) に相当する。 % \countUpTo{<n>}: 1 から n までの整数を出力する \newcount\num \newcount\limitNum \def\countUpTo#1{% \num=0 \limitNum=#1\relax \loop \advance\num1 \the\num\space \ifnum\num<\limitNum \repeat }この \loop は次の形で用いる。 \loop <処理1> \if<条件> <処理2>

    TeX のループ構文 - マクロツイーター
    nixeneko
    nixeneko 2016/03/19
  • それでも TeX でプログラミングしたい人のための何か (3) - マクロツイーター

    あるいは 〜私の TeX プログラム変換環境〜 ステップ 1 : 仕様を決める 早速プログラムの変換を始めたいところだが、その前に。 パッケージの名前を決める すなわち \eltaso の実装コードを書きこむ .sty ファイルの名前を決める。ここでは tceltaso と命名しよう。*1そうすると、ファイル名は tceltaso.sty となり、このパッケージを利用した文書は例えば次のようになるだろう。 \documentclass[a4paper]{jsarticle} \usepackage{tceltaso} \begin{docucment} \eltaso{1000} \end{document} なお、元ネタの著者がやっているように、LaTeX 文書のプレアンブル部に(\makeatletter〜\makeatother で囲って)TeX (on LaTeX)のコードを書くこ

    それでも TeX でプログラミングしたい人のための何か (3) - マクロツイーター
    nixeneko
    nixeneko 2016/03/19
  • 1