Skip to content

Instantly share code, notes, and snippets.

@wojtekka
Created August 3, 2024 13:08
Show Gist options
  • Select an option

  • Save wojtekka/bf26c7c80aa793c817872e4f0226153f to your computer and use it in GitHub Desktop.

Select an option

Save wojtekka/bf26c7c80aa793c817872e4f0226153f to your computer and use it in GitHub Desktop.
Prepare page numbers to print a booklet using n-up option in print dialog
#!/usr/bin/python3
import sys
# 4 -> odd -> 4,1
# even -> 2,3
# 8 -> odd -> 8,1 6,3
# even -> 2,7 4,5
# 12 -> odd -> 12,1 10,3 8,5
# even -> 2,11 4,9 6,7
# 16 -> odd -> 16,1 14,3 12,5 10,7
# even -> 2,15 4,13 6,11 8,9
def booklet(pages):
def ceil4(n):
return n + (3 - ((n - 1) % 4))
def fix(n, pages):
return max(1, min(n, pages))
odd = []
even = []
front, back = 1, ceil4(pages)
for _ in range(0, ceil4(pages)//4):
odd.append((fix(back, pages), fix(front, pages)))
even.append((fix(front+1, pages), fix(back-1, pages)))
front += 2
back -= 2
return (odd, even)
def format_pages(pages):
return ",".join([f"\033[1m{l},{r}\033[0m" if i % 2 == 0 else f"{l},{r}\033[0m" for i, (l, r) in enumerate(pages)])
if len(sys.argv) < 2:
print(f"usage: {sys.argv[0]} NUMBER-OF-PAGES", file=sys.stderr)
exit(1)
pages = int(sys.argv[1])
odd, even = booklet(pages)
print("Odd:", format_pages(odd))
print(" ↺", format_pages(reversed(odd)))
print("Even:", format_pages(even))
print(" ↺", format_pages(reversed(even)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment