在节点样式定义中设置标签锚点

在节点样式定义中设置标签锚点

我正在尝试设置anchor=base节点标签,以便标签与基线对齐。如果我在标签本身中设置选项,它似乎可以工作,但如果我全局设置选项,则不行。

没有选择:

\documentclass[margin=5mm]{standalone} 

\usepackage{tikz}

\begin{document}

\tikzset{mynode/.style={circle,fill=black}}

    \begin{tikzpicture}

        \draw  (0,0) node[mynode,label={Aa}] (n1) {}
            -- (1,0) node[mynode,label={Ag}] (n2) {}
            -- (2,0) node[mynode,label={Bb}] (n3) {};           

    \end{tikzpicture}

\end{document}

在此处输入图片描述

在每个标签中设置选项:

\documentclass[margin=5mm]{standalone} 

\usepackage{tikz}

\begin{document}

\tikzset{mynode/.style={circle,fill=black}}

    \begin{tikzpicture}

        \draw  (0,0) node[mynode,label={[anchor=base,yshift=2pt]Aa}] (n1) {}
            -- (1,0) node[mynode,label={[anchor=base,yshift=2pt]Ag}] (n2) {}
            -- (2,0) node[mynode,label={[anchor=base,yshift=2pt]Bb}] (n3) {};           

    \end{tikzpicture}

\end{document}

在此处输入图片描述

使用全局设置选项:

\documentclass[margin=5mm]{standalone} 

\usepackage{tikz}

\begin{document}

\tikzset{mynode/.style={circle,fill=black}}

    \begin{tikzpicture}[every label/.style={anchor=base,yshift=2pt}]

        \draw  (0,0) node[mynode,label={Aa}] (n1) {}
            -- (1,0) node[mynode,label={Ag}] (n2) {}
            -- (2,0) node[mynode,label={Bb}] (n3) {};           

    \end{tikzpicture}

\end{document}

在此处输入图片描述

但全局设置其他选项似乎有效;例如,如果我更改为

\begin{tikzpicture}[every label/.style={blue,anchor=base,yshift=2pt}]

然后我得到:

在此处输入图片描述

我如何才能全局设置对齐方式而不是单独设置每个标签的对齐方式?(如果我可以在节点样式声明中设置标签样式就更好了。)

答案1

引用tikz 中的节点基线5.1 节点样式pgf manual

基线不匹配的问题是由于 . 和数字以及 E 的高度和深度都不同。如果它们都具有相同的高度和深度,它们将以相同的方式垂直放置。因此,Ilka 需要做的就是使用文本高度和文本深度选项明确指定节点的高度和深度。

例如,如果我们使用

every label/.append style={text depth=.25ex,color=blue,},

然后我们得到

在此处输入图片描述

这是一个完整的例子

% arara: pdflatex
\documentclass[margin=5mm]{standalone}

\usepackage{tikz}
\tikzset{mynode/.append style={circle,fill=black},
    every label/.append style={text depth=.25ex,color=blue,},
}
\begin{document}

\begin{tikzpicture}
  \draw  (0,0) node[mynode,label={Aa}] (n1) {}
    -- (1,0) node[mynode,label={Ag}] (n2) {}
    -- (2,0) node[mynode,label={Bb}] (n3) {};

\end{tikzpicture}

\end{document}

答案2

问题是锚点被覆盖了。换句话说,every label应用得太早了。作为一种解决方法,我添加了第二个版本的every labelevery label add,它会在稍后应用。如果你然后说

every label add/.style={anchor=base}

锚点将按需要设置。

\documentclass[margin=5mm]{standalone} 
\usepackage{tikz}
\makeatletter% from tikz.code.tex
\def\tikz@@parse@label@nonactive[#1]#2:#3:\pgf@nil{%
  \tikzset{%
    append after command = {%
      \bgroup
        [current point is local=true]
        \pgfextra{\let\tikz@save@last@fig@name=\tikz@last@fig@name\tikz@node@is@a@labelfalse}
        node [every label,
              tikz@label@angle = #2,
              anchor=@auto,
              every label add,%<- added
              #1,
              tikz@label@post = \tikz@label@distance] {\iftikz@handle@active@nodes\expandafter\scantokens\else\expandafter\pgfutil@firstofone\fi{#3\noexpand}}
        \pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name}
      \egroup}}}%
\tikzset{every label add/.style={}}
\makeatother

\begin{document}

\tikzset{mynode/.style={circle,fill=black}}

    \begin{tikzpicture}

        \draw  (0,0) node[mynode,label={[anchor=base,yshift=2pt]Aa}] (n1) {}
            -- (1,0) node[mynode,label={[anchor=base,yshift=2pt]Ag}] (n2) {}
            -- (2,0) node[mynode,label={[anchor=base,yshift=2pt]Bb}] (n3) {};           

    \end{tikzpicture}


    \begin{tikzpicture}[every
    label/.append style={yshift=2pt},every label add/.style={anchor=base}]

        \draw  (0,0) node[mynode,label={Aa}] (n1) {}
            -- (1,0) node[mynode,label={Ag}] (n2) {}
            -- (2,0) node[mynode,label={Bb}] (n3) {};           

    \end{tikzpicture}

\end{document}

在此处输入图片描述

可以想象,对此类功能提出请求是有意义的。

相关内容