同时使用 tikz external 和 algpseudocodex 时出错

同时使用 tikz external 和 algpseudocodex 时出错

在我的 Latex 文件中,我使用避免重新编译的选项,并且使用tikz伪代码,但似乎环境中的某些命令被识别为 PGF 命令并引发错误。externalalgpseudocodexalgorithmic

这是最小代码:

\documentclass{article}
\usepackage{algorithm}
\usepackage{algorithmicx}
\usepackage{algpseudocodex}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[prefix=tikz/]

\begin{document}
\begin{tikzpicture}
    \node[draw=red, fill=yellow] {hello};
\end{tikzpicture}
\begin{algorithm}[hbt!]
    \label{alg:my-algorithm}
    \begin{algorithmic}[1]
        \Require $n$
        \Ensure $s$
        \For{$i \gets 1$ to $n$}
            \State $s \gets s + i$
        \EndFor
        \State \Return $s$
    \end{algorithmic}
\end{algorithm}
\end{document}

错误信息的部分内容如下:

Missing number, treated as zero.
<to be read again> 
                   \relax 
l.32         \State
                    \Return $s$
Illegal unit of measure (pt inserted).
<to be read again> 
                   \relax 
l.32         \State
                    \Return $s$
Package pgf Error: No shape named `algpx@indentStart-0' is known.

See the pgf package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.32         \State
                    \Return $s$
Undefined control sequence.
<argument> \algpx 
                  @indStartX ,\algpx @indEndY 
l.32         \State
                    \Return $s$

但是如果我不使用 tikz 的外部功能,即,\usetikzlibrary{external}并且\tikzexternalize[prefix=tikz/]进行了注释,则不会出现错误。我应该如何插入伪代码并避免重新编译未修改的 tikz 图形?

答案1

algopseudocodex包内部使用 TikZ。最简单的解决方案是algorithmic通过执行以下操作禁用环境的外部化

\AddToHook{env/algorithmic/begin}{\tikzexternaldisable}

代码

\documentclass{article}
\usepackage{algorithm}
\usepackage{algorithmicx}
\usepackage{algpseudocodex}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[prefix=tikz/]
\AddToHook{env/algorithmic/begin}{\tikzexternaldisable}
\begin{document}
\begin{tikzpicture}
    \node[draw=red, fill=yellow] {hello};
\end{tikzpicture}
\begin{algorithm}[hbt!]
    \label{alg:my-algorithm}
    \begin{algorithmic}[1]
        \Require $n$
        \Ensure $s$
        \For{$i \gets 1$ to $n$}
            \State $s \gets s + i$
        \EndFor
        \State \Return $s$
    \end{algorithmic}
\end{algorithm}
\end{document}

相关内容