本地化 TiKZ 标记

本地化 TiKZ 标记

以下代码改编自第一个答案这里,按照我想要的方式工作。

但这不是我所期望的。我正在重复使用 tikzmark 标签a..e\makebrace标记第一次放置后的使用使用这些位置,第二次放置后的使用使用第二个位置。

我可以依赖这种行为吗?如果不行,有没有办法本地化 tikzmarks?

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calc,tikzmark}
\newcommand{\ntkm}[2]{#2\thinspace\tikzmarknode{#1}{}}
% #1 top item; #2 bottom item; #3 widest item; #4 text
\newcommand{\makebrace}[4]{%
    \begin{tikzpicture}[overlay, remember picture]
        \draw [decoration={brace,amplitude=0.5em},decorate,line width=0.09em]
        let \p1=(#1), \p2=(#2), \p3=(#3) in
        ({\x3+1em}, {\y1+0.9em}) -- node[right=0.6em] {#4} ({\x3+1em}, {\y2-0.2em});
    \end{tikzpicture}
}

\begin{document}
\begin{itemize}
  \item \ntkm{a}{{This is item one of first list}}
  \item \ntkm{b}{{This is item two of first list}}
  \item \ntkm{c}{{This is item three of first list}}
  \item \ntkm{d}{{This is item four of first list}}
  \item \ntkm{e}{{This is item five of first list}}
\end{itemize}
\makebrace{a}{b}{c}{First two items}
\makebrace{c}{e}{c}{Other items}

% much later in long document ...
\begin{itemize}
  \item \ntkm{a}{{This is item one of second list}}
  \item \ntkm{b}{{This is item two of second list}}
  \item \ntkm{c}{{This is item three of second list}}
  \item \ntkm{d}{{This is item four of second list}}
  \item \ntkm{e}{{This is item five of second list}}
\end{itemize}
\makebrace{a}{b}{c}{First two items of second list}
\makebrace{c}{e}{c}{Other items of second list}
\end{document}

答案1

TL; DR是的,是的。


您实际上正在使用\tikzmarknode定义两者的节点分数。在绘制括号的代码中,您使用的是节点,而不是标记。节点是在文档中定义的,因此定义\tikzmarknode了一个可以使用的节点,随后的节点\tikzmarknode会覆盖它,因此在第二次使用后,第一个节点将被遗忘,而第二个节点从那时起可用。这是使用节点时的预期行为。

如果您使用括号代码中的标记,您将遇到重复使用问题,因为标记会保存到文件中aux,因此这是一个“最后一个标记获胜”的情况 - 标记的最后一个版本在文档开始时读回到文档中,并且是唯一可用的标记。但是,在这种情况下,有一种方法可以使 tikzmarks 独一无二,而无需更改代码中的明显名称。可以定义前缀和后缀,它们会自动添加到 tikzmark 名称中。因此,通过在每个列表周围定义其中一个或两个,您可以本地化名称。有关设置这些的详细信息,请参阅文档。

相关内容