ラベル TeX の投稿を表示しています。 すべての投稿を表示
ラベル TeX の投稿を表示しています。 すべての投稿を表示

2026年7月6日月曜日

TikZのカメ(4)

TikZのカメ(3)からの続き


図:Claudeが生成したクサガメのTikZ

アンソロピックが,クロードミュトス相当で牙を抜いたバーションである クロード フェイブル(Fable 5) を6月9日にリリースし,6月22日までは一般のサブスクリプションユーザも使えるとアナウンスがあった。(P. S. その後,米政府によって,6月13日に停止,7月1日から再開 7月7日までサブスクリプションユーザが使える)

早速試してみようと,次の課題を与えた。

Q(koshix):
これらのイメージを参考にして,クサガメのなるべく精緻でリアルなイメージを再現できるtikzコードを下さい。(クサガメの写真2枚とイラスト2枚を添付した)

途中で,Opus 4.8  に切り替えられてしまった。どこがまずかったのかはよくわからない。その結果のTikZコードで描画したのが上図である。前回のGemini3 Pro とそれほどレベルはかわらない。こんなものか。




写真:クサガメのカメキチの近影(2026.6.3撮影)


2026年6月3日水曜日

MediaWiki(3)

MediaWiki(2)からの続き

前回は,Fisica WikiにMathJaxの設定をしたところだった。新しく知ることになったRaTeXのインストール過程で,MathJax代替にはKaTeXというJavascriptライブラリを使うのがよいと教えられた。MathJaxより若干表現範囲は狭いが,高速で自己完結していて十分だとのことだ。

そこで,Fisica WikiにKaTeXを導入することにした。koshix.blogspot.com はとりあえずMathJaxのままにしておく。GeminiにKaTeXの設定方法を尋ねたところ,具体的には次のようなことだ。

(1) Commons.jsを修正する。
/* KaTeXの読み込みと自動実行 */
(function() {
    // CSSの追加
    var link = document.createElement('link');
    link.rel = 'stylesheet';
    link.href = 'https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css';
    document.head.appendChild(link);

    // JSの追加
    var script = document.createElement('script');
    script.src = 'https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js';
    script.onload = function() {
        var autoRenderScript = document.createElement('script');
        autoRenderScript.src = 'https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js';
        autoRenderScript.onload = function() {
            renderMathInElement(document.body, {
                delimiters: [
                    {left: "\$\$", right: "\$\$", display: true},
                    {left: "\$", right: "\$", display: false}
                ]
            });
        };
        document.head.appendChild(autoRenderScript);
    };
    document.head.appendChild(script);
})();

(2) ただし,このままではセキュリティの問題でブロックされるので,さくらインターネットレンタルサーバーのコントロールパネルのセキュリティで,WAFを一端無効化してから作業して,有効化に戻すことに注意する。

(3) LocalSettings.php の確認(Extension:Math を使っている場合)
もし「Math拡張機能」自体を導入して MathJax モードに設定している場合は、そちらの設定も変更する必要がある。Extension:Mathを使っていたのでコメントアウトした。

数式は正しく表示され,<math>E = h \nu</math> のようなものは,レンダリングされなくなった。それはそれで,従来のソースと矛盾するので,再度復活させることにした。うーん,結局KaTeXは意味があったのかな?

2026年5月31日日曜日

RaTeX

MathJaxで数式表示(2)からの続き



図:RaTeXデモ(Githubのdemoページから引用)


Twitter(x.com)で,他言語の記事が自動翻訳されて流通するようになった結果,自分のエコーチェンバーには数学や情報や物理系の記事が増えてきて,それはそれで結構な話だ。そのなかで,Rustでかかれ,モバイル端末でも使える軽量な数式レンダリングエンジンRaTeXの話題があった。JavaScriptやブラウザ(WebView)を介さず、ネイティブ環境で数式をPNGやSVG,PDFとして出力できる。

さっそくChatGPTに頼んで試したところ,イマイチでつまづいたので,Geminiでやりなおした。

前回のどさくさ(アレコレたいへん)で消えてしまったRustを,ChatGPTが,homebrewでインストールしてしまったので,それやらRaTeXディレクトリを削除するところからやり直しになった。homebrew版ではなく,オリジナルからインストールの方がいろいろメリットがあるそうだ。

brew uninstall rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
1) Proceed with installation (default)
source $HOME/.cargo/env
rustc --version
rustc 1.95.0 (59807616e 2026-04-14)
cargo --version
cargo 1.95.0 (f2d3ce0bd 2026-03-21)
git clone https://github.com/erweixin/RaTeX.git
cd RaTeX
cargo build --release
echo 'y = ax^2 + bx + c' | cargo run --release -p ratex-render
echo 'E = mc^2' | cargo run --release -p ratex-svg --features "cli standalone" -- --output energy.svg
cargo run --release -p ratex-svg --features "cli standalone" << 'EOF'
\begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} ax+by \\ cx+dy \end{pmatrix}
EOF

ということで,pngもsvgもなんとか生成された。こんな感じで短いLaTeX断片をレンダリングすることは容易にできるようだ。さっそく,このsvgファイルをblogspotに埋め込めないかを聞いたところ。svgファイル(テキスト)を<svg></svg>タグで挟めばいいだけだと。

ところが,生成された行列のsvgファイルをみると分けの分からない数字が大量にならんでいる。もちろん,描画は成功している。どうやら文字コードではなくて,それを線画として描画するときの情報がsvg化されているようだ。それはあまりうれしくないので,blogspotへの適用はやめになった。


2026年2月25日水曜日

TikZのカメ(3)

TikZのカメ(2)からの続き

Geminiの思考モードは,例の評判の Gemini3 らしい。それで画像を生成するとこれまた評判のNanoBanana Pro が発動するらしい。というのも本人に聞いても,自分のバージョンについては口を閉ざすからだ。

いつものようにTikZのカメを描画させてその性能をチェックする。今回はカメ(クサガメ)と指定したところ,これまでよりも一段とリアルに近づけようと,背中に3本のキールがあって,頭部に黄色い模様があるといいだした。確かにそうだ。

