如何阻止 hyperref 包干扰 pstricks?

如何阻止 hyperref 包干扰 pstricks?

说实话,我对此已经束手无策了,试图找出这个错误已经很累了,但我没有其他选择。我正在写一份需要大量围棋棋盘(游戏)图表的文档,只有该软件包才psgo真正适合。由于我还包含了 png 文件,所以我不得不使用 xelatex。使用auto-pst-pdf不是一个选择,它根本不起作用,所以我只能使用 xelatex。

当包含hyperref包裹时,图中的任何编号棋子都会移位并破坏图。下图中的 MWE 中可以看到这种情况。

\documentclass{report}
\usepackage[]{pstricks}
\usepackage{psgo}
\usepackage[xetex]{hyperref}

\begin{document}
\begin{psgopartialboard*}{(8,6)(14,12)}
        \stone{black}{k}{10}
        \stone{black}{l}{11}
        \stone{black}{k}{11}
        \stone{black}{l}{10}
        \stone{white}{l}{8}
        \stone{white}{k}{9}
        \stone{white}{l}{9}
        \setcounter{gomove}{0}
        \move{j}{10}
        \move{j}{9}
        \move{j}{8}
        \move{j}{7}
\end{psgopartialboard*}
\end{document}

我一直在用来latexmk -xelatex main.tex --enable-write18编译这个。

如果您复制所示的 psgo 部分板,那么它将xdvipdfmx:warning: Object @gomove.1 already defined.在编译时显示为警告,但它仍然有效。

我已将其缩小到 hyperref 与计数器交互方式的问题(我认为),因为计数器必须在每个棋盘上重置。任何没有计数器放置的静态棋子都可以正常工作。令人沮丧的是,它通过 dvipdf 完美运行,但我无法将其用于这个项目。

有没有办法修复这个问题而不失去功能?我正在重写psgo,有什么技巧可以用吗?很多其他东西都需要 Hyperref,所以我不知道这里该怎么做。

任何帮助都将不胜感激,谢谢!

答案1

psgo使用\refstepcounter(恕我直言没有必要)并且使用 hyperref 会添加改变间距的目的地。

您可以使用布尔值来隐藏目标。在当前的 texlive 中,您可以使用 lualatex 来获取 pstricks。它比 xelatex 快得多,但对于某些效果(如不透明度),它需要新的 pdfmanagement。

%for lualalatex:
\DocumentMetadata{} %required to activate the pdfmanagement
\documentclass{report}
\usepackage[]{pstricks}
\usepackage{psgo}
\usepackage{hyperref}

\makeatletter
\AddToHook{env/psgopartialboard*/before}{\@skiphyperreftrue} %\LinkTargetOff in the next hyperref
\makeatother
\begin{document}


\begin{psgopartialboard*}{(8,6)(14,12)}
        \stone{black}{k}{10}
        \stone{black}{l}{11}
        \stone{black}{k}{11}
        \stone{black}{l}{10}
        \stone{white}{l}{8}
        \stone{white}{k}{9}
        \stone{white}{l}{9}
        \setcounter{gomove}{0}
        \move{j}{10}
        \move{j}{9}
        \move{j}{8}
        \move{j}{7}
\end{psgopartialboard*}

\end{document}

在此处输入图片描述

相关内容