要求 tikz 图片在特定的相对位置渲染并且不占用任何空间

要求 tikz 图片在特定的相对位置渲染并且不占用任何空间

我想知道是否有办法使用 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 图片的,以便将其与文本正确对齐。\putpicturebaseline\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}}}

相关内容