バックグラウンド
このenscript
コマンドは、SQL ステートメント、シェル スクリプト、PHP コード、HTML ファイルなど、さまざまな種類のソース ファイルに構文の強調表示を適用できます。enscript
技術マニュアル用のソース コードの 300dpi 画像を生成するために使用しています。
- 実際のソース コードに基づいて書籍のコンテンツを生成します。
- ソース コードを変更せずに本と一緒に配布してください。
- 本を書きながら、スクリプトを実行してテストします。
問題
次のシェル スクリプトは、ほぼ希望どおりに変換を実行します。
#!/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
man ページによると、 --escapes
( -e
) オプションは、ファイル (つまり$1
) にenscript
固有の制御シーケンスが埋め込まれていることを示します。
制御シーケンスを追加することは、コードを複製する必要があることを意味し、単一のソースを持つという目的を無効にします。
解決
ドキュメントはenscript
、スクリプトを実行する前に 2 つのファイル (ターゲットと「ヘッダー」) を連結して、3 番目のファイルを作成できることを示しています。
^@shade{0.85} -- header line
#!/bin/bash -- start of source file
コマンドが完了したら、3 番目のファイルを削除します。
質問
Q.1. 3 番目のファイルを使用せずに、制御シーケンスとソース ファイルをenscript
プログラムにパイプするより効率的な方法は何ですか?
Q.2. 私が説明した単一ソースの要件を尊重しながら、書籍の構文の強調表示を自動化するために利用できる他のオプションは何ですか? (たとえば、LyX で本を書き、LaTeX コマンドを使用してインポートと構文の強調表示を行います。)