私はdjvuの本のスキャンバージョンを持っています。 2つの状況を考えてみましょう。
ページ番号を付けたいです。
0, 1, 2, ...
(ユースケース:カバーは0ページでなければなりません。)一部のページにはローマ数字で番号を付け、一部のページにはアラビア数字で番号を付けたいです。たとえば、次のようになります。 (
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"
...
djvused
DjVuファイルへの変更をコミットするには、スクリプトの出力をパイプする必要があります。
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"
...
djvused
DjVuファイルへの変更をコミットするには、次のリストを渡してください。
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
このページでは、アラビア数字をローマ数字に変換するパッケージを使用しています。しかし、numconv
Kubuntuシステムへのインストールに問題があります。つまり、うまくインストールされているように見えますが、呼び出すとエラーが返されます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