Фон
Команда enscript
может применять подсветку синтаксиса к различным типам исходных файлов, включая операторы SQL, сценарии оболочки, код PHP, файлы HTML и многое другое. Я использую enscript
для создания изображений исходного кода с разрешением 300 точек на дюйм для технического руководства:
- Создание контента для книги на основе фактического исходного кода.
- Распространение исходного кода вместе с книгой без каких-либо изменений.
- Запускайте и тестируйте сценарии во время написания книги.
Задача
Следующий скрипт оболочки выполняет преобразование практически так, как нужно:
#!/bin/bash
DIRNAME=$(dirname $1)
FILENAME=$(basename $1)
# Remove the extension from the filename.
BASENAME=${FILENAME%%.*}
FILETYPE=${FILENAME##*.}
LIGHTGRAY="#f3f3f3"
enscript --escapes --color -f Courier10 -X ps -B -1 --highlight=$FILETYPE \
$2 -h -o - $1 | \
gs -dSAFER -sDEVICE=pngalpha -dGraphicsAlphaBits=4 -dNOPAUSE -r300 \
-sOutputFile=$BASENAME.png -dBackgroundColor=16$LIGHTGRAY > /dev/null && \
convert -trim $BASENAME.png $BASENAME-trimmed.png && \
mv $BASENAME-trimmed.png $BASENAME.png
Проблема в том, что фон не светло-серого цвета. Согласно справочной странице enscript
параметр --escapes
(-e
) указывает, что файл (то есть $1
) имеет enscript
-специфические последовательности управления, встроенные в него.
Добавление контрольных последовательностей означает дублирование кода, что лишает цели наличия единственного источника.
Решение
Документация enscript
подразумевает, что должна быть возможность объединить два файла вместе (цель и «заголовок») перед запуском сценария, чтобы создать третий файл:
^@shade{0.85} -- header line
#!/bin/bash -- start of source file
Затем удалите третий файл после завершения команды.
Вопросы
Q.1. Какой более эффективный способ передачи управляющих последовательностей и исходного файла в программу enscript
без использования третьего файла?
Q.2. Какие другие опции доступны для автоматизации подсветки синтаксиса для книги при соблюдении требований единого источника, которые я описал? (Например, напишите книгу в LyX и используйте команды LaTeX для импорта и выделения синтаксиса.)