色合いが濃すぎてみにくかったので,そこだけ手動で修正したのが下記の右図だ。左図は出来ましたといった結果のTikZスニペットのあとに向こうが提示してきた画像。しっぽが首側からでていてキールが1本しかないなど若干問題はあるが,顔と指先は似ているかも知れない。


図:Gemini3 Pro?によるTikZのクサガメ(右)

2025年11月12日水曜日

五芒星

真鍋さんがMIPOで sin π/5 の求め方を書いていた。

最初の代数的方法は,sin n x の一般式(n倍角の公式)を使うとよい(ド・モアブルの定理経由)。つまり,sin 5θ = 16 sin^5θ - 20 sin^3θ + 5 sinθ。θ=π/5を代入すると,x=sinθとして,16x^4-20x^2+5 = 0というxの4次方程式(x^2の2次方程式)がでてきてすぐに納得できた(といってもn倍角の公式導出はChatGPTに頼ったけれど・・・)。

一方2番目の幾何学的な方法は,正五角形と五芒星をかいてθ=π/5=36度の鋭角を持った直角三角形の相似条件から求めるというもので,それを前提に自分でも考えてみようとしたけれど,中々思いつかない。しかたがないので,ちゃんと図を描いてみようとしたが,フリーハンドではわかりにくい。

そこで,ChatGPT-5 Thinking にTikZでの作成を依頼した。こんな感じで。

Q(koshix):
LatexのTikZを使って次の作図をしてください。
(1) 薄いグレイドットの1cmグリッドが入ったxy座標系をとって,以下の図形はy>=0の領域だけ描画する。
(2) 原点を中心として半径6cmの円
(3) 原点を中心として中心から頂点までの距離が6cmの正五角形 。ただし,1つの頂点は(6,0) におく。 
(4) 各頂点をすべて結んで五芒星になるようにする。
(5) 原点にO,(6,0)の頂点をA,反時計回りの頂点を,B,Cとラベルする。
(6) 原点から辺ABに垂線ODを降ろす。
(7) OBとACが直交している交点をEとする。
以上よろしくお願いします。
(その後,ODとACの交点F,FからAOに降ろした垂線の足Gを追加した。)

結果のTikZをチューニングしたものが以下のコードである。

\begin{tikzpicture}[scale=1.0]

% 1cmグリッド(薄いグレードット)
\draw[step=1cm,black!50,dotted] (0,0) grid (7,7);

% 座標軸
\draw[gray!50,->] (0,0) -- (7,0) node[right] {$x$};
\draw[gray!50,->] (0,0) -- (0,7) node[above] {$y$};

% 点の定義
\coordinate (O) at (0,0);
\coordinate (A) at (6,0);                        % (6,0)
\coordinate (B) at ({6*cos(72)},{6*sin(72)});    % 72°
\coordinate (C) at ({6*cos(144)},{6*sin(144)});  % 144°
\coordinate (Dfull) at ({6*cos(216)},{6*sin(216)});
\coordinate (Efull) at ({6*cos(288)},{6*sin(288)});

% 半径6cmの円
\draw[gray!50] (O) circle (6);

% 正五角形(外接円半径6)
\draw[gray]  (A) -- (B) -- (C) -- (Dfull) -- (Efull) -- cycle;

% 五芒星(頂点を全て結ぶ)
\draw  (A) -- (C) -- (Efull) -- (B) -- (Dfull) -- cycle;

% Oから頂点A,Bへの線
\draw[thick, blue] (O)--(A);
\draw[thick, blue] (O)--(B);
  
% Oから辺ABへの垂線 OD
\coordinate (D) at ($(A)!(O)!(B)$);
\draw[thick,blue,dashed] (O) -- (D);

% OB と AC の交点 E(OB ⟂ AC)
\path[name path=OB] (O) -- (B);
\path[name path=AC] (A) -- (C);
\path[name intersections={of=OB and AC,by=E}];

% OD と AC の交点 F (OD ∠ AC)
\path[name path=OD] (O) -- (D);
\path[name path=AE] (A) -- (E);
\path[name intersections={of=OD and AE,by=F}];

% Fから辺AOへの垂線 FG
\coordinate (G) at ($(O)!(F)!(A)$);
\draw (F) -- (G);

% 点の描画
\foreach \P in {O,A,B,C,D,E,F,G}
  \fill (\P) circle (1.8pt);

% ラベル
\node[below left]  at (O) {$O$};
\node[above right] at (A) {$A$};
\node[above right] at (B) {$B$};
\node[above left]  at (C) {$C$};
\node[above right] at (D) {$D$};
\node[above right] at (E) {$E$};
\node[below right] at (F) {$F$};
\node[below right] at (G) {$G$};

\end{tikzpicture}

大変勉強になった。TikZにおいて,
・ある点から別の点への垂線の降ろし方
・2つの線分の交点の求め方
・一連の点の表現を繰り返しで指定する方法
がわかったのだった。

えーと,肝腎の相似条件はわからないままで難渋している。MIPOをもう一度よく読んで見ると頂角36度の二等辺三角形の相似条件だった。チーン。直角三角形ではなかった。まあ,勉強になったからよしとしよう。

図:ChatGPTが生成したTikZで描いた正五角形と五芒星

2025年2月19日水曜日

Typst(2)

Typst(1)からの続き

自分のLaTeX利用ではTikZによる作図が大きな割合を占めている。TypstがLaTeXの代替の組版処理(文書整形)ツールとして使えるためには,TikZに相当する図形描画機能が必須だ。

調べてみると,CeTZというツールがある。CeTZ-plotもその仲間だ。関数やベジェ曲線にも対応しているので,TikZでこれまで作成してきたものは概ね再現できそうだ。具体例として,115 Scientific Diagrams というページに,物理や化学で用いられる図が,CeTZで74例,TikZで109例,示されている。

まだ慣れないからかもしれないが,TikZの方が使いやすいと思う。115 Scientific Diagramの同じ図で比較しても,CeTZの方が1TikZに比べて1.5倍程度の行数が必要だ。まあ,ないよりましなのだ。


図:CeTZによる凸関数の例(115 Scientific Diagrams から引用)


[3]115 Scienfitic Diagrams(Janosh Riebesell)

2025年2月18日火曜日

