スキップページを含むスクリプト

スキップページを含むスクリプト

私はdjvuの本のスキャンバージョンを持っています。 2つの状況を考えてみましょう。

  1. ページ番号を付けたいです。0, 1, 2, ...(ユースケース:カバーは0ページでなければなりません。)

  2. 一部のページにはローマ数字で番号を付け、一部のページにはアラビア数字で番号を付けたいです。たとえば、次のようになります。 (i, ii, iii, ..., x, 1, 2, 3, ...ユースケース:本の一部の紹介ページにはローマ数字で番号が付けられています。)

Linuxで実装できますか?

答え1

可能ですが、要求する必要がある場合はあまり役に立ちません。set-page-title次の一連のコマンドを生成するには、スクリプトが必要です。

select 1; set-page-title "Cover"
select 2; set-page-title "i"
select 3; set-page-title "ii"
select 4; set-page-title "iii"
select 5; set-page-title "1"
select 6; set-page-title "2"
select 7; set-page-title "3"
select 8; set-page-title "4"
select 9; set-page-title "5"
select 10; set-page-title "6"
...

djvusedDjVuファイルへの変更をコミットするには、スクリプトの出力をパイプする必要があります。

djvu_pagination | djvused -f - -s file.djvu

しかし、チャンスは一度だけ与えられます。番号が間違っていると、同じコマンドを再実行することはできず、コンポーネント名を参照して論理ページ番号をリセットする必要があります。問題は次のとおりです。

select "all_24223_to_00243.cpc.djvu"; set-page-title "all_24223_to_00243.cpc.djvu"
select "all_24223_to_00243.cpc0002.djvu"; set-page-title "all_24223_to_00243.cpc0002.djvu"
select "all_24223_to_00243.cpc0003.djvu"; set-page-title "all_24223_to_00243.cpc0003.djvu"
select "all_24223_to_00243.cpc0004.djvu"; set-page-title "all_24223_to_00243.cpc0004.djvu"
select "all_24223_to_00243.cpc0005.djvu"; set-page-title "all_24223_to_00243.cpc0005.djvu"
...

djvusedその後、これらのコマンドを上記のようにパイプできます。

djvu_reset_pagination | djvused -f - -s file.djvu

昔々、人々はこれらすべてを処理するためにスクリプトを使用しました。そんな時代はもう通り過ぎました。

答え2

2021年3月の更新:スクリプトの更新+ページをスキップ

(lcd047の回答で修正)

問題が発生した場合に備えて、.djvuファイルのバックアップコピーを作成します。

numconvインストールパッケージからここ

以下をテキストファイルとして保存します。例generate_page_list.sh:

#!/bin/bash

## Set these parameters:
# Name first/last page $CNAME/$BCNAME? (Yes/No=0/1)
COVER=1
BCOVER=0
CNAME="C"
BCNAME="BC"
# Lowest roman page number 
MINROMAN=3
# Highest roman page number
MAXROMAN=6
# Lowest arabic page number
MINARABIC=1
# Highest arabic page number
MAXARABIC=10

# Create/Empty new_page_list
> new_page_list
# Initialise total page number iTOTAL
iTOTAL=1
# Generate list of set-page-title commands
if [[ "$COVER" == 1 ]]; then
    echo "select $iTOTAL; set-page-title \"$CNAME\"" >> new_page_list
    ((iTOTAL++))
fi

for (( i=$MINROMAN; i<=$MAXROMAN; i++)); do
    iROMAN=`echo $i | numconv -f Western -t Roman_Lower`
    echo "select $iTOTAL; set-page-title \"$iROMAN\"" >> new_page_list
    ((iTOTAL++))
done

for (( i=$MINARABIC; i<=$MAXARABIC; i++)); do
    echo "select $iTOTAL; set-page-title \"$i\"" >> new_page_list
    ((iTOTAL++))
done

if [[ "$BCOVER" == 1 ]]; then
    echo "select $iTOTAL; set-page-title \"$BCNAME\"" >> new_page_list
    ((iTOTAL++))
fi

generate_page_list.sh実行可能ファイルの転送

chmod +x generate_page_list.sh

スクリプトを実行して

./generate_page_list.sh

これでファイルが作成されますnew_page_list。このファイルをテキストエディタで開き、set-page-title次の一連のコマンドが含まれていることを確認します。

select 1; set-page-title "Cover"
select 2; set-page-title "i"
select 3; set-page-title "ii"
select 4; set-page-title "iii"
select 5; set-page-title "1"
select 6; set-page-title "2"
select 7; set-page-title "3"
select 8; set-page-title "4"
select 9; set-page-title "5"
select 10; set-page-title "6"
...

djvusedDjVuファイルへの変更をコミットするには、次のリストを渡してください。

djvused -f new_page_list -s file.djvu

スキップページを含むスクリプト

.djvuファイルにページが見つからない場合(たとえば、スキャン中に空白のページが残る)、上記のスクリプトの次の拡張子を使用できます。

#!/bin/bash

