如何修复这个 \special{pdf: content ...} 以便它不会损坏生成的 PDF?

如何修复这个 \special{pdf: content ...} 以便它不会损坏生成的 PDF?

我使用\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

当我在 Adob​​e 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 都适用。

相关内容