Typst(1)

奥村さんが Typst β版の新バージョンが出たことを話題にしていた。聞き覚えがあるような気もするが,早速インストールして試してみよう,というかこれは何をするものだ?

Typstは2023年に生まれた組版処理システム(PCで整形されたきれいな文書をつくるもの)だ。同種のものとして,ドナルド・クヌース(1938-)が1978年に開発したTeXや,レスリー・ランポート(1941-)がこれに続いて1984年に作ったLaTeXがある。まあ,Wordだってその仲間だ。咲子がLaTeXならば風葉がTypstだ。軽量マークアップ言語のMarkdown(2004)に数式表現が加わっている。同工のものとして日本発のSATySFy(2021)がある。

さて,ローカル版はhomebrewで簡単にインストールできる。sample.typ ファイルに対して, typst c sample.typ とすれば,sample.pdf が得られる。しかも,LaTeXよりずっと速い。typst w sample.typ とすれば,ソースコードを修正しながらこれが反映した結果のpdfファイルを確認できる。Typst.appにはWeb版もあって,登録すれば無料で利用できる。Sing In したところ,メールアドレスは登録済みだったので,昔いちど試してみたのかもしれない。もう忘れている。

LaTeXとTypstのコンバータがあれば便利だろうと,OpenAI o3-mini-high にやらせてみたところ,すぐにできたが,入力したtexファイルに問題があって,うまくいかなかった。そうこうしているうちに,ファイルコンバータのpandoc にはこの変換が組み込まれている(逆方向はダメ)ことがわかり,確かにうまくいった(\Big は\big に直す必要があった)。


図:Typst のアイコン(Typstのホームページから引用)

Q(koshix):
日本語と数式と図を含んだ組版システムとして,LaTeX(昔から)とTypst(最近)があります。この両者の特徴を比較して,どちらがお薦めかを教えてください。

A(Perplexity Pro):
LaTeXとTypstは、両者とも日本語、数式、図を含んだ文書の組版に適したシステムですが、それぞれに特徴があります。以下に両者を比較し、どちらがおすすめかを検討します。

LaTeXの特徴
長所:
・長年の実績があり、学術界で広く使用されている
・複雑な数式や特殊文字を正確に表現できる
・異なる要素のスタイルを厳密かつ一貫して制御できる
・すべてのOSと互換性がある
・数式や図表の自由な配置編集が可能
・安定性が高く、バグが少ない
短所:
・環境構築が複雑
・エラーメッセージが不親切で、デバッグが困難
・初心者には扱いづらい

Typstの特徴
長所:
・文法がわかりやすく、特に数式の記述が直感的
・エラーメッセージが親切で理解しやすい
・環境構築が簡単
・処理速度が非常に速い
・レイアウトの調整が容易
・LaTeXからの移行がしやすい
短所:
・比較的新しいシステムのため、LaTeXほどの実績がない
・英語のドキュメントしかない

おすすめ
どちらがおすすめかは、ユーザーの状況や目的によって異なります。
LaTeXをおすすめする場合:
・学術論文を執筆し、広く受け入れられているフォーマットが必要な場合
・複雑な数式や特殊な組版が必要な場合
・長期的なサポートや豊富なリソースが必要な場合
Typstをおすすめする場合:
・迅速な文書作成や編集が必要な場合
・環境構築の手間を省きたい場合
・より直感的な文法を好む場合
・処理速度を重視する場合

結論として、学術界での実績や豊富なリソースを重視するならLaTeXが、使いやすさや処理速度を重視するならTypstがおすすめです。ただし、Typstは比較的新しいシステムなので、今後の発展や学術界での受け入れ状況を注視する必要があります。
[1]Typst.app 公式ページ
[3]Typst入門(奥村晴彦)
[4]Typstの使い方(KumaROOT)
[5]Typstのはじめかた(monaqa)
[6]組版処理システムTypstの紹介(樫村博基)
[7]便利パッケージと使用例の紹介(Qiita,key_271)

2025年2月3日月曜日

ChatGPT o3-mini(1)

TikZのカメ(2)からの続き

1月31日にOpenAIから一般向けにリリースされた ChatGPT o3-mini である。すごく評判がいい。一般の二次関数の逆数の定積分や平方根の定積分は軽々と実行したが,これはどこにでも公式がのっているようなものなので検証の役には立たない。

こうなってくると人間のアイディアの方がAIの処理能力に追いつかないのである。とりあえず比較のためにカメのTIkZイメージを同じように作らせてみた。残念ながら一発でコードが通らなかったのだが,エラー部分を入れてみるとすぐに実行可能なコードがでてきた。その結果が下図である。立体的な表現ができるようになり,足と頭と尾の位置はそれぞれもっともらしいところにある。


図:OpenAI o3-mini-highによるカメのイメージ

以下が,OpenAI o1 にまとめさせたOpenAI o3-mini の概要だ。
OpenAIは、新たな推論モデル「o3-mini」をリリースしました。このモデルは、科学、数学、コーディングなどのSTEM分野での優れた性能を持ち、従来の「o1-mini」と比較して低コストかつ低遅延を実現しています。 

o3-miniは、関数呼び出し、構造化出力、開発者メッセージなど、開発者から要望の多かった機能をサポートしており、すぐにプロダクション環境での利用が可能です。また、推論の深さを「低」「中」「高」の3段階から選択でき、タスクの複雑さや速度要件に応じて最適化できます。ただし、視覚的なタスクには対応していないため、画像や視覚情報を扱う場合は「o1」モデルの使用が推奨されています。 

OpenAIのPlus、Team、Proユーザーは、本日よりo3-miniにアクセス可能で、Enterpriseユーザー向けには2月から提供が開始されます。o3-miniは、従来のo1-miniに代わり、より高いレート制限と低遅延を提供し、特にコーディングやSTEM関連の問題解決に適しています。さらに、PlusおよびTeamユーザー向けのメッセージ制限が1日50件から150件に増加しました。無料プランのユーザーも、メッセージ作成時に「Reason」オプションを選択することで、初めて推論モデルを試すことができます。