## Set these parameters:
# Name first/last page $CNAME/$BCNAME? (Yes/No=0/1)
COVER=1
BCOVER=0
CNAME="C"
BCNAME="BC"
# Lowest roman page number 
MINROMAN=3
# Highest roman page number
MAXROMAN=6
# Skipped roman page numbers 
SKIPROMAN=""
# Lowest arabic page number
MINARABIC=1
# Highest arabic page number
MAXARABIC=10
# Skipped arabic page numbers
SKIPARABIC="3 5"

# Create/Empty new_page_list
> new_page_list
# Initialise total page number iTOTAL
iTOTAL=1
# Generate list of set-page-title commands
if [[ "$COVER" == 1 ]]; then
    echo "select $iTOTAL; set-page-title \"$CNAME\"" >> new_page_list
    ((iTOTAL++))
fi

for (( i=$MINROMAN; i<=$MAXROMAN; i++)); do
    if [[ ! " $SKIPROMAN " =~ " $i " ]]; then
        iROMAN=`echo $i | numconv -f Western -t Roman_Lower`
        echo "select $iTOTAL; set-page-title \"$iROMAN\"" >> new_page_list
        ((iTOTAL++))
    fi
done

for (( i=$MINARABIC; i<=$MAXARABIC; i++)); do
    if [[ ! " $SKIPARABIC " =~ " $i " ]]; then
        echo "select $iTOTAL; set-page-title \"$i\"" >> new_page_list
        ((iTOTAL++))
    fi
done

if [[ "$BCOVER" == 1 ]]; then
    echo "select $iTOTAL; set-page-title \"$BCNAME\"" >> new_page_list
    ((iTOTAL++))
fi

SKIPARABIC(またはSKIPROMAN)は、スキップされたページ番号のスペースで区切られたリストを含む文字列です。たとえば、数値を個別に入力できます。

SKIPARABIC="3 4"

または範囲で

SKIPARABIC="{3..5}"

または1つ以上の数字と範囲の組み合わせ(また、スペースで区切られています)

SKIPARABIC="{3..5} 7 {9..15}"

私は文字列比較を使用しています。このstackoverflowの答え)、これは最も効率的ではないかもしれませんが、リストに基づいたループで反復をスキップするために見つけることができる最も簡単で読みやすい解決策です。

答え3

2023年11月の更新:hifeの回答は以下に依存しません。numconv

これhifeが返信しましたnumconvこのページでは、アラビア数字をローマ数字に変換するパッケージを使用しています。しかし、numconvKubuntuシステムへのインストールに問題があります。つまり、うまくインストールされているように見えますが、呼び出すとエラーが返されますnumconv: error while loading shared libraries: libuninum.so.5: cannot open shared object file: No such file or directory(ライブラリが必要な場所であるにもかかわらず/usr/local/lib/)。

したがって、変換を実行するbashスクリプトを作成しました。これはarabic_to_roman基本的に提案されたアルゴリズムを bash に訳したものです。ここ。スクリプトはこの記事の最後にあります。

hifeスクリプトで変更する唯一のことは、次のコマンドです。

iROMAN=`echo $i | numconv -f Western -t Roman_Lower`

このコマンドは次のように置き換える必要があります。

iROMAN=`arabic_to_roman $i`

これが機能するには、スクリプトが検索パスarabic_to_romanのディレクトリにある必要があります。それ以外の場合は、スクリプトへのフルパスを提供する必要があります。もちろん、スクリプトは実行可能でなければなりません(例:を使用してchmod +x arabic_to_roman)。

最後に、スクリプトは次のようになりますarabic_to_roman

#!/bin/bash

# sample usage: 
# arabic_to_roman 54
# returns liv

# Function to convert Arabic number to Roman numeral
convert_to_roman() {
    num=$1
    res=""

    while [ $num -ge 1000 ]; do
        res+="m"
        ((num-=1000))
    done

    while [ $num -ge 900 ]; do
        res+="cm"
        ((num-=900))
    done

    while [ $num -ge 500 ]; do
        res+="d"
        ((num-=500))
    done

    while [ $num -ge 400 ]; do
        res+="cd"
        ((num-=400))
    done

    while [ $num -ge 100 ]; do
        res+="c"
        ((num-=100))
    done

    while [ $num -ge 90 ]; do
        res+="xc"
        ((num-=90))
    done

    while [ $num -ge 50 ]; do
        res+="l"
        ((num-=50))
    done

    while [ $num -ge 40 ]; do
        res+="xl"
        ((num-=40))
    done

    while [ $num -ge 10 ]; do
        res+="x"
        ((num-=10))
    done

    while [ $num -ge 9 ]; do
        res+="ix"
        ((num-=9))
    done

    while [ $num -ge 5 ]; do
        res+="v"
        ((num-=5))
    done

    while [ $num -ge 4 ]; do
        res+="iv"
        ((num-=4))
    done

    while [ $num -ge 1 ]; do
        res+="i"
        ((num-=1))
    done

    echo "$res"
}

# Check if an argument is provided
if [ $# -eq 0 ]; then
    echo "Usage: $0 <arabic_number>"
    exit 1
fi

# Call the function with the provided Arabic number
convert_to_roman $1

関連情報