
Мне нужно распечатать билеты в театр. План зала театра следующий:
Блоки (A правый, A левый, B правый, B левый и т.д. до H)
Ряды (Блок A может иметь ряды от 1 до 15, Блок B — от 1 до 20 и т. д.: они не все одинаковы по количеству)
Место (в блоке А, правый ряд 1, могут быть места с 1 по 4, в блоке А, правый ряд 2, — с 1 по 22 и т. д.: опять же, не все они одинаковы по количеству)
Я знаю о существовании циклов for в Latex, и я успешно использовал их раньше, но у меня возникла проблема: как сообщить циклу, что он должен остановиться на строке 15, если блок — это A, но он должен перейти на строку 20, если блок — это B, и т. д. То же самое и для сидений (тогда как если я решу задачу для рядов, я смогу решить ее и для сидений).
Я думал о том, чтобы поместить информацию о количестве строк в блоке и количестве мест в строке в таблицу, но тогда я не знаю, как заставить цикл for читать таблицу. Или, может быть, for не подходит в этом случае? Может быть, while ... do было бы более уместно? Но тогда я не знаю, как реализовать это в Latex.
решение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>,.../ ...}
МВЭ:
\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}