o3-miniは、特に技術的な分野での精度と速度を求めるユーザーにとって、有力な選択肢となります。ChatGPT内では、デフォルトで中程度の推論深度が設定されており、速度と精度のバランスが取れています。また、全ての有料ユーザーは、モデルピッカーで「o3-mini-high」を選択することで、より高度な推論を行うバージョンを利用できます。Proユーザーは、これらのモデルに無制限にアクセス可能です。 

 

\begin{tikzpicture}[scale=1]
% OpenAI o3-mini-high
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % カメの甲羅: 大きな楕円にグラデーションシェーディング
  \shade[ball color=green!30!blue, opacity=0.9] (0,0) ellipse (3cm and 2cm);
  \draw[line width=1pt, color=green!80!black] (0,0) ellipse (3cm and 2cm);
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % 甲羅の装飾: ウロコ風の模様(小さな円)
  \foreach \pos in {(-1.2,0.5), (1.2,-0.5), (0,1), (-0.8,-0.7), (0.8,0.8)}
  {
    \draw[fill=green!60!black, opacity=0.8] \pos circle (0.3cm);
  }
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % カメの頭: 右側に配置
  \begin{scope}[shift={(3.5,0.5)}]
    \shade[ball color=yellow!80!orange, opacity=0.95] (0,0) ellipse (0.8cm and 0.6cm);
    \draw[line width=1pt, color=orange!80!black] (0,0) ellipse (0.8cm and 0.6cm);
    % 目の描画
    \fill[white] (0.3,0.15) circle (0.15cm);
    \fill[black] (0.33,0.15) circle (0.07cm);
  \end{scope}
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % カメの足: 前右、前左、後右、後左の4箇所に配置
  \foreach \x/\y in {(1.8,2.0), (-1.8,2.0), (1.8,-2.0), (-1.8,-2.0)}
  {
    \begin{scope}[shift={(\x,\y)}]
      \shade[ball color=green!50!yellow, opacity=0.95] (0,0) ellipse (0.5cm and 0.3cm);
      \draw[line width=1pt, color=green!70!black] (0,0) ellipse (0.5cm and 0.3cm);
    \end{scope}
  }
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % カメの尻尾: 左側に配置
  \begin{scope}[shift={(-3.2,0)}]
    \shade[ball color=green!50!yellow, opacity=0.95] (0,0) ellipse (0.4cm and 0.2cm);
    \draw[line width=1pt, color=green!70!black] (0,0) ellipse (0.4cm and 0.2cm);
  \end{scope}
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % 背景装飾: 水しぶきのような曲線(オプション)
  \draw[blue!50, thick, decoration={random steps,segment length=3mm,amplitude=1mm}, decorate] 
        (-3, -2.5) .. controls (0, -3) .. (3, -2.5);

\end{tikzpicture}

2025年2月1日土曜日

TikZのカメ(2)

TikZのカメ(1)からの続き

ChatGPTのプログラムコードではじめて絵を描かせてみたのが2年前のマインドマップのつたない線画だった。半年前にはそのテクニックで,Claude 3.5 Sonnetによるカメを描いた。だいぶ進化していた。

この度,推論モデルが登場したので,再度TikZによる描画に挑戦してみた。参加メンバーは,(1) Chat GPT o1,(2) Gemini 2.0 Flash,(3) Qwen2.5-Max,(4) DeepSeek R1の4種類である。ただし,新登場の(3) Qwen2.5-Maxだけは推論モデルには該当しないことに注意する。


図:TikZによる各生成AIが保持しているカメのイメージ
(1) 左上:ChatGPT o1,(2) 右上:Gemini 2.0 Flash
(3) 左下:Qwen2.5-Max,(4) 右下:DeepSeek R1 

半年前よりは少し進化しているかもしれない。彼ら生成AIは,カメが甲羅と頭としっぽと四本の短い足から成り立っていることを知っている。また,緑色や茶色が基調色として採用されている。今回は,グラデ—ションや中間色の表現が登場した。DeepSeekR1は本体の足の取り扱いは残念なのだが背景の水や泡にまで思いが及ぶようになっている。


2024年6月30日日曜日

TikZのカメ(1)

マインドマップからの続き

去年,Chat GPTは,日本語を解釈してSVGやTikZで稚拙ながらそれらしいイメージを出力することができた。あれから1年,この度のClaude 3.5 Sonnetではどうか試してみた。まあ,少しだけ進歩しているかもしれない。

Q(koshix):
latexのtikzコマンドで、カメのイメージをなるべくリアルに描画するコマンドを示してください
Q(koshix):
亀の甲羅の模様を六角にして,手足には爪をつけて,しっぽはスルリと細く短くなるようにできますか?
Q(koshix):
以下の部分でエラーが出ました。
\foreach \x in {-1,0,1}
  \foreach \y in {-0.75,0,0.75}
    \draw[green!30!black, thick] (\x,\y) hexagon (0.5);

A(Claude 3.5 Sonnet):
申し訳ありません。エラーが発生したのは、hexagon コマンドが標準のTikZには定義されていないためです。このエラーを修正し、六角形を描画する別の方法を使用しましょう。

\documentclass{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}

% カメの体(甲羅)
\fill[green!50!black] (0,0) ellipse (2 and 1.5);

% 頭
\fill[green!70!black] (2.3,0) ellipse (0.5 and 0.4);

% 目
\fill[black] (2.6,0.1) circle (0.05);

% 足と爪
\begin{scope}
  \clip (-1.5,-1.2) ellipse (0.4 and 0.3);
  \fill[green!70!black] (-1.5,-1.2) ellipse (0.4 and 0.3);
  \fill[brown] (-1.7,-1.4) -- (-1.6,-1.5) -- (-1.5,-1.4) -- (-1.4,-1.5) -- (-1.3,-1.4) -- cycle;
\end{scope}

\begin{scope}
  \clip (-0.5,-1.4) ellipse (0.4 and 0.3);
  \fill[green!70!black] (-0.5,-1.4) ellipse (0.4 and 0.3);
  \fill[brown] (-0.7,-1.6) -- (-0.6,-1.7) -- (-0.5,-1.6) -- (-0.4,-1.7) -- (-0.3,-1.6) -- cycle;
\end{scope}

