GAP から TeX で直接行列を取得する

GAP から TeX で直接行列を取得する

GAP では、出力として次の方法で行列を取得します。

[ [ 0, 0, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], [ 1, 0, 0, 0 ] ]

この行列はリストのリスト(行ベクトル)として与えられます。

質問: この行列の GAP 出力を TeX ファイルに直接貼り付けて、TeX で行列を取得する直接的な方法はありますか?

この質問の動機は、GAP からの出力として非常に大きな (40 x 40 のような) 行列が返される場合があり、そのような GAP 出力を TeX に直接貼り付けて LaTeX で行列を取得できれば便利だということです。

答え1

ここに画像の説明を入力してください

\documentclass{article}
\usepackage{amsmath}


\def\gapmatrix[{\begin{pmatrix}
\gaprows}
\def\gaprows#1[#2]#3{%
\gapcell#2\gapendrow,\ifx]#3\end{pmatrix}\else\afterfi\\\gaprows\fi}

\def\afterfi#1\fi{\fi#1}
\def\gapcell#1,{#1\uppercase{&}\gapcell}
\def\gapendrow#1\gapcell{}
\begin{document}


\[
\gapmatrix
[ [ 0, 0, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], [ 1, 0, 0, 0 ] ]
\]

\end{document}

答え2

異なるアプローチ(デイビッドほど巧妙ではない)

\documentclass{article}
\usepackage{mathtools}

\ExplSyntaxOn

\NewDocumentCommand{\gapmatrix}{sO{p}m}
 {% #2 = fences, #3 = data
  \IfBooleanTF{#1}
   {% small matrix
    \mare_gapmatrix:nn { #2small } { #3 }
   }
   {% normal size
    \mare_gapmatrix:nn { #2 } { #3 }
   }
 }

\tl_new:N \l__mare_gapmatrix_body_tl
\seq_new:N \l__mare_gapmatrix_rows_seq
\cs_generate_variant:Nn \seq_set_from_clist:Nn { NV }

\cs_new_protected:Nn \mare_gapmatrix:nn
 {
  % make sure we have no spaces at either end
  \tl_set:Nn \l__mare_gapmatrix_body_tl { #2 }
  % remove the outer brackets
  \regex_replace_once:nnN { \A\s*\[ (.*) \] \s*\Z } { \1 } \l__mare_gapmatrix_body_tl
  % replace [...] with {...}
  \regex_replace_all:nnN { \[(.*?)\] } { \{\1\} } \l__mare_gapmatrix_body_tl
  % split into a sequence of rows
  \seq_set_from_clist:NV \l__mare_gapmatrix_rows_seq \l__mare_gapmatrix_body_tl
  % now we can typeset
  \begin{#1matrix}
  \seq_map_function:NN \l__mare_gapmatrix_rows_seq \__mare_gapmatrix_row:n
  \end{#1matrix}
 }

\cs_new_protected:Nn \__mare_gapmatrix_row:n
 {
  \clist_use:nn { #1 } { & } \\
 }

\ExplSyntaxOff

\begin{document}

\[
\gapmatrix{[ [ 0, 0, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], [ 1, 0, 0, 0 ] ]}
\gapmatrix[b]{[ [ 0, 0, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], [ 1, 0, 0, 0 ] ]}
\gapmatrix*{[ [ 0, 0, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], [ 1, 0, 0, 0 ] ]}
\gapmatrix*[b]{[ [ 0, 0, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], [ 1, 0, 0, 0 ] ]}
\]

\end{document}

ここに画像の説明を入力してください

答え3

Sage の GAP インターフェース、Sage メソッドlatex(obj)、LaTeX パッケージsagetex

インストールについてはsagetexhttps://doc.sagemath.org/html/en/tutorial/sagetex.html#make-sagetex-known-to-tex

CTAN バージョンと TeXLive で配布される のバージョンは、sagetex.styお使いの Sage のバージョンと互換性がない可能性があるため、 のインストールは、sagetex.stySage 自体で配布されるバージョンを使用して手動で行う必要があることが指摘されています。

SAGE_ROOT/venv/share/texmf/tex/latex/sagetex/sagetex.sty

私にとってSAGE_ROOT

❯ sage -c "print(SAGE_ROOT)"
/Applications/SageMath-10-0.app/Contents/Frameworks/Sage.framework/Versions/10.0

使用方法は次のようになります。

\documentclass{article}
\usepackage{sagetex}

\begin{document}

\begin{equation}
\sage{matrix(gap('[ [ 0, 0, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], [ 1, 0, 0, 0 ] ]').sage())}
\end{equation}

\end{document}

注意: 自分で呼び出す必要はありませんlatex(obj)\sageコマンドが代わりにこれを実行します。\sagestr{}は実行しません。

この特定のケースでは、GAP と Sage (Python) のマトリックス表記が一致するため、 の呼び出しはgap('gap code').sage()必要ありません。しかし、質問のポイントは、TeX ドキュメントに GAP コード (GAP マトリックス) を挿入して、LaTeX で適切なタイプセット結果を取得する方法です。これは、この可能性を示すものです。

答え4

GAP パッケージtypeset

バージョン 1.0 リリース: 2022-11-11
リポジトリ:https://github.com/gap-packages/typeset

このパッケージを使用すると、GAP で TeX 出力を生成し、TeX に貼り付けることができます (Mathematica の場合と同様TeXForm)。

例:

gap> LoadPackage("typeset");
gap> x := [ [ 0, 0, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], [ 1, 0, 0, 0 ] ];;
gap> Typeset(x);
\left(\begin{array}{rrrr}
0 & 0 & 0 & 1 \\
0 & 0 & 1 & 0 \\
0 & 1 & 0 & 0 \\
1 & 0 & 0 & 0 \\
\end{array}\right)

オプション: TeX文書内でGAPコードを呼び出す

LaTeX ドキュメントへの挿入ステップを自動化したい場合は、TeX ドキュメントから GAP コードを実行することができます。次の CTAN パッケージがこの機能を対象としています (CTAN Topics Callback、Exec foreign、External code)

最小限の例texsurgery

\documentclass{article}
\usepackage[gap-4]{texsurgery} % specify kernel

\begin{document}

% \begin{equation} % triggers many errors on first run
% Assuming GAP package "typeset" is autoloaded by gap.
\begin{run}
Print("\\begin{equation}\n");
Typeset([ [ 0, 0, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], [ 1, 0, 0, 0 ] ]);
Print("\\end{equation}\n");
\end{run}
% \end{equation}

\end{document}
❯ pipenv run texsurgery texsurgery-typeset.tex -pdf
GAP Jupyter Kernel Starting using gap
true
\begin{equation}
\left(\begin{array}{rrrr}
0 & 0 & 0 & 1 \\
0 & 0 & 1 & 0 \\
0 & 1 & 0 & 0 \\
1 & 0 & 0 & 0 \\
\end{array}\right)
\end{equation}
This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./texsurgery-typeset.pdf.temp.tex
LaTeX2e <2023-06-01> patch level 1
L3 programming layer <2023-10-10>
(/usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls
Document Class: article 2023/05/17 v1.4n Standard LaTeX document class
(/usr/local/texlive/2023/texmf-dist/tex/latex/base/size10.clo))
(/usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def)
(./texsurgery-typeset.pdf.temp.aux) [1{/usr/local/texlive/2023/texmf-var/fonts/
map/pdftex/updmap/pdftex.map}] (./texsurgery-typeset.pdf.temp.aux) )</usr/local
/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></usr/local/
texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb>
Output written on texsurgery-typeset.pdf.temp.pdf (1 page, 18009 bytes).
Transcript written on texsurgery-typeset.pdf.temp.log.

PDF:

ここに画像の説明を入力してください

関連情報