嗯,我消失好幾天了。那么,我都在做什么呢?沒錯,就是寫這篇文章了。這篇文章寫起來着實有些費神了。於是,如果你覺得這篇文章對你有幫助,不妨掃描文末的二維碼,適量贊助一下哦~!
tcolorbox
宏包是 Thomas F. Sturm 開發的一個用於繪制彩色文本框的宏包。tcolorbox
底層基於 pgf
,功能也是十分強大。
一個月前,有群友在群里問到如何制作下面這樣的藍色邊框,於是這里借着實現這一邊框的時機,簡單講講 tcolorbox
的用法。
概述:安裝與調用
和大多數宏包一樣,tcolorbox
被 MiKTeX 和 TeX Live 都收錄其中。因此,通常情況,你只需要用相應的宏包管理器安裝就好。
使用起來,也很簡單。和其他宏包一樣,你需要在導言區,使用 \usepackage
命令調用這個宏包。
1 |
\usepackage{tcolorbox} |
你可以在調用宏包時,用可選參數指明需要加載哪些程序庫;也可以在調用 tcolorbox
之后,顯式地使用 \tcbuselibrary
來調用 tcolorbox
提供的豐富程序庫。比如,下面的代碼調用了 skins, breakable, theorems
三個程序庫。
1 |
\usepackage{tcolorbox} |
每個程序庫,都對應着一個 tcbXXX.code.tex
文件。實際上,使用 \tcbuselibrary
命令,就是調用了一個個這樣的文件。以下是常見可用的 tcolorbox
程序庫:
skins
: 調用tikz
宏包,提供豐富的文本框樣式;vignette
: 提供一些裝飾性的樣式;raster
: 用以調整若干tcolorbox
的排布樣式listings
/listingsutf8
/minted
: 用以和對應的宏包聯用,實現好看的代碼清單theorems
: 用以生成定理類環境breakable
: 實現自動分頁的文本框magazine
: 實現類似雜志的分段文本fitting
: 實現字體大小和文本框大小的自適應
tcolorbox
基礎
基礎環境和基礎命令
tcolorbox
宏包提供了與宏包同名的環境,是整個宏包的基礎環境,用於生成段落間的文本框。與之對應,宏包還提供了 \tcbox
命令,用於生成行內的文本框。
1 |
\begin{tcolorbox}[⟨options⟩] |
tcolorbox
環境和 \tcbox
命令都可以接收一組選項,用來控制文本框的樣式。我們來看看下面的代碼,及其相應的效果。
1 |
\documentclass{article} |
7 – 9 行是一個最朴素的 tcolorbox
環境。我們看到,在默認情況下,tcolorbox
輸出了一個深灰色圓角邊框、淺灰底色的文本框。
11 – 15 行則在上述最朴素的 tcolorbox
環境的基礎上,增加了一條虛線。這條虛線由 \tcblower
控制,它將 tcolorbox
中的內容分成了上下兩部分。
17 – 21 行則第一次指定了 tcolorbox
環境的選項。tcolorbox
環境和 \tcbox
都可以接受一串 key-value 的參數列表。這里,我們給 tcolorbox
環境傳入了一個名為 title
的參數,它的值是 I Love Sophia
。顧名思義,這給 tcolorbox
輸出的文本框起了一個名字。默認情況下,這個名字會顯示在文本框的頭部。
23 – 25 行引入了一個新的命令——\tcbset
。顯而易見,tcb
是宏包名字的縮寫,而 set
自然是「設置」的意思。\tcbset
也可以接受一串 key-value 參數列表,這些參數將對(同一個分組內) \tcbset
之后的所有 tcbcolorbox
環境和 \tcbox
命令生效。這里引入了一些參數,我們在此不深究它們的含義,且先看效果再說。
在 27 行,我們遇到了第一個 \tcbox
命令。在先前 \tcbset
設置的選項之外,這個 \tcbox
還顯式地引入了 tcbox raise base
這一參數。結合效果,不難猜出這個選項調整了 \tcbox
生成盒子的基線(baseline)。
29 行和 40 行開頭的兩個 \tcbox
命令,一方面說明 tcolorbox
宏包提供了相當多的控制選項,因此文本框的樣式是高度可定制的;另一方面說明了 \tcbox
內里可以裝各種類型的文本——包括表格和圖檔。
定義和重定義新的 box
tcolorbox
宏包提供了 4 個命令,分別用來定義和重定義 tcolorbox
環境和 \tcbox
命令制作的文本框樣式。
1 |
\newtcolorbox[⟨init options⟩]{⟨name⟩}[⟨number⟩][⟨default⟩]{⟨options⟩} |
\newtcolorbox
類似 LaTeX 的 \newenvironment
命令,能夠基於 tcolorbox
環境創建一個新的 box 環境;\renewcolorbox
則類似 LaTeX 的 \renewenvironment
。\newtcbox
類似 LaTeX 的 \newcommand
命令,能夠基於 \tcbox
命令創建一個新的 box 命令;\renewtcbox
則類似 LaTeX 的 \renewcommand
命令。
在這里
⟨init options⟩
通常是用來控制計數器的,具體可以參見tcolorbox
宏包說明手冊的第 5 章⟨name⟩
是環境或命令的名字⟨number⟩
是環境或命令參數的個數⟨default⟩
是環境或命令可選參數的默認值⟨options⟩
接受類似\tcbset
的 key-value 參數列表
1 |
\documentclass{article} |
這里,在 5 – 7 行,我們用 \newtcolorbox
定義了名為 mybox
的環境;在 9 – 12 行,我們用 \renewtcolorbox
重新定義了名為 mybox
的環境;14 – 16 行則用原始的 tcolorbox
重復實現了 mybox
環境的效果。
1 |
\documentclass{article} |
在這里,我們用 \newtcolorbox
命令定義了一個稍微復雜的 mybox
環境。它接收兩個參數,其中第一個參數是可選的,默認值為空;第二個參數則是必填的參數。第一個參數用作 tcolorbox
環境參數補充,第二個參數則是 box 的標題。另外值得注意的是,代碼中引入了 most
這個程序庫。most
會自動調取除 minted
和 documentation
之外所有的 tcolorbox
程序庫。
1 |
\documentclass{article} |
這里我們用 \newtcbox
命令定義了一個新的 \mybox
命令,它可以用來高亮選中的單詞。
warp 既有環境
有的時候,我們希望將既有的 LaTeX 環境改造成帶文本框樣式的環境。這時候,可以使用 \tcolorboxenvironment
環境。它的用法是
1 |
\tcolorboxenvironment{⟨name⟩}{⟨options⟩} |
1 |
\documentclass{article} |
在這里,我們用 \tcolorboxenvironment
命令,在 myitemize
環境外重新 wrap 了一層。新的 myitemize
環境在左側有一道寬為 3mm 的紅色提示線。不難發現,\tcolorboxenvironment
命令可以在(幾乎)不改變原有環境效果的情況下,定義一個新的文本框環境。這種功能十分實用。
常用選項
這里列一些常用的選項,用來控制 tcolorbox
環境和 \tcbox
命令的效果。其它未盡選項和效果,可以查看 tcolorbox
的說明手冊。
標題的內容控制
title
: 設置標題內容,默認為空。adjusted title
: 設置標題內容,默認為空。使用title
生成的標題,標題欄會根據標題內容的高低自動調整;而使用adjusted title
生成的標題,標題欄的高度由當前行文本框中,標題占據高度最高的文本框決定。squeezed title
: 設置標題內容,默認為空。使用squeezed title
生成的標題,如果超過允許的長度,不會換行,而是會在橫向進行壓縮。squeezed title*
: 設置標題內容,默認為空。合並了adjusted title
和squeezed title
的效果。
1 |
\documentclass{article} |
我們看到,兩組紅色的文本框,它們的標題分別由 title
和 squeezed title
指定。因此,標題占據的高度會隨着標題本身的高度變化。兩組藍色的文本框,它們的標題則分別由 adjusted title
和 squeezed title*
指定。於是,標題占據的高度,會根據所處同一行的文本框中,標題所需高度最高的那個文本框來確定,看起來,就整齊多了。
后面兩組文本框,他們的標題分別由 squeezed title
和 squeezed title*
指定。我們發現,當標題長度過長時,標題在水平方向上會被壓縮。
標題位置
默認情況下,文本框的標題會附在文本框的上方。這一狀態稱為 attach
。我們也可以將標題從默認位置上移開,這個動作稱為 detach
。detach
之后,我們就可以用 tcolorbox
提供的宏,將標題放在任意自己想要放的位置。其中,\tcbtitletext
儲存了標題的文本內容,\tcbtitle
則儲存了標題的文本及樣式。
attach title
: 默認樣式,標題將顯示在文本框上方的單獨單元格里。detach title
: 取消文本框上方單獨的單元格,標題需要用戶手工指定位置。attach title to upper = ⟨text⟩
: 取消文本框上方單獨的單元格,標題放在文本框 upper 部分的頭部。
1 |
\documentclass{article} |
在這里,6 – 8 行是正常的情形;9 – 11 行是 detach
的情形,然后用 before upper
將 \tcbtitle
放在 upper
部分之前;12 – 14 行也是 detach
的情形,然后用 after upper
將 \tcbtitle
換行后放在 upper
部分的末尾;16 – 18 行和 19 – 21 行,都是 attach title to upper
的情形,前者直接給 attach title to upper
傳入了標題后的分隔符,后者則使用 after title
傳入分隔符——這兩種方式的效果是一致的。
upper 和 lower 的狀態
tcolorbox
宏包輸出的文本框,在邏輯上可以分為 upper 和 lower 兩個部分,在代碼中用 \tcblower
命令分割 upper 和 lower 兩部分——如果沒有 \tcblower
,則當前文本框只有 upper 部分,而沒有 lower 部分。
upper 和 lower 部分都有可見 (visible
) 和不可見 (invisible
) 兩種狀態,lower 部分還有被忽略 (ignored
) 這一額外的狀態。
upperbox = ⟨visible|invisible⟩
: 控制 upper 部分是否可見lowerbox = ⟨visible|invisible|ignored⟩
: 控制 lower 部分是否可見visible
: 同時控制 upper 和 lower 部分可見invisible
: 同時控制 upper 和 lower 部分不可見
下面的代碼很容易理解,就不做詳細解釋了。
tcb-visible.tex 1 |
\documentclass{article} |
upper 和 lower 部分的分隔
默認情況下,upper 和 lower 部分之間會有一個分隔,不過,我們也可以通過 lower separated
來控制是否顯示這一分隔符。
lower separated = ⟨true|false⟩
: 控制是否顯示 upper 和 lower 兩部分中間的分隔。
1 |
\documentclass{article} |
這里用 tcbraster
環境做了一個明顯的左右對比。我們可以看到,當開啟 lower separated=false
時,各個 skin 下的分隔都不見了。值得注意的是,中間一行中,我們使用了 sidebyside
選項,它能將 upper 和 lower 兩個部分從上下的布局樣式,改變成左右的布局樣式。
顏色和字體控制
tcolorbox
提供了很多顏色控制選項,用來控制文本框各個部分的顏色效果。
colframe
: 文本框框沿的顏色,默認是black!75!white
。colback
: 文本框內的底色,默認是black!5!white
。colbacktitle
: 文本框中標題框的底色,默認是black!50!white
。colupper
: upper 部分文字的顏色。collower
: lower 部分文字的顏色。coltext
: 同時設置 upper 和 lower 部分文字的顏色。coltitle
: title 部分文字的顏色。
1 |
\documentclass{article} |
fontupper
: 控制 upper 部分的字體fontlower
: 控制 lower 部分的字體fonttitle
: 控制 title 部分的字體
1 |
\documentclass{article} |
寬度控制
tcolorbox
宏包提供了三個選項對寬度進行最基本的控制,它們分別是:
width
: 文本框的總寬度,默認是\linewidth
。textwidth
: 文本框內文本的寬度。add to width
: 在現有設置的基礎上,調整文本框的總寬度。
1 |
\documentclass{article} |
這里,我們首先將 width
設置為 5cm
,然后將 text width
設置為 5cm
,最后將 width
在 5cm
的基礎上,用 add to width
減去 1cm
。
線條
tcolorbox
輸出的文本框,其框線都可以設置寬度。
toprule
/bottomrule
/leftrule
/rightrule
: 分別設置文本框上、下、左、右的框線寬度。titlerule
: 設置標題框和內容框之間的框線寬度。boxrule
: 一口氣設置上述 5 條框線的寬度。
1 |
\documentclass{article} |
這里我們首先用 boxrule = 0.5mm
將文本框所有的框線設置為 0.5mm
,而后按照上下左右標題的順序,依次設置相應的框線為 3mm
。
弧度
文本框的弧度也是可以定制的。並且,文本框的弧度,在 tcolorbox
中被細分為內弧和外弧,可以分別設置。默認情況下,外弧的弧度與內弧保持一致(auto outer arc
)。
arc=⟨length⟩
: 設置內弧的半徑。outer arc=⟨length⟩
: 設置外弧的半徑,可以與內弧不同。auto outer arc
: 讓外弧的半徑自動隨着內弧的半徑增減,默認啟用。
1 |
\documentclass{article} |
這里,第一個文本框,我們設置內弧的半徑為 0mm
,得到了一個直角;第二個文本框,我們設置內弧半徑為 3mm
,得到了一個比較圓潤的邊框;第三個文本框,我們設置內弧半徑為 1mm
,外弧半徑為 4mm
——與此同時,第四個文本框將內外弧半徑調換,得到了兩個有些另類的效果。
除了手工設置內外弧的半徑之外,tcolorbox
還預定義了一些樣式:circular arc
、bean arc
、octogon arc
。
theorems
程序包
tcolorbox
宏包提供了 theorems
程序包來實現定理類的環境。theorems
程序包會自動加載 amsmath
宏包。加載調用的方法如前所述:
1 |
\tcbuselibrary{theorems} |
基本用法
theorems
程序包提供了兩個命令,來生成文本框樣式的定理類環境。
\newtcbtheorem[⟨init options⟩]{⟨name⟩}{⟨display name⟩}{⟨options⟩}{⟨prefix⟩}
\renewtcbtheorem[⟨init options⟩]{⟨name⟩}{⟨display name⟩}{⟨options⟩}{⟨prefix⟩}
兩個命令分別都有 4 個必需參數和 1 個可選參數。
name
: 創建的 LaTeX 環境名稱display name
: 創建的環境的標題名稱options
: 傳入tcolorbox
的參數prefix
: 用於生成環境的label
init options
: 用於控制編號
我們來看幾個例子。
tcb-theorem-basic.tex 1 |
\documentclass[UTF8]{ctexart} |
選項
theorems
程序包也提供了諸多選項,用來控制生成的定理環境樣式。
separator sign = ⟨sign⟩
: 設置定理環境編號和標題之間的分隔符,默認是:
。separator sign colon
: 相當於separator sign = {:}
separator sign dash
: 相當於separator sign = {-}
separator sign none
: 相當於separator sign = {}
description delimiters={⟨left⟩}{⟨right⟩}
: 設置定理標題左右的定界符,默認是空。description delimiters parenthesis
: 相當於description delimiters = {(}{)}
description delimiters none
: 相當於description delimiters = {}{}
description color = ⟨color⟩
: 設置定理標題的字體顏色。description font = ⟨text⟩
: 設置定理標題的字體。terminator sign = ⟨sign⟩
: 設置定理標題結束后的終止符。terminator sign colon
: 相當於terminator sign = {:}
terminator sign dash
: 相當於terminator sign = {-}
terminator sign none
: 相當於terminator sign = {}
1 |
\documentclass[UTF8]{ctexart} |
實際動手制作一個定理環境看看
tcb-theorem-final.tex 1 |
\documentclass[UTF8]{ctexart} |
這里我們調用了 skins
/breakable
/theorems
三個程序包,其中 theorems
我們已經見過了。skins
程序包提供了各種「皮膚」,可以在基礎 tcolorbox
的基礎上擴展更多樣式:attach boxed title to top left
這一效果就來自 skins
程序包中的 enhanced
主題。breakable
的效果則使得文本框能夠跨頁。
其他的參數很好理解,就不用展開講了。
希望你看過這篇文章之后,能夠用 tcolorbox
宏包,制作出自己喜歡的文本框。