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
问题是背景不是浅灰色。根据{{1}}手册页,enscript
(--escapes
)选项表示文件(即-e
)具有$1
- 嵌入的特定控制序列它
添加控制序列意味着必须复制代码,这违背了拥有单一来源的目的。
enscript
文档暗示在运行脚本之前应该可以将两个文件连接在一起(目标和“标题”),以创建第三个文件:
enscript
然后在命令完成后删除第三个文件。
Q.1。在不使用第三个文件的情况下,将源文件和管道传输到^@shade{0.85} -- header line
#!/bin/bash -- start of source file
程序的更有效方法是什么?
Q.2。还有哪些其他选项可用于自动化书籍的语法高亮显示,同时满足我所描述的单一来源要求? (例如,在LyX中编写本书并使用LaTeX命令进行导入和语法突出显示。)
答案 0 :(得分: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中使用'进程替换'。
您也可以使用括号来运行子shell:
(echo "^@shade{0.85}"; cat $1) | ...
请注意cat
之后的分号是括号所必需的,括号中不需要(在开括号之后需要空格) - 这就是shell脚本的奥秘。
Q2 我没有其他选择。当我出版一本书(20年前,现在使用troff)时,我编写了一个程序,将源代码转换为必要的标记,以便本书是从源代码生成的,但是是通过自动化过程生成的。
(300 dpi足够高的分辨率?)
解决转换脚本本身嵌入的转义序列的enscript
程序:
{ cat ../../enscript-header.txt $1; } |
答案 1 :(得分:1)
Q2:将LaTeX与listings包一起使用。