在 TikZ 中使用固定锚点位置进行文本对齐

在 TikZ 中使用固定锚点位置进行文本对齐

我使用创建了一些生物图画迪亚并将它们导出为 TikZ TeX 代码。

我想定义一些命令来插入这些图形并向其中添加一些文本。由于文本很多而空间不大,我希望文本根据某个锚点左对齐、右对齐或居中对齐。

就看这个例子。箭头应该指向锚点。

在此处输入图片描述

第一个文本“right”在其右侧有一个固定锚点。如果文本变长,文本应该进一步向左移动。文本“left”在其左边缘有一个锚点。它向右增长。“center”文本根据其中心位置上的锚点居中。

最终的 TeX 代码发布如下。抱歉,所有代码都是样板!

[编辑]

澄清我真正想要实现的目标:

我在 Dia 中创建了一张包含一些(占位符)文本的图片。现在我想要一个相应的 LaTeX 命令,该命令会为图形中原本放置的每个文本插入此图片和新文本。由于空间有限,文本有时需要以不同的方式对齐。

考虑这个示例图片

在此处输入图片描述

为了创建命令,我可以轻松地用类似以下内容替换生成的 Tex 中的文本

\node[anchor=west] at (8.650000\du,7.400000\du){#1};

它只会用相应的参数替换原始文本,但正如第二张示例图所示,没有足够的空间来左对齐每个字符串。所以我需要的是这样的命令

\drawText{(8.650000\du,7.400000\du)}{#1}{l}

这使我能够指定对齐方式,正如第一个示例所示。

您是否知道仅通过了解锚点就能实现这一点(以上述三种方式输出的文本)?

先感谢您

以下是第一个示例 Dia 项目生成的一些示例代码

\documentclass{article}
\usepackage{tikz}
\begin{document}
\ifx\du\undefined
  \newlength{\du}
\fi
\setlength{\du}{15\unitlength}
\newcommand{\testpic}[3]{
\begin{tikzpicture}
\pgftransformxscale{1.000000}
\pgftransformyscale{-1.000000}
\definecolor{dialinecolor}{rgb}{0.000000, 0.000000, 0.000000}
\pgfsetstrokecolor{dialinecolor}
\definecolor{dialinecolor}{rgb}{1.000000, 1.000000, 1.000000}
\pgfsetfillcolor{dialinecolor}
\pgfsetlinewidth{0.100000\du}
\pgfsetdash{}{0pt}
\pgfsetdash{}{0pt}
\pgfsetbuttcap
{
\definecolor{dialinecolor}{rgb}{0.000000, 0.000000, 0.000000}
\pgfsetfillcolor{dialinecolor}
% was here!!!
\pgfsetarrowsend{stealth}
\definecolor{dialinecolor}{rgb}{0.000000, 0.000000, 0.000000}
\pgfsetstrokecolor{dialinecolor}
\draw (9.950000\du,10.050000\du)--(9.950000\du,7.700000\du);
}
\pgfsetlinewidth{0.100000\du}
\pgfsetdash{}{0pt}
\pgfsetdash{}{0pt}
\pgfsetbuttcap
{
\definecolor{dialinecolor}{rgb}{0.000000, 0.000000, 0.000000}
\pgfsetfillcolor{dialinecolor}
% was here!!!
\pgfsetarrowsend{stealth}
\definecolor{dialinecolor}{rgb}{0.000000, 0.000000, 0.000000}
\pgfsetstrokecolor{dialinecolor}
\draw (14.831803\du,10.050000\du)--(14.831803\du,7.700000\du);
}
\pgfsetlinewidth{0.100000\du}
\pgfsetdash{}{0pt}
\pgfsetdash{}{0pt}
\pgfsetbuttcap
{
\definecolor{dialinecolor}{rgb}{0.000000, 0.000000, 0.000000}
\pgfsetfillcolor{dialinecolor}
% was here!!!
\pgfsetarrowsend{stealth}
\definecolor{dialinecolor}{rgb}{0.000000, 0.000000, 0.000000}
\pgfsetstrokecolor{dialinecolor}
\draw (19.951803\du,10.050000\du)--(19.951803\du,7.700000\du);
}
% setfont left to latex
\definecolor{dialinecolor}{rgb}{0.000000, 0.000000, 0.000000}
\pgfsetstrokecolor{dialinecolor}
\node[anchor=west] at (8.650000\du,7.400000\du){#1};
% setfont left to latex
\definecolor{dialinecolor}{rgb}{0.000000, 0.000000, 0.000000}
\pgfsetstrokecolor{dialinecolor}
\node[anchor=west] at (6.250000\du,7.800000\du){};
% setfont left to latex
\definecolor{dialinecolor}{rgb}{0.000000, 0.000000, 0.000000}
\pgfsetstrokecolor{dialinecolor}
\node[anchor=west] at (14.050000\du,7.418625\du){#2};
% setfont left to latex
\definecolor{dialinecolor}{rgb}{0.000000, 0.000000, 0.000000}
\pgfsetstrokecolor{dialinecolor}
\node[anchor=west] at (20.000000\du,7.400000\du){#3};
\end{tikzpicture}
}
\testpic{right}{center}{left}
\end{document}

答案1

您的代码中有很多重复和重新定义。但是,看起来(如果您想使用 TikZ 来实现这一点),下面的代码应该可以很好地完成:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}[my node/.style={anchor=base,inner sep=0pt},
                    my arrows/.style={arrows=stealth-,line width=2pt}
                   ]
  \pgftransformxscale{3}
  \node[my node] (right)  at (0,0) {right};
  \node[my node] (center) at (1,0) {center};
  \node[my node] (left)   at (2,0) {left};  

  \draw[my arrows] ($(left.base west)+(0,-1ex)$)  -- ($(left.base west)+(0,-2cm)$);
  \draw[my arrows] ($(center.base)+(0,-1ex)$)     -- ($(center.base)+(0,-2cm)$);
  \draw[my arrows] ($(right.base east)+(0,-1ex)$) -- ($(right.base east)+(0,-2cm)$);
\end{tikzpicture}

\end{document}

在此处输入图片描述

或者按照@Qrrbrbirlbel 的建议,您可以calc按照以下方式完成此操作,而无需使用库

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}[my node/.style={anchor=base,inner sep=0pt},
                    my arrows/.style={arrows=stealth-,line width=2pt}
                   ]
  \pgftransformxscale{3}
  \node[my node] (right)  at (0,0) {right};
  \node[my node] (center) at (1,0) {center};
  \node[my node] (left)   at (2,0) {left};  

  \draw[my arrows] (left.base west)  ++ (down:1ex) -- ++ (down:2cm);
  \draw[my arrows] (center.base)     ++ (down:1ex) -- ++ (down:2cm);
  \draw[my arrows] (right.base east) ++ (down:1ex) -- ++ (down:2cm);

\end{tikzpicture}

\end{document}

答案2

当您导出到 时tikz,不清楚您是否希望在tikz上下文中找到解决方案。因此,我以一种不属于 的方式进行了解释tikz

首先,我必须将更多隐身的箭头导入到数学字体中。虽然它们与您的并不完全相同,但我从mathabx包中抓取了单个字符,而没有加载整个包。

然后,为了实现文本,我使用了包\toplap中的宏,该宏将、和作为参数以及要重叠的文本。\stackenginelcr

我的左边和右边与你的相反,但我认为重新训练我的大脑比编写几行代码来交换它们的含义更容易。

我应该指出,由于该命令是一个重叠宏,LaTeX 无法“看到”文本块的大小,因此,根据您如何放置相邻的内容,您可能必须考虑额外的间距。另一方面,这可能正是您想要的,因为文本不会影响锚点位置,锚点位置始终是箭头。

\documentclass{article}
\usepackage{graphicx}
\usepackage{stackengine}
% Setup the matha font (from mathabx.sty)
\DeclareFontFamily{U}{matha}{\hyphenchar\font45}
\DeclareFontShape{U}{matha}{m}{n}{
      <5> <6> <7> <8> <9> <10> gen * matha
      <10.95> matha10 <12> <14.4> <17.28> <20.74> <24.88> matha12
      }{}
\DeclareSymbolFont{matha}{U}{matha}{m}{n}
% Define a subset character from that font (from mathabx.dcl)
% to completely replace the \subset character, you can replace
% \varsubset with \subset
\DeclareMathSymbol{\varleftarrow}{3}{matha}{"D0}
%\DeclareMathSymbol{\varrightarrow}{3}{matha}{"D1}
\def\uparrow{\scalebox{2}{\rotatebox{-90}{\hspace{-1.3ex}$\varleftarrow$}}}
\newcommand\textarrow[2]{\hsmash{\uparrow}\toplap{#1}{\sffamily#2}}
\parindent 0in\parskip 1em
\begin{document}
\textarrow{l}{left text}\par
\textarrow{c}{center text}\par
\textarrow{r}{right text}
\end{document}

在此处输入图片描述


导入单个数学字符是从 Alan Munn 那里学到的

从不同字体导入单个符号

相关内容