如何将 TikZ 外部库与 nicematrix 包结合使用?
我尝试将外部库与 nicematrix 包(2018 年 8 月 12 日版本)结合使用,以提高编译速度。但它没有按预期工作。
这是一个最小的例子:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{external}
%\tikzexternalize % activate!
\usepackage{nicematrix}
\begin{document}
% Test 1
\begin{flalign}
\begin{bNiceMatrix}
0 & \Cdots & 0 \\\Vdots & & \Vdots \\0 & \Cdots & 0
\end{bNiceMatrix}
\end{flalign}
% Test 2
\begin{flalign}
\begin{tikzpicture}[baseline,inner sep = 0pt]
\node {$
\begin{bNiceMatrix}
0 & \Cdots & 0 \\\Vdots & & \Vdots \\0 & \Cdots & 0
\end{bNiceMatrix}
$};
\end{tikzpicture}
\end{flalign}
% Test 3
\begin{flalign}
\begin{tikzpicture}[baseline,inner sep = 0pt]
\node {$
\begin{pNiceArrayRC}{CC}%
C_1 & C_2 \\1 & 2 & L_1\\4 & 5 & L_2\\
\end{pNiceArrayRC}
$};
\end{tikzpicture}
\end{flalign}
\end{document}
测试结果如下:
- 非外部,测试 1:没有问题。
- 非外部,测试 2:没有问题。结果与测试 1 相同。
- 非外部,测试3:没有问题。
- 外部,测试 1:错误。
Line 1: Extra }, or forgotten $. ...nt }]\bgroup \box_use:N \l_tmpa_box \egroup
- 外部,测试 2:没有错误,但输出不符合预期。
- 外部,测试 3:错误。
Package tikz Error: Sorry, the system call 'pdflatex -shell-escape -halt-on-e
将 nicematrix 嵌入 tikz 图片并不能真正解决问题。这可能是由于嵌套的 tikz 图片造成的(请参阅 pgfmanual 50.2)。
有人知道如何解决这个问题吗?
答案1
由于扩展nicematrix
使用 Tikz 和选项overlay
以及remember picture
来绘制虚线,因此无法将 Tikz 外部化与这些元素一起使用。事实上,在 2.1 之前的版本中,当我们尝试将外部化与 一起使用时,我们甚至会遇到 TeX 错误nicematrix
。
在 2018/09/18 的 2.1.1 版本(可在 CTAN 中使用)中,环境中的外部化过程现已停用nicematrix
。当然,唯一的好处是在文档中包含其他有趣的 Tikz 图片进行外部化。
答案2
我找到了一个使用该软件包的解决方案standalone
,它解决了这个问题并提高了速度。以下是该解决方案的简短描述。
为每个矩阵创建一个单独的独立文件。
% matrix_N.tex
\documentclass{standalone}
\usepackage{nicematrix}
\begin{document}%
\ensuremath{<code of matrix>}%
\end{document}
然后将独立文件包含在主文档中:
% main.tex
\documentclass{article}
\usepackage[mode=buildnew]{standalone}
\usepackage{nicematrix}
\begin{document}
% Test 1
\begin{flalign}
[S]&=\tikz[baseline]{\node[anchor=center]{\includestandalone{Test1}};}
\end{flalign}
% Test 3
\begin{flalign}
[S]&=\tikz[baseline]{\node[anchor=center,yshift=1em]{\includestandalone{Test3}};}
\end{flalign}
\end{document}
问题/限制:
- 方程式对齐不完美(手动调整)
- 不支持标签和引用
- 手动控制主文档和图形(字体等)的一致性
- 注意,如果独立图形需要多次编译才能正确显示。请编译
mode=build
直到图形正确,然后更改mode=buildnew
或保存具有新修改日期的独立文件并编译直到图形正确。
当然,这个解决方案并不局限于nicematrix
包,可以普遍使用。例如,如果tikz
无法进行外部化。
答案3
从源代码来看:
\group_begin:
\tikzset{every~picture/.style = {overlay,
remember~picture,
name~prefix = nm-\int_use:N \g_@@_env_int-}}
如您所见,该包使用overlay
和绘制每个矩阵remember picture
。因此,对于如何外部化它们的问题,简短的回答是:您不能。
带有图片overlay and remember picture
通常需要两次编译。但是,外部化机制相当简单,开发人员决定不支持此功能,而不是试图产生未定义的东西。
您仍然可以选择外部化其他图片,但如果您使用许多nicematrix
环境,我建议您在本地启用其他图片的外部化。