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
다른 접근 방식(David의 접근 방식보다 덜 교활함)
\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, Sage 방식 latex(obj)
및 LaTeX 패키지 의 GAP 인터페이스sagetex
설치에 대해서는 sagetex
참조https://doc.sagemath.org/html/en/tutorial/sagetex.html#make-sagetex-known-to-tex
sagetex.sty
CTAN 버전과 TeXLive와 함께 배포되는 버전은 Sage 버전과 호환되지 않을 수 있으므로 sagetex.sty
Sage 자체와 함께 배포되는 버전을 사용하여 수동으로 설치해야 한다는 점이 지적되어 있습니다 .
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
갭 패키지typeset
버전 1.0 릴리스: 2022-11-11
저장소:https://github.com/gap-packages/typeset
이 패키지를 사용하면 TeX에 붙여넣기 위해 GAP에서 TeX 출력을 생성할 수 있습니다( TeXForm
Mathematica와 유사).
예:
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 주제 콜백, 외부 실행, 외부 코드).
robust-externalize
(Github 토론도 참조하세요.#7)texsurgery
~와 함께JupyterKernel GAP 패키지runcode
hvextern
pythontex
memoize
최소 예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: