両面ページ

両面ページ

こんにちは。私は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.psbcなどで、バックファイルb01.psdummy.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

関連情報