\begin{scope}
  \clip (0.5,-1.4) ellipse (0.4 and 0.3);
  \fill[green!70!black] (0.5,-1.4) ellipse (0.4 and 0.3);
  \fill[brown] (0.3,-1.6) -- (0.4,-1.7) -- (0.5,-1.6) -- (0.6,-1.7) -- (0.7,-1.6) -- cycle;
\end{scope}

\begin{scope}
  \clip (1.5,-1.2) ellipse (0.4 and 0.3);
  \fill[green!70!black] (1.5,-1.2) ellipse (0.4 and 0.3);
  \fill[brown] (1.3,-1.4) -- (1.4,-1.5) -- (1.5,-1.4) -- (1.6,-1.5) -- (1.7,-1.4) -- cycle;
\end{scope}

% 尻尾(より細く短く)
\fill[green!70!black] (-2.1,0) .. controls (-2.3,0.1) and (-2.3,-0.1) .. (-2.1,-0.1) -- cycle;

% 甲羅の六角形の模様(修正版)
\foreach \x in {-1,0,1}
  \foreach \y in {-0.75,0,0.75} {
    \draw[green!30!black, thick] 
      (\x+0.5*0.866,\y+0.25) -- 
      (\x+0.5*0.866,\y-0.25) -- 
      (\x,\y-0.5) -- 
      (\x-0.5*0.866,\y-0.25) -- 
      (\x-0.5*0.866,\y+0.25) -- 
      (\x,\y+0.5) -- cycle;
  }

\end{tikzpicture}
\end{document}

この修正版では、以下の変更を行いました:
1.hexagon コマンドの代わりに、六角形を直接描画するコードを使用しています。これは6つの点を指定して六角形を描くものです。
2.六角形のサイズと位置を調整して、カメの甲羅に合うようにしました。
3.その他の部分(体、頭、目、足、爪、尻尾)は前回のバージョンと同じままです。

この修正により、エラーなくコンパイルできるはずです。六角形の模様が甲羅全体に広がり、カメらしい外観を作り出しています。
コードをコンパイルして問題がないか確認してください。もし他に問題が発生したり、さらに調整したい部分があれば、お知らせください。例えば、六角形のサイズや配置を微調整したり、色を変更したりすることも可能です。

図:Claude 3.5 Sonnet が持っているカメのイメージ,修正前と修正後


2023年5月28日日曜日

留数計算

GPT-4とBardとPerplexityに実関数の広義積分を複素解析を使って解くようにお願いした。

問題は,$\displaystyle \int_0^\infty \dfrac{\sin x}{x} dx$  というものだ。で,三者全員がそれらしい導出過程を示しながら答えは$\pi$だと返してきた。どうもおかしいなと思って,Mathematicaで検算すると $\dfrac{\pi}{2}$だ。やはり,ちゃんと勉強せずに生成系AIを使うことはできない(何度か試すと正しい答えを返す場合もあった)。

ところが,最近(ここ数十年)留数計算なんかご無沙汰しているので,自分の方が計算の仕方が分からなくなってしまっている。AI以下である。インターネットで復習してから自分で結果を再構成してみた。まだよく理解できていないけれど概ね次のようなものだ。

図:2通りの積分路と極の位置(ChatGPTのtikzコードによる)

複素関数$f(z) = \dfrac{e^{iz}}{z}$の積分を考える。

経路 $C_1 :  \gamma_{-} + \Gamma' + \gamma_{+} + \Gamma$,
経路 $C_2 :  \gamma_{-} + \Gamma'' + \gamma_{+} + \Gamma$,
とする。

$f(z)$がコーシーリーマンの関係式を満たす正則関数であるならば,
$C_1$のように閉じた積分路の中に$f(z)$に極がない場合,$f(z)$の経路積分の値は,$I_1=\oint_{C_1} f(z) dz =0 $になる。
また$C_2$のように閉じた積分路の中に極がある場合は,$f(z)$の経路積分の値は,$I_2=\oint_{C_2} f(z) dz =2 \pi i \ \mathrm{Res} f(z)$になる。

