Как правильно записать переменные в функции?
В discord.py не слишеом сложные правила разбора строки с командой.
1. По умолчанию одно слово интерпретируется как один параметр.
async def command(ctx, a: str, b: str, c:str)
!command раз два три
a, b, c == "раз", "два", "три"

2. Если часть вводимой команды заключена в кавычки, то она интерпретируется как один параметр.
async def command(ctx, a: str, b: str)
!command "раз два" три
a, b == "раз два", "три"

3. Если последний параметр отмечен как "все позиционные аргументы" (*args), то все последующие слова попадают в него как отдельные элементы. 
async def command(ctx, a: str, *b: str)
!command раз два три
a, b == "раз", ("два", "три")

4. Если последний параметр обозначен как "только ключевое слово" (..., *, param), то остаток строки подаётся в него как есть.
async def command(ctx, a: str, *, b: str)
!command раз два три
a, b == "раз", "два три"

Таким образом, у тебя есть два выхода.
а) помещай строку с названием книги в кавычки
б) поставь название книги последним параметром в своей команде

EDIT: ниже напомнили, что есть слэш-команды. Посмотри их!
Дополню ответ выше.
Сейчас имеет смысл разрабатывать изначально на слеш-командах и у них каждый параметр принимается без какой-то доп обработки. По сути это аналогично вводу с кавычками, но более юзерфрендли
