2020年はイロイロとアレな年でしたが、「自分にとっての2020年」を振り返ってみました。
今年は
ゆきだるま☃がいっぱい回る年でした(素敵🙂)
来年は
ゆきだるま☃がもっといっぱい回る年になってほしいですね(素敵🙂)
ZR「いやー、やっぱり、半日でネタを仕上げるのは無理でしたねー」
*「だったら無理にブログ記事を書く必要ないじゃん!」
ZR「というわけで、来年も当(くだらない)ブログをよろしくお願いします!」
2020年はイロイロとアレな年でしたが、「自分にとっての2020年」を振り返ってみました。
ゆきだるま☃がいっぱい回る年でした(素敵🙂)
ゆきだるま☃がもっといっぱい回る年になってほしいですね(素敵🙂)
ZR「いやー、やっぱり、半日でネタを仕上げるのは無理でしたねー」
*「だったら無理にブログ記事を書く必要ないじゃん!」
ZR「というわけで、来年も当(くだらない)ブログをよろしくお願いします!」
アドベントカレンダー完走!
^^`^^;^^`\^^$^^%^^&\!^^;\^^$^^%^^&^^=^^`\!\^^:#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名が初参加でした。参加者の皆様に心からの感謝を例によって捧げたいと思います。
今年の重点テーマは「このパッケージもスゴイ!」でした。改めて見返すと、テーマに沿った記事が割と多く、たくさんのパッケージが紹介されました。その一覧をあげておきます。
TeX & LaTeX Advent Calendar 2020 を楽しんでくれた皆さんに、
例によってありがとう!
そして
*「やっぱり……」
ZR「例によって……」
*「………………」
時の経つのは早いもので、SATySFiもその正式公開1からもう2年以上も経っています。この間にSATySFiを取り巻くエコシステム(例えばパッケージマネージャであるSatyrographosなど)も徐々にではありますが整えられつつある状況です。
今の状況に至ったところで、改めて「SATySFiの元来の目的」について思い返してみましょう。
初心忘るべからず。#satysfi #TeX以外 pic.twitter.com/RPvhgwPYzv
— 某ZR(ざんねん🙃) (@zr_tex8r) 2020年11月8日
そう、SATySFiは「LaTeXを置き換える」ことを目的にして開発されたのでした。
現状のSATySFiは「LaTeXを置き換える存在」になっているのでしょうか?
この疑問に答えるには、まず「LaTeXの存在意義」という究極の問いについて考察する必要があります。LaTeX(拡張エンジンを含む)を使うと数式や日本語や英語などを高い組版品質をもって出力できるわけですが、LaTeXは究極的に何のためにあるのでしょうか?
LaTeXなんて、ゆきだるま☃さえ出力できればいいんですよ#TeX #えっ
— 某ZR(ざんねん🙃) (@zr_tex8r) 2016年3月9日
極めて本質的な答えですね。しかし最近は状況が少し変わっています。
新しいLaTeXがイロイロと🍣なので、☃を回すしかない……😫 #ナントカ pic.twitter.com/IMcB8QaUYd
— 某ZR(ざんねん🙃) (@zr_tex8r) 2020年9月13日
正立☃️→倒立☃️→回転☃️
— ワトソン (@wtsnjp) 2020年5月10日
という展開があったようだ.#ナントカ #ナントカ考古学
このように、最近では単に☃を出力するだけでは不十分で、☃を回転させることまで要求されるようになっています。
まとめると、LaTeXの目的は究極的には「☃を回すこと」であると結論づけて間違いないでしょう2。
LaTeXの目的についての本質的な理解が得られたところで、いよいよSATySFiについて考えてみます。果たしてSATySFiで「☃を回すこと」は可能でしょうか。
LaTeXでは「PDF上でのアニメーション」を実現するためのanimateというパッケージがあり、また、この機能を利用して「テキストを回転させる」ためのtcfaspinというパッケージが作られています。tcfaspinを使うことで簡単に☃を回転できます。
一方で、SATySFiには現状で「PDF上でのアニメーション」を実現するための機能が欠けています。このためSATySFi上でfcfaspinに相当するパッケージを実装することは、残念ながら現状では不可能です。やはり、SATySFiはLaTeXを置き換える存在にはなりえないのでしょうか。
一見して絶望的な状況ですが、ここでまた最近のLaTeXのトレンドを見てみると、希望が見えてきます。
美文書第☃︎版「現代的なTeX(LuaTeXなど)の出力形式はPDFというもので、Adobe Readerなどのソフトウェアで開いて中身をみられますが、ツイッタァーに上げるためにはPNGやGIFなどの画像形式に変換する必要があります」#TeX #ナントカ #えっ
— 某ZR(ざんねん🙃) (@zr_tex8r) 2020年8月18日
すなわち、LaTeXの主戦場が最近ではPDF文書からGIFアニメ画像に移行しつつあるといっても過言ではないでしょう3。
とはいっても、LaTeXエンジンにGIFアニメ画像を出力する機能はありません。「LaTeXでGIF画像をつくる」にはtcspingifという補助のスクリプトを利用する必要があります。
このtcspingifは「普通の(静止した)複数のPDF画像からGIFアニメ画像に変換する」という処理を行うものです。そのことを考えると、SATySFiについても可能性が見えてきます。tcspingifをSATySFiに対応させればよさそうです。
というわけで、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でフレーム画像を生成する」仕組をつくってみます。次のような仕様にします。
*.satyh
)」とする。frame
を定義する必要がある。
frame
: int → int → documentframe
m n は出力したいGIFアニメ画像の「n フレーム中の m フレーム目」の画像を表す文書。この仕様とtcspingifの仕様を繋ぐためのシェルスクリプトを用意します。
#!/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.sh
→tcsg-satysfi
に変更すべき。これで準備は整ったので、いよいよ☃を回すことにしましょう。必要なのは、「☃を回す」ためのパッケージファイルを作ることです。そこで、次のようなframe
函数を定義するscframeパッケージを実装します。
frame
m 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を表示させてみると……。
SATySFiで☃を回せました!
やっぱり「回転する☃」はトッテモ素敵😊
TeX界における年末の恒例イベントとなったような気もするアドベントカレンダーが今年も始まりました。
今年の重点テーマはコレです。
このパッケージもスゴイ!
スゴイLaTeXパッケージ、いっぱいありますね。その中には、スゴイけどあまり知られていないものもあるでしょう。「このパッケージはもっと普及すべきだ」と思うパッケージを紹介してしまいましょう!
※例によって、重点テーマは「必須」ではありません。あらゆるTeXネタを歓迎しております。
こちらになります。
TeX & LaTeX Advent Calendar 2020(#texadvent2020)は
まだまだ参加者募集中です。
LaTeXなネタ、TeX言語なネタ、アレなネタ、アレレなネタ、アレアレなネタ、ア~レ~なネタ、アレッアレなネタ、超絶アレなネタ、その他ナントカカントカ、お持ちの方はぜひぜひ、
ご参加おねがいします!
いつの間にかもう空きが残りわずかとなっています。登録はお早めに!
昨年(2019年)の「TeX & LaTeX Advent Calendar」はこんな感じでした。
12/01 | emojifreak | LuaTeXでカラーフォント・絵文字✌(SVG/COLR/CBDT) |
12/02 | t-kemmochi | xfakebold.styの紹介 |
12/03 | p_typo | Pre-Announcement |
12/04 | ToshioCP | Linux, LaTeX, Beamer and Tikz |
12/05 | CareleSmith9 | [TeX] fontspec について。 |
12/06 | uwabami | TeX on Debian 10 (Buster) |
12/07 | やまいも | jlreqでの箇条書きのインデント調整に関して。 |
12/08 | trueroad | LuaTeXで原ノ味フォントを使う |
12/09 | munepi | ぼくのかんがえたさいきょうのLaTeX索引スタイルファイル |
12/10 | mod_poppo | TeXConf 2019向けのClutTeX発表資料 | 雑記帳 |
12/11 | doraTeX | TikZ でベン図をたくさん描いてみよう! |
12/12 | TANNO | GitLab を利用して LaTeX 文書を作成する話 |
12/13 | mattskala | pgfornamentとTsukurimashouでディングバットを書いて |
12/14 | hak7a3 | TeX言語でレイトレーシングを実装する話 |
12/15 | aminophen | pTeX のペナルティと LuaTeX-ja のペナルティ |
12/16 | keisuke495500 | 日本列島をLaTeXで表示させたかったのでSVGをTikZに変換するプログラムを作った |
12/17 | t-kemmochi | LaTeXの数式を映えさせる |
12/18 | Xs | LaTeXで目次のカスタマイズをしてみた |
12/19 | hid_alma1026 | 技術書典7で頒布した同人誌の公開 |
12/20 | えぬぬん | どうしてLaTeXを使うのか、もう一度考えてみる |
12/21 | ToshioCP | 書籍作成の支援ツール |
12/22 | puripuri2100 | TeXConf 2019の供養 |
12/23 | wtsnjp | LuaTeX の普及状況を LuaTeX で調べてみた |
12/24 | golden_lucky | TeXの脚注をなんとかする |
12/25 | zr_tex8r | マクロとプリミティブの間の壁を打破せよ―LuaTeXで“1回展開”のマクロを定義する話 |
例によって!!
TeX & LaTeX Advent Calendar 2020
とっておきのTeX/LaTeXネタを皆で持ち寄って楽しむ
「TeX & LaTeX Advent Calendar」
今年で9回目の開催となります。
皆さんの、心をこめた素敵なネタを例によってお待ちしております!
※ ハッシュタグは「#texadvent2020」
※ TeX/LaTeX 初心者大歓迎。 (重要)
※ TeX/LaTeX 非初心者大歓迎。
例によって……コレです!
今年の重点テーマ
今年の重点テーマはコレです。
「このパッケージもスゴイ!」重点テーマを設定しはじめたのは2014年で、そのときのテーマが 「このパッケージがスゴイ!」でした。 それから6年の時が経ち、新しいパッケージが続々と生まれています。 皆さんの推しパッケージの魅力を存分に語りましょう! 。
スゴイパッケージを知ってるぞ、という人は是非ともそのスゴさを語りましょう。スゴイパッケージが思いつかないという人は、自分でスゴイパッケージをつくってそれを紹介しましょう!(えっ)
例によって「重点テーマ」は「制限」ではありません。
(前略)……以下の何れかテーマに該当する何かを書きます。
「このパッケージもスゴイ!」に大いに関連するTeX/LaTeXネタ。
「このパッケージもスゴイ!」にチョット関連するTeX/LaTeXネタ。
「このパッケージもスゴイ!」にサッパリ関連しないTeX/LaTeXネタ。
このように、例によって以前と同じく、TeXに関連するもの(LaTeX、plain TeX、ConTeXt、llmk、learnlatex.org、Overleaf、Cloud LaTeX、……)なら何でも構いません。
例によって、寒い冬を乗り越えましょう☃︎!
今日は、皆さんお待ちかねの、きりたんぽの日!
というわけで早速、SATySFiで「1TeXのロゴ」を出力してみましょう!
「SATySFiでTeX関係のロゴ」というと一昨年のクリスマスのネタにありましたね。
というわけで早速……アレ?
\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;!} >
1TeX!1
こんなことをやってる場合じゃない(自明)
Online.アレ の発表スライドが完成する気が全くしない😱 #ヤバい #TeX
— 某ZR(ざんねん🙃) (@zr_tex8r) 2020年11月10日