PYTHON Book Builder
Я пытаюсь сделать книгу из нескольких тетрадей, но неважно, что я делаю, код все равно оказывается завернутым, потому что он переполняется.
Iпопробовал:
- Убедиться, что мои блокноты не превышают 70 столбцов для кода.
- В шаблоне латекса я сделал:
- Использование
extsizes
латексупакуйте и используйте наименьший доступный размер pont:
\documentclass[8pt, preprint, floatfix, groupaddress]{extbook}
\usepackage{extsizes}
- Попробуйте использовать бумагу большего размера и уменьшите поля:
\usepackage[a5paper, margin=0.5in, inner=0.5in]{geometry}
- Максимально уменьшайте поля, не затрагивая нижние и нижние колонтитулы:
\usepackage{geometry}
\geometry{verbose,tmargin=0.6in,bmargin=0.6in,lmargin=0.5in,rmargin=0.5in}
Однако этого все же недостаточно для достижения эффекта, который я ищу, я неуверен, как еще больше уменьшить размер входных и выходных кодовых блоков или какой блок I следует расширить или перезаписать, чтобы добиться этого.
Пример вывода: Python_Book.pdf
Это мои текущие настройки.
Зависимости сборки
Убедитесь, что выУ вас установлены следующие не-Python-зависимости:
pandoc
texlive
bibtex
Установкаэти 3 зависимости должны автоматически получать множество других подчиненных зависимостей.
Setup
Создайте виртуальную среду с зависимостями сборки Python, затем запустите процесс сборки книги:
- Запустите
setup.sh
в корневом каталоге хранилища. - Запустите
make_book.sh
из каталога book_dir
.
Структура Dir
`root_dir`
|--- A bunch of `.ipynb` files, order preserved by `ls` sorting
|--- `setup.sh` for environment setup
|--- `requirements.txt` needed for setup
|--- `book_dir`
|--- `make_book.sh` build script
|--- `Python_Book.tplx` latex template
|--- `execute_all_cells.py` execute preprocessor
Требования Python
cite2c
flask
jupyter
jupyterlab
jupyter_contrib_nbextensions
nbmerge
nbformat
nbconvert
Сценарий установки
#!/bin/bash
echo "Starting setup..."
if [ ! -d Python_Book_env ]; then
echo "Installing virtual environment..."
python -m venv Python_Book_env
fi
echo "Activating virtual environment..."
source Python_Book_env/bin/activate
echo "Installing Python dependencies..."
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
echo "Installing extra notebook extensions..."
jupyter contrib nbextension install --user
python3 -m cite2c.install
echo "Setup finished!"
deactivate
Сценарий сборки
#!/bin/bash
BOOK="Python_Book"
echo "Starting $BOOK build..."
NOTEBOOKS=`ls ../*.ipynb`
source ../virtual_env/bin/activate
echo "Reseting assets..."
reset_assets () {
rm -rf ../assets/files/*
echo "Example file." > ../assets/files/example_file.txt
}
reset_assets
for NOTEBOOK in $NOTEBOOKS; do
echo "Executing: $NOTEBOOK..."
python execute_all_cells.py "$NOTEBOOK"
done
echo "Merging notebooks..."
nbmerge $NOTEBOOKS > "$BOOK.ipynb"
echo "Clearing notebooks..."
jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace $NOTEBOOKS
echo "Generating LaTeX..."
jupyter nbconvert --to=latex --template="$BOOK.tplx" "$BOOK.ipynb" --no-prompt
echo "Patching LaTeX..."
sed -i -e 's/assets\/images/..\/assets\/images/g' "$BOOK.tex" # fix images path
# sed -i -e 's/\\section/\\chapter/g' "$BOOK.tex" # contents start at 0.1 :(
sed -i -e 's/\\maketitle/\\maketitle \\tableofcontents/g' "$BOOK.tex" # add table of contents
sed -i -e 's/\\includegraphics{/\\includegraphics[width=5cm]{/g' "$BOOK.tex" # adjust graphics size
echo "Generating Python Book pdf... Fingers crossed: ლↂ‿‿ↂლ" #
pdflatex -interaction nonstopmode -halt-on-error -file-line-error "$BOOK.tex"
bibtex "$BOOK.tex"
pdflatex -interaction nonstopmode -halt-on-error -file-line-error "$BOOK.tex"
pdflatex -interaction nonstopmode -halt-on-error -file-line-error "$BOOK.tex"
echo "Cleaning build dir..."
rm *.bbl
rm *.aux
rm *.blg
rm *.log
rm *.out
rm *.bib
rm *.toc
reset_assets
echo "Book build finished!"
deactivate
Выполнить препроцессор
from sys import argv
import nbformat
from nbconvert.preprocessors import ExecutePreprocessor, CellExecutionError
ep = ExecutePreprocessor(timeout=600, kernel_name='python3', allow_errors=True)
with open(argv[1]) as f:
nb = nbformat.read(f, as_version=4)
ep.preprocess(nb, {'metadata': {'path': '..'}})
with open(argv[1], 'w', encoding='utf-8') as f:
nbformat.write(nb, f)
Шаблон LaTeX
((*- extends 'style_jupyter.tplx' -*))
((* block docclass *))
\documentclass[8pt, preprint, floatfix, groupaddress]{extbook}
\usepackage{extsizes}
% Use a wider inner margin for the two-sided book
\usepackage[a5paper, margin=0.5in, inner=0.5in]{geometry}
\usepackage{geometry}
\geometry{verbose,tmargin=0.6in,bmargin=0.6in,lmargin=0.5in,rmargin=0.5in}
% Ignore future geometry commands with optional and mandatory arguments
\usepackage{xparse}
\RenewDocumentCommand{\geometry}{om}{}
% Let all figures float 'H'ere
\usepackage{float}
\floatplacement{figure}{H}
((* endblock docclass *))
% Authors and Title
((* block maketitle *))
\author{D Author}
\title{Python Book}
\date{2019\\October}
\maketitle
((* endblock maketitle *))
Мысли
Я использовал толькоИндекс и введение Вихрь Tнаш Python в качестве примеров.
При такой настройке я получаю почти то, что хочу, но для меня код Python выглядит слишком большим, на мой вкус, и часть кода оказывается завернутой.
Я очень стараюсь не превышать 70 столбцов в ячейках кода для моих ноутбуков, но это не всегда возможно, например, если я получаю ноутбуки в другом месте.
Другие проблемы
Unicode
Я не могу поставить любые символы Unicode, поэтому многие ноутбуки с любым из них пока не будут работать.
Я использовал только индекс и введение Whirlwind Tour of Python в качестве примеров, но если вы попробуете всю книгу, она будет жаловаться на ■
.
./Python_Book.tex:1792: Package inputenc Error: Unicode character ■ (U+25A0)
(inputenc) not set up for use with LaTeX.
See the inputenc package documentation for explanation.
Type H <return> for immediate help.
...
l.1792 ...that is, for any operator ``\texttt{■}
'', the expression
./Python_Book.tex:1792: ==> Fatal error occurred, no output PDF file produced!
Я попробовал inputenc
, я должен был сделатьчто-то не так, но это для другого вопроса, это здесь на всякий случай, если вы попытаетесь запустить это и получить эти ошибки.
Конечно, есть больше проблем для большего количества вопросов, но они не влияют на конвейер тольковывод, некоторые, вероятно, болееУместно на сайте LaTeX Exchange.
С наилучшими пожеланиями.