$\oint_{C_1} f(z) dz = \int_{-R}^{-\varepsilon} \dfrac{e^{i x}}{x} dx + \int_{\Gamma'} \dfrac{e^{iz}}{z} dz +  \int_{\varepsilon}^{R} \dfrac{e^{i x}}{x} dx + \int_{\Gamma} \dfrac{e^{iz}}{z} dz =0$

第1項と第3項をまとめて,第2項と第4項は $z=r e^{i \theta}$と極座標表示して,
これから$\varepsilon \rightarrow 0, \ R \rightarrow \infty$の極限をとると,

$\displaystyle 2 i \int_0^{\infty} \dfrac{\sin x}{x} dx - \pi i + 0 = 0$

同様に積分路$C_2$については,$\mathrm{Res}(z=0) f(z) = 1$ なので
これから$\varepsilon \rightarrow 0, \ R \rightarrow \infty$の極限をとると,

$\displaystyle 2 i \int_0^{\infty} \dfrac{\sin x}{x} dx + \pi i + 0 = 2\pi i$

いずれにしても,$\displaystyle \int_0^{\infty} \dfrac{\sin x}{x} dx = \dfrac{\pi}{2}$

2023年3月26日日曜日

へのへのもへじ

ネット上で誰かが,「へのへのもへじ」より「へめへめくつし」がいいねといった。ホウ,そんなものがあったのか,と一瞬思ったけれど,そういえば昔いろいろと試していたような気もする。それほどビックリする話題ではない。

むしろ,テレビで外国人の平熱が37度台であると知ったことの方が驚きだ。これは筋肉が多い人について成り立つらしく,日本のボディビルダーに体温がやはり37度台であることを検証していた。どこまで正しいかわからないけれど。

そこで,へのへのもへじ出力プログラムを作ってみた。最初は,TeXのTikZで書いた。こんな感じ。ベジェ曲線が手軽に使えるのがありがたい。

\begin{tikzpicture}
\draw[gray, step=1, dotted] (0,0) grid (6,6);
\draw (2,5) node[below]{\Huge \${〜}\$};
\draw (2,4) node[below]{\Huge \${め}\$};
\draw (4.2,5) node[below]{\Huge \${〜}\$};
\draw (4.2,4) node[below]{\Huge \${め}\$};
\draw (3,3) node[below]{\Huge \${く}\$};
\draw (3.3,1.9) node[below]{\Huge \${つ}\$};
\draw [ultra thick] (1,5.5) .. controls (0.5,2) and (1.25,0.75)  ..(2,0.5);
\draw [ultra thick] (2,0.5) .. controls (3,0) and (5,0)  ..(5.5,2);
\draw (5.5,3) node[below]{\Huge \${々}\$};
\end{tikzpicture}


図1:LaTeXのTikZで書いたへのへのもへ字

これだと,文字を入れ替えるたびにコードを書き換えることになる。そこで,pythonで作り直そうとしてGPT-4に聞いてみたら,ほぼ1発で正しいコードが得られた。macOSのフォントの場所だけを指定すれば良かった。さらに,コマンドラインからひらがなを入力して文字に分解するところもGPT-4に教えてもらった。これからのプログラミング教育はどうなるのだろう?

問題は,pythonのpillowライブラリにはベジェ曲線がないことだ。おまけに,最初の結果は顔の輪郭は直線4本で表され,顔に被ってしまっていた。GPT-4はそこまで賢いわけではない。仕方がないので,自力でもがいて作った折れ線グラフで代用している。プログラミング教育って絶対にこうなるから。論理的ではない部分が多すぎる。

#! ~/bin/python


from PIL import Image, ImageDraw, ImageFont

import sys


def generate_henohenomoheji(brow: str, eye: str, nose: str, mouth: str, file_name: str):

     

    # 背景画像を作成

    image = Image.new('RGB', (600,600), (255, 255, 255))

    draw = ImageDraw.Draw(image)


    # フォントの設定

    font_size = 80

    font = ImageFont.truetype("/Users/koshi/Library/Fonts/BIZUDGothic-Regular.ttf", font_size)


    # へのへのもへじの要素を描画

    draw.text((160, 120), brow, font=font, fill=(0, 0, 0))  # 眉毛

    draw.text((340, 120), brow, font=font, fill=(0, 0, 0))  # 眉毛

    draw.text((180, 200), eye, font=font, fill=(0, 0, 0))   # 目

    draw.text((330, 200), eye, font=font, fill=(0, 0, 0))   # 目

    draw.text((240, 290), nose, font=font, fill=(0, 0, 0))  # 鼻

    draw.text((250, 380), mouth, font=font, fill=(0, 0, 0)) # 口

    draw.text((480, 240), "〃", font=font, fill=(0, 0, 0))  # 濁点


    # 顔の輪郭(ベジェ曲線ではない)

    contour = [

        (100, 100), (110, 150), (110, 200), (100, 250), (100, 300),

        (110, 340), (120, 380), (140, 410), (160, 440), (180, 460),

        (200, 480), (220, 490), (240, 500), (260, 505), (280, 505),

        (300, 500), (320, 500), (340, 495), (360, 495), (370, 490),

        (390, 480), (410, 470), (430, 460), (450, 440), (470, 410),

        (480, 380), (480, 360), (475, 340), (470, 310), (470, 280),

    ]

    draw.line(contour, width=5, fill=(0, 0, 0), joint="curve")


    # 画像の表示と保存

    image.show()

    image.save(file_name, "PNG")


moji = list(sys.argv[1])

brow = moji[0]

eye = moji[1]

nose = moji[2]

mouth = moji[3]

print(brow,eye,nose,mouth)

generate_henohenomoheji(brow,eye,nose,mouth, "heno-mohe.png")

図2:PythonのPillowによるへのへのもへ字

2022年7月8日金曜日

latexdiff

latexdiffは,texファイルの差分表示ソフトだ。

latexdiff main1.tex main2.tex > diff.tex
pdflatex diff.tex


下の例題に対する結果は次のようになる。
% main1.tex
\documentclass{article}
\title{ld}
\author{me}
\date{July 2021}
\begin{document}
\maketitle
\section{Introduction}
zzz
\end{document}

% main2.tex
\documentclass{article}
\title{latexdiff}
\author{me\and you}
\date{July 2021}
\begin{document}
\maketitle
\section{Introduction}
zzz zzz
\section{Section}
zzz
\end{document}

図:latexdiffの出力サンプル


2022年5月23日月曜日

2次元ルービック

Twitterで@jagarikinさんが,ルービックキューブの2次元表現のアニメーションに成功していた。さっそくこれををTikzで描いてみた。


図:2次元ルービックの概念図

(1) 3重の円を3個配置する。2つの円のひとかたまりの交点群は,9個の色つきマークの1組として表わされる。こうしてできた6つの組がルービックキューブの6面に対応し,各マークはルービックキューブのピースに該当する。ルービックキューブの回転操作はこの円に沿って,マークを組単位で回転移動することに相当する。

(2) 色つきマークの組の中心マークが6個あり,これがルービックキューブの6個のセンターピースに対応する。これらは相対的な配置が固定された不動点になるので,これを通る破線の円は動かす必要がない。外側の円と内側の円に沿っての回転だけを考えればよい。

(3) 実線でつながる3個のマークが8組あり,これが8個のコーナーピースに対応する。破線でつながる2個のマークが12組あり,これが12個のエッジピースに対応する。

(4) 内側の円に沿った回転操作にともなって,回転操作を行った円に囲まれた9個の組もピースの関係を保持するために同じ向きに回転する。外側の円に沿った回転操作にともなって,回転操作を行った円の外側にある9個の組もピースの関係を保持するために逆向きに回転する必要がある。


2022年3月24日木曜日

pandoc(3)

pandoc(2)からの続き

引き続き,markdown ファイル の活用例として,プレゼンテーション用のスライド作成に取り掛かる。見本(英文)は簡単に見つかって実行できたものの,日本語対応が面倒だと書いてある。あれこれ探してみても,出発点が RStudioの R Markdownというものが多いのだ。結局,日本語Markdownからスライド資料を作成する(Rcmdnk's Blog 2015)とBeamerスライドをMarkdownで簡単に作成(Tomokazu NOMURA's Web Page)を参考にした。

% kpsewhich beamerthemeSingapore.sty

% /usr/local/texlive/2021/texmf-dist/tex/latex/beamer/beamerthemeSingapore.sty

beamerのテーマファイルを上記のkpsewhichコマンド探し,これを編集して末尾に, \usepackage{luatexja} を加えることで日本語対応するということだった。設定ファイルに直接手を入れるのは気が進まないが,元のmarkdownファイルの1ページ目の yaml ヘッダで定義すれば十分であり,styファイルの修正は不要だった。その結果,次のコマンドで memo.md から memo.pdf というbeamerによるプレゼンテーションスライドが生成される。

pandoc -t beamer -o memo.pdf memo.md --pdf-engine=lualatex

memo.mdの1ページ目の yaml ヘッダは次のとおりであり,スライドの改ページは --- である。

---
title: "MarkdownからBeamer"
subtitle: "Pandocで変換"
author: "大阪教育大学 越桐國雄"
date: 2022/03/24
output:
beamer_presentation:
keep_tex: yes
latex_engine: lualatex
header-includes:
- \usepackage{bookmark}
- \usepackage{luatexja}
- \usetheme{Singapore}
---


図:mdファイルから生成したbeamerスライド

2022年3月23日水曜日

pandoc(2)

pandoc(1)からの続き

とりあえず,markdown ファイルから pdf ファイルが生成できるようになった。tex ファイルや html ファイルも生成できるので,その手順をまとめてみる。

(1) tex ファイルの場合

pandoc -s test.md -o test.tex

このtexファイルに対して,ドキュメントクラスを日本語対応に変更する。すなわち,\documentclass[]{article} → \documentclass[]{ltjarticle}として,コマンドラインから,lualatex test.tex とすれば,test.pdf が得られる。

置き換えを perl のワンライナーで実行すれば,シェルスクリプトに落とし込むことができる。

perl -pi -e 's/{article}/{ltjarticle}/' test.tex

(2) htmlファイルの場合

pandoc -s test.md -o test.html --mathml

pandoc -s test.md -o test.html --mathjax

どちらでもよいのだが,数式のまわりのhtmlは,mathjaxの方が少しだけスッキリしているかもしれない。

そこで,これらを zsh のスクリプトとしてまとめたものが次である。md.sh input option とすればよい。optionには{pdf, tex, html}のいずれかが入る。入力ファイルは input.md であり,拡張子より前の部分を引数に取ればよい。以下は md.sh の内容である。

#! /bin/zsh
case \$2 in
  "pdf")
    echo "pdf";
    iconv -f UTF-8-MAC -t UTF-8 \$1.md | pandoc -f markdown -o \$1.pdf -V documentclass=ltjarticle --pdf-engine=lualatex
  ;;
  "tex")
    echo "tex";
    pandoc -s \$1.md -o \$1.tex;
    perl -pi -e 's/{article}/{ltjarticle}/' \$1.tex
  ;;
  "html")
    echo "html";
    pandoc -s \$1.md -o \$1.html --mathjax
  ;;
