高度な特殊タグ練習   作:紺野遍音

2 / 4
requireタグ、ありがとう!
そして最後は力技。


高度な練習(enclosureタグ その1)

さて、約束通りencloseパッケージの話をしよう。

encloseは、仕様としてはMathMLの命令をJavaScriptで実装するパッケージだ。

前回はこれを表示してTikZの話をして終わったのだった。

$$\require{enclose} \enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}}$$

この円の中身はこうだ。

\require{enclose} \enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}}

種明かしとしては、

① まずencloseパッケージを呼び出し……

② circleをencloseする(囲む)対象を指定する。

③ その対象は、phantom(透明)で──

④ ──中心から幅6em、上に3em伸び、下にも3em伸びる長方形(正方形)だ。

 

つまり、円を描こうとしてもencloseパッケージは囲う(enclose)ための円しか持っていないので、「透明な正方形が囲う円(透明な正方形に内接する円)」として実装しているというわけだ。

白状すると、このやり方はChatGPT 5.6 Solに聞いた。ChatGPT Plusに月3,000円課金した甲斐が増えたというものだ。

 

$$\smash{\rlap{\Rule{8em}{0.025em}{0.025em}}} \smash{\rlap{\hskip 4em\Rule{0.05em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}$$

こういうこともできる。

この中身は

\smash{\rlap{\Rule{8em}{0.025em}{0.025em}}} \smash{\rlap{\hskip 4em \Rule{0.025em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}

で、少しややこしいのだが、

それぞれsmashとrlapを使って、smashで要素をレイアウト上では幅0em高さ0emとみなしてrlapで重ねた表示を許している。そのうえで、

① 幅8em、高さが上と下にそれぞれ0.025emの長方形を描画(レイアウト上では幅0em高さ0em要素重ね可)

② 4em左から(h: horizontal)スキップ(skip)して、それから、幅0.05emで高さが上と下にそれぞれ4emの長方形を描画(レイアウト上では幅0em高さ0em要素重ね可)

③ そして、すべてがレイアウト上で0emだと本文に食い込むので、透明な(phantom)幅8em高さ8emの長方形(正方形)を描画して描画スペースを確保している。(これはレイアウト上での幅や高さは0emにしていない)

ということをしている。

②の幅が0.05emなのは①の長方形の高さが上下にそれぞれ0.025emの合計0.05emだったからだ。

 

 

では、この2つを重ね合わせるとどうなる……?

$$\require{enclose} \enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}} \smash{\rlap{\Rule{8em}{0.025em}{0.025em}}} \smash{\rlap{\hskip 4em \Rule{0.05em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}$$

\require{enclose} \enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}} \smash{\rlap{\Rule{8em}{0.025em}{0.025em}}} \smash{\rlap{\hskip 4em \Rule{0.05em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}

ただそのまま2つを繋げるのではうまく機能しないことが分かった。

というか、さっき出ていた縦軸まで消えている。仕方がないので、線をちょっぴり太くしよう。

\require{enclose} \enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}

$$\require{enclose} \enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}$$

これで縦横軸が表示された。

 

円と縦横軸がズレている。そういえば、さっき縦軸と横軸が重なっていたのは、smashとrlapのおかげだった。

というわけで、

\require{enclose} \smash{\rlap{\enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}

というふうにsmashとrlapの恩恵を受ける形にすると、どうなるか。

$$\require{enclose} \smash{\rlap{\enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}$$

ところで、ちゃんと重ねたのに円と縦横軸がズレている。これはなぜか。

試しにphantomにしていた透明な正方形を表示してみよう。(phantomの正方形を円と四角形(circle,box)囲う(enclose)だけだ)

$$\require{enclose} \smash{\rlap{\enclose{circle,box}{\phantom{\Rule{6em}{3em}{3em}}}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \enclose{box}{\phantom{\Rule{8em}{4em}{4em}}}$$

 

そう。基準として置かれていたphantomの正方形の位置が円と縦横軸で一致していないことが原因だったのだ。

encloseの描画は左端中心を基準にして開始される。

したがって、さっき縦軸の描画を左から(h: horizontal)描画をスキップ(skip)したように、今度は円の方の描画も左から(h: horizontal)スキップ(skip)しよう。6emと8emで左右合計で2emズレていたわけだから、スキップするのは1emでいい。

$$\require{enclose} \smash{\rlap{\hskip 1em \enclose{circle,box}{\phantom{\Rule{6em}{3em}{3em}}}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \enclose{box}{\phantom{\Rule{8em}{4em}{4em}}}$$

\require{enclose} \smash{\rlap{\hskip 1em \enclose{circle,box}{\phantom{\Rule{6em}{3em}{3em}}}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \enclose{box}{\phantom{\Rule{8em}{4em}{4em}}}

まだズレているが、これは箱を描画していたencloseコマンドのせいだと考えて、取り除いておこう。

$$\require{enclose} \smash{\rlap{\hskip 1em \enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}$$

\require{enclose} \smash{\rlap{\hskip 1em \enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}

 

さあ!なぜまだズレるのか。

さっきe()n()c()l()o()s()e()()()()と言った。それは正しい。まったくその通りだ。

そして、()()()()()()()()()e()n()c()l()o()s()e()()()()()()()()()()()

encloseはその性質上周囲に余白を形成し、その余白の幅はレンダラーに依存する

というわけで、気合でhskipを調整してみよう。

$$\require{enclose} \smash{\rlap{\hskip 0.8em \enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}$$

\require{enclose} \smash{\rlap{\hskip 0.8em \enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}

0.2emずらしたら偶然うまくいった。

ここだけは本当に気合で合わせるしかない。

 

ちなみに……これまでの格闘はダークモードではうまく表示されないので、colorパッケージをrequireして、どちらのモードでもそこそこ見える色にしておこう。

$$\require{color} \color{#777777}{\require{enclose} \smash{\rlap{\hskip 0.8em \enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}}$$

\require{color} \color{#777777}{\require{enclose} \smash{\rlap{\hskip 0.8em \enclose{circle}{\phantom{\Rule{6em}{3em}{3em}}}}} \smash{\rlap{\Rule{8em}{0.05em}{0.05em}}} \smash{\rlap{\hskip 4em \Rule{0.1em}{4em}{4em}}} \phantom{\Rule{8em}{4em}{4em}}}

 

すこし物足りない色だが、仕方がない。

次回は、さらに座標らしくする方法について書く。

 

  1. 目次
  2. 小説情報
  3. 縦書き
  4. しおりを挟む
  5. お気に入り登録
  6. 評価
  7. 感想
  8. ここすき
  9. 誤字
  10. 閲覧設定

▲ページの一番上に飛ぶ
X(Twitter)で読了報告
感想を書く ※感想一覧 ※ログインせずに感想を書き込みたい場合はこちら
内容
0文字 10~5000文字
感想を書き込む前に 感想を投稿する際のガイドライン に違反していないか確認して下さい。
※展開予想はネタ潰しになるだけですので、感想欄ではご遠慮ください。