我想要创建一些看起来像这样的东西:
我知道,\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=6mm
below
所以我猜测我不想关心确切的位置,而是大致这样做:
\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=.25ex
到matrix
样式将确保上括号和下括号(至少在这个特定的 MWE 中)正确对齐。另一个选项是\vphantom{...}
在node
s 内使用,这是上面的 MWE 中使用的选项。
答案2
当我需要对文本进行下括号时,我使用的一个简单解决方案是使用包含在新命令中的数学模式:
\newcommand{\undertext}[2] {$\underbrace{\textrm{#1}}_{\textrm{#2}}$}
然后你就可以\undertext{any text}{like this}