如何在文本模式下过度支撑/不足支撑(使用 TikZ?)

如何在文本模式下过度支撑/不足支撑(使用 TikZ?)

我想要创建一些看起来像这样的东西:

在此处输入图片描述

我知道,\overbrace但这只适用于数学模式。我找不到\overbrace文本。虽然我可能可以使用数学模式,但这样做感觉有点不对。

我按照建议尝试了 TikZ很少 其他 问题我想到了以下几点:

\documentclass{article}
\usepackage{tikz}
\begin{document}
\usetikzlibrary{patterns,arrows,decorations.pathreplacing}

\begin{figure}
\newcommand{\tikzmark}[1]{\tikz[overlay, remember picture] \coordinate (#1);}

\tikzmark{begin}%
http:
\tikzmark{schema}
//user:[email protected]:port/resource
\tikzmark{query}
?query=foo
\tikzmark{fragment}
\#fragment
\tikzmark{end}

\tikz[overlay,remember picture] {
  \draw[decorate,decoration={brace,raise=5mm,amplitude=24pt}] (begin.north west) -- node [above=16mm] {URI} (end.north east) ;
  \draw[decorate,decoration={brace,raise=2mm,amplitude=24pt,mirror}] (schema.south west) -- node[below of=begin, below=6mm] {Schema} (end.south east) ;
  \draw[decorate,decoration={brace,raise=2mm,amplitude=6pt,mirror}] (fragment.south west) -- node[below of=begin, below=6mm] {Fragment} (end.south east) ;
}
\end{figure}
\end{document}

虽然这看起来很有潜力:但是渲染代码 必须手动使用和调整标签的位置感觉很尴尬。above=6mmbelow

所以我猜测我不想关心确切的位置,而是大致这样做:

\overbrace{URI}{\underbrace{schema}{http:}\underbrace{specific}{//\underbrace{credentials}{user:pass}}}

答案1

使用smatrix的a node,然后利用这些节点的角(通过.north west.north east.south west.south east)来\draw设置路径,结合node沿路径设置 s 的能力,您可以在 中执行此操作TikZ。此外,您可以使用\tikzstyle全局设置一些选项,这样您就不必不断手动调整标签的位置:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{matrix}
\usetikzlibrary{decorations.pathreplacing}

\tikzstyle{overbrace text style}=[font=\tiny, above, pos=.5, yshift=3mm]
\tikzstyle{overbrace style}=[decorate,decoration={brace,raise=2mm,amplitude=3pt}]
\tikzstyle{underbrace style}=[decorate,decoration={brace,raise=2mm,amplitude=3pt,mirror},color=gray]
\tikzstyle{underbrace text style}=[font=\tiny, below, pos=.5, yshift=-3mm]

\begin{document}

\begin{tikzpicture}

    \matrix[name=M1, matrix of nodes, inner sep=0pt, column sep=0pt]{
      \node (schema) [text=red] {http:\vphantom{/}}; & \node (schema-spezifisch) [text=black] {//}; & \node (nutzerinfo) [text=orange] {user:pass\vphantom{/}}; & @ & \node (host) [text=blue] {www.example.com\vphantom{/}}; & : & \node (port) [text=blue!40] {1234\vphantom{/}}; & \node (pfad) [text=red] {/directory/index.php}; & \node (query) [text=purple] {?key=value\vphantom{/}}; & \node (fragment) [text=green] {\#anchor\vphantom{/}};  \\
    };

    \draw [overbrace style] (schema.north west) -- (schema.north east) node [overbrace text style] {Schema};
    \draw [overbrace style] (schema-spezifisch.north west) -- (fragment.north east) node [overbrace text style] {Schema-Spezifisch};
    \draw [underbrace style] (nutzerinfo.south west) -- (nutzerinfo.south east) node [underbrace text style,text=orange] {Nutzerinfo};
    \draw [underbrace style] (host.south west) -- (host.south east) node [underbrace text style,text=blue] {Host};
    \draw [underbrace style] (port.south west) -- (port.south east) node [underbrace text style,text=blue!40,baseline] {Port};
    \draw [underbrace style] (pfad.south west) -- (pfad.south east) node [underbrace text style,text=red] {Pfad};
    \draw [underbrace style] (query.south west) -- (query.south east) node [underbrace text style,text=purple] {Query};
    \draw [underbrace style] (fragment.south west) -- (fragment.south east) node [underbrace text style,text=green] {Fragment};

\end{tikzpicture}

\begin{tikzpicture}

    \matrix[name=M2, matrix of nodes, inner sep=0pt, column sep=0pt]{
      \node (URI) {http:}; & \node (schema) [text=black] {//user:[email protected]:port/resource?query=foo}; & \node (fragment) {\#fragment};  \\
    };

    \draw [overbrace style] (URI.north west) -- (fragment.north east) node [overbrace text style] {URI};
    \draw [decorate,decoration={brace,raise=6mm,amplitude=3pt,mirror},color=gray] (schema.south west) -- (fragment.south east) node [font=\tiny, below, pos=.5, yshift=-7mm] {Schema};
    \draw [underbrace style] (fragment.south west) -- (fragment.south east) node [underbrace text style] {Fragment};

\end{tikzpicture}

\end{document}

在此处输入图片描述

您只需要确保每个需要放置下支撑或上支撑的开始或结束的位置都node在其自己的列中设置为自己的位置matrix

此外,如果您不想在第二个中手动设置下部下部支撑的选项tikzpicture,您可以全局设置“下部下部支撑\tikzstyle”之类的内容,或类似的东西。


此外,您还可以将\draw命令包装在宏中。例如,您可以将其放在序言中:

\usepackage{twoopt}
\newcommandtwoopt{\tikzoverbrace}[5][][]{\draw [overbrace style,#1] (#3.north west) -- (#4.north east) node [overbrace text style,#2] {#5};}
\newcommandtwoopt{\tikzunderbrace}[5][][]{\draw [underbrace style,#1] (#3.south west) -- (#4.south east) node [underbrace text style,#2] {#5};}

然后你可以写:

\tikzoverbrace{schema-spezifisch}{fragment}{Schema-Spezifisch}

代替:

\draw [overbrace style] (schema-spezifisch.north west) -- (fragment.north east) node [overbrace text style] {Schema-Spezifisch};

你也可以写:

\tikzunderbrace[][text=orange]{nutzerinfo}{nutzerinfo}{Nutzerinfo}

代替:

\draw [underbrace style] (nutzerinfo.south west) -- (nutzerinfo.south east) node [underbrace text style,text=orange] {Nutzerinfo};

matrix但是,使用此解决方案,您仍然必须独立于这些新命令进行设置。


更新:

正如@FrederickNord 在评论中指出的那样,添加nodes={anchor=south}, text height=1.5ex,text depth=.25exmatrix样式将确保上括号和下括号(至少在这个特定的 MWE 中)正确对齐。另一个选项是\vphantom{...}nodes 内使用,这是上面的 MWE 中使用的选项。

答案2

当我需要对文本进行下括号时,我使用的一个简单解决方案是使用包含在新命令中的数学模式:

\newcommand{\undertext}[2] {$\underbrace{\textrm{#1}}_{\textrm{#2}}$}

然后你就可以\undertext{any text}{like this}

相关内容