我使用\special
命令来驱动一些对角线作为绘制拼图的宏。虽然这些在使用 XeTeX 编译时工作正常,但在使用时它们似乎会破坏生成的 PDF 文档pdftex
。这是一个最小的可重现示例:
\special{pdf: content q 0 G 0.4 w
0 8 m 2 10 l
0 6 m 4 10 l
0 4 m 6 10 l
0 2 m 8 10 l
0 0 m 10 10 l
0 -2 m 12 10 l
0 -4 m 14 10 l
0 -6 m 16 10 l
0 -8 m 18 10 l
0 -10 m 20 10 l
2 -10 m 20 8 l
4 -10 m 20 6 l
6 -10 m 20 4 l
8 -10 m 20 2 l
10 -10 m 20 0 l
12 -10 m 20 -2 l
14 -10 m 20 -4 l
16 -10 m 20 -6 l
18 -10 m 20 -8 l
S Q}
\bye
当我在 Adobe Acrobat 或 Ghostscript 中打开生成的文档时,它会抱怨页面有缺陷。例如,pdf2ps
我们有:
$ pdf2ps test.pdf
**** Error: File did not complete the page properly and may be damaged.
Output may be incorrect.
这可能是什么问题?我该如何更改命令\special
来解决此问题?
答案1
我会用条件来抽象后端差异
\ifdefined\XeTeXversion
\protected\def\myspecial#1{\special{pdf:content q #1 Q}}
\else
\protected\def\myspecial#1{\pdfliteral{q #1 Q}}
\fi
\myspecial{%
0 G 0.4 w
0 8 m 2 10 l
0 6 m 4 10 l
0 4 m 6 10 l
0 2 m 8 10 l
0 0 m 10 10 l
0 -2 m 12 10 l
0 -4 m 14 10 l
0 -6 m 16 10 l
0 -8 m 18 10 l
0 -10 m 20 10 l
2 -10 m 20 8 l
4 -10 m 20 6 l
6 -10 m 20 4 l
8 -10 m 20 2 l
10 -10 m 20 0 l
12 -10 m 20 -2 l
14 -10 m 20 -4 l
16 -10 m 20 -6 l
18 -10 m 20 -8 l
S}
\bye
(这可以扩展到 DVI 模式、LuaTeX 等)
如果你想拥有一切里面一个宏,可以使用
\protected\def\myspecial#1{%
\special{%
\ifdefined\XeTeXversion
pdf:content q #1 Q
\else
pdf:q #1 Q
\fi
}%
}
\myspecial{%
0 G 0.4 w
0 8 m 2 10 l
0 6 m 4 10 l
0 4 m 6 10 l
0 2 m 8 10 l
0 0 m 10 10 l
0 -2 m 12 10 l
0 -4 m 14 10 l
0 -6 m 16 10 l
0 -8 m 18 10 l
0 -10 m 20 10 l
2 -10 m 20 8 l
4 -10 m 20 6 l
6 -10 m 20 4 l
8 -10 m 20 2 l
10 -10 m 20 0 l
12 -10 m 20 -2 l
14 -10 m 20 -4 l
16 -10 m 20 -6 l
18 -10 m 20 -8 l
S}
\bye
答案2
我最终使用了
\special{pdf:content ...}
pdf:
(请注意和之间没有空格content
)。这似乎对 pdfTeX 和 XeTeX 都适用。