我正在尝试使用 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}
答案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
里面使用的改变为接受可选参数的。tikzcd
scope
tikzcd
如果您使用了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:
- 首先
tikzpicture
外化。 - 第二次
tikzpicture
外化。 - 主文档包含四张 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}