
Tengo que imprimir entradas para un teatro. La distribución de asientos del teatro es la siguiente:
Bloques (A derecha, A izquierda, B derecha, B izquierda, etc., hasta H)
Filas (el bloque A podría tener filas del 1 al 15, el bloque B del 1 al 20, etc.: no todos son iguales en número)
Asiento (el bloque A de la fila 1 de la derecha podría tener asientos de 1 a 4, el bloque A de la fila 2 de la derecha de 1 a 22, y así sucesivamente: nuevamente, no todos son iguales en número)
Soy consciente de la existencia de bucles for en Latex y los he usado con éxito antes, pero tengo el problema de cómo decirle al bucle que tiene que detenerse en la fila 15 si el bloque es A, pero tiene pasar al 20 si el Bloque es B, etc. Lo mismo para los asientos (mientras que si resuelvo el problema de las filas, lo puedo resolver para los asientos).
Pensé en poner la información sobre el número de filas por bloque y el número de asientos por fila en una tabla, pero no sé cómo hacer que el bucle for lea la tabla. ¿O tal vez el for no es el correcto en este caso? Quizás un tiempo… ¿sería más apropiado? Pero no sé cómo implementar eso en Latex.
Respuesta1
Usando el pgffor
paquete
Una posibilidad:
\documentclass{article}
\usepackage{pgffor}
\begin{document}
\foreach \block/\rows in {
A right/{4,22,31},
A left/{4,5},
B right/{10,4,3,4,5},
} {
\foreach \seats [count=\row] in \rows {
\foreach \seat in {1, ..., \seats} {
Block: \block\ Row: \row, Seat:\seat
}
}
}
\end{document}
Cada bloque se define utilizando un nombre de bloque y una lista de tamaños de fila.
Respuesta2
Dado que el OP no dio ninguna indicación de que el número de asiento de una fila pueda comenzar con algo distinto a 1
, lo supuse, pero podría cambiar en consecuencia. Sintaxis:
\printtickets{<section name> : <row 1 seats>, <row 2 seats>,.../ ...}
El MWE:
\documentclass[12pt]{article}
\usepackage{listofitems,pgffor,stackengine}
\usepackage[margin=.5cm]{geometry}
\newcommand\printtickets[1]{\noindent%
\setsepchar[@]{/@:@,}%
\readlist*\seatcount{#1}%
\foreachitem\x\in\seatcount[]{%
\foreach\y in {1,...,{\listlen\seatcount[\xcnt,2]}}{%
\foreach\z in {1,...,{\seatcount[\xcnt,2,\y]}}{%
\addstackgap[1pt]{\fbox{\makebox[1in]{%
\Longstack{Block~\seatcount[\xcnt,1] Row~\y{} Seat~\z}}}}\kern3pt\allowbreak%
}%
}%
}%
}
\begin{document}
\sloppy
\printtickets{
A right : 3,5,7 /
A left : 3,5,6 /
B right : 4,5,6,9,11/
B left : 4,5,6,9,11
}
\end{document}
Respuesta3
algo como esto
\documentclass{article}
\makeatletter
\def\seats#1#2#3#4{%
\edef\minrow{\beforedash#2-\relax}%
\edef\maxrow{\afterdash#2-#2-\relax}%
\tickets{#1}\minrow\maxrow{#3}{#4}%
}
\def\beforedash#1-#2\relax{#1}
\def\afterdash#1-#2-#3\relax{#2}
\def\tickets#1#2#3#4#5{%
\count@#4 %
\loop
Block: #1, Row: \number#2, Seat: \the\count@\par
\ifnum\count@<#5 %
\advance\count@ 1 %
\repeat
\ifnum#2=#3 %
\expandafter\@gobble
\else
\expandafter\@firstofone
\fi
{\tickets{#1}{\numexpr#2+1\relax}{#3}{#4}{#5}}}
\begin{document}
% block row low high
\seats{A Left} {2-6} {1} {10}
\seats{A Left} {1} {2} {8}
\seats{B Right}{1-8} {1} {12}
\seats{B Right} {9} {10} {12}
\seats{B Right} {10} {10} {12}
\end{document}