En GAP se obtiene una matriz de la siguiente manera como salida:
[ [ 0, 0, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], [ 1, 0, 0, 0 ] ]
Esta matriz se proporciona como una lista de listas (que son los vectores de fila).
Pregunta: ¿Existe una forma directa de pegar esta salida GAP de una matriz directamente en un archivo TeX y obtener la matriz en TeX?
La motivación para esta pregunta es que a veces uno obtiene matrices muy grandes (como 40 por 40) de GAP como salida y sería bueno poder pegar directamente dicha salida GAP en TeX para obtener la matriz en LaTeX.
Respuesta1
\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}
Respuesta2
Un enfoque diferente (menos astuto que el de 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}
Respuesta3
Interfaz GAP en Sage, método Sage latex(obj)
y paquete LaTeXsagetex
Para la instalación de sagetex
verhttps://doc.sagemath.org/html/en/tutorial/sagetex.html#make-sagetex-known-to-tex
Se señala que la versión CTAN y la versión sagetex.sty
distribuida con TeXLive pueden ser incompatibles con su versión de Sage y, por lo tanto, la instalación sagetex.sty
debe realizarse manualmente utilizando la versión distribuida con Sage:
SAGE_ROOT/venv/share/texmf/tex/latex/sagetex/sagetex.sty
Para mí SAGE_ROOT
es
❯ sage -c "print(SAGE_ROOT)"
/Applications/SageMath-10-0.app/Contents/Frameworks/Sage.framework/Versions/10.0
Ahora cómo se ve el uso:
\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}
Tenga en cuenta que no es necesario que se llame latex(obj)
a sí mismo: el \sage
comando lo hace por usted. \sagestr{}
no lo hace.
En este caso particular, la llamada a gap('gap code').sage()
no sería necesaria ya que la notación matricial en GAP y en Sage (Python) coinciden. Pero el punto de la pregunta es cómo insertar en un documento TeX el código GAP (matriz GAP) y obtener un resultado tipográfico adecuado en LaTeX. Esto debería ilustrar esta posibilidad.
Respuesta4
Paquete BRECHAtypeset
Lanzamiento de la versión 1.0: 2022-11-11
Repositorio:https://github.com/gap-packages/typeset
Este paquete permite generar salida TeX en GAP para pegar en TeX (similar a TeXForm
Mathematica).
Ejemplo:
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)
Opcional: llame al código GAP dentro del documento TeX
Si desea automatizar el paso de inserción en el documento LaTeX, es posible ejecutar el código GAP desde un documento TeX. Los siguientes paquetes CTAN tienen como objetivo esta funcionalidad (Devolución de llamada de temas de CTAN, Exec externo, código externo)
robust-externalize
(ver también la discusión sobre Github#7)texsurgery
conPaquete GAP de JupyterKernelruncode
hvextern
pythontex
memoize
Ejemplo mínimo contexsurgery
\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: