LaTeX/Picture
The picture 環境允許在 LaTeX 中直接程式設計圖片。一方面,存在相當嚴格的約束,因為線段的斜率和圓形的半徑被限制在一組狹窄的值中。另一方面,LaTeX2e 的 picture 環境帶來了 \qbezier 命令,“q” 代表 _二次_。許多常用的曲線,例如圓形、橢圓和 懸鏈線 可以透過二次貝塞爾曲線得到令人滿意的近似,儘管這可能需要一些數學上的努力。如果使用 Java 等程式語言生成 LaTeX 輸入檔案的 \qbezier 塊,picture 環境將變得非常強大。
儘管在 LaTeX 中直接程式設計圖片受到嚴格限制,並且通常非常繁瑣,但仍然有這樣做的理由。因此生成的文件在位元組方面“很小”,並且沒有額外的圖形檔案需要拖動。
像 pict2e、epic、eepic 或 pstricks 這樣的包增強了原始的 picture 環境,並極大地增強了 LaTeX 的圖形能力。
一個 picture 環境可以在任何 LaTeX 發行版中使用,無需載入任何外部包。此環境是使用以下兩個命令之一建立的
\begin{picture}(x, y)
...
\end{picture}
|
或
\begin{picture}(x, y)(x0, y0)
...
\end{picture}
|
第一對,,影響文件中為圖片保留的矩形空間。
可選的第二對,,將任意座標分配給保留矩形的左下角。
數字 x、y、x0、y0 是 \unitlength 單位的數字(長度),可以隨時重置(但不能在 picture 環境中)使用以下命令
\setlength{\unitlength}{1.2cm}
|
\unitlength 的預設值為 1pt.
大多數繪圖命令具有以下兩種形式之一
\put(x, y){object}
|
或
\multiput(x, y)(dx, dy){n}{object}
|
貝塞爾曲線是一個例外。它們使用以下命令繪製
\qbezier(x1, y1)(x2, y2)(x3, y3)
|
使用 picture 包,除了相對於 \unitlength 的數字之外,還允許使用絕對尺寸(如 15pt)和表示式。
線段使用以下命令繪製
\put(x, y){ \line(x1, y1){length} }
|
\line 命令有兩個引數
- 一個方向向量,
- 一個“長度”(有點像:這個引數在垂直線段的情況下是垂直長度,在所有其他情況下是線的水平距離,而不是線段本身的長度)。
方向向量的分量被限制為整數 (−6, −5, ... , 5, 6) 並且它們必須互質(除了 1 之外沒有公因子)。下圖說明了第一象限中所有 25 種可能的斜率值。長度相對於 \unitlength。
\setlength{\unitlength}{5cm}
\begin{picture}(1,1)
\put(0,0){\line(0,1){1}}
\put(0,0){\line(1,0){1}}
\put(0,0){\line(1,1){1}}
\put(0,0){\line(1,2){.5}}
\put(0,0){\line(1,3){.3333}}
\put(0,0){\line(1,4){.25}}
\put(0,0){\line(1,5){.2}}
\put(0,0){\line(1,6){.1667}}
\put(0,0){\line(2,1){1}}
\put(0,0){\line(2,3){.6667}}
\put(0,0){\line(2,5){.4}}
\put(0,0){\line(3,1){1}}
\put(0,0){\line(3,2){1}}
\put(0,0){\line(3,4){.75}}
\put(0,0){\line(3,5){.6}}
\put(0,0){\line(4,1){1}}
\put(0,0){\line(4,3){1}}
\put(0,0){\line(4,5){.8}}
\put(0,0){\line(5,1){1}}
\put(0,0){\line(5,2){1}}
\put(0,0){\line(5,3){1}}
\put(0,0){\line(5,4){1}}
\put(0,0){\line(5,6){.8333}}
\put(0,0){\line(6,1){1}}
\put(0,0){\line(6,5){1}}
\end{picture}
|
箭頭使用以下命令繪製
\put(x, y){\vector(x1, y1){length}}
|
對於箭頭,方向向量的分量比線段的限制更窄,即限制為整數 (−4, −3, ... , 3, 4)。分量也必須互質(除了 1 之外沒有公因子)。請注意 \thicklines 命令對指向左上角的兩個箭頭產生的影響。
\setlength{\unitlength}{0.75mm}
\begin{picture}(60,40)
\put(30,20){\vector(1,0){30}}
\put(30,20){\vector(4,1){20}}
\put(30,20){\vector(3,1){25}}
\put(30,20){\vector(2,1){30}}
\put(30,20){\vector(1,2){10}}
\thicklines
\put(30,20){\vector(-4,1){30}}
\put(30,20){\vector(-1,4){5}}
\thinlines
\put(30,20){\vector(-1,-1){5}}
\put(30,20){\vector(-1,-4){5}}
\end{picture}
|
命令
\put(x, y){\circle{diameter}}
|
繪製一個以 (x, y) 為中心,直徑(不是半徑)由 diameter 指定的圓形。picture 環境只允許大約 14mm 的直徑,即使在這個限制以下,也不是所有直徑都是可能的。 \circle* 命令生成圓盤(填充圓形)。與線段一樣,可能需要使用其他包,例如 eepic、pstricks 或 tikz。
\setlength{\unitlength}{1mm}
\begin{picture}(60, 40)
\put(20,30){\circle{1}}
\put(20,30){\circle{2}}
\put(20,30){\circle{4}}
\put(20,30){\circle{8}}
\put(20,30){\circle{16}}
\put(20,30){\circle{32}}
\put(40,30){\circle{1}}
\put(40,30){\circle{2}}
\put(40,30){\circle{3}}
\put(40,30){\circle{4}}
\put(40,30){\circle{5}}
\put(40,30){\circle{6}}
\put(40,30){\circle{7}}
\put(40,30){\circle{8}}
\put(40,30){\circle{9}}
\put(40,30){\circle{10}}
\put(40,30){\circle{11}}
\put(40,30){\circle{12}}
\put(40,30){\circle{13}}
\put(40,30){\circle{14}}
\put(15,10){\circle*{1}}
\put(20,10){\circle*{2}}
\put(25,10){\circle*{3}}
\put(30,10){\circle*{4}}
\put(35,10){\circle*{5}}
\end{picture}
|
picture 環境中還有另一種可能性。如果你不害怕進行必要的計算(或者將它們留給程式),則可以將任意圓形和橢圓從二次貝塞爾曲線中拼湊起來。請參閱 _LaTeX2e 中的圖形_ 以獲取示例和 Java 原始檔。
正如本示例所示,可以使用 \put 命令在環境中以通常的方式寫入文字和公式
\setlength{\unitlength}{0.8cm}
\begin{picture}(6,5)
\thicklines
\put(1,0.5){\line(2,1){3}}
\put(4,2){\line(-2,1){2}}
\put(2,3){\line(-2,-5){1}}
\put(0.7,0.3){$A$}
\put(4.05,1.9){$B$}
\put(1.7,2.95){$C$}
\put(3.1,2.5){$a$}
\put(1.3,1.7){$b$}
\put(2.5,1.05){$c$}
\put(0.3,4){$F=\sqrt{s(s-a)(s-b)(s-c)}$}
\put(3.5,0.4){$\displaystyle s:=\frac{a+b+c}{2}$}
\end{picture}
|
命令
\multiput(x, y)(dx, dy ){n}{object}
|
有 4 個引數:起點、從一個物件到下一個物件的平移向量、物件的數量以及要繪製的物件。該\linethickness命令適用於水平和垂直線段,但不適用於斜線段或圓形。但是,它確實適用於二次貝塞爾曲線!
\setlength{\unitlength}{2mm}
\begin{picture}(30,20)
\linethickness{0.075mm}
\multiput(0,0)(1,0){26}%
{\line(0,1){20}}
\multiput(0,0)(0,1){21}%
{\line(1,0){25}}
\linethickness{0.15mm}
\multiput(0,0)(5,0){6}%
{\line(0,1){20}}
\multiput(0,0)(0,5){5}%
{\line(1,0){25}}
\linethickness{0.3mm}
\multiput(5,0)(10,0){2}%
{\line(0,1){20}}
\multiput(0,5)(0,10){2}%
{\line(1,0){25}}
\end{picture}
|
命令
\put(x, y){\oval(w, h)}
|
或
\put(x, y){\oval(w, h)[position]}
|
生成一個以(x, y)為中心,寬度為w,高度為h的橢圓。可選的位置引數b, t, l, r分別代表“頂部”,“底部”,“左側”,“右側”,可以組合使用,如示例所示。線條粗細可以透過兩種命令控制:一方面是\linethickness{''length''},另一方面是\thinlines和\thicklines。雖然\linethickness{''length''}僅適用於水平和垂直線(以及二次貝塞爾曲線),但\thinlines和\thicklines也適用於斜線段以及圓形和橢圓。
\setlength{\unitlength}{0.75cm}
\begin{picture}(6,4)
\linethickness{0.075mm}
\multiput(0,0)(1,0){7}%
{\line(0,1){4}}
\multiput(0,0)(0,1){5}%
{\line(1,0){6}}
\thicklines
\put(2,3){\oval(3,1.8)}
\thinlines
\put(3,2){\oval(3,1.8)}
\thicklines
\put(2,1){\oval(3,1.8)[tl]}
\put(4,1){\oval(3,1.8)[b]}
\put(4,3){\oval(3,1.8)[r]}
\put(3,1.5){\oval(1.8,0.4)}
\end{picture}
|
圖片框可以透過命令進行宣告
\newsavebox{name}
|
然後透過以下命令進行定義
\savebox{name}(width,height)[position]{content}
|
最後,可以任意多次使用以下命令進行繪製
\put(x, y){\usebox{name}}
|
可選的位置引數的作用是定義儲存框的“錨點”。在示例中,它被設定為“bl”,將錨點放置在儲存框的左下角。其他位置指定符為頂部和右側。
name引數引用一個 LaTeX 儲存箱,因此具有命令性質(這解釋了當前示例中的反斜槓)。框圖可以巢狀:在本示例中,\foldera在\folderb的定義中使用。\oval命令必須使用,因為如果線段長度小於約 3 毫米,\line命令將無法工作。
\setlength{\unitlength}{0.5mm}
\begin{picture}(120,168)
\newsavebox{\foldera}
\savebox{\foldera}
(40,32)[bl]{% definition
\multiput(0,0)(0,28){2}
{\line(1,0){40}}
\multiput(0,0)(40,0){2}
{\line(0,1){28}}
\put(1,28){\oval(2,2)[tl]}
\put(1,29){\line(1,0){5}}
\put(9,29){\oval(6,6)[tl]}
\put(9,32){\line(1,0){8}}
\put(17,29){\oval(6,6)[tr]}
\put(20,29){\line(1,0){19}}
\put(39,28){\oval(2,2)[tr]}
}
\newsavebox{\folderb}
\savebox{\folderb}
(40,32)[l]{% definition
\put(0,14){\line(1,0){8}}
\put(8,0){\usebox{\foldera}}
}
\put(34,26){\line(0,1){102}}
\put(14,128){\usebox{\foldera}}
\multiput(34,86)(0,-37){3}
{\usebox{\folderb}}
\end{picture}
|
命令
\qbezier(x1, y1)(x, y)(x2, y2)
|
繪製一個二次貝塞爾曲線,其中,表示端點,而表示中間控制點。相應的切線斜率,和,可以從以下方程式中獲得
參見LaTeX2e 中的圖形,獲取一個生成必要\qbezier命令列的 Java 程式。
\setlength{\unitlength}{0.8cm}
\begin{picture}(6,4)
\linethickness{0.075mm}
\multiput(0,0)(1,0){7}
{\line(0,1){4}}
\multiput(0,0)(0,1){5}
{\line(1,0){6}}
\thicklines
\put(0.5,0.5){\line(1,5){0.5}}
\put(1,3){\line(4,1){2}}
\qbezier(0.5,0.5)(1,3)(3,3.5)
\thinlines
\put(2.5,2){\line(2,-1){3}}
\put(5.5,0.5){\line(-1,5){0.5}}
\linethickness{1mm}
\qbezier(2.5,2)(5.5,0.5)(5,3)
\thinlines
\qbezier(4,2)(4,3)(3,3)
\qbezier(3,3)(2,3)(2,2)
\qbezier(2,2)(2,1)(3,1)
\qbezier(3,1)(4,1)(4,2)
\end{picture}
|
如本例所示,將圓形拆分成 4 個二次貝塞爾曲線並不令人滿意。至少需要 8 個。圖再次顯示了\linethickness命令對水平或垂直線的影響,以及\thinlines和\thicklines命令對斜線段的影響。它還顯示了兩種命令都影響二次貝塞爾曲線,每個命令覆蓋所有之前的命令。
\setlength{\unitlength}{1cm}
\begin{picture}(4.3,3.6)(-2.5,-0.25)
\put(-2,0){\vector(1,0){4.4}}
\put(2.45,-.05){$x$}
\put(0,0){\vector(0,1){3.2}}
\put(0,3.35){\makebox(0,0){$y$}}
\qbezier(0.0,0.0)(1.2384,0.0)
(2.0,2.7622)
\qbezier(0.0,0.0)(-1.2384,0.0)
(-2.0,2.7622)
\linethickness{.075mm}
\multiput(-2,0)(1,0){5}
{\line(0,1){3}}
\multiput(-2,0)(0,1){4}
{\line(1,0){4}}
\linethickness{.2mm}
\put( .3,.12763){\line(1,0){.4}}
\put(.5,-.07237){\line(0,1){.4}}
\put(-.7,.12763){\line(1,0){.4}}
\put(-.5,-.07237){\line(0,1){.4}}
\put(.8,.54308){\line(1,0){.4}}
\put(1,.34308){\line(0,1){.4}}
\put(-1.2,.54308){\line(1,0){.4}}
\put(-1,.34308){\line(0,1){.4}}
\put(1.3,1.35241){\line(1,0){.4}}
\put(1.5,1.15241){\line(0,1){.4}}
\put(-1.7,1.35241){\line(1,0){.4}}
\put(-1.5,1.15241){\line(0,1){.4}}
\put(-2.5,-0.25){\circle*{0.2}}
\end{picture}
|
在本圖中,懸鏈線的每個對稱半部分都由一個二次貝塞爾曲線近似。曲線的右側半部分在點 (2, 2.7622) 處結束,那裡的斜率值為 m = 3.6269。再次使用方程式 (*),我們可以計算中間控制點。它們結果是 (1.2384, 0) 和 (-1.2384, 0)。十字表示真實懸鏈線的點。誤差幾乎不可察覺,小於百分之一。本例指出了\{picture}命令可選引數的用法。圖片在方便的“數學”座標中定義,而透過命令
\begin{picture}(4.3,3.6)(-2.5,-0.25)
|
它的左下角(用黑色圓盤標記)被分配座標 (-2.5, -0.25)。
\setlength{\unitlength}{1cm}
\begin{picture}(6,6)(-3,-3)
\put(-1.5,0){\vector(1,0){3}}
\put(2.7,-0.1){$\chi$}
\put(0,-1.5){\vector(0,1){3}}
\multiput(-2.5,1)(0.4,0){13}
{\line(1,0){0.2}}
\multiput(-2.5,-1)(0.4,0){13}
{\line(1,0){0.2}}
\put(0.2,1.4)
{$\beta=v/c=\tanh\chi$}
\qbezier(0,0)(0.8853,0.8853)
(2,0.9640)
\qbezier(0,0)(-0.8853,-0.8853)
(-2,-0.9640)
\put(-3,-2){\circle*{0.2}}
\end{picture}
|
兩個貝塞爾曲線的控制點是根據公式 (*) 計算的。正分支由 , 和 ,。同樣,影像在數學上方便的座標系中定義,左下角被分配了數學座標 (−3,−2) (黑色圓盤)。
強大的科學繪圖軟體包 gnuplot 能夠直接輸出到 LaTeX picture 環境。直接繪製到 LaTeX 通常會方便得多,因為它可以避免處理可能存在問題的 PostScript 檔案。以這種方式繪製科學資料(或數學圖形)提供了比其他方式(例如 PostScript)更大的控制能力,當然也提供了排版能力。然後可以使用 \include{} 命令將這些影像新增到文件中。
注意,gnuplot 是一款功能強大的軟體,擁有大量命令。本說明無法全面討論 gnuplot。請參閱 [1] 獲取教程。
