Usando el pgfforpaquete

Usando el pgfforpaquete

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 pgfforpaquete

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}

ingrese la descripción de la imagen aquí

Respuesta3

algo como esto

ingrese la descripción de la imagen aquí

\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}

información relacionada