マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

ある悲劇的なジョーク、または TeX の質問をするための練習問題 (2)

前回の続き)

というわけで、「他人に 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} とすることはどういう意味をもつか。

*1:初級者用の問題だからカテゴリコードの問題は気にしなくて良い。英字は常にカテゴリコード 11 をもつとする。

*2:おまけ:「TeX システムで cmssq8 という TFM 名のフォントが使える」というのは、ファイルのレベルでいうとどういうことか?