こんにちは。私はmpageを使って複数の片面紙を1ページに簡単に圧縮できます。しかし、両面紙で同じことをするのは難しいことがわかりました。この場合はバッジを印刷しています。私の入力が次のようになるとしましょう。
Badge01Front.pdf
Badge01Back.pdf
Badge02Front.pdf
Badge02Back.pdf
Badge03Front.pdf
...
複数のバッジを1枚のシートにまとめてシートをバッジに切り取った場合、最初のバッジの片側にBadge01Frontを作成し、もう一方の側にBadge01Backを作成するにはどうすればよいですか。 (等)。ちなみに、私はおそらくPDFの代わりにSVGを使用しています。しかし、変換しやすいので、大きく変わることはありません。
私はすでに書いたデフォルトでは、これを行う複数のスクリプトしかし、複雑で脆弱です。これを行うきれいな方法はありますか?
答え1
以下は体系的なアプローチです。後のファイル名が前のファイル名から単に派生できると仮定することから始めます。その後、古いファイルの数はページあたりのページ数の倍数で埋められます。私はnup
同じ名前の非常に古いプログラムでこれを呼び出しました。 Bash を使用して、以前のすべてのファイル名のインデックス配列を作成し、
files
最後にダミープレースホルダファイルで埋めます。一度に1つのテーブルを処理します。ファイル名を配列nup
として抽出します。すべてのファイル名を正しい順序で含む配列sheet
に追加します。final
ダミーのファイル名をスキップし、ワークシートのファイル名を将来のバージョンのファイル名に変換します。
nup/width
幅は、ページ内のアイテム数であるシートあたりの行数を計算します。各行に対して、その行のエントリの開始インデックスと終了インデックスを計算し、ワークシートのコピーから逆順にアイテムを更新します。結果をfinal
配列に追加します。
これにより、以下のbashスクリプトがより明確になります。私のフロントファイルはf01.ps
bcなどで、バックファイルb01.ps
はdummy.ps
。
nup=8
width=2
let numrows=nup/width
declare -a files final
files=(f*.ps)
dopad(){
while numfiles=${#files[@]}
let x=numfiles/nup*nup
[ $x != $numfiles ]
do files+=(dummy.ps)
done
}
doallsheets(){
declare -a sheet
let numsheets=numfiles/nup
for sheetnum in $(seq $numsheets)
do let offset=(sheetnum-1)*nup
for i in $(seq $nup)
do sheet+=(${files[$offset+$i-1]})
done
dosheet
unset sheet
done
}
dosheet(){
final+=(${sheet[@]})
convertnames
swaprows
final+=(${sheet[@]})
}
convertnames(){
for i in $(seq $nup)
do if [ ${sheet[$i-1]} != dummy.ps ]
then back=${sheet[$i-1]}
sheet[$i-1]=${back/f/b}
fi
done
}
swaprows(){
declare -a sheetcopy=(${sheet[@]})
for row in $(seq $numrows)
do let start=(row-1)*width
let end=row*width-1
swap
done
}
swap(){
for i in $(seq $width)
do sheet[$start+$i-1]=${sheetcopy[$end-$i+1]}
done
}
dopad
doallsheets
mpage -$nup -k -c -bA4 -l -a -P- -L5 -W40 -H ${final[@]} >out.ps
以下で生成されたいくつかのPostScriptファイルを使用してこれをテストしましたenscript
。
create(){
echo "$1" | enscript -fCourier30 -FCourierBold30 -p- | eps2eps - - >"${2?}"
}
startup(){
for i in $(seq -f '%02.0f' 11)
do create "item $i front" f$i.ps
create "item $i back" b$i.ps
done
create "dummy" dummy.ps
}
startup