.png)
私は次のページリストを作成したいと考えています(組版作業用);(ページ数は可変ですが、16 ページのリストを使用してニーズのサンプルを作成します。長いリストでもロジックは同じです)
1,16
8,9
15,2
10,7
3,14
6,11
13,4
12,5
私はこれをサイクルのために書きました:
for ((x=16, y=1, z=8, w=9;x>=4, y<=4, z>=12, w<=12;x--, y++, z--, w++)); do echo "$x $y;$z $w"; done | tr ";" "\n" | tr " " ","
しかし、次の結果が生じます。
16,1
8,9
15,2
7,10
14,3
6,11
13,4
5,12
私が欲しいページのリストではありません。そのため、awk または他のコマンドを使用して、このパターンに従っていくつかの列のフィールドを交換する必要があります (4 ページごとに繰り返す)
フィールドをスワップする
スワップフィールドなし
スワップフィールドなし
フィールドをスワップする
16,1 (swap: becomes: 1,16
8,9 (no swap: remains 8,9
15,2 (no swap: remains 15,2
7,10 (swap: becomes: 10,7
14,3 (swap: becomes: 3,14
6,11 (no swap: remains 6,11
13,4 (no swap: remains 13,4
5,12 (swap: becomes: 12,5
この組版のロジックを一般化して(A6サイズの本を1部A4サイズのページに組版する必要がある)、より一般的なスクリプトを作成しました。
#!/bin/sh
pages=$1
halfpages="`let DIVISION=$pages/2; echo $DIVISION`"
incr="$(echo "scale=0; $halfpages+1" |bc -l)"
dividedby4="$(echo "scale=0; $pages/4" |bc -l)"
lastupperpage="$(echo "scale=0; $pages-$dividedby4" |bc -l)"
u="u"
for ((x=$pages, y=1, z=$halfpages, w=$incr;x>=4, y<=4, z>=$lastupperpage, w<=$lastupperpage;x--, y++, z--, w++)); do echo "$x$u $y$u;$z $w"; done | tr ";" "\n" | tr " " "," | tr "\n" ","
exit 0
ただし、私が作成できるのは以下のものだけです:
16u、1u、8、9、15u、2u、7、10、14u、3u、6、11、13u、4u、5、12
正しい代わりに:
1u、16u、8、9、15u、2u、10、7、3u、14u、6、11、13u、4u、12、5
私が渡すマルチバレント.jar
正しい組版順序を示すために、A4の上にA6を正しく組版した写真を添付します。
私が目指しているのは、A6サイズの本をA4サイズのページに載せる方法です。1つ見開きページ(8ページ組版ではない)を半分にカットし、A4ページを半分に折り重ねて閉じ、裏紙を半分にカットし、左端に糊をつけて表紙を付ける。
このタスクを実行するには、スクリプトを最初から考え直すか、固定パターン(スワップ、スワップなし、スワップなし、スワップ)で列内のフィールドを交換する方法を見つけて、スクリプトによって生成された間違った順序を修正する必要があります。
編集
次の構文を使用してスクリプトの標準出力を awk に送信する問題を解決しました:
awk -F "," '{
print $2 "," $1;
getline; print;
getline; print;
getline; print $2 "," $1
}'
答え1
次のスクリプトは、必要な出力を取得するためのよりクリーンな方法です。
#!/usr/bin/env bash
(($# == 0)) && {
echo "Usage: $0 <page_count>"
exit 1
} >&2
# nTotal = $1 rounded up to a multiple 8
nTotal=$(($1 + 7))
nTotal=$((nTotal - nTotal % 8))
nHalf=$((nTotal / 2))
nQuarter=$((nTotal / 4))
# print page numbers in groups of 4, 2 groups at a time
for ((x=0; x < nQuarter; x+=2)); do
printf '%du,%du\n%d,%d\n' \
$((x + 1)) $((nTotal - x)) $((nHalf - x)) $((nHalf + x + 1))
printf '%du,%du\n%d,%d\n' \
$((nTotal - (x + 1))) $((x + 2)) \
$((nHalf + x + 2)) $((nHalf - x - 1))
done
例
$ ./imposition8 16
1u,16u
8,9
15u,2u
10,7
3u,14u
6,11
13u,4u
12,5
元のスクリプトにいくつか問題があったため、スクリプトを書き直しました。
sh
互換性のない特定の構文が使用されていたbash
ため、一致するようにシェバン行を修正しました。すべては純粋な で実行できます。複数の呼び出し、外部、および
bash
の使用は非効率的です。特に、POSIX 準拠であっても および は内部で計算を実行できることを知っておく必要があります。tr
awk
bc
bash
sh
答え2
ここに、それをきれいに実行するスクリプトがあります (うまくいけば)。印刷/製本方法に精通していないため、シーケンスが正しいかどうかはわかりませんが、中心から外側に向かって確実に機能します...必要な折りたたみ/切断シーケンスがわかりません (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
------- -------
答え3
数式を導き出したい気持ちはわかりますが、メンテナンスの観点からは、次のようなものを使用する方がはるかに簡単で、したがってより優れているのではないでしょうか。
#!/bin/bash
arr=(1 16 8 9 15 2 10 7 3 14 6 11 13 4 12 5)
for i in {0..3}; do
for n in ${arr[*]}; do
echo -n $((n+16*i))","
done
echo
done | sed -r 's/([^,]+,[^,]+),/\1\n/g'
あるいは、パターンは次のように繰り返されませんか:
1,16
8,9
15,2
10,7
3,14
6,11
13,4
12,5
17,32
24,25
31,18
26,23
19,30
22,27
29,20
28,21
...