在學習 Python 的時候,看到一個習題集,每個習題的后面是答案,而網址在每個習題的下面提供了一個點擊的按鈕,當點擊的時候可以顯示答案,當時我就想,LaTeX 的宏包有沒有能夠實現這個功能的?順藤摸瓜找到了 ocg 包,然后其進化版 ocgx,以及最終進化版 ocgx2.
1. 最初的設想
在學習 Python 的時候,看到一個習題集,每個習題的后面是答案,而網址在每個習題的下面提供了一個點擊的按鈕,當點擊的時候可以顯示答案,當時我就想,LaTeX 的宏包有沒有能夠實現這個功能的?順藤摸瓜找到了 ocg 包,然后其進化版 ocgx,以及最終進化版 ocgx2。
OCG(Optional Content Groups),暫譯為可選內容組,指的是在 PDF 中嵌套可選可視的內容。比如加入圖層(layer),在查看的時候,通過不同的圖層搭配可以顯示不同的效果。
2. ocgx2 包介紹
ocgx2 是 Alexander Grahn 從 2015 年開始開發并維護至今的一個用于創建 PDF 圖層,管理 ocg 的包,它的作用是想完全替換掉目前 Paul Gaborit 的 ocgx 包和 Werner Moshammer 的 ocg-p 包,因為后兩者都有自己的局限性。相比初代 ocg,ocgx 和 ocg-p 包,ocgx2 完全實現了這幾個包的功能,并且解決了編譯引擎上的局限,現在 ocgx2 支持
LaTeX ? dvips ? ps2pdf/Distiller
(Xe)LaTeX ? (x)dvipdfmx
pdfLaTeX, LuaLaTeX
并且 ocgx2 改善了在處理 PDF 圖層時的性能,也提高與其他包同時加載時的兼容性。更為重要的,ocgx2 新增加圖層跨頁功能,之前宏包沒法跨頁。
3. ocgx2 宏包設定
3.1 為 ocg 對象鏈接添加顏色
\usepackage{hyperref} % do NOT set [ocgcolorlinks] here! \usepackage[ocgcolorlinks]{ocgx2}
3.2 為 TikZ 提供圖層支持
\usepackage[tikz]{ocgx2}
4. ocgx2 宏包使用
4.1 ocg 定義方法
我們是通過 ocg 環境定義一個 ocg 圖層的,語法如下
\begin{ocg}[<options>]{<layer name>}{<layer id>}{<initial visibility>} ... material to be put on a PDF layer ... \end{ocg}
其中 options
一般不填,想了解的可以看下 ocgx2 官網對這部分的解釋。layer name
是第一個必選項,意為當前創建的 ocg 的圖層名字,在之后并不會調用,在閱讀 PDF 的時候能夠用于分辨不同圖層。layer id
是為當前 ocg 創建的 ocg 的 id(唯一識別)。不同的 ocg 的 id 都應該不一樣。initial visibility
指的是為當前 ocg 指定默認的可見性。1 為可見(visible),0 為不可見(invisible)。
4.2 ocg 圖層間切換
ocgx2 提供了 4 個核心命令用于切換 ocg 圖層
\switchocg{待切換的圖層 id,逗號分隔}{<link text>} \showocg{待顯示的圖層 id,逗號分隔}{<link text>} \hideocg{待隱藏的圖層 id,逗號分隔}{<link text>} \actionsocg{待切換的圖層(X)}{待顯示的圖層(Y)}{待隱藏的圖層(Z)}{<link text>}
其中 link text
是一段文字,在 PDF 的效果是,當鼠標點擊 link text
的時候,圖層會進行切換,顯示或者隱藏。圖層 id 可以為多個,并用英文分號隔開即可。需要注意的是 \actionsocg
是為 link text
指定一系列動作,即在點擊 link text
的時候,同時 X 的所有圖層狀態切換(可見
<-> 不可見
),Y 所有圖層全部變為 可見
,Z 所有圖層全部變為 不可見
。
一個簡單的示例如下:
\switchocg{ocg1}{\textbf{Show answer}} \begin{ocg}{Python Code}{ocg1}{1} \begin{verbatim}import requests url = 'www.example.com' reponse = request.get(url=url).content print(response) \end{verbatim} \end{ocg}
在點擊 Show answer
之后,下面的這段代碼就能切換顯示狀態。
4.3 與 TikZ 結合使用
為了讓 ocg 與 TikZ 結合非常簡單,只需要在 TikZ 環境中,用 ocg 環境包裹 TikZ 繪圖命令即可。比如
\begin{tikzpicture}[node distance=3cm, state/.style={fill=green!20},auto] \begin{ocg}{grid}{ocgridid}{1} \draw[black!20] (-1,-1) grid (4,2); \end{ocg} \begin{ocg}{states}{ocstatesid}{1} \node[state] (q_a) {$q_a$};\node[state] (q_b) [right of=q_a] {$q_b$}; \end{ocg} \begin{ocg}{edges}{ocedgesid}{1} \path[->](q_a) edge node {0} (q_b) edge [loop above] node {0} () (q_b) edge [loop above] node {1} (); \end{ocg} \end{tikzpicture}