Вот сценарий, который делает это чисто (надо надеяться).. Я не с печатью/методами привязки, таким образом, я не уверен, корректно ли упорядочивание, но это, конечно, работает от центра... Я просто не делаю knwo сворачивающаяся/сокращающая последовательность, которой Вы требуете (вне Вашего примера на 16 страниц)... Я включал демонстрационный вывод на 24 страницы.
pages=${1:-16}
pagesPerSheet=4
sheets=$(( (pages/pagesPerSheet)
+((pages%pagesPerSheet)>0) ))
pagesTot=$((sheets*pagesPerSheet))
Ob=0 # overall begin
Ox=$((pagesTot+1)) # overall max
Hb=$((Ox/2)) # 2nd Half begin
hx=$((Hb+1)) # 1st half max
for ((s=sheets;s>0;s-=2)) ;do
printf '%su,%su,%s,%s,%su,%su,%s,%s%s' \
$((Ob+=1)) $((Ox-=1)) \
$((hx-=1)) $((Hb+=1)) \
$((Ox-=1)) $((Ob+=1)) \
$((Hb+=1)) $((hx-=1)) \
$(((s>2)) && echo ,)
done; echo
вывод
# 16 page
1u,16u,8,9,15u,2u,10,7,3u,14u,6,11,13u,4u,12,5
# 24 page
1u,24u,12,13,23u,2u,14,11,3u,22u,10,15,21u,4u,16,9,5u,20u,8,17,19u,6u,18,7
Этот фрагмент кода печатает графическое представление
Ob=0 # overall begin
Ox=$((pagesTot+1)) # overall max
Hb=$((Ox/2)) # 2nd Half begin
hx=$((Hb+1)) # 1st half max
for ((s=sheets;s>0;s-=2)) ;do
printf '%2su %2su | %2su %2su\n%2s %2s | %2s %2s\n------- -------\n' \
$((Ob+=1)) $((Ox-=1)) $((Ox-=1)) $((Ob+=1)) \
$((hx-=1)) $((Hb+=1)) $((Hb+=1)) $((hx-=1))
done
вывод
# 16 page
1u 16u | 15u 2u
8 9 | 10 7
------- -------
3u 14u | 13u 4u
6 11 | 12 5
------- -------
# 24 page
1u 24u | 23u 2u
12 13 | 14 11
------- -------
3u 22u | 21u 4u
10 15 | 16 9
------- -------
5u 20u | 19u 6u
8 17 | 18 7
------- -------
Можно использовать виртуальный X-сервер как Xvfb
для этого. Это (не только) для X что /dev/null
для консоли. Вы работаете Xvfb
и ДИСПЛЕЙ АППАРАТА к нему.
У меня нет практического опыта с этим так, я не могу предоставить Вам подробную информацию. Но это должно быть способом пойти.
Вы могли попытаться запустить программу в tty только, чтобы удостовериться, что она не откажет на Вас, если не будет никакого "дисплея".
Если это будет работать затем, вероятно, то это будет работать также:
$(unset DISPLAY; java your_stuff_here)
то, что это делает, породить подоболочку (следовательно $ (...)) и очищает переменную ДИСПЛЕЯ.
Я помню эту работу для некоторых приложений GUI, которые я хотел запустить без GUI