Compare commits
3 Commits
54fdc697dc
...
095e19700e
Author | SHA1 | Date | |
---|---|---|---|
095e19700e | |||
b2c8cffc3d | |||
f9c5191b7d |
12
README.md
12
README.md
@ -12,15 +12,18 @@ This LaTeX code needs a wrapper LaTeX script with
|
|||||||
\usepackage{verse, gmverse}
|
\usepackage{verse, gmverse}
|
||||||
```
|
```
|
||||||
in the preamble and some other features.
|
in the preamble and some other features.
|
||||||
The path to markdown files, chapter names and other options can be configured in the `conf.sh` file.
|
The path to markdown files, chapter names and other options can be configured in the `verse.conf` file.
|
||||||
The `config.sh` file is read by `mkverse.sh`.
|
The `verse.conf file is read by `mkverse.sh`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## mkverse.sh
|
## mkverse.sh
|
||||||
The `mkverse.sh` script creates a PDF file out of several easy markdown files.
|
The `mkverse.sh` script creates a PDF file out of several easy markdown files.
|
||||||
Some options need to be set in `config.sh` file.
|
Some options need to be set in `vers.conf` file.
|
||||||
`config.sh` might be renamed to `verse.conf`.
|
A single configuration file can be given to `mkverse.sh` to use instead of `verse.conf`.
|
||||||
|
```
|
||||||
|
cp verse.conf quaderno.conf
|
||||||
|
./mkverse.sh quaderno.conf
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -31,6 +34,7 @@ Some options need to be set in `config.sh` file.
|
|||||||
## pdf2book.py
|
## pdf2book.py
|
||||||
This script takes a pdf and reorders pages for printing signatures.
|
This script takes a pdf and reorders pages for printing signatures.
|
||||||
The number of pages per signature can be varied
|
The number of pages per signature can be varied
|
||||||
|
Dependency: `pypdf`
|
||||||
```
|
```
|
||||||
s=1: 1,2,3,4 -> 04,01.02,03 i=0
|
s=1: 1,2,3,4 -> 04,01.02,03 i=0
|
||||||
08,05.06,07 i=1
|
08,05.06,07 i=1
|
||||||
|
109
mkparallel.sh
Executable file
109
mkparallel.sh
Executable file
@ -0,0 +1,109 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# CREATE PDF from markdown files
|
||||||
|
#
|
||||||
|
|
||||||
|
#set -x
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ $# -eq 1 ]
|
||||||
|
then
|
||||||
|
CONF=$1
|
||||||
|
else
|
||||||
|
CONF="parallel.conf"
|
||||||
|
fi
|
||||||
|
|
||||||
|
CONVERTER="md2parallel.sh"
|
||||||
|
|
||||||
|
if ! [[ -f $CONF ]] ; then echo "$CONF not found! Exiting ..." && exit ; fi
|
||||||
|
if ! [[ -f $CONVERTER ]] ; then echo "$CONVERTER not found! Exiting ..." && exit ; fi
|
||||||
|
if ! [[ -x $CONVERTER ]] ; then echo "$CONVERTER not executable! Exiting ..." && exit ; fi
|
||||||
|
|
||||||
|
. $CONF
|
||||||
|
# SAVE WORKING DIR
|
||||||
|
WD=$PWD
|
||||||
|
TMPDIR=$(mktemp -d)
|
||||||
|
PATH=$PATH:$WD
|
||||||
|
pushd $TMPDIR > /dev/null
|
||||||
|
|
||||||
|
# CONVERT MD TO TEX
|
||||||
|
for tex in $( echo $INFILES | grep '.md$' )
|
||||||
|
do
|
||||||
|
if [[ -f $WD/$tex ]]
|
||||||
|
then
|
||||||
|
# create parent dir if necassary
|
||||||
|
mkdir -p $(dirname $tex)
|
||||||
|
$CONVERTER $WD/$tex > $( echo $tex | sed "s/.md/.tex/" )
|
||||||
|
else
|
||||||
|
if [[ $tex == *.md ]]
|
||||||
|
then
|
||||||
|
echo "$WD/$tex does not exist!!!"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# CREATE WRAPPER
|
||||||
|
WRAPPER="""
|
||||||
|
\documentclass[twoside]{$DOCCLASS}
|
||||||
|
\usepackage[fontsize=${FONTSIZE}pt]{fontsize}
|
||||||
|
\usepackage[${PAGESIZE}paper]{geometry}
|
||||||
|
\usepackage{libertine} % also loads fontspec which is needed for ɔ and ɛ
|
||||||
|
\usepackage{minitoc} % make mini table of content for each chapter
|
||||||
|
\usepackage{graphicx} % include graphics
|
||||||
|
\usepackage{csquotes} % \enquote
|
||||||
|
\usepackage{reledmac} % needed for repedpar
|
||||||
|
\usepackage{reledpar} % parallel text
|
||||||
|
\newcommand{\pagesinclude}[2]{
|
||||||
|
\begin{pages}
|
||||||
|
\begin{Leftside}
|
||||||
|
\beginnumbering
|
||||||
|
\pstart\input{#1}\pend
|
||||||
|
\endnumbering
|
||||||
|
\end{Leftside}
|
||||||
|
\begin{Rightside}
|
||||||
|
\beginnumbering
|
||||||
|
\pstart\input{#2}\pend
|
||||||
|
\endnumbering
|
||||||
|
\end{Rightside}
|
||||||
|
\end{pages}
|
||||||
|
\Pages
|
||||||
|
}
|
||||||
|
\title{$TITLE}
|
||||||
|
\author{$AUTHOR}
|
||||||
|
\begin{document}
|
||||||
|
\maketitle
|
||||||
|
\tableofcontents
|
||||||
|
"""
|
||||||
|
WRAPPER_END="""
|
||||||
|
\end{document}
|
||||||
|
"""
|
||||||
|
|
||||||
|
echo "$WRAPPER" > $PROJECT.tex
|
||||||
|
# INCLUDE INDIVIDUAL TEX FILE
|
||||||
|
first_lang="true"
|
||||||
|
for input in $INFILES
|
||||||
|
do
|
||||||
|
if [[ $input == *.md ]]
|
||||||
|
then
|
||||||
|
if [[ $first_lang == "true" ]] ; then
|
||||||
|
echo '\pagesinclude' "{ $( echo $input | sed 's/.md/.tex/' ) }" >> $PROJECT.tex
|
||||||
|
first_lang="false"
|
||||||
|
else
|
||||||
|
echo "{ $( echo $input | sed 's/.md/.tex/' ) }" >> $PROJECT.tex
|
||||||
|
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
#is chapter
|
||||||
|
echo '\chapter' " { $input }" >> $PROJECT.tex
|
||||||
|
fi
|
||||||
|
echo '\clearpage' >> $PROJECT.tex
|
||||||
|
done
|
||||||
|
echo "$WRAPPER_END" >> $PROJECT.tex
|
||||||
|
|
||||||
|
# CREATE PDF
|
||||||
|
$LATEX_ENGINE $PROJECT.tex 2&> /dev/null
|
||||||
|
$LATEX_ENGINE $PROJECT.tex 2&> /dev/null
|
||||||
|
# $LATEX_ENGINE $PROJECT.tex
|
||||||
|
popd > /dev/null
|
||||||
|
cp -r $TMPDIR $WD/$PROJECT
|
||||||
|
echo "File $PROJECT.pdf created at $WD/$PROJECT/"
|
||||||
|
rm -rf $TMPDIR
|
23
mkverse.sh
Normal file → Executable file
23
mkverse.sh
Normal file → Executable file
@ -5,12 +5,17 @@
|
|||||||
#set -x
|
#set -x
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
CONF="conf.sh"
|
if [ $# -eq 1 ]
|
||||||
|
then
|
||||||
|
CONF=$1
|
||||||
|
else
|
||||||
|
CONF="verse.conf"
|
||||||
|
fi
|
||||||
|
|
||||||
TEMPLATE="verse-wrapper-template.tex"
|
TEMPLATE="verse-wrapper-template.tex"
|
||||||
CONVERTER="md2verse.sh"
|
CONVERTER="md2verse.sh"
|
||||||
|
|
||||||
if ! [[ -f $CONF ]] ; then echo "$CONF not found! Exiting ..." && exit ; fi
|
if ! [[ -f $CONF ]] ; then echo "$CONF not found! Exiting ..." && exit ; fi
|
||||||
if ! [[ -f $TEMPLATE ]] ; then echo "$TEMPLATE not found! Exiting ..." && exit ; fi
|
|
||||||
if ! [[ -f $CONVERTER ]] ; then echo "$CONVERTER not found! Exiting ..." && exit ; fi
|
if ! [[ -f $CONVERTER ]] ; then echo "$CONVERTER not found! Exiting ..." && exit ; fi
|
||||||
if ! [[ -x $CONVERTER ]] ; then echo "$CONVERTER not executable! Exiting ..." && exit ; fi
|
if ! [[ -x $CONVERTER ]] ; then echo "$CONVERTER not executable! Exiting ..." && exit ; fi
|
||||||
|
|
||||||
@ -19,7 +24,7 @@ if ! [[ -x $CONVERTER ]] ; then echo "$CONVERTER not executable! Exiting ..." &&
|
|||||||
WD=$PWD
|
WD=$PWD
|
||||||
TMPDIR=$(mktemp -d)
|
TMPDIR=$(mktemp -d)
|
||||||
PATH=$PATH:$WD
|
PATH=$PATH:$WD
|
||||||
pushd $TMPDIR
|
pushd $TMPDIR > /dev/null
|
||||||
|
|
||||||
# CONVERT MD TO TEX
|
# CONVERT MD TO TEX
|
||||||
for tex in $( echo $INFILES | grep '.md$' )
|
for tex in $( echo $INFILES | grep '.md$' )
|
||||||
@ -30,8 +35,11 @@ do
|
|||||||
mkdir -p $(dirname $tex)
|
mkdir -p $(dirname $tex)
|
||||||
$CONVERTER $WD/$tex > $( echo $tex | sed "s/.md/.tex/" )
|
$CONVERTER $WD/$tex > $( echo $tex | sed "s/.md/.tex/" )
|
||||||
else
|
else
|
||||||
|
if [[ $tex == *.md ]]
|
||||||
|
then
|
||||||
echo "$WD/$tex does not exist!!!"
|
echo "$WD/$tex does not exist!!!"
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# CREATE WRAPPER
|
# CREATE WRAPPER
|
||||||
@ -74,7 +82,12 @@ done
|
|||||||
echo "$WRAPPER_END" >> $PROJECT.tex
|
echo "$WRAPPER_END" >> $PROJECT.tex
|
||||||
|
|
||||||
# CREATE PDF
|
# CREATE PDF
|
||||||
$LATEX_ENGINE $PROJECT.tex
|
$LATEX_ENGINE $PROJECT.tex 2&> /dev/null
|
||||||
|
$LATEX_ENGINE $PROJECT.tex 2&> /dev/null
|
||||||
|
# $LATEX_ENGINE $PROJECT.tex
|
||||||
cp $PROJECT.pdf $WD
|
cp $PROJECT.pdf $WD
|
||||||
popd
|
echo "File $PROJECT.pdf created at $WD"
|
||||||
|
#cp $PROJECT.tex $WD
|
||||||
|
echo "File $PROJECT.tex created at $WD"
|
||||||
|
popd > /dev/null
|
||||||
rm -rf $TMPDIR
|
rm -rf $TMPDIR
|
||||||
|
13
parallel.conf
Normal file
13
parallel.conf
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
LATEX_ENGINE="pdflatex"
|
||||||
|
DOCCLASS="memoir"
|
||||||
|
DOCCLASS_EXTRA="twoside"
|
||||||
|
FONTSIZE="10"
|
||||||
|
PAGESIZE="a5"
|
||||||
|
PROJECT="asem"
|
||||||
|
TITLE="Nsɛm wɔ Twi ne Brɔfo\\\LARGE Texts in Twi and English"
|
||||||
|
AUTHOR=""
|
||||||
|
INFILES="""
|
||||||
|
Anansesem - Ghanaian Folk Tales
|
||||||
|
testfiles/parallel-ak.md
|
||||||
|
testfiles/parallel-en.md
|
||||||
|
"""
|
74
pdf2book.py
74
pdf2book.py
@ -1,35 +1,43 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from pypdf import PdfReader
|
||||||
|
from pypdf import PdfWriter
|
||||||
import argparse
|
import argparse
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
prog='pdf2book',
|
prog='pdf2book',
|
||||||
description='pdf2book rearranges pages for signature printing ',
|
description='pdf2book rearranges pages for signature printing ',
|
||||||
epilog='AQOABA')
|
epilog='AQOABA')
|
||||||
|
|
||||||
#parser.add_argument('pdf-file') # positional argument
|
parser.add_argument('pdf_file') # positional argument
|
||||||
parser.add_argument('pages', type=int) # positional argument
|
#parser.add_argument('pages', type=int) # positional argument
|
||||||
#parser.add_argument('-s', '--signature') # option that takes a value
|
#parser.add_argument('-s', '--signature') # option that takes a value
|
||||||
parser.add_argument('-v', '--verbose', action='store_true') # on/off flag
|
parser.add_argument('-v', '--verbose', action='store_true') # on/off flag
|
||||||
parser.add_argument('-s', '--signature',
|
parser.add_argument('-s', '--signature',
|
||||||
dest='signature',
|
dest='signature',
|
||||||
type=int,
|
type=int,
|
||||||
action='store',
|
action='store',
|
||||||
default=1,
|
default=0,
|
||||||
help='')
|
help='')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
s=args.signature
|
signature_size=args.signature
|
||||||
if s < 0 :
|
if signature_size < 0 :
|
||||||
# print("signature size must be greater than 0!")
|
# print("signature size must be greater than 0!")
|
||||||
print("signature size must be positive integer!")
|
print("signature size must be positive integer!")
|
||||||
exit(1)
|
exit(1)
|
||||||
pages=args.pages
|
|
||||||
|
reader = PdfReader(args.pdf_file)
|
||||||
|
number_of_pages = len(reader.pages)
|
||||||
|
#page = reader.pages[0]
|
||||||
|
#text = page.extract_text()
|
||||||
|
|
||||||
|
pages=number_of_pages
|
||||||
#print(pages)
|
#print(pages)
|
||||||
|
|
||||||
lst=[]
|
lst=[]
|
||||||
|
|
||||||
def get_reorder(page_number: int, signature_size: int):
|
def get_reorder(number_of_pages: int, signature_size: int):
|
||||||
panu=page_number
|
panu=number_of_pages
|
||||||
sisi=signature_size
|
sisi=signature_size
|
||||||
|
|
||||||
# s| 1 | 2 | 3 | 4 |
|
# s| 1 | 2 | 3 | 4 |
|
||||||
@ -49,23 +57,23 @@ def get_reorder(page_number: int, signature_size: int):
|
|||||||
#12 | 12 | 16 | 12 | 16 |
|
#12 | 12 | 16 | 12 | 16 |
|
||||||
#13 | 16 | 16 | 24 | 16 |
|
#13 | 16 | 16 | 24 | 16 |
|
||||||
|
|
||||||
p=page_number
|
p=number_of_pages
|
||||||
s=signature_size
|
s=signature_size
|
||||||
if s == 0:
|
if signature_size == 0:
|
||||||
s=1
|
signature_size=1
|
||||||
pages_filled= ( int((p-1)/(4*s)) +1 )*4*s
|
pages_filled= ( int((number_of_pages-1)/(4*signature_size)) +1 )*4*signature_size
|
||||||
s=int(pages_filled/4)
|
signature_size=int(pages_filled/4)
|
||||||
pages_filled= ( int((p-1)/(4*s)) +1 )*4*s
|
pages_filled= ( int((number_of_pages-1)/(4*signature_size)) +1 )*4*signature_size
|
||||||
|
|
||||||
signature_count=int( pages_filled/s/4 )
|
signature_count=int( pages_filled/signature_size/4 )
|
||||||
#print(signature_count)
|
#print(signature_count)
|
||||||
for i in range(signature_count):
|
for i in range(signature_count):
|
||||||
# print("i=",i)
|
# print("i=",i)
|
||||||
down=(i+1)*4*s
|
down=(i+1)*4*signature_size
|
||||||
# print("down=",down)
|
# print("down=",down)
|
||||||
up= (i*4*s)+1
|
up= (i*4*signature_size)+1
|
||||||
# print("up",up)
|
# print("up",up)
|
||||||
for count in range(s):
|
for count in range(signature_size):
|
||||||
# print("count=",count)
|
# print("count=",count)
|
||||||
lst.append(down); down -= 1
|
lst.append(down); down -= 1
|
||||||
lst.append(up); up += 1
|
lst.append(up); up += 1
|
||||||
@ -75,14 +83,34 @@ def get_reorder(page_number: int, signature_size: int):
|
|||||||
#print(lst)
|
#print(lst)
|
||||||
#print(len(lst))
|
#print(len(lst))
|
||||||
return lst
|
return lst
|
||||||
def print_signatures(lst: list,s: int):
|
def print_signatures(lst: list,signature_size: int):
|
||||||
if s==0: s=1
|
if signature_size==0: signature_size=1
|
||||||
for i in range( len( lst ) ):
|
for i in range( len( lst ) ):
|
||||||
if ( (i+1) % (4*s) == 0 ):
|
if ( (i+1) % (4*signature_size) == 0 ):
|
||||||
print(lst[i])
|
print(lst[i])
|
||||||
elif ( (i+1) % (4) == 0 ):
|
elif ( (i+1) % (4) == 0 ):
|
||||||
print(lst[i], end=' ')
|
print(lst[i], end=' ')
|
||||||
else:
|
else:
|
||||||
print(lst[i],end='.')
|
print(lst[i],end='.')
|
||||||
lst=get_reorder(args.pages, args.signature)
|
lst=get_reorder(number_of_pages, signature_size)
|
||||||
print_signatures(lst,s)
|
print_signatures(lst,signature_size)
|
||||||
|
|
||||||
|
# REARRANGING OF PAGES
|
||||||
|
|
||||||
|
def rearrange_pages(reader, lst):
|
||||||
|
|
||||||
|
writer = PdfWriter()
|
||||||
|
for page in lst:
|
||||||
|
# print(page)
|
||||||
|
if page > len(reader.pages):
|
||||||
|
writer.add_blank_page(width=reader.pages[0].mediabox.width,height=reader.pages[0].mediabox.height)
|
||||||
|
else:
|
||||||
|
writer.add_page(reader.pages[page-1])
|
||||||
|
|
||||||
|
return writer
|
||||||
|
|
||||||
|
# SAVE FILE TO DISK
|
||||||
|
writer=rearrange_pages(reader,lst)
|
||||||
|
outfile=args.pdf_file.split(".pdf")[0]+"_book_s"+str(signature_size)+".pdf"
|
||||||
|
with open(outfile, "wb") as fp:
|
||||||
|
writer.write(fp)
|
||||||
|
@ -10,4 +10,13 @@ Ladainhas
|
|||||||
testfiles/verse.md
|
testfiles/verse.md
|
||||||
Corridos
|
Corridos
|
||||||
testfiles/verse.md
|
testfiles/verse.md
|
||||||
|
testfiles/verse.md
|
||||||
|
testfiles/verse.md
|
||||||
|
testfiles/verse.md
|
||||||
|
testfiles/verse.md
|
||||||
|
testfiles/verse.md
|
||||||
|
testfiles/verse.md
|
||||||
|
Corridos
|
||||||
|
testfiles/verse.md
|
||||||
|
testfiles/verse.md
|
||||||
"
|
"
|
Loading…
Reference in New Issue
Block a user