*)
  echo "undefined"
  ;;
esac

2022年3月22日火曜日

pandoc(1)

マークダウン(2)からの続き

マークダウンの使い方をみていると,コマンドラインベースで各種のドキュメントを相互に変換することができる,pandocとの相性が良いらしい。ということで,pandoc をインストールしようとしたら,すでに homebrew で導入済みだった。念のために,brew reinstall pandocで,pandoc 2.17.1.1が入った。

変換できるファイルの種類のカテゴリーは,次のように多岐に渡る。Lightweight markup (.md),HTML (.html),Ebooks (.epub),Documentation,Roff,TeX (.tex),XML,Outline,Word processor (.docx), Interactive notebook (.ipynb),Page layout,Wiki markup (MediaWiki),Slide show (beamer),Data (.csv),Custom,PDF (.pdf)

厄介なことにマークダウンに関しては微妙に異なった方言が存在するのでなんだか意図した結果が出てこないと思っていたが,記法のミスだった。(1) 見出し,(2) 箇条書き,(3) 番号付き箇条書き,(4) 書体,(5) コード,(6) 数式,(7) 表,(8) 画像,(9) リンク,(10) 脚注 などが概ね機能している。見出しのレベルがまだはっきりわからない。番号付きリストの半角空白は3個にした。

iconv -f UTF-8-MAC -t UTF-8 test.md | pandoc -f markdown -o test.pdf -V documentclass=ltjarticle --pdf-engine=lualatex

上記が,macOS での pandoc の使用例である。入力ファイルは test.md,出力ファイルは test.pdf である。pdf 出力のためには lualatex を通す必要があることと,ファイルは標準の(macOS標準ではなく)UTF-8 形式にしておく必要があるのでiconvで漢字変換したものをpandocに食わせている(pdfファイルで濁点が分離してしまうのを防ぐらしい)。

.zshrcにパスを通して,md2pdf.sh という実行可能なシェルスクリプトを作ったので,引数を1つ指定すると,md2pdf.sh test1 のようにmdファイルからpdfファイルが生成できるようになった。

以下が,マークダウンファイル,test1.md の内容である。

# 見出し1(Title)
ここが段落の文章になる改行しても無視される 
空行があるためこの文章は第二段落となる

## 見出し2(Chapter)
これでは
あれでは

### 見出し3(Section)

#### 見出し4(Subsection)

- リストA
- リストB
  - 子リストB-a
    - 孫リストB-a-a
- リストC

- リストの文章1です。

  行の頭に半角スペースが二つあるので,
  リストの内部要素です。

- リストの文章2です。

行の頭に半角スペースがないので新しい段落です。

1. 番号付きリスト A
   1. 番号付き子リスト A-a
   1. 番号付き子リスト A-b
      1. 番号付き孫リスト A-b-α
      1. 番号付き孫リスト A-b-β
      1. 番号付き孫リスト A-b-γ
   1. 番号付き子リスト A-c
1. 番号付きリスト B

*italic* **bold** ***italic+bold***

