В GAP на выходе получается матрица следующим образом:
[ [ 0, 0, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], [ 1, 0, 0, 0 ] ]
Эта матрица представлена в виде списка списков (которые являются векторами-строками).
Вопрос: Существует ли прямой способ вставить этот вывод GAP матрицы непосредственно в файл TeX и получить матрицу в TeX?
Мотивация этого вопроса заключается в том, что иногда в качестве выходных данных GAP получаются очень большие матрицы (например, 40 на 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
Интерфейс GAP в Sage, метод Sage latex(obj)
и пакет LaTeXsagetex
Для установки sagetex
см.https://doc.sagemath.org/html/en/tutorial/sagetex.html#make-sagetex-known-to-tex
Обратите внимание, что версия CTAN и версия, sagetex.sty
распространяемая с 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('gap code').sage()
не был бы необходим, так как матричная нотация в GAP и в Sage (Python) совпадает. Но суть вопроса в том, как вставить в TeX-документ код GAP (матрицу GAP) и получить правильный результат набора в LaTeX. Это должно проиллюстрировать эту возможность.
решение4
Пакет GAPtypeset
Версия 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)
Необязательно: вызов кода GAP в документе TeX
Если вы хотите автоматизировать этап вставки в документ LaTeX, можно запустить GAP Code из документа TeX. Следующие пакеты CTAN нацелены на эту функциональность (CTAN Topics Callback, Exec foreign, External code)
robust-externalize
(см. также обсуждение на Github)#7)texsurgery
сПакет JupyterKernel GAPruncode
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-файл: