1

バックグラウンド

この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

問題は、背景が明るい灰色ではないことです。enscriptman ページによると、 --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 コマンドを使用してインポートと構文の強調表示を行います。)

4

2 に答える 2

2

Q1中かっこ ' {}' を使用して I/O リダイレクトを行うことができます。

{ echo "^@shade{0.85}"; cat $1; } |
enscript --color -f Courier10 -X ps -B -1 --highlight=$FILETYPE $2 -h -o - |
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 がその標準入力を読み取ることを前提としています。そうでない場合は、オプション (おそらく ' -i -') を使用するか、より深刻な魔法を使用する必要があります。bash で「プロセス置換」を使用することもできます。

括弧を使用してサブシェルを実行することもできます。

(echo "^@shade{0.85}"; cat $1) | ...

後のセミコロンcatは中かっこでは必要であり、かっこでは不要であることに注意してください (開き中かっこの後にはスペースが必要です)。これはシェル スクリプトの謎です。

Q2提供できる代替手段がありません。私が本を作成したとき (今から 20 年前、troff を使用)、ソースを必要なマークアップに変換するプログラムを作成しました。

(300dpiで十分高解像度か?)

編集

enscript変換スクリプト自体に埋め込まれたエスケープ シーケンスを解釈するプログラムを回避するには:

{ cat ../../enscript-header.txt $1; } |
于 2010-11-02T08:02:59.893 に答える
1

Q2: Listingsパッケージで LaTeX を使用します。

于 2010-11-02T08:13:19.570 に答える