\`inline_code\`

\`\`\`
display style code block
function test(a,b) {
return a+b;
}
\`\`\`
\$\int_{-\infty}^\infty e^{-\alpha x^2}dx = \sqrt{\frac{\pi}{\alpha}}\$

\$\$
\int_{-\infty}^\infty e^{-\alpha x^2}dx = \sqrt{\frac{\pi}{\alpha}}
\$\$

|項目1|項目2|項目3|
|---|---|---|
|りんご| 10円| 3個|
|みかん| 50円|10個|
|いちご| |売り切れ|
|バナナ|100円| 2本|

[リンク先 https://pandoc.org/ をクリック](https://pandoc.org/)

画像![ALT これはアイコンです](sample.png)も表示させられます。

Markdown エディタ NowType は Ito によって作られ た。 [^1]

NowTypeにおいては、次のような入力支援を行います。

[^1]: Atsushi M. Ito, プラズマ・核融合学会誌, vol. X, No. Y, 2020.

2021年11月20日土曜日

ギリシャ文字の斜体

統計力学のテキストつながりで,冨田博之先生のウェブサイトを見ていると,2021年度の大学入試共通テストの「物理」「物理基礎」の話題が出てきた。

数年前の阪大・京大の個別学力検査の物理で,波動(音)の問題の出題ミスが話題になった。その当時,日本物理教育学会の近畿支部長だったので,あれやこれやの対応に追われたような,それほどでもなかったような。

その出題ミスを指摘した人の一人が予備校講師の吉田弘幸さんであり,これが契機となって,入試制度や社会問題などにも関わって広く発言されている。

その吉田さんが,2021年度の共通テストの物理の問題の問題点を指摘した。特に,薄膜干渉の問題が出題ミスであると指摘しているのだが,これに対して冨田さんが反論している。これは,冨田さんの方に分があるわ。

ところで,吉田さんの些細な指摘の方が気になった。「数学や物理では変数 $X$ の変化を $\varDelta X$ で表します。$\varDelta$ はギリシャ文字の $\Delta$ を斜体で表したものです。ところが,この問題(第1日程)では斜体でない $\Delta$ を使っています」

これまで,自分がLaTeXで $\Delta$を出力する際は,斜体かどうかなんて気にしていなかったのだ。この点は吉田さんが正しいかもしれない。ということで,確かめてみると,ちょっと面倒なことになっていた。

\begin{equation} \alpha \ \beta \ \gamma \ \delta \ \epsilon (\varepsilon) \ \zeta \ \eta \ \theta (\vartheta) \ \iota \ \kappa \ \lambda \ \mu (\umu) \ \nu \ \xi \ o \ \pi \ \rho (\varrho) \ \sigma (\varsigma) \ \tau \ \upsilon \ \phi (\varphi) \ \chi \ \psi \ \omega (\varpi)\end{equation}

\begin{equation} {\rm A} \ {\rm B} \ \Gamma \ \Delta (\varDelta) \ {\rm E} \ {\rm Z} \ {\rm H} \ \Theta \ {\rm I} \ {\rm K} \ \Lambda \ {\rm M} \ {\rm N} \ \Xi \ {\rm O} \ \Pi \ {\rm P} \ \Sigma \ {\rm T} \ \Upsilon \ \Phi \ {\rm X} \ \Psi \ \Omega \end{equation}

\begin{equation} A \ B \ \mathit{\Gamma} \ \ \mathit{\Delta} \ \ E \ Z \ H \ \mathit{\Theta} \ \ I \ K \ \mathit{\Lambda} \ \ M \ N \ \mathit{\Xi} \ \ O \ \mathit{\Pi} \ \ P \ \mathit{\Sigma} \ \ T \ \mathit{\Upsilon} \ \ \mathit{\Phi} \ \ X \ \mathit{\Psi} \ \ \mathit{\Omega} \end{equation}

P. S. \umu は,単位のミクロン(μ)で使うための立体のミュー(オイラーフォント)であるが,blogspotの環境では出力できない。

2021年11月4日木曜日

TikZの反復と分岐

数理的なモデルと関連した 図を書くのにPowerPointはちょっと使いにくい。MathematicaやJuliaでも表現力の自由度が足りない。そこで,PGF/TikZの登場となる。その機能を十分に生かそうとすると,TikZ環境でのプログラミングが必要であり,変数の処理や反復・分岐などが求められる。

PGF/TikZについては,Tantauの1300pを超えるマニュアルがあるのだけれど,これがまた詳しすぎて読みにくい。そんなわけで,日本語の適当な解説書を探すのだけれどこれがまたないのだった。そんなわけで,ボルツマン分布の概念図を作図しようとしていきなりつまづいた。

反復の方は\foreachを使うというところまではいいのだが,これに条件分岐を入れるとなんだかやヤコしい。しかも,堪え性のない老人は,最近の大学生のように真面目に調べずにネット情報を漁ってつまみ食いしようとするものだから,訳がわからない状態になるのであった。

小学生からのプログラミング教育は,いっそのことLaTeX+PGF/TikZにしたらいいのではないかとしみじみ思う今日この頃です。Pictogrammingと合体できないものか。まあグダグダ言いながらなんとか,解決方法の1つが見つかった。

/begin{tikzpicture}
\draw[step=2, dotted] (0,0) grid (13,2);
\foreach \x [count=\i]in {1,3,...,13}
{
\draw (\x,-0.5) node{\$(n_\i,u_\i)\$};
\foreach \y in {1,...,8}
\pgfmathsetmacro{\col}{ifthenelse(rnd*8 > \y,"white",ifthenelse(rnd*8 <\y,"gray","white"))}
\draw[fill,\col] (\x+rnd*1.6-0.8, rnd*1.6+0.2) circle(0.05);
}
\end{tikzpicture}

少し違うタイプの問題が出ても対応できる自信はまったくない,勉強不足なのであった。


図:TikZの例,\foreachとifthenelseとrndを組み合わせたもの


2021年9月19日日曜日

Detexify

たまに TeXの記号を探すのに苦労することがある。それを解決するのが Detexifyである。手書き入力したシンボルに似た形のTeXコマンドのリストを出してくれる。アプリとしてダウンロードすることもできる。シンボルの一覧もスクロールで一気に閲覧できるのでそれはそれでよいかもしれない。


図:Detexifyアプリ版のアイコンより