Usando o pgfforpacote

Usando o pgfforpacote

Tenho que imprimir ingressos para um teatro. A planta do teatro é a seguinte:

Blocos (A direita, A esquerda, B direita, B esquerda, etc., até H)

Linhas (o bloco A pode ter linhas de 1 a 15, o bloco B de 1 a 20 e assim por diante: não são todos iguais em número)

Assento (o Bloco A, fila 1 da direita, pode ter assentos de 1 a 4, o Bloco A, fila 2, da direita, de 1 a 22, e assim por diante: novamente, nem todos iguais em número)

Estou ciente da existência de loops for no Latex e já os usei com sucesso antes, mas tenho o problema de como dizer ao loop que ele deve parar na linha 15 se o bloco for A, mas tem ir para 20 se o Bloco for B, etc. O mesmo para os assentos (ao passo que se eu resolver o problema das filas, posso resolvê-lo para os assentos).

Pensei em colocar as informações sobre o número de linhas por bloco e o número de assentos por linha em uma tabela, mas não sei como fazer com que o loop for leia a tabela. Ou talvez o for não esteja certo neste caso? Talvez um pouco... seria mais apropriado? Mas não sei como implementar isso no Latex.

Responder1

Usando o pgfforpacote

Uma possibilidade:

\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 bloco é definido usando um nome de bloco e uma lista de tamanhos de linha.

Responder2

Como o OP não deu nenhuma indicação de que o número do assento de uma fileira possa começar com algo diferente de 1, presumi isso, mas poderia mudar de acordo. Sintaxe:

\printtickets{<section name> : <row 1 seats>, <row 2 seats>,.../ ...}

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

insira a descrição da imagem aqui

Responder3

algo assim

insira a descrição da imagem aqui

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

informação relacionada