pgffor패키지 사용

pgffor패키지 사용

극장 티켓을 인쇄해야 해요. 극장 좌석 배치도는 다음과 같습니다.

블록(H를 통해 A 오른쪽, A 왼쪽, B 오른쪽, B 왼쪽 등)

행(블록 A는 1부터 15까지의 행을 가질 수 있고, 블록 B는 1부터 20까지의 행을 가질 수 있습니다. 숫자가 모두 동일하지는 않습니다.)

좌석(블록 A 오른쪽 행 1에는 1부터 4까지의 좌석이 있을 수 있고, 블록 A 오른쪽 행 2에는 1부터 22까지의 좌석이 있을 수 있습니다. 다시 말하지만 숫자가 모두 동일하지는 않습니다)

나는 Latex에 for-loop가 있다는 것을 알고 있으며 이전에 성공적으로 사용한 적이 있지만 Block이 A인 경우 행 15에서 중지해야 한다고 루프에 알리는 방법에 대한 문제가 있습니다. 블록이 B인 경우 20으로 이동합니다. 좌석도 마찬가지입니다(반면에 행 문제를 해결하면 좌석 문제도 해결할 수 있습니다).

블록당 행 수와 행당 좌석 수에 대한 정보를 테이블에 넣는 것에 대해 생각했지만 for 루프를 사용하여 테이블을 읽는 방법을 모르겠습니다. 아니면 이 경우 for가 옳지 않을 수도 있나요? 어쩌면 잠시... 더 적절할까요? 하지만 라텍스에서 이를 구현하는 방법을 모르겠습니다.

답변1

pgffor패키지 사용

한 가지 가능성:

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

각 블록은 블록 이름과 행 크기 목록을 사용하여 정의됩니다.

답변2

OP는 행의 좌석 번호가 이외의 다른 것으로 시작할 수 있다는 표시를 제공하지 않았기 때문에 1가정했지만 그에 따라 변경할 수 있습니다. 통사론:

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

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}

여기에 이미지 설명을 입력하세요

답변3

이 같은

여기에 이미지 설명을 입력하세요

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

관련 정보