tikz 折线 箭头_LaTeX技巧862:用 TikZ 实现带箭头的注释效果
有時候,我們需要對文中的內容做進一步的解釋;有時候,我們會想在文章邊注的區域內,給特定的內容加上一個俏皮話(如下圖)。
這篇文章,我們將用 TikZ 實現這個效果。
TikZ 的知識
我們知道,在 tikzpicture 環境中,類似上面的效果,很容易就能實現。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{>=stealth}
\begin{document}
\begin{tikzpicture}[node distance = 1.5cm]
\node (test) {I'm a soldier!};
\node (testDesc) [above right = of test] {Yes, you are!};
\draw [->,thick] (testDesc) to [in = 60, out = -120] (test);
\end{tikzpicture}
\end{document}
在這里,我們引入了 tikz 宏包,以及它的 positioning 庫,用來繪制和定位 nodes。在 tikzpicture中,我們建立了兩個 node: test 和 testDesc,后者的位于前者的右上方。最后,我們用繪制了從 testDesc 到 test 的曲線箭頭,其樣式由之前的 \tikzset{>=stealth} 指定。
這是 TikZ 的基本應用,不必多言。然而我們的需求,是將位于正文中的文字(它應該是一個 node)和正文外 tikzpicture 中的 node 連起來。如果能解決這一點,那么我們就能將未知問題轉換為已知問題。
我們從 TeX 的執行過程和 TikZ 出發,思考一下,為了解決這個問題,需要如何操作。首先,我們需要記錄 test和 testDesc 的位置。由于我們不可能將這個位置信息直接寫入輸出的 PDF 文件中,所以我們需要將它寫入輔助文件中。這意味著,為了正確實現我們需要的效果,我們至少應該編譯兩次源文件。其次,對于連接 test 和testDesc 的箭頭來說,它的邊界(bounding box)需要特別處理——如果按照正常的方式處理,那么箭頭和正文部分就不能重疊。
所幸,TikZ 已經為我們做好了這些工作。我們需要它提供的 remember picture 和 overlay 連個選項。它們的作用是:
remember picture: 將位置信息寫入輔助文件,供后續使用;
overlay: 不計算邊界,允許與其它內容重疊。
實際實現看看
首先,我們來實現 test 的部分。這部分比較通用,本質上就是用 TikZ 給幾個單詞打上 node 標記的過程。于是我們可以定義一個命令
\newcommand{\tikzmark}[3][]
{\tikz[remember picture, baseline]
\node [anchor=base,#1](#2) {#3};}
注意,這里我們用了 remember picture 選項,確保 \tikzmark 的位置會被保存下來。之后,在寫注釋的時候,就可以引用 \tikzmark 的位置了。這里有一個簡單的實現
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{>=stealth}
\newcommand{\tikzmark}[3][]
{\tikz[remember picture, baseline]
\node [anchor=base,#1](#2) {#3};}
\usepackage{mwe}
\begin{document}
\blindtext
\tikzmark{test}{I'm a soldier!}
\blindtext
\begin{tikzpicture}[overlay, remember picture, node distance = 1.5cm]
\node (testDesc) [above left = of test, xshift = -1cm] {Yes, you are!};
\draw [->,thick] (testDesc) to [in = 120, out = -60] (test);
\end{tikzpicture}
\end{document}
在寫注釋的時候,我們給 tikzpicture 環境加上了 overlay 選項。這是因為從 testDesc 到 test 的箭頭應該可以與其它正文重疊。這段代碼的效果,就是文章開頭的那個樣子。
還能用在數學公式里?
是的,\tikzmark 也可以寫在數學公式里。
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{>=stealth}
\newcommand{\tikzmark}[3][]
{\tikz[remember picture, baseline]
\node [anchor=base,#1](#2) {#3};}
\begin{document}
\[
\mathcal{A} = (\tikzmark{identity}{\texttt{I}} -\tikzmark[red]{G}{\texttt{G}}
\tikzmark[blue]{L}{\texttt{L}} - \tikzmark[purple]{C}{\texttt{C }})
\]
\begin{tikzpicture}[overlay, remember picture,node distance =1.5cm]
\node (identitydescr) [below left=of identity ]{words};
\draw[,->,thick] (identitydescr) to [in=-90,out=90] (identity);
\node[red] (Gdescr) [below =of G]{other words};
\draw[red,->,thick] (Gdescr) to [in=-90,out=90] (G);
\node[blue,xshift=1cm] (Ldescr) [above right =of L]{some words};
\draw[blue,->,thick] (Ldescr) to [in=45,out=-90] (L.north);
\node[purple] (Cdescr) [below right =of C]{more words};
\draw[purple,->,thick] (Cdescr) to [in=-90,out=90] (C.south);
\end{tikzpicture}
\end{document}
你可以試著編譯上面的代碼,將得到以下效果
選自:http://liam0205.me/2016/09/24/TikZ-comment-to-text/
總結
以上是生活随笔為你收集整理的tikz 折线 箭头_LaTeX技巧862:用 TikZ 实现带箭头的注释效果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 强大简洁的免费视频工具,老版快剪辑
- 下一篇: QQ微派狼人杀经典秘籍进阶篇