LaTeX/標籤和交叉引用
在 LaTeX 中,您可以輕鬆地引用幾乎所有可以編號的內容,並讓 LaTeX 在需要時自動更新編號。可以引用的物件包括章節、部分、小節、腳註、定理、方程式、圖形和表格[1]。要使用的命令不依賴於您要引用的是什麼,它們是
\label{標記}- 用於為要引用的物件提供一個標記 - 一個以後可以用來引用該物件的名稱。
\ref{標記}- 用於引用具有指定標記的物件。這將列印分配給該物件的數字。
\pageref{標記}- 用於列印包含指定標記物件的頁面編號。
LaTeX 將為文件中的物件計算正確的編號;您用來標記物件的標記不會在文件中的任何位置顯示。相反,LaTeX 將用分配給該物件的正確數字替換字串“\ref{標記}”。如果您引用一個不存在的標記,文件的編譯將成功,但 LaTeX 將返回一個警告
LaTeX Warning: There were undefined references.
並且它將用“??”替換“\ref{未知標記}” - 這樣在文件中更容易找到。
如您所見,這種交叉引用方式是一個兩步過程:首先編譯器必須將標籤與要用於引用的正確數字儲存起來,然後它必須用正確數字替換\ref。
因此,您必須編譯您的文件兩次才能看到具有正確編號的輸出。如果您只編譯一次,那麼 LaTeX 將使用之前編譯中收集的舊資訊(可能已過時),並且編譯器將在編譯結束時列印以下訊息,通知您
- LaTeX 警告:標籤可能已更改。重新執行以使交叉引用正確。
使用命令\pageref{},您可以透過同時提供該物件所在的頁面編號來幫助讀者找到引用的物件。您可以寫類似以下內容
See figure~\ref{fig:test} on page~\pageref{fig:test}.
由於您可以使用完全相同的命令來引用幾乎所有內容,因此在您引入大量引用後,您可能會感到有些困惑。LaTeX 使用者中的慣例是在標籤中新增幾個字母來描述您引用的是什麼。一些包,如fancyref,依賴於此元資訊。以下是一個例子
| ch | 章節 |
| sec | 部分 |
| subsec | 小節 |
| fig | 圖形 |
| tab | 表格 |
| eq | 方程式 |
| lst | 程式碼清單 |
| itm | 列舉列表項 |
| alg | 演算法 |
| app | 附錄小節 |
遵循此約定,圖形的標籤將類似於\label{fig:我的圖形},等等。您沒有義務使用這些字首,實際上可以使用任何字串作為\label{...}的引數,但隨著文件大小的增長,這些字首會變得越來越有用。
另一個建議:儘量避免在標籤中使用數字。最好描述物件是什麼。這樣,如果您更改物件的順序,您就不必重新命名所有標籤及其引用。
如果您希望能夠在輸出文件中看到您正在使用的標記,可以使用showkeys 包;這在您開發文件時會非常有用。有關更多資訊,請參閱包 部分。
以下是一些實際示例,但您會注意到它們都相同,因為它們都使用相同的命令。
\section{Greetings}
\label{sec:greetings}
Hello!
\section{Referencing}
I greeted in section~\ref{sec:greetings}.
您可以在節的任何地方放置標籤;但是,為了避免混淆,最好將其放在節的開頭之後。請注意,如前所述,標記以sec:開頭。然後在另一個節中引用標籤,其中波浪號(~)表示不間斷空格。
您可以透過將圖片插入到圖形浮動環境中來引用它。
\begin{figure}
\centering
\includegraphics[width=0.5\textwidth]{gull}
\caption{Close-up of a gull}
\label{fig:gull}
\end{figure}
Figure~\ref{fig:gull} shows a photograph of a gull.
|
當在浮動環境中宣告標籤時,\ref{...} 將返回相應的圖形/表格編號,但它必須出現在標題之後。當在外部宣告時,它將給出節編號。為了完全安全,任何圖片或表格的標籤都可以放在\caption{} 命令中,如下所示
\caption{Close-up of a gull\label{fig:gull}}
有關更多資訊,請參閱關於figure 和相關環境的浮動體、圖形和標題 部分。
命令\label 必須出現在\caption 之後(或內部)。否則,它將拾取當前節或列表編號,而不是預期內容。
\begin{figure}
\centering
\includegraphics[width=0.5\textwidth]{gull}
\caption{Close-up of a gull} \label{fig:gull}
\end{figure}
由 hyperref 處理的表格和圖形連結問題
[edit | edit source]如果您使用 hyperref 包來建立 PDF 檔案,指向表格或圖片的連結將指向其標題,標題始終位於表格或圖片下方[2]。 因此,如果表格或圖片位於指標上方,則表格或圖片將不可見,這意味著需要向上滾動一些內容。 如果您希望連結指向影像的頂部,您可以為 caption 包提供 hypcap 選項[3]。
\usepackage{caption} % hypcap is true by default so [hypcap=true] is optional in \usepackage[hypcap=true]{caption}
公式
[edit | edit source]以下示例演示如何引用公式
\begin{equation} \label{eq:solve}
x^2 - 5 x + 6 = 0
\end{equation}
\begin{equation}
x_1 = \frac{5 + \sqrt{25 - 4 \times 6}}{2} = 3
\end{equation}
\begin{equation}
x_2 = \frac{5 - \sqrt{25 - 4 \times 6}}{2} = 2
\end{equation}
and so we have solved equation~\eqref{eq:solve}
|
這裡,請注意標籤中的 eq: 字首 - 以及該標籤是在數學模式開始後不久放置的。 要引用公式,必須使用帶計數器的環境。 大多數情況下,您將使用 equation 環境,因為這通常是單行公式的最佳選擇,無論您是否使用 amsmath。
eqref
[edit | edit source]amsmath 包添加了一個新的命令來引用公式; 它是 \eqref{}。 它與 \ref{} 的工作方式完全相同,但會新增括號,因此它不會列印一個簡單的數字,例如 5,而是會列印 (5)。 這對於幫助讀者區分公式和其他內容很有用,無需在任何引用之前重複“公式”一詞[4]。 它的輸出可以根據需要進行更改; 有關更多資訊,請參閱 amsmath 文件。
tag
[edit | edit source]\tag{eqnno} 命令用於手動設定公式編號,其中 eqnno 是您要顯示的文字字串,而不是通常的公式編號。 通常最好使用標籤,但有時硬編碼的公式編號可能提供一個有用的解決方法 - 例如您想要重複之前已經使用過的公式的情況(例如 \tag{\ref{eqn:before}})。
numberwithin
[edit | edit source]amsmath 包添加了 \numberwithin{countera}{counterb} 命令,它用更復雜的 counterb.countera 替換了簡單的 countera。 例如,在序言中使用 \numberwithin{equation}{section} 將在所有公式編號之前加上節編號。
cases
[edit | edit source]cases 包添加了 \numcases 和 \subnumcases 命令,它們分別生成帶單獨公式編號和帶單獨公式編號加字母的多案例公式,每個案例一個。
該varioref包
[edit | edit source]varioref 包引入了名為 \vref{} 的新命令。 此命令的使用方式與基本的 \ref 完全相同,但它根據上下文具有不同的輸出。 如果要引用的物件在同一頁面上,它就像 \ref 一樣工作; 如果該物件距離很遠,它將列印類似“第 25 頁的 5”的內容,即它會自動新增頁碼。 如果該物件很近,它可以根據上下文和文件類自動使用更精細的句子,例如“在下一頁”或“在對面頁”。
此命令必須非常謹慎地使用。 它輸出多個單詞,因此它的輸出可能出現在兩個不同的頁面上。 在這種情況下,演算法可能會感到困惑並導致迴圈。
例如,您可以在第 23 頁上標記一個物件,並且 \vref 的輸出可能恰好在第 23 頁和第 24 頁之間。 如果它在第 23 頁上,它將像基本的 ref 一樣列印; 如果它在第 24 頁上,它將列印“在上一頁”,但它在這兩頁上,這可能會導致編譯時出現一些奇怪的錯誤,這些錯誤可能很難修復。
對於小型文件,這些情況可能很少發生,但對於跨越數百個引用的長文件,這些情況發生的可能性更大。 在文件準備期間避免這些問題的一種方法是首先始終使用標準 ref,在文件接近最終版本時將所有內容轉換為 vref - 在進行調整以修復任何可能的問題之前。
該hyperref包
[edit | edit source]autoref
[edit | edit source]hyperref 包引入了另一個有用的命令; \autoref{}。 此命令建立帶有對應於目標型別的附加文字的引用,所有這些都將是超連結。 例如,命令 \autoref{sec:intro} 將建立一個指向 \label{sec:intro} 命令的超連結,無論它在哪裡。 假設該標籤指向一個節,超連結將包含文字“第 3.4 節”,或類似內容(預設名稱的完整列表可以在 這裡 找到)。 請注意,雖然有一個 \autoref* 命令可以生成未連結的字首(如果標籤與引用在同一頁面上,這很有用),但沒有定義替代的 \Autoref 命令來生成大寫版本(例如,在句首有用); 但由於 autoref 名稱的大寫由包作者選擇,您可以透過重新定義 \typeautorefname 為您想要的字首來自定義字首文字,例如
\def\sectionautorefname{Section}
當然,這種重新命名技巧也可以用於其他目的。
- 如果您希望擁有一個沒有
\autoref{}提供的預定義文字的超連結引用,那麼您可以使用類似\hyperref[sec:intro]{Appendix~\ref*{sec:intro}}的命令來更改它。 請注意,您可以在hyperref中停用超連結的建立,只需使用這些命令來建立自動文字。
- 請記住,
\label必須放置在帶計數器的環境中,例如表格或圖片。 否則,不僅數字將引用當前節(如 上面 所述),而且該名稱也可能引用具有計數器的先前環境。 例如,如果您在關閉圖片後放置一個標籤,該標籤仍然會顯示“圖片 n”,其中 n 是當前節號。
nameref
[edit | edit source]hyperref 包還會自動包含 nameref 包和一個同名命令。 它類似於 \autoref{},但會插入對應於節名稱的文字,例如。
輸入
\section{MyFirstSection} \label{sec:marker}
\section{MySecondSection}
In section~\nameref{sec:marker} we defined...
輸出
在“MyFirstSection”節中,我們定義了...
錨點手動定位
[edit | edit source]當您在圖片、表格或其他浮動物件之外定義 \label 時,該標籤指向當前節。 在某些情況下,這種行為並非您想要的行為,您希望生成的連結指向定義 \label 的行。 這可以透過 \phantomsection 命令來實現,例如
%The link location will be placed on the line below.
\phantomsection
\label{the_label}
該cleveref包
[edit | edit source]cleveref 包引入了新的命令 \cref{},它像 \autoref{} 一樣包含引用物件的型別。 替代的 \labelcref{} 命令更類似於標準的 \ref{}。 \cpageref{} 命令處理對頁面的引用。
- 使用
\crefrange{}{}和\cpagerefrange{}命令以任意順序使用起始和結束標籤,並提供自然語言(啟用babel)範圍。 - 使用
\cref{}命令進行多個或單個引用(在單行上),它會自動按順序對它們進行排序並分組到非常方便的格式中,例如 ` item 2 to 4 and 6 to 19.`.[5] - 在數字是標籤的引用並且 [排序] 輸出與上一段中一樣的情況下使用
\labelcref{}
可以在序言中指定格式。
因為varioref、hyperref和cleveref重新定義了相同的命令,所以當它們在序言中以錯誤的順序使用\usepackage命令時,可能會產生意想不到的結果。例如,使用hyperref、varioref,然後是cleveref會導致\vref{}失敗,就好像標記未定義一樣。[6] 以下順序通常似乎有效
variorefhyperrefcleveref[6]
- ↑ LaTeX 的優勢 - 自動編號和強大的引用系統
- ↑ http://www.ctan.org/tex-archive/macros/latex/contrib/hyperref/README
- ↑
caption包的文件 - 6.5hyperref - ↑ TeX StackExchange - \eqref 和 \ref 之間的區別是什麼?
- ↑ TeX 部落格 - Cleveref,一種在 LaTeX 中進行引用的巧妙方法
- ↑ a b 在報告類下進行的測試 http://tex.stackexchange.com/questions/139459/vref-and-input-command
