1

背景

enscript命令可以将语法高亮应用于各种类型的源文件,包括 SQL 语句、shell 脚本、PHP 代码、HTML 文件等。我正在使用enscript为技术手册生成 300dpi 的源代码图像,以:

  • 根据实际源代码为本书生成内容。
  • 随书一起分发源代码,无需任何修改。
  • 在编写本书时运行和测试脚本。

问题

以下 shell 脚本几乎按照需要执行转换:

#!/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

然后在命令完成后删除第三个文件。

问题

问题 1。在不使用第三个文件的情况下,将控制序列源文件通过管道传输到程序的更有效方法是什么?enscript

问题 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是大括号所必需的,而不是括号所必需的(并且在左大括号之后需要一个空格) - 这就是 shell 脚本的奥秘。

Q2我没有其他选择。当我制作一本书时(现在是 20 年前,使用 troff),我编写了一个程序来将源代码转换为必要的标记,因此这本书是从源代码产生的,但是是通过一个自动化的过程。

(300 dpi 的分辨率是否足够高?)

编辑

要解决enscript解释嵌入在转换脚本本身中的转义序列的程序:

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

Q2:在列表包中使用 LaTeX 。

于 2010-11-02T08:13:19.570 回答