我想知道是否有办法使用 TikZ 实现以下行为(将文本叠加在相对于文本锚点的位置)
代码如下:
Here is a list:
\begin{itemize}
\item One
\item Two
\item Three
\end{itemize}
Here's what I want:
\begin{itemize}
\item \placetext{2007,-0.3cm,0cm} One
\item \placetext{2009,-0.3cm,0cm} Two
\item \placetext{2012,-0.3cm,0cm} Three
\end{itemize}
命令\placetext{text,x_location,y_location}
应该将文本放置text
在相对的位置x_location
以及y_location
文本上的锚点。
我一直在尝试以下我发现的代码在此主题中要求 LaTeX 和 TikZ 打印“不占用空间”的文本,但没有成功。
\makebox[0pt][c]{%
\begin{tikzpicture}[scale=4, overlay]
\node[draw=none,fill=none] {Hello};\end{tikzpicture}}
使用 TikZ 可以实现这一点吗?我该怎么做?
答案1
你不需要 tikz 来实现这一点:
\documentclass{article}
\begin{document}
\def\placetext#1#2#3{%
\setlength{\unitlength}{1cm}%
\begin{picture}(0,0)%
\put(#2,#3){\llap{#1}}%
\end{picture}%
}
Here's what I want:
\begin{itemize}
\item \placetext{2007}{-.5}{0}One % Note: no space after the macro
\item \placetext{2009}{-.5}{0}Two
\item \placetext{2012}{-.5}{0}Three
\item Four
\end{itemize}
\end{document}
更新
如果出于某种原因(例如,为了将 tikz 样式应用于“浮动”文本),您坚持使用 tikz,您仍然可以在LaTeX环境\tikz
中使用。但有一个警告。如果您不使用从 (0,0) 到文本位置的任何路径,则 tikz 生成的结果框将不包含 (0,0),因此将无法正确定位。此外,您必须正确设置tikz 图片的,以便将其与文本正确对齐。\put
picture
baseline
\item
这里有一个 MWE:
\documentclass{article}
\usepackage{tikz}
\def\placetext#1#2#3{%
\begin{picture}(0,0)%
\put(0,0){\llap{\tikz[baseline=(m.base)]\path (0,0)--(#2,#3)
node[left, fill=orange!30] (m) {#1};}}
\end{picture}%
}
\begin{document}
Here's what I want:
\begin{itemize}
\item \placetext{2007}{-.7}{0}One
\item \placetext{2009}{-.7}{0}Two
\item \placetext{2012}{-.7}{0}Three
\item Four
\end{itemize}
\end{document}
答案2
以下是 TikZ 解决方案,使用臭名昭著的\tikzmark
宏来标记文档中的特定位置并\PlaceText
放置文本。\PlaceText
宏接受可选的第一个参数,可用于自定义文本,如下面的后两种情况所示:
笔记:
- 这确实需要两次运行。第一次确定位置,第二次进行绘图。
- 传递给标记的名称
\tikzmark
是任意的,与文本无关,但需要将用于命名标记的相同名称传递给宏\PlaceText
。
代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand*{\PlaceText}[4][]{%
\begin{tikzpicture}[overlay,remember picture]
\node [anchor=base, #1] at ($(#2) + (#3)$) {#4};
\end{tikzpicture}%
}%
\begin{document}
Here's what I want:
\begin{itemize}
\item \tikzmark{First} One
\item \tikzmark{Second} Two
\item \tikzmark{Third} Three
\end{itemize}
\PlaceText{-0.85cm,0.0cm}{First}{2007}
\PlaceText[text=black, fill=red!30, draw=black, dashed]{-0.85cm,0.0cm}{Second}{2009}
\PlaceText[text=blue, fill=yellow]{-0.85cm,0.0cm}{Third}{2012}
\end{document}
答案3
您无需 tikz 和图片即可获得结果。
\documentclass{article}
\usepackage{xcolor}
\newcommand\placetext[2][-0.5cm]{\hspace*{#1}\llap{\colorbox{yellow}{#2}}\hspace*{-#1}}
\begin{document}
Here's what I want:
\begin{itemize}
\item \placetext{2007}One
\item \placetext{2009}Two
\item \placetext{2012}Three
\item Four
\end{itemize}
\end{document}
\raisebox
如果您想使用另一个参数进行垂直调整,则可以进行一些改进。
egreg 的另一个想法是\placetext
定义\makebox
\newcommand\placetext[2][0.5cm]{\makebox[0pt][r]{\colorbox{yellow}{#2}\hspace{#1}}}