(前回の続き)
というわけで、「他人に TeX について質問するのに堪えられるだけの TeX の基礎知識があるかを判定する」問題を出題する。制限時間の目安は 24 時間で、他人(人間)に質問する以外であれば、任意の文献を参照してかまわない。
7 問中 4 問以上できれば合格。
【お願い】後から解こうとする人が検索除外に利用できるように、この問題に対する回答を含むページ、ブログの記事、Twitter のツイート等の Web 上の書き込みには #zrtex0210 の文字列を含めるようにしてください。
(注意:一部の問題は TeX on LaTeX を前提にしています。多分、TeX 初級者で plain TeX 使いの人はいないと思うけど。)
※ 「プリミティブだけで」という場合、プリミティブに与えるパラメタのための文字トークンを含める(例えば「\tracingmacros=1
」等)は構わない。要点は、マクロを使わないということである。
[1] 以下の仕様を満たすマクロ \doMax
を作れ。併せて、整数レジスタ \result
の宣言の文も記述せよ。
\doMax{<整数x>}{<整数y>}
を実行すると、x と y のうち大きい方(正確には「小さくない方」)の数を\result
に代入する。- x と y は十進表記で与えられていると仮定してよい。
- 例:
\doMax{42}{33}
を実行すると\result
に 42 が代入される。
[2] 以下の仕様を満たすマクロ \isHoge
を作れ。併せて、スイッチ(if 文として使えるトークン;例を参照) \ifOk
の宣言の文も記述せよ。
\isHoge{<文字列>}
を実行すると、与えられた文字列(正確には「トークン列」)が「hoge
」であるかを判定し結果をスイッチ\ifOk
に返す。- 文字列は英字のみからなると仮定してよい。*1
- 例:
\isHoge{piyo}
を実行した後\ifOk Y\else N\fi
を実行すると「N」が出力される。
[3] 段落中で、現在水平位置を動かさずにその位置の左側にテキストを「重ね打ち」するには、LaTeX では \makebox[0pt][r]{<テキスト>}
とすればよいのであった。では、この機能をもつマクロ \placeLeft{<テキスト>}
を TeX のプリミティブだけを用いて 80 文字以内で定義せよ。(段落中であることを前提にしてよい。)
[4] TeX システムで cmssq8 という TFM 名のフォントが使えると仮定する。(普通使えるはずである。)現在フォントを「cmssq8 の 12pt」に変更して「A」と出力し、その後「cmssq8 に変える前のフォント」に戻して「B」と出力するようなソースを記述せよ。(ただし、cmssq8 も「前のフォント」も「A」「B」の符号位置にその文字があると仮定する。)*2
[5] 以下の LaTeX 文書の ????????
の部分に適当な TeX プリミティブの列を入れて、2 つの「Hello」の間で(\newpage
使用時のように)改ページが起こるようにせよ。(Overfull や Underfull が生じてはいけない。)
\documentclass{article} \begin{document} Hello ???????? Hello \end{document}
[6] TeX のプリミティブ \kern
の機能(何を出力するのか)について説明せよ。
[7] LaTeX の内部命令 \@startsection
の第 5 引数の意味を説明せよ。またこの引数を {-2em plus-1em}
とすることはどういう意味をもつか。