如何在不引入工件的情况下保存或定义 spath3 的 TikZ 路径?

如何在不引入工件的情况下保存或定义 spath3 的 TikZ 路径?

在第 19 页和第 20 页spath3 文档圆弧定义在 \AtBeginDocument以允许将其用作两个交叉路径之间的连接路径,就像在这个 MWE 中一样(这里我称之为弧,myarc以区别于arc

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{spath3, intersections}

\AtBeginDocument{
    \tikz[overlay] \path[spath/save=myarc] (0,0) arc[radius=1cm, start angle=180, delta angle=-180];
}

\tikzset{
    bridge/.style 2 args={
        spath/split at intersections with={#1}{#2},
        spath/insert gaps after components={#1}{8pt},
        spath/join components upright with={#1}{myarc},
        spath/split at intersections with={#2}{#1},
        spath/insert gaps after components={#2}{4pt},
    }
}

\title{This should be page 1}
\begin{document}
    \maketitle
    \begin{tikzpicture}
        \path[spath/save=over] (0,0) -| ++(1,1) -| ++(-1,1) -| ++(1,1) -|
        ++(-1,1);
        \path[spath/save=under] (.5,-.5) -- ++(0,4);
        \tikzset{bridge={over}{under}}
        \draw[spath/use=over];
        \draw[spath/use=under];
    \end{tikzpicture}
\end{document}

图片的外观是正确的,但是在标题前产生了一个空白页,似乎是由于使用了\AtBeginDocument

在此处输入图片描述

文档建议将 放置在环境\path[spath/save=arc] ...tikzpicture而不是 内AtBeginDocument,但(a)这对我来说是不可取的,因为它将强制我正在编写的包的用户为每个实例提供这样的代码,并且(b)这有时也会以图像中空白空间的形式引入伪影,您可以使用文档standalone类而不是 来查看article它:

在此处输入图片描述

是否有另一种方法可以myarc在序言中保存(或以其他方式定义)以使其与spath3包兼容,但不引入如上所述的额外工件?

答案1

问题源于这样一个事实:空的 tikzpicture 仍会在文档中插入一个空框。这可以通过\maketitle强制分页之类的命令来发现。

为了解决这个问题,你可以在一个框中排版 tikzpicture,然后将其丢弃。为此,我使用\sbox0{...}将排版内容保存到寄存器 0 中的框中。但是,框形成一个隐式组,因此要访问框外保存的路径,我们需要使用spath/save global

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{spath3, intersections}

\AtBeginDocument{%
    \sbox0{\tikz[overlay] \path[spath/save global=myarc] (0,0) arc[radius=1cm, start angle=180, delta angle=-180];}%
}

\tikzset{
    bridge/.style 2 args={
        spath/split at intersections with={#1}{#2},
        spath/insert gaps after components={#1}{8pt},
        spath/join components upright with={#1}{myarc},
        spath/split at intersections with={#2}{#1},
        spath/insert gaps after components={#2}{4pt},
    }
}

\title{This should be page 1}
\begin{document}
    \maketitle
    \begin{tikzpicture}
        \path[spath/save=over] (0,0) -| ++(1,1) -| ++(-1,1) -| ++(1,1) -|
        ++(-1,1);
        \path[spath/save=under] (.5,-.5) -- ++(0,4);
        \tikzset{bridge={over}{under}}
        \draw[spath/use=over];
        \draw[spath/use=under];
    \end{tikzpicture}
\end{document}

答案2

如果您要定义一个不会改变的路径(从您的用例来看),那么您可以在包中对其进行硬编码,而无需通过 tikz 图片进行定义。要找出定义,请在单独的文档中定义它并使用密钥save to aux。然后,您可以将代码从 aux 文件复制到您的包中。

这是定义半圆的文档:

\documentclass{article}
%\url{https://tex.stackexchange.com/q/605800/86}

\usepackage{tikz}
\usetikzlibrary{spath3}

\begin{document}
\begin{tikzpicture}
\path[spath/save=semicircle] (0,0) arc[radius=1,start angle=-180, delta angle=180];
\tikzset{spath/save to aux=semicircle}
\end{tikzpicture}
\end{document}

auxfile 包含代码(为清晰起见添加了换行符):

\ExplSyntaxOn
\tl_clear_new:N \tikz@intersect@path@name@semicircle
\tl_set:Nn \tikz@intersect@path@name@semicircle
{
\pgfsyssoftpath@movetotoken {0.0pt}{0.0pt}
\pgfsyssoftpath@curvetosupportatoken {0.0pt}{-15.71422pt}
\pgfsyssoftpath@curvetosupportbtoken {12.73853pt}{-28.45274pt}
\pgfsyssoftpath@curvetotoken {28.45274pt}{-28.45274pt}
\pgfsyssoftpath@curvetosupportatoken {44.16696pt}{-28.45274pt}
\pgfsyssoftpath@curvetosupportbtoken {56.90549pt}{-15.71422pt}
\pgfsyssoftpath@curvetotoken {56.90549pt}{0.0pt}
}
\ExplSyntaxOff 

save to aux由于密钥不太复杂,因此名称应该只包含字母(不包含数字、空格或数字) 。稍后可以通过编辑代码来更改,例如:

\ExplSyntaxOn
\tl_clear_new:c {tikz@intersect@path@name@semi-circle}
\tl_set:cn {tikz@intersect@path@name@semi-circle}
{
\pgfsyssoftpath@movetotoken {0.0pt}{0.0pt}
\pgfsyssoftpath@curvetosupportatoken {0.0pt}{-15.71422pt}
\pgfsyssoftpath@curvetosupportbtoken {12.73853pt}{-28.45274pt}
\pgfsyssoftpath@curvetotoken {28.45274pt}{-28.45274pt}
\pgfsyssoftpath@curvetosupportatoken {44.16696pt}{-28.45274pt}
\pgfsyssoftpath@curvetosupportbtoken {56.90549pt}{-15.71422pt}
\pgfsyssoftpath@curvetotoken {56.90549pt}{0.0pt}
}
\ExplSyntaxOff 

请注意,软路径的默认命名方案是使它们与交集库兼容(因此tikz@intersect@path@name@开头有一点)。可以通过prefixsuffix键在包中更改这一点,因此通过在包中使用它们,您可以保护您的路径不被用户意外覆盖。

相关内容