如何解决 tikz-cd 与外部不兼容的问题

如何解决 tikz-cd 与外部不兼容的问题

我正在尝试使用 tikz-cd 将 tikz 图片导出为 pdf。为了运行 tikz-cd,我必须禁用外部库,如下所示

\documentclass{article}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{braket}
\usepackage{graphicx}
\usepackage{subcaption}
\usepackage{hyperref}
\usepackage[dvipsnames]{xcolor}
\usepackage{amssymb}
\usepackage{dsfont}
\usepackage{verbatim}
\usepackage{amsmath,amscd}
\usepackage[all,cmtip]{xy}
\usepackage{multirow}
\usepackage{etoolbox,tikz}
\usetikzlibrary{decorations.pathmorphing}
\usetikzlibrary{cd}
\usetikzlibrary{external}
\tikzexternalize

 \AtBeginEnvironment{tikzcd}{\tikzexternaldisable}
 \AtEndEnvironment{tikzcd}{\tikzexternalenable}
\begin{document}

\begin{tikzcd}
 ABC \arrow[loop right, "x"]{} \arrow[loop left, "y"]{} \arrow[out=240, 
in=320, 
 loop] \arrow[out=220, in=300, loop,crossing over, "z" swap, pos=0.58] \\
\end{tikzcd}


\begin{tikzcd}
D \arrow[loop left]{} \arrow[d]{} \arrow[r]{} & AC \arrow[out=240, in=320, 
loop] 
\arrow[out=220, in=300, loop,crossing over]  \\
DB \arrow[out=240, in=320, loop] \arrow[out=220, in=300, loop,crossing over]  
& 
\\
\end{tikzcd}

\end{document}

如上所述这里。我尝试使用其他答案提到过,但它们对我不起作用。如何将每张 tikzcd 图片分别导出为 pdf?

答案1

以下解决方案仅在使用适当的 LaTeX 环境(即\begin{tikzcd}和)时才有效。使用将破坏外部化或无法编译。 需要更复杂的解决方案来涵盖所有用例。(不过,由于首先仅适用于 LaTeX,所以我认为剩下的不多了。)\end{tikzcd}\tikzcd … \endtikzcd
external


当触发库的机制时,库external需要\end{tikzpicture}位于输入流上。\begin{tikzpicture}

我建议调整tikzcd环境,以便它可以在 TikZ 图片中使用,而不会干扰外部化过程。这意味着你需要

\begin{tikzpicture}
\begin{tikzcd}
\end{tikzcd}
\end{tikzpicture}

将 CD 外部化。(这也是它与 PGFPlots 一起工作的方式。)

在下面的代码中,我向\tikzcd宏添加了必要的检查(即),它通过检查是否是 TikZ 自己的来\begin{tikzcd}检测您是否正在使用tikzcd内部环境。tikzpicture\path\path

如果是,它将把tikzpicture里面使用的改变为接受可选参数的。tikzcdscopetikzcd

如果您使用了tikzcd外部的图表tikzpicture(即\path不是 TikZ 的\path),那么它将禁用此图表的外部化。

这也会破坏嵌套的 TikZ 图片,但这从一开始就不是一个好主意。

但是它允许在一个 TikZ 图片中使用多个 CD。(请记住,这些只是\matrix示例。但是您需要使用

\begin{tikzcd}[every matrix/.append style={…}]

将选项更改为\matrix(例如name或任何展示位置)。定义如下快捷方式可能会有所帮助

\tikzcdset{matrices/.style={every matrix/.append style={#1}}}

使得改变风格变得更容易。


这些\pgfkeys东西基本上是etoolbox的,\preto但带有 TikZ 的板载资源。

代码

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{cd,external}
\tikzexternalize
\makeatletter
\pgfkeys{
  /utils/temp/.initial/.expand once=\tikzcd,
  /utils/temp/.prefix=%
    \ifx\path\tikz@command@path % we're inside a tikzpicture
      \let\tikzpicture\scope
      \let\endtikzpicture\endscope
    \else % we're not inside a tikzpicture, disable externalizing
      \tikzexternaldisable
    \fi,
  /utils/temp/.get=\tikzcd}
\makeatother
\begin{document}
\begin{tikzpicture}
\begin{tikzcd}
 ABC \arrow[loop right, "x"]
     \arrow[loop left,  "y"]
     \arrow[out=240, in=320, loop]
     \arrow[out=220, in=300, loop, crossing over, "z" swap, pos=0.58] \\
\end{tikzcd}
\end{tikzpicture}

\begin{tikzpicture}
\begin{tikzcd}
  D  \arrow[loop left]
     \arrow[d]
     \arrow[r]
& AC \arrow[out=240, in=320, loop]
     \arrow[out=220, in=300, loop, crossing over]  \\
  DB \arrow[out=240, in=320, loop]
     \arrow[out=220, in=300, loop, crossing over]
\end{tikzcd}
\end{tikzpicture}

\begin{tikzcd}
 ABC \arrow[loop right, "x"]
     \arrow[loop left,  "y"]
     \arrow[out=240, in=320, loop]
     \arrow[out=220, in=300, loop, crossing over, "z" swap, pos=0.58] \\
\end{tikzcd}

\begin{tikzcd}
  D  \arrow[loop left]
     \arrow[d]
     \arrow[r]
& AC \arrow[out=240, in=320, loop]
     \arrow[out=220, in=300, loop, crossing over]  \\
  DB \arrow[out=240, in=320, loop]
     \arrow[out=220, in=300, loop, crossing over]
\end{tikzcd}
\end{document}

输出

三个 PDF:

  1. 首先tikzpicture外化。
  2. 第二次tikzpicture外化。
  3. 主文档包含四张 TikZ 图片。

答案2

只是说memoize现在可以外化了tikzcd,至少如果你比我更了解事情并找出正确的选择。这些是memoize作者 Sašo Živanović

\documentclass{article}
% addaswyd o gwestiwn user25957: https://tex.stackexchange.com/q/493622/
\usepackage{memoize}
\mmzset{%
  %   path={dir=memos}, % v. 1
  %   mkdir, % v. 1
  prefix=memos/, % v. 1.1 and later
  % Sašo Živanović: https://chat.stackexchange.com/transcript/message/64689784#64689784
  auto={tikzcd}{memoize,verbatim},
}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}
  ABC \arrow[loop right, "x"]{} \arrow[loop left, "y"]{} \arrow[out=240, 
  in=320, 
  loop] \arrow[out=220, in=300, loop,crossing over, "z" swap, pos=0.58] \\
\end{tikzcd}


\begin{tikzcd}
  D \arrow[loop left]{} \arrow[d]{} \arrow[r]{} & AC \arrow[out=240, in=320, 
  loop] 
  \arrow[out=220, in=300, loop,crossing over]  \\
  DB \arrow[out=240, in=320, loop] \arrow[out=220, in=300, loop,crossing over]  
  & 
  \\
\end{tikzcd}
\end{document}

记忆化的 tikzcd 图表

相关内容