我正在使用该tikzmark
库usetikzlibrary(tikzmark)
。
下面的代码
\newcommand{\DrawCircle}[1]{%
\begin{tikzpicture}[overlay,remember picture]
\draw[color=red] (pic cs:#1) circle (0.25cm);
\end{tikzpicture}
}
有效,但是这个代码
\newcommand{\DrawHLine}[3][]{%
\begin{tikzpicture}[overlay,remember picture]
\draw[shorten <=0.2em, #1] (pic cs:#2.west) -- (pic cs:#3.east);
\end{tikzpicture}
}
由于.west
和,无法正确绘制线条.east
。如果我删除它们,线条就会被绘制。如何正确使用.west
、.east
、.north
和?.south
tikzmark
答案1
tikzmark
创建坐标并且坐标没有不同的锚点,因为它们是点。因此coordinate.west
与 相同,coordinate.east
并且没有必要定义它们。
[借鉴percusse 的评论,它们都等同于 ,coordinate.center
与 完全相同coordinate
。]
答案2
作为 cfr 答案的扩展,您可以定义自己的\tikzmark
\documentclass{article}
\usepackage{tikz}
\newcommand{\tikzmark}[2]{%
\tikz[overlay,remember picture,baseline]\node [anchor=base] (#1) {#2};
}
\newcommand{\DrawHLine}[3][]{%
\begin{tikzpicture}[overlay,remember picture]
\draw[shorten <=0.2em, #1] (#2.west) -- (#3.east);
\end{tikzpicture}
}
\begin{document}
\tikzmark{a}{Some text in tikzmark}
\mbox{}\hfill
\tikzmark{b}{Some text in another tikzmark}
\DrawHLine{b}{a}
\end{document}
这里\node
使用 而不是\coordinate
来使east
west
等锚可用。如果您正在加载tikzmark
库,请不要忘记为宏指定不同的名称。
答案3
cfr 的答案并不完全正确,但对于实际目的来说已经足够接近正确。确实tikzmark
不会创建节点,但也不会创建坐标。它不会创建任何东西,它几乎只做了在页面上标记一个点所需的最低限度的事情,仅此而已(不是相当最低限度,有\pgfmark
是绝对最低限度)。不创建坐标或节点的意义在于,这样位置就可以使用了前发出\tikzmark
以及之后(节点和坐标仅在之后可用)。
原始版本\tikzmark
与 Harish 的版本非常相似,但经过修改(我想是为了回答这里的一个问题)为当前版本,以应对上述情况。尽管如此,为了提供与原始版本相同的功能,\tikzmark
可以采用可选的第一个参数,该参数可以是任何 TikZ 代码。
因此将在 内部\tikzmark[{\node[anchor=base] {\(-1\)}}]{a}
产生一个。 (此外, 的名称传递时没有“保护”,因此它可以被选择为将更多选项传递给命令,如。)这与 Harish 的版本不太一样,但要知道在参数中放什么,我需要确切地知道你试图做什么。node
\tikzmark
tikzmark
\tikz
\tikzmark[stuff]{a,baseline=0pt}
tikzmark
然而,它的哲学tikzmark
是,它解决了基本问题,但没有每一个问题。如果你想做一些复杂的事情,那么你最好制作一个合适的 tikzpicture 或你自己的宏(正如 Harish 建议的那样)。可能性的数量tikzmark
如此之大,以至于我无法预测每一个。因此,虽然你可以选择内置\tikzmark
来做你想做的事情,但定义一个新的宏是“LaTeX 方式”。毕竟,\tikzmark
生活就是这样开始的。