跳轉到內容

LaTeX/Picture

來自華夏公益教科書

LaTeX

入門
  1. 介紹
  2. 安裝
  3. 安裝額外的包
  4. 基礎
  5. 如何獲得幫助

常見元素

  1. 文件結構
  2. 文字格式
  3. 段落格式
  4. 顏色
  5. 字型
  6. 列表結構
  7. 特殊字元
  8. 國際化
  9. 旋轉
  10. 表格
  11. 標題建立
  12. 頁面佈局
  13. 自定義頁面頁首和頁尾‎
  14. 匯入圖形
  15. 浮動、圖形和標題
  16. 腳註和頁邊注
  17. 超連結
  18. 標籤和交叉引用
  19. 首字母

機制

  1. 錯誤和警告
  2. 長度
  3. 計數器
  4. 規則和支撐

技術文字

  1. 數學
  2. 高階數學
  3. 定理
  4. 化學圖形
  5. 演算法
  6. 原始碼列表
  7. 語言學

特殊頁面

  1. 索引
  2. 詞彙表
  3. 參考文獻管理
  4. 更多參考文獻

特殊文件

  1. 科學報告(學士報告、碩士論文、博士論文)
  2. 信件
  3. 簡報
  4. 教師專區
  5. 簡歷
  6. 學術期刊(MLA、APA 等)

建立圖形

  1. 介紹程式圖形
  2. MetaPost
  3. Picture
  4. PGF/TikZ
  5. PSTricks
  6. Xy-pic
  7. 建立 3D 圖形

程式設計

  1. Plain TeX
  2. 建立包
  3. 建立包文件
  4. 主題

其他

  1. 模組化文件
  2. LaTeX 文件的協作寫作
  3. 匯出到其他格式

幫助和建議

  1. 常見問題解答
  2. 技巧和竅門

附錄

  1. 作者
  2. 連結
  3. 包參考
  4. LaTeX 文件示例
  5. 索引
  6. 命令詞彙表

編輯此框編輯目錄

The picture 環境允許在 LaTeX 中直接程式設計圖片。一方面,存在相當嚴格的約束,因為線段的斜率和圓形的半徑被限制在一組狹窄的值中。另一方面,LaTeX2e 的 picture 環境帶來了 \qbezier 命令,“q” 代表 _二次_。許多常用的曲線,例如圓形、橢圓和 懸鏈線 可以透過二次貝塞爾曲線得到令人滿意的近似,儘管這可能需要一些數學上的努力。如果使用 Java 等程式語言生成 LaTeX 輸入檔案的 \qbezier 塊,picture 環境將變得非常強大。

儘管在 LaTeX 中直接程式設計圖片受到嚴格限制,並且通常非常繁瑣,但仍然有這樣做的理由。因此生成的文件在位元組方面“很小”,並且沒有額外的圖形檔案需要拖動。

pict2eepiceepicpstricks 這樣的包增強了原始的 picture 環境,並極大地增強了 LaTeX 的圖形能力。

基本命令

[編輯 | 編輯原始碼]

一個 picture 環境可以在任何 LaTeX 發行版中使用,無需載入任何外部包。此環境是使用以下兩個命令之一建立的

\begin{picture}(x, y)
 ...
\end{picture}

\begin{picture}(x, y)(x0, y0)
...
\end{picture}

第一對,,影響文件中為圖片保留的矩形空間。

可選的第二對,,將任意座標分配給保留矩形的左下角。

數字 xyx0、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 命令有兩個引數

  1. 一個方向向量,
  2. 一個“長度”(有點像:這個引數在垂直線段的情況下是垂直長度,在所有其他情況下是線的水平距離,而不是線段本身的長度)。

方向向量的分量被限制為整數 (−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* 命令生成圓盤(填充圓形)。與線段一樣,可能需要使用其他包,例如 eepicpstrickstikz

\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\linethickness

[編輯 | 編輯原始碼]

命令

\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) (黑色圓盤)。

picture 環境和 gnuplot

[編輯 | 編輯原始碼]

強大的科學繪圖軟體包 gnuplot 能夠直接輸出到 LaTeX picture 環境。直接繪製到 LaTeX 通常會方便得多,因為它可以避免處理可能存在問題的 PostScript 檔案。以這種方式繪製科學資料(或數學圖形)提供了比其他方式(例如 PostScript)更大的控制能力,當然也提供了排版能力。然後可以使用 \include{} 命令將這些影像新增到文件中。

注意,gnuplot 是一款功能強大的軟體,擁有大量命令。本說明無法全面討論 gnuplot。請參閱 [1] 獲取教程。


前一頁:MetaPost 索引 下一頁:PGF/TikZ
華夏公益教科書