2010-04-15 5 views
14

¿Hay arrays en LaTeX? No me refiero a la forma de componer matrices. Me refiero a las matrices como la estructura de datos en LaTeX/TeX como un "lenguaje de programación". Necesito almacenar un número de vbox-es o hbox-es en una matriz. Puede ser algo así como "una matriz de macros".¿Tiene LaTeX una estructura de datos de matriz?

Más detalles: Tengo un entorno que debe componer canciones. Necesito almacenar algunos párrafos de canciones dados como argumentos en mi macro \ songparagraph (así que no los escribiré, solo almacenaré esos párrafos). Como no sé cuántos párrafos puede haber en una canción en particular, necesito una matriz para esto. Cuando el entorno está cerrado, todos los párrafos se escribirán, pero primero se medirán y se calculará la mejor ubicación para cada párrafo (por ejemplo, algunos párrafos se pueden poner uno al lado del otro en dos columnas para que la canción se vea más compacto y ahorre un poco de espacio).

Cualquier idea sería bienvenida. Por favor, si conoce las matrices en LaTeX, publique un enlace a alguna documentación básica, tutorial o simplemente indique los comandos básicos.

Respuesta

2

Salida Arrayjob que implementa matrices para LaTeX. Es cierto que solo he echado un vistazo, así que no sé cuán efectivo será. Pero, si no tiene que escribirlo usted mismo ...

9

Esta es una matriz cómo se podría implementar en LaTeX:

\documentclass{article} 
\begin{document} 

\newcounter{mycounter} 
\setcounter{mycounter}{1} 

% ary is any prefix you want, it should not exist as a command. 

\expandafter\newcommand\csname ary\the\value{mycounter} \endcsname{myfirstelement} 
\stepcounter{mycounter} 
\expandafter\newcommand\csname ary\the\value{mycounter} \endcsname{mysecondelement} 

\csname ary1 \endcsname 

or 

\newcounter{index} 
\setcounter{index}{2} 

\csname ary\the\value{index} \endcsname 

\end{document} 

Ejecutar este a través del látex (látex o mydoc.tex mydoc.tex pdflatex) y ver la salida.

Una breve explicación: esto crea dos comandos (con newcommand): ary1 y ary2. Se necesita \expandafter porque newcommand no debe definir \csname pero el comando creado por \csname ... \endcsname. \expandafter salta sobre el próximo token, en este caso la secuencia de control \newcommand y ejecuta el siguiente comando antes de que TeX vea el \newcommand. Eso significa que lo primero en las nuevas líneas de comandos que TeX ve es el constructo \csname ... \endcsname, TeX lo ejecuta y luego ejecuta con el resultado de la construcción \csname ... \endcsname. \csname foo\endcsname es lo mismo que \foo, pero puede usar cualquier carácter o incluso espacios en el comando creado por \csname ... \endcsname.

Esto no es trivial. Consulte el gran libro "TeX por tema" de Victor Eijkhout: http://eijkhout.net/texbytopic/texbytopic.html

3

Para ampliar la respuesta de Patrick, la respuesta breve es "No". Sin embargo, como tiene expansión macro, se puede programar para tener matrices.

Aquí hay otro ejemplo, este usando push y pop para "arrays". Cuando se llama al \[email protected], guarda el color actual en la pila. \[email protected] toma la definición del color de la parte superior, y lo utiliza:

\newcount\[email protected] 
\def\[email protected]{% 
    \xglobal\colorlet{foo\the\[email protected]}{.}% 
\global\advance\[email protected] by1\relax} 
\def\[email protected]{% 
    \global\advance\[email protected] by-1\relax% 
\color{foo\the\[email protected]}} 

(I adaptado el código de la fuente para el paquete Beamer)

3

También puede ver algo como el paquete de herramientas de datos o el sistema de programación expl3, y el tipo de datos "lista de propiedades".

3

pgfkeys y pgffor también podría funcionar para usted. Son parte del paquete pgf (formato de gráficos portátiles) pero se pueden usar independientemente de todos los elementos gráficos.

4

Luatex tiene tablas de Lua, que generalizan las matrices. Si el látex estándar no es importante para usted, considere usar Luatex con látex. A continuación, puede hacer cosas como:

\def\lookup#1{\directlua { 
    local array={1,2,4,8}; tex.print(array[#1])}} 
\[ 2 \mapsto \lookup{2} \] 

LuaTeX es un poco escamosa con látex, debido a la necesidad de escapar de todo tipo de personajes Lua en el código de látex. El contexto tiene macros \startluacode ... \stopluacode para manejar las definiciones del código Lua, y \ctxlua para las llamadas al código Lua, y no veo ningún motivo por el que algo como esto no pueda definirse para Latex.

Cuestiones relacionadas