マクロツイーター

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

例によって、暮れのご挨拶的な何か

2020年はイロイロとアレな年でしたが、「自分にとっての2020年」を振り返ってみました。

今年は

f:id:zrbabbler:20201231165007g:plain

ゆきだるま☃がいっぱい回る年でした(素敵🙂)

来年は

f:id:zrbabbler:20201231165058g:plain

ゆきだるま☃がもっといっぱい回る年になってほしいですね(素敵🙂)

* * *

ZR「いやー、やっぱり、半日でネタを仕上げるのは無理でしたねー」
*「だったら無理にブログ記事を書く必要ないじゃん!」
ZR「というわけで、来年も当(くだらない)ブログをよろしくお願いします!」

今年も Merry TeXmas! ― \end{texadvent2020}

f:id:zrbabbler:20201122184755g:plain
TeX & LaTeX アドベントカレンダー 2020
*  *  *

アドベントカレンダー完走!

^^`^^;^^`\^^$^^%^^&\!^^;\^^$^^%^^&^^=^^`\!\^^:#1^^;^^=^^`%^^'^^`1~^^`^^"
\!\[{^^2}\!\<{%% --:--:--:--:--:--:--:-- 2 @ 2 @ --:--:--:--:--:--:--:--
\^^#^^3^^.^^!^^-^^%}\!\]{^^3}\^^:?\!\>{\^^%^^.^^$^^#^^3^^.^^!^^-^^%}%**%
\!\={\^^,^^%^^4}\=\?\^^#^^!^^4^^#^^/^^$^^%\=\#\^^:\?`*\?`\^\?`.\?`\*%[#\
\?`/\?`\^\!\|{^^5}\=\@\^^%^^$**%**&\?`\@\?`//*\=\+%+5.//)=\?..{**!};@^^:
\..!^^$//6..!^^.//#..%\=\&\..'//,^^/.."^^!//,\#6\=\%\^^,**#..#///..$**%%
\@\_{\<..,**/..7^^%\[^^#..!\]..%\>}\!\^^!{\?\(\?`+\%\(\)\+\(\@^^.//%%7;)
\+\)\@**.^^%}\=\^^"\**!\=\^^#\..!\!\..${\^^!\**"\..#}\=\..%\..$%.:8:*:8:
\@\({\**$//!**9}\@\){\<//9..%**!\[\>}\!\**'{{\)`/\+\)\@...**%\(\)\+\(\)%
\//$\..%\^^!\..$\+\)\?`\^\//$\^^%\_{\&\!\..:@^^:{%%.(.**$!\\;//:%@>./++.
^^%**,//&..$**&^^/^^&^^#//'..%//&//-**&^^%..&**.//'//$//&//#..&**,**&**!
//'..#..'..#**'//+^^'^^#..'**$//&//!..&**.//&^^$^^&**!//&**,**&**/..&...
**&**%**'//-^^%^^,..'^^%..'**#..&**%^^'`//&**!..&//#**&^^+..&**!^^&^^'%^
**&^^%//'^^+**'//(**&//#//&///**&//,..&../**'//"**"..,**'^^$//&..)..&//+
..'..*.."^^,..'**#..&//#..'^^#..&...^^&/////'//'^^&..-//&..!//&^^...'//-
**%//,^^'..%**'..#..&..%**'^^$**&..)**&**+**'***//&..,**&^^)**&.."..'^^"
^^&^^!^^'**"**'**)^^'^^+**&..$//&//%//&**#..&/////'**"//&..!**'^^$^^&//)
//&..///&...^^'**#^^"**.//'^^$..&//%..'..(**'**$**'..-//%^^,..'`**&//!%/
//&//'^^&**%^^&..#//&../^^&**,//&../..'^^"^^'..+^^&//'**'^^"..&^^%..&^^%
//&//.//"..!**#**)^^#^^%^^"**!**'//"^^&..%..&//$//"**!**#//#..#`**"..!%*
//&^^"//&^^,..&//!//&^^#..&//+^^'..-..%//,^^&..#**&^^///&^^,//&/////'**"
..&//,^^&..%//'..$**'//+//&**&**&^^!**&..#..&**%..'**-**'..+//'//"^^&..%
**&..$//"..!//#**#..#`//"..!**'..)**&^^%**&**,^^&**,..&../..'^^'//"//!%.
..#//'..#`**'**-..%**,**&^^#^^&**/**&^^,..&^^/**'^^"//&//,..&..%..'//$%^
**'**+..&**)..&**...&..+//'**-..'//+**&^^&//&**!//&**#^^&**%**"..!^^#..#
..#`//"..!//&**"^^&**,^^&//!**&^^#..&**+//'..-//%//,**&...//&//%//'^^'%/
^^&^^#//&**/**&..-^^&..-^^&..!**&**.**&..$.."..*//'//+//%**,^^&^^&^^%..$
..'**-**'//+..%^^,^^&^^&..&^^/**&^^.**'//$**'//#//&^^)//'^^*..&//%^^'**+
**#^^!**#..$..'**-^^'**+**#`^^'..-**%**,//&..&..&///..&^^.//'^^$//&**&%*
**&^^!**&**-..&//)^^&**,**'..)//'..+**'`**&//(**'**&^^'//-**%//,//&^^&%/
^^&../**&**.**'//$**'^^#..&..%..'**"..&**)**&..%**'..#//'^^+//&**"..&..#
^^'^^-//%..,..'**#..&//%..&//,//&//%..&..#**'..$**&..&//&../..&**.//'//$
**'//-^^%^^,^^&**"^^&//%**&^^'**&^^)^^&^^.^^'**+//&**$//&../..&//#**'^^%
^^&//-^^&..%//&//.//'..$**'//-..%//,^^&**"^^&^^%..&//'**&..)^^&^^.^^'//+
..'//$..&//)..&**+//'*****'`//&..)^^&**#^^'**$//'..%**'^^"//&**%..'^^-%.
..%**,^^'**%**'**#//&**%//&**!**'..#..&//"^^&^^/**'**%**&//.//&..$**&..)
**&^^.^^&//'//&//"..&**/..'..(**"..(//#`.."..,^^#`//"^^)//'.."**&//%%^^)
**&^^#**'^^$**&..!//&^^.**&..'//&..,..&^^%//"^^(**#^^!..#`**"^^,^^#**!%.
**#`//"^^)//#..+^^%**,..&..&^^&..)//&..,//&^^,**%..+**&**&..&^^!//&//#%*
//&//%..%..-.."**(**#^^%.."//,^^#..%^^"**)**&//#^^&//)**'.."**&//#..&//,
^^&^^%//%..+//'.."..&^^!**&..$//&**)..'//%..'//#//#//-//#^^#.."...//#..%
..%..-**#**+**%^^,**'`..&..!//'^^$**&**(^^%^^+..&//)^^&//.^^&//+//"^^,%.
^^&../**'//%..'//$..#**-^^#..$^^#`**"**,..&**)//&//.**#**-//#**!//#^^$%^
^^#`.."^^,**&..$//&**%^^&//#**&///**'^^"^^&**!//'**$**&//%.."..,//&^^$%^
..&^^%**&^^#..&..///'**"**&..!..'**$**&**)^^&**/**&//...#..-//'**+..'..$
..&^^%..'..(**'^^$//"`..&//!**&..,^^&..///&^^...&**'**"`//'`//&**!%//(**
^^'^^$**&..(//"..,//'**$..&..%..'//(//'..$..#..-..'**+//'**,//%**,^^&**&
^^%^^$//'**,..%**#..$//%^^$..%**"`//%//)^^$..///%..%^^"`..$^^...$^^%%//-
//%^^(//%^^$.."`**%//)//$//%//$^^!..%..".."//!..'..-^^'..-**%**-^^"//(%*
^^#^^#**"//,//#^^&.."//)//'//$^^&**///"//(..#..'^^"//,..#//&//"^^)//#**+
//%^^,^^&**&^^&///**'**"//&**%^^&//!//&..#^^&..(^^%//,^^'**(**"`//&..)%/
**&//...'..+^^#^^#//"**.//#..'**"**,**#//&..".....#..#..'..-//'..+^^%//,
^^&^^.//&^^/**&..$**&^^%//%//+..'**$..&^^%//'^^(**'^^$..#..-^^&**)^^&^^.
//&//+..%^^-**&//!//'^^$**"**(..%//,^^'//(**"^^,//#..$.."^^.//#^^%^^"^^)
..'..+**%**,//'**#^^&^^#**'//#//&**.//&^^/..'^^'**&^^-**&//!**&.....%//+
//'//#..&**#..&^^!..&**,//&**%..#..-^^#//&**"//,**&.."**&**///&//$**'//)
^^"//,^^&//"..'..%..'..$^^'//$^^&..///&**.^^'**#**#..-^^&^^)//&//...&//+
//"^^,//&..-^^'//%^^&**&..&**&//&**,^^&//%**'^^"**#**-^^&**)**&^^.^^&..+
^^%//-..'^^-^^#..+**'..-..#^^+//%//,..&..%//&...**&..$**'^^+**'^^$..&**)
//&**+..'^^*//'`^^&**)..&//#..'//$..'**%^^'^^"^^&^^%..'//-**%//,//&**%%/
..&...^^&**$^^'**+..&**$//&../..&^^#//'^^%..&..-..&**%..&//.^^'..$**'//-
}}\//:*}\^^:$}\..'\(`../\+\(\?`\{\%`,=\(\+\(\?`\&\%`.=\(\+\(\?`\&\%`;=\(
\_{\@\^^!{,..$//&\|...**%\]^^#**!,..%**(^^%;}\@\^^"{\]**#**!^^..**/..+%)
//%^^.\]}\@\..%{**%;,..!^^.^^$//!**&.^^%\[}}{\<\**%\>\=\<\+\=\%%% __ __ 
\+\&\@\^^:@^^!{\&\=\%\<}}\**:@..!\<\^^%\>\=\%\.."\>\+\&\@%.^../%%  / |_>
\..:..:..$../{\<\.."\>{\<\..!\>{\..:@..:}}\#?}\#;}\^^:^^:^^$^^/%% /_ | \

(↑pdflatexでコンパイル)

というわけで、9回目の開催となる TeX & LaTeX Advent Calendar 2020 も、素敵なTeXネタを途絶えさせることなく例によって無事にクリスマスの日を迎えられました。今年の参加者は全部で19名、うち5名が初参加でした。参加者の皆様に心からの感謝を例によって捧げたいと思います。

今年の重点テーマは「このパッケージもスゴイ!」でした。改めて見返すと、テーマに沿った記事が割と多く、たくさんのパッケージが紹介されました。その一覧をあげておきます。

  • bxpdfver
  • fewerfloatpages
  • hmtrump
  • jlreq-deluxe
  • manfnt
  • mathabx
  • mleftright
  • pdfx
  • pxchfon
  • pxjodel
  • qrcode
  • scsnowman
  • scsnowman+
  • tcsushihead
  • tegaki
  • tikzducks

TeX & LaTeX Advent Calendar 2020 を楽しんでくれた皆さんに、

例によってありがとう!

そして

*  *  *

*「やっぱり……」
ZR「例によって……」
*「………………」

徹底検証! SATySFiはLaTeXの代わりになるか

これは「SATySFi Advent Caleandar 2020」の22日目の記事です。
(21日目は bd_gfngfn さん、23日目は amutake さん です。)

時の経つのは早いもので、SATySFiもその正式公開1からもう2年以上も経っています。この間にSATySFiを取り巻くエコシステム(例えばパッケージマネージャであるSatyrographosなど)も徐々にではありますが整えられつつある状況です。

今の状況に至ったところで、改めて「SATySFiの元来の目的」について思い返してみましょう。

そう、SATySFiは「LaTeXを置き換える」ことを目的にして開発されたのでした。

現状のSATySFiは「LaTeXを置き換える存在」になっているのでしょうか?

そもそもLaTeXとは何だったのか

この疑問に答えるには、まずLaTeXの存在意義」という究極の問いについて考察する必要があります。LaTeX(拡張エンジンを含む)を使うと数式や日本語や英語などを高い組版品質をもって出力できるわけですが、LaTeXは究極的に何のためにあるのでしょうか?

極めて本質的な答えですね。しかし最近は状況が少し変わっています。

このように、最近では単に☃を出力するだけでは不十分で、☃を回転させることまで要求されるようになっています。

まとめると、LaTeXの目的は究極的には「☃を回すこと」であると結論づけて間違いないでしょう2

SATySFiで☃を回せそうにない話

LaTeXの目的についての本質的な理解が得られたところで、いよいよSATySFiについて考えてみます。果たしてSATySFiで「☃を回すこと」は可能でしょうか。

LaTeXでは「PDF上でのアニメーション」を実現するためのanimateというパッケージがあり、また、この機能を利用して「テキストを回転させる」ためのtcfaspinというパッケージが作られています。tcfaspinを使うことで簡単に☃を回転できます。

一方で、SATySFiには現状で「PDF上でのアニメーション」を実現するための機能が欠けています。このためSATySFi上でfcfaspinに相当するパッケージを実装することは、残念ながら現状では不可能です。やはり、SATySFiはLaTeXを置き換える存在にはなりえないのでしょうか。

それでもSATySFiで☃を回したい話

一見して絶望的な状況ですが、ここでまた最近のLaTeXのトレンドを見てみると、希望が見えてきます。

すなわち、LaTeXの主戦場が最近ではPDF文書からGIFアニメ画像に移行しつつあるといっても過言ではないでしょう3

とはいっても、LaTeXエンジンにGIFアニメ画像を出力する機能はありません。「LaTeXでGIF画像をつくる」にはtcspingifという補助のスクリプトを利用する必要があります。

このtcspingifは「普通の(静止した)複数のPDF画像からGIFアニメ画像に変換する」という処理を行うものです。そのことを考えると、SATySFiについても可能性が見えてきます。tcspingifをSATySFiに対応させればよさそうです。

tcspingifで「TeX以外」する話

というわけで、tcspingifを少し改修してみました。

今まで、エンジン(-eオプション)にはLaTeXのコマンドを指定することのみを想定していましたが、ここで任意のコマンドを指定することにします。この場合、オプションの指定の方式がLaTeX用のものだと不便なので、もう少し汎用的な呼出形式を--interface=envで選択できるようにしました。

従来(既定値の--interface=latexを指定した時)は「nフレーム中のmフレーム目」のPDF画像を生成するのに特定の呼出形式でLaTeXのコマンドを起動していた(参考)のですが、--interface=envを指定すると代わりに以下のコマンド行が実行されるようになります。

<コマンド名> <入力ファイル> <一時出力ファイル>
  • <コマンド名>-eオプションの値。
  • <入力ファイル>はtcspingifに与えた入力ファイル名。
  • <一時出力ファイル>はこのコマンドが出力すべきPDF画像のファイル名。(実際のtcspingifの実行中には自動生成のファイル名が指定される。)
  • 以下の環境変数の値が設定される:
    • FASTOPTICKS:上の説明中の「m」の値。
    • FAALLTICKS:上の説明中の「n」の値。

すなわち、上記の規約を満たすプログラムを作成して、そのコマンド名を-eに指定すればいいわけです。

tcspingifでSATySFiする話

tcspingifの新機能に基づいて、「SATySFIでフレーム画像を生成する」仕組をつくってみます。次のような仕様にします。

  • 入力ファイルは「SATySFiのパッケージファイル(*.satyh)」とする。
  • パッケージの中で以下の函数frameを定義する必要がある。
    • frame: int → int → document
      framem n は出力したいGIFアニメ画像の「​n フレーム中の m フレーム目」の画像を表す文書。

この仕様とtcspingifの仕様を繋ぐためのシェルスクリプトを用意します。

[tcsg-satysfi]
#!/bin/bash
set -eu

if [[ ! ( $# == 2 && -f $1 ) ]]; then
  exit 1
fi
stop=$((${FASTOPTICKS}))
all=$((${FAALLTICKS}))
ibase=${1%.satyh}
obase=${2%.pdf}
if [[ ! ( 0 -le $stop && $stop -lt $all &&\
    $1 != $ibase && $2 != $obase ) ]]; then
  exit 1
fi

cat <<EOT >$obase.saty
@import: $ibase
frame $stop $all
EOT
${SATYSFI:-satysfi} $obase.saty

if [[ ! -f $2 ]]; then
  exit 1
fi
rm $obase.saty
  • tcsg-satysfi(Gist/zr-tex8r)
    ※ファイル名をtcsg-satysfi.shtcsg-satysfiに変更すべき。

SATySFiでとにかく☃を回す話

これで準備は整ったので、いよいよ☃を回すことにしましょう。必要なのは、「☃を回す」ためのパッケージファイルを作ることです。そこで、次のようなframe函数を定義するscframeパッケージを実装します。

  • framem n」は時計回りに (​m​/​n​) 回転分だけ傾いた☃の絵を中央に配置した文書を作る。

この仕様は現在のSATySFiで十分に実装可能です。

新版のtcspingifとtcsg-satysfiを実行可能にした上で、scframe.satyhを置いたディレクトリで以下のコマンドを実行しましょう!

tcspingif -e tcsg-satysfi --interface=env -t 32 -b 2 scframe.satyh

次のように端末に表示された上で、結果のGIFアニメ画像ファイルscframe.gifが出力されました。

$ tcspingif -e tcsg-satysfi --interface=env -t 32 -b 2 scframe.satyh
tcspingif: convert: scframe.satyh -> scframe.gif
tcspingif: parameters: density=72; ticks=32
tcspingif: generate frame: 0
tcspingif: generate frame: 1
tcspingif: generate frame: 2
……(略)……
tcspingif: generate frame: 31
tcspingif: generate gif: scframe.gif

scframe.gifを表示させてみると……。

f:id:zrbabbler:20201220013805g:plain
回転する☃(素敵😊)

SATySFiで☃を回せました!

まとめ

やっぱり「回転する☃」はトッテモ素敵😊


  1. 2017年度の未踏事業成果報告会があった2018年2月11日を正式公開の日と見なすことにする。

  2. 異論については地中深くに10万年くらい埋めておくことにしましょう。

  3. 異論については地中深くに10万年くらい埋めておくことにしましょう。

例によってアドベントがはじまった ― \begin{texadvent2020}

f:id:zrbabbler:20201122184755g:plain
TeX & LaTeX アドベントカレンダー 2020

TeX界における年末の恒例イベントとなったような気もするアドベントカレンダーが今年も始まりました。

重点テーマ

今年の重点テーマはコレです。

このパッケージもスゴイ!

スゴイLaTeXパッケージ、いっぱいありますね。その中には、スゴイけどあまり知られていないものもあるでしょう。「このパッケージはもっと普及すべきだ」と思うパッケージを紹介してしまいましょう!

※例によって、重点テーマは「必須」ではありません。あらゆるTeXネタを歓迎しております。

で、初日のネタは

こちらになります。

まだ参加できます!

TeX & LaTeX Advent Calendar 2020(#texadvent2020)は

まだまだ参加者募集中です。

LaTeXなネタ、TeX言語なネタ、アレなネタ、アレレなネタ、アレアレなネタ、ア~レ~なネタ、アレッアレなネタ、超絶アレなネタ、その他ナントカカントカ、お持ちの方はぜひぜひ、

ご参加おねがいします!

いつの間にかもう空きが残りわずかとなっています。登録はお早めに!

例によって去年のアレ(アレ)を振り返ってみる

f:id:zrbabbler:20201122184755g:plain
TeX & LaTeX Advent Calendar 2020

昨年(2019年)の「TeX & LaTeX Advent Calendar」はこんな感じでした。

12/01emojifreakLuaTeXでカラーフォント・絵文字✌(SVG/COLR/CBDT)
12/02t-kemmochixfakebold.styの紹介
12/03p_typoPre-Announcement
12/04ToshioCPLinux, LaTeX, Beamer and Tikz
12/05CareleSmith9[TeX] fontspec について。
12/06uwabamiTeX on Debian 10 (Buster)
12/07やまいjlreqでの箇条書きのインデント調整に関して。
12/08trueroadLuaTeXで原ノ味フォントを使う
12/09munepiぼくのかんがえたさいきょうのLaTeX索引スタイルファイル
12/10mod_poppoTeXConf 2019向けのClutTeX発表資料 | 雑記帳
12/11doraTeXTikZ でベン図をたくさん描いてみよう!
12/12TANNOGitLab を利用して LaTeX 文書を作成する話
12/13mattskalapgfornamentとTsukurimashouでディングバットを書いて
12/14hak7a3TeX言語でレイトレーシングを実装する話
12/15aminophenpTeX のペナルティと LuaTeX-ja のペナルティ
12/16keisuke495500日本列島をLaTeXで表示させたかったのでSVGをTikZに変換するプログラムを作った
12/17t-kemmochiLaTeXの数式を映えさせる
12/18XsLaTeXで目次のカスタマイズをしてみた
12/19hid_alma1026技術書典7で頒布した同人誌の公開
12/20えぬぬんどうしてLaTeXを使うのか、もう一度考えてみる
12/21ToshioCP書籍作成の支援ツール
12/22puripuri2100TeXConf 2019の供養
12/23wtsnjpLuaTeX の普及状況を LuaTeX で調べてみた
12/24golden_luckyTeXの脚注をなんとかする
12/25zr_tex8rマクロとプリミティブの間の壁を打破せよ―LuaTeXで“1回展開”のマクロを定義する話

というわけで、今年はこれを微塵も参考にせずに、自分が素敵だと思うネタを全力でぶつけていきましょう!

今年も例によってTeXでAdvent Calendarする件について

例によって!!

f:id:zrbabbler:20201122184755g:plain
TeX & LaTeX Advent Calendar 2020

TeXLaTeX Advent Calendar 2020

とっておきのTeXLaTeXネタを皆で持ち寄って楽しむ
TeXLaTeX Advent Calendar」
今年で9回目の開催となります。
皆さんの、心をこめた素敵なネタを例によってお待ちしております!
ハッシュタグは「#texadvent2020
TeXLaTeX 初心者大歓迎。 (重要)
TeXLaTeX 非初心者大歓迎。

例によって……コレです!

今年の重点テーマ

今年の重点テーマはコレです。
「このパッケージもスゴイ!」

重点テーマを設定しはじめたのは2014年で、そのときのテーマが 「このパッケージがスゴイ!」でした。 それから6年の時が経ち、新しいパッケージが続々と生まれています。 皆さんの推しパッケージの魅力を存分に語りましょう! 。

スゴイパッケージを知ってるぞ、という人は是非ともそのスゴさを語りましょう。スゴイパッケージが思いつかないという人は、自分でスゴイパッケージをつくってそれを紹介しましょう!(えっ)

例によって「重点テーマ」は「制限」ではありません。

(前略)……以下の何れかテーマに該当する何かを書きます。

「このパッケージもスゴイ!」に大いに関連するTeXLaTeXネタ。
「このパッケージもスゴイ!」にチョット関連するTeXLaTeXネタ。
「このパッケージもスゴイ!」にサッパリ関連しないTeXLaTeXネタ。

このように、例によって以前と同じく、TeXに関連するもの(LaTeX、plain TeX、ConTeXt、llmk、learnlatex.org、Overleaf、Cloud LaTeX、……)なら何でも構いません。

例によって、寒い冬を乗り越えましょう☃︎

「1TeXのロゴ」をSATySFiしたい話

今日は、皆さんお待ちかねの、きりたんぽの日

というわけで早速、SATySFiで「1TeXのロゴ」を出力してみましょう!

texlogoパッケージを使って解決しない話

「SATySFiでTeX関係のロゴ」というと一昨年のクリスマスのネタにありましたね。

というわけで早速……アレ?

f:id:zrbabbler:20201110142612p:plain
texlogoで出力できるロゴの一覧表(test.pdfより)

\OneTeX がない……。(ざんねん🙃)

結局自力で解決する話

仕方がないので、作ってみた。

@require: stdja

let-inline ctx \OneTeX =
  let size = get-font-size ctx in
  let krn r = inline-skip (0pt -' size *' r) in
  let f = read-inline ctx in
  let fE = ctx |> set-manual-rising (0pt -' (size *' 0.15))
               |> read-inline in
  let dsone = math-char MathOrd (string-unexplode [0x1D7D9]) in
  let one = embed-math (set-font-size (size *' 1.44) ctx) dsone in
    one ++ krn 0.2 ++ f {T} ++ krn 0.125 ++ fE {E} ++ krn 0.08 ++ f {X}

in

document (|
  title = {今日はきりたんぽの日!};
  author = {某ZR(アレ)};
  show-title = false; show-toc = false;
|) '<
  +p {I love \OneTeX;!}
>

f:id:zrbabbler:20201110142907p:plain
出力結果

1TeX!1

まとめ

こんなことをやってる場合じゃない(自明)


  1. LaTeXで出力したときのロゴと比べると「1」のフォントが違うが、黒板太字の一種であるのでこれで正当である。