LaTeX/超連結
LaTeX 允許排版超連結,當結果格式為 PDF 時非常有用,超連結可以被點選。它使用 hyperref 包來實現。
hyperref[1] 包為 LaTeX 提供了在文件中建立超連結的能力。它適用於 pdflatex 以及與 dvips 和 ghostscript 或 dvipdfm 一起使用的標準 “latex” 來構建 PDF 檔案。如果你載入它,你將有可能包含互動式外部連結,所有內部引用都將轉換為超連結。編譯器 pdflatex 使得可以直接從 LaTeX 原始碼建立 PDF 檔案,而 PDF 比 DVI 支援更多功能。特別是 PDF 支援超連結。此外,PDF 可以包含有關文件的其他資訊,例如標題、作者等,這些資訊可以使用同一個包進行編輯。
使用標準設定的基本用法很簡單。只需在序言中載入該包即可
\usepackage{hyperref}
|
這將自動將所有內部引用轉換為超連結。它不會影響編寫文件的方式:只需繼續使用標準的 \label-\ref 系統(在關於 標籤和交叉引用 的章節中討論);使用 hyperref,這些 “連線” 將變成連結,你就可以點選它們來跳轉到正確的頁面。此外,目錄、圖/表列表和索引也將由超連結組成。如果你在草稿模式下工作,超連結將不會顯示出來。
該包提供了一些有用的命令,用於插入指向文件外部的連結。
用法
\hyperref[label_name]{''link text''}
|
這將與 \ref{label_name} 的效果相同,但它將使文字 link text 變成一個完整的連結。兩者可以結合使用。如果標記為 mainlemma 的引理編號為 4.1.1,則以下示例將得到
We use \hyperref[mainlemma]{lemma \ref*{mainlemma} }.
|
我們使用引理 4.1.1。 |
並得到預期的超連結。注意 \ref 後面的 "*" 用於避免巢狀超連結。
用法
\url{<my_url>}
|
它將使用等寬字型顯示 URL,如果你點選它,你的瀏覽器將開啟並指向它。
用法
\href{<my_url>}{<description>}
|
它將使用標準文件字型顯示字串 description,但如果你點選它,你的瀏覽器將開啟並指向 my_url。這裡有一個例子
\url{https://www.wikibooks.org}
\href{https://www.wikibooks.org}{Wikibooks home}
|
兩者都指向同一個頁面,但第一個示例會顯示 URL,而第二個示例會隱藏 URL。請注意,如果你列印你的文件,使用 \href 儲存的連結將不會在文件中的任何地方顯示。
除了上面討論的連結到網站之外,hyperref 可以用於提供 mailto 連結、連結到本地檔案以及連結到 PDF 輸出檔案中的任何地方。
插入電子郵件連結的一種可能方法是
\href{mailto:my_address@wikibooks.org}{my\_address@wikibooks.org}
|
它只會顯示你的電子郵件地址(以便人們即使在紙上列印文件也能知道它),但如果讀者點選它,他/她可以輕鬆地給你傳送電子郵件。或者,要將 url 包的格式化和換行功能整合到顯示的文字中,請使用[2]
\href{mailto:my_address@wikibooks.org}{\nolinkurl{my_address@wikibooks.org} }
|
使用此形式時,請注意 \nolinkurl 命令很脆弱,如果超連結在移動引數內部,則必須在其前面加上 \protect 命令。
也可以使用 url 或 href 命令連結檔案。你只需要在連結字串的開頭新增字串 run:
\url{run:/path/to/my/file.ext}
\href{run:/path/to/my/file.ext}{text displayed}
|
根據 http://tex.stackexchange.com/questions/46488/link-to-local-pdf-file 使用的版本url並不總是有效,但href有效。
可以使用相對路徑來連結當前文件位置附近的文件;為此,請使用標準的類 Unix 符號(./是當前目錄,../是上一級目錄,等等)。
示例
\href{run:D:/my_folder/my_subfolder/my_file.txt}{Windows, absolute path}
\href{run:my_subfolder/my_file.txt}{Windows, relative path}
\href{run:./my_subfolder/my_file.txt}{Windows, relative path, variant}
\href{run:/my_folder/my_subfolder/my_file.txt}{Linux, absolute path}
\href{run:./my_subfolder/my_file.txt}{Linux, relative path}
|
還可以建立文件中的任何位置的錨點(帶或不帶標題),並連結到它。要建立錨點,請使用
\hypertarget{label}{target caption}
|
要連結到它,請使用
\hyperlink{label}{link caption}
|
其中 target caption 和 link caption 分別是在目標位置和連結位置顯示的文字。
還要注意,如果你放置了超目標,單擊連結到該超目標時,它實際上可能會指向超目標後的行,這並不理想。因此,如果發生這種情況,你可以報告錯誤並參考 此處 以瞭解解決方案。
你還可以透過將 #label 附加到檔案的 URL 來獲取超目標的外部連結,或者右鍵單擊指向目標的超連結之一併複製 URL,或者從 PDF 側邊欄中的標題獲取連結,或者透過從檢視中推斷的過程(例如,子節 11.5.1 將具有標籤 subsubsection.11.5.1)。這在學術和教學目的中非常有用。如果你在瀏覽器中啟用與 PDF 1.5 相容的 PDF 檢視器,例如 Chrome 或 Chromium 瀏覽器的 PDF 檢視器 和 Firefox 的 No PDF Download;以及在 Android 上,Xodo 應用程式最適合使用連結,因為它使用與 PDF 桌面程式相同的正確邊框渲染它們,其次是 Foxit PDF 應用程式,它使用灰色突出顯示渲染連結(而在其他應用程式中,連結可能也適用,但沒有任何特殊渲染,例如 Dropbox PDF 檢視器應用程式;而另一些則不適用於連結,例如 Drive PDF 檢視器、PDF 閱讀器和 Google PDF 檢視器)。你可能需要在新標籤頁中開啟指向 PDF 的 URL,否則它可能會提示下載它(也就是說,如果你點選 URL,不要左鍵單擊,右鍵單擊並選擇在新標籤頁中開啟它)。
標準設定應該適合大多數使用者,但如果你想更改某些內容,這也是可能的。有幾個變數和兩種方法將它們傳遞給包。選項可以在載入包時作為引數傳遞(包的工作標準方式),或者可以使用 \hypersetup 命令,如下所示
\hypersetup{<option1> [, ...]}
|
你可以傳遞任意多個選項;用逗號分隔它們。選項必須採用以下形式
variable_name=new_value
|
在載入包時將這些選項傳遞給包時,必須使用完全相同的格式,如下所示
\usepackage[<option1, option2>]{hyperref}
|
以下是你可以更改的可能變數列表(有關完整列表,請參閱官方文件)。預設值以直立字型書寫
檢視 tug.org 上的 hyperref-manual 中的 3.8 大列表
| 變數 | 值 | 評論 |
|---|---|---|
| bookmarks | =true,false | 顯示或隱藏顯示文件時的書籤欄 |
| unicode | =false,true | 允許在 Acrobat 的書籤中使用非拉丁語系字元 |
| pdfborder | ={RadiusH RadiusV Width [Dash-Pattern]} | 設定連結周圍邊框的樣式。前兩個引數(RadiusH、RadiusV)在大多數 pdf 檢視器中沒有效果。Width 定義邊框的粗細。Dash-Pattern 是由空格分隔並用方括號括起來的數字序列。它是一個可選引數,用於指定虛線圖案中每條線和間隙的長度。例如,{0 0 0.5 [3 3]} 應該繪製一個寬度為 0.5 的正方形框(沒有圓角)和一個虛線圖案,該圖案的虛線長度為 3,間隙長度為 3。關於不同的 pdf 檢視器是否/如何渲染虛線圖案,並沒有統一性。 |
| pdftoolbar | =true,false | 顯示或隱藏 Acrobat 的工具欄 |
| pdfmenubar | =true,false | 顯示或隱藏 Acrobat 的選單 |
| pdffitwindow | =true,false | 調整文件視窗大小以適合文件大小 |
| pdfstartview | ={FitH},{FitV},etc[3]. | 將頁面的寬度調整為視窗大小 |
| pdftitle | ={text} | 定義在 Acrobat 的“文件資訊”視窗中顯示的標題 |
| pdfauthor | ={text} | PDF 作者的姓名,它與上面的工作方式相同 |
| pdfsubject | ={text} | 文件的主題,它與上面的工作方式相同 |
| pdfcreator | ={text} | 文件的建立者,它與上面的工作方式相同 |
| pdfproducer | ={text} | 文件的生產者,它與上面的工作方式相同 |
| pdfkeywords | ={text} | 用逗號分隔的關鍵字列表,示例如下 |
| pdfnewwindow | (=true,false) | 定義當連結超出當前文件時是否應該開啟新的 PDF 視窗。注意:如果連結指向 http/https 地址,則此選項將被忽略。 |
| pagebackref | (=false,true) | 啟用參考文獻內部。必須在\usepackage{}語句中指定。 |
| colorlinks | (=false,true) | 用彩色框架包圍連結(false)或用顏色對連結的文字進行著色(true)。可以使用以下選項配置這些連結的顏色(預設顏色如下所示) |
| hidelinks | 隱藏連結(刪除顏色和邊框) | |
| linkcolor | =red | 內部連結(部分、頁面等)的顏色 |
| linktoc | =none,section,page,all | 定義目錄條目中哪一部分被製成連結 |
| citecolor | =green | 引文連結(參考文獻)的顏色 |
| filecolor | =cyan | 檔案連結的顏色 |
| urlcolor | =magenta | URL 連結(郵件、網路)的顏色 |
| linkbordercolor | ={1 0 0} | 內部連結周圍框架的顏色(如果colorlinks=false) |
| citebordercolor | ={0 1 0} | 引文周圍框架的顏色 |
| urlbordercolor | ={0 1 1} | URL 連結周圍框架的顏色 |
請注意,顯式 RGB 規範僅適用於邊框顏色(如 linkbordercolor 等),而其他顏色只能分配給命名顏色(你可以定義自己的顏色,請參閱 Colors)。為了加快自定義過程,以下列出了帶預設值的變數。將它複製到你的文件中並進行你想要的更改。變數旁邊是對其含義的簡短說明
\hypersetup{
bookmarks=true, % show bookmarks bar?
unicode=false, % non-Latin characters in Acrobat’s bookmarks
pdftoolbar=true, % show Acrobat’s toolbar?
pdfmenubar=true, % show Acrobat’s menu?
pdffitwindow=false, % window fit to page when opened
pdfstartview={FitH}, % fits the width of the page to the window
pdftitle={My title}, % title
pdfauthor={Author}, % author
pdfsubject={Subject}, % subject of the document
pdfcreator={Creator}, % creator of the document
pdfproducer={Producer}, % producer of the document
pdfkeywords={keyword1, key2, key3}, % list of keywords
pdfnewwindow=true, % links in new PDF window
colorlinks=false, % false: boxed links; true: colored links
linkcolor=red, % color of internal links (change box color with linkbordercolor)
citecolor=green, % color of links to bibliography
filecolor=cyan, % color of file links
urlcolor=magenta % color of external links
}
|
如果你不需要如此高的自定義程度,以下是一些較小但有用的示例。在建立用於列印的 PDF 時,彩色連結不是一件好事,因為它們最終會在最終輸出中變為灰色,難以閱讀。你可以使用彩色框架,這些框架不會被列印
\usepackage{hyperref}
\hypersetup{colorlinks=false}
|
或使連結變為黑色
\usepackage[hidelinks]{hyperref}
|
或使用 \usepackage{hyperref} \hypersetup{hidelinks}
當你只想為 PDF 檔案的“文件資訊”部分提供資訊,以及啟用參考文獻內部時
\usepackage[pdfauthor={Author's name},%
pdftitle={Document Title},%
pagebackref=true,%
pdftex]{hyperref}
|
預設情況下,URL 使用等寬字型列印。如果你不喜歡它,並希望它們以與文字其餘部分相同的樣式列印,可以使用以下方法
\urlstyle{same}
|
出現以下訊息
! pdfTeX warning (ext4): destination with the same identifier (name{
equation.1.7.7.30}) has been already used, duplicate ignored
當你執行以下操作時會發生
\begin{eqnarray}a=b\nonumber\end{eqnarray}
|
如果你使用此形式,錯誤會消失
\begin{eqnarray*}a=b\end{eqnarray*}
|
注意,顯示的行號通常與錯誤行完全不同。
可能的解決方案:將 amsmath 包放在 hyperref 包之前。
出現以下訊息
! Runaway argument?
{\@firstoffive }\fi ), Some text from your document here (\ref {re\ETC.
Latex Error: Paragraph ended before \Hy@setref@link was complete.
當你使用 \label 在 align 環境中時會出現。
可能的解決方案:在你的前言中新增以下內容
\AtBeginDocument{\let\textlabel\label}
|
注意:如果你使用冒號“:”作為標籤的一部分,例如 \label{lst:program01},也會出現相同的錯誤。替換它將有所幫助。
出現以下訊息
! pdfTeX warning (ext4): destination with the same
identifier (name{page.1}) has been already used,
duplicate ignored
當計數器被重新初始化時會出現問題,例如使用book文件類提供的命令 \mainmatter。它在書的第一章之前將頁碼計數器重置為1。但由於書籍的前言也有頁碼1,所以所有指向“第1頁”的連結將不再是唯一的,因此會出現“重複項已被忽略”的提示。解決方法是在 hyperref 選項中新增 plainpages=false。不幸的是,這隻能解決頁碼計數器的問題。一個更徹底的解決方法是使用選項 hypertexnames=false,但這樣會導致索引中的頁面連結無法正常工作。
最佳解決方案是使用 \pagenumbering 命令為每個頁面賦予一個唯一的名稱
\pagenumbering{alph} % a, b, c, ...
... titlepage, other front matter ...
\pagenumbering{roman} % i, ii, iii, iv, ...
... table of contents, table of figures, ...
\pagenumbering{arabic} % 1, 2, 3, 4, ...
... beginning of the main matter (chapter 1) ...
|
另一個解決方法是在命令 \maketitle 之前使用 \pagenumbering{alph},這將為標題頁提供標籤 page.a。由於頁碼被隱藏,所以對輸出結果不會產生任何影響。
透過在計數器重置之前每次更改頁碼,每個頁面都會獲得一個唯一的名稱。在這種情況下,頁面將被編號為 a, b, c, i, ii, iii, iv, v, 1, 2, 3, 4, 5, ...
如果你不想讓頁碼可見(例如,在前言部分),請使用 \pagestyle{empty} ... \pagestyle{plain}。重要的是,儘管數字不可見,但每個頁面都將擁有一個唯一的名稱。
另一個更靈活的方法是將計數器設定為負數
\setcounter{page}{-100}
... titlepage, other front matter ...
\pagenumbering{roman} % i, ii, iii, iv, ...
... table of contents, table of figures, ...
\pagenumbering{arabic} % 1, 2, 3, 4, ...
... beginning of the main matter (chapter 1) ...
|
這將為前幾頁提供一個唯一的負數頁碼。
問題也可能出現在演算法包中:因為每個演算法都使用相同的行號方案,所以第二個及後續演算法的行識別符號將與第一個演算法的重複。
如果在 eqnarray 環境的每一行上都使用 \nonumber,就會出現方程式識別符號的問題。在這種情況下,請使用帶星號的形式,例如 \{eqnarray*} ... \end{eqnarray*}(這是一個無編號的方程式陣列),並刪除現在不再需要的 \nonumber 命令。
如果你的 url 太長,導致超出頁面範圍,請嘗試使用breakurl包將 url 分割到多行。這在多列環境中尤其重要,因為在這種環境下行寬會大大縮短。
書籤顯示的文字並不總是如你預期的那樣。因為書籤只是“文字”,所以書籤可用的字元比正常的 LaTeX 文字要少得多。Hyperref 通常會注意到此類問題併發出警告
Package hyperref Warning: Token not allowed in a PDFDocEncoded string:
現在你可以透過提供一個書籤的文字字串來解決此問題,該字串將替換有問題的文字
\texorpdfstring{''TEX text''}{''Bookmark Text''}
|
數學表示式是此類問題的典型例子
\section{ \texorpdfstring{$E=mc^2$}{E=mc2} }
|
它將 \section{$E=mc^2$} 轉換為E=mc2書籤區域。顏色更改也不會很好地傳播到書籤中
\section{ \textcolor{red}{Red !} }
|
生成字串“redRed!”。命令 \textcolor 被忽略,但它的引數(red)被打印出來。如果你使用
\section{ \texorpdfstring{\textcolor{red}{Red !}}{Red\ !} }
|
結果會更清晰易懂。
如果你用 unicode 編寫文件,並且在 hyperref 包中使用 unicode 選項,你可以在書籤中使用 unicode 字元。這將為你提供更多可供選擇的字元,用於 \texorpdfstring。
由 hyperref 建立的連結指向浮動環境中建立的標籤,正如 之前所述,該標籤必須始終在標題之後設定。由於標題通常位於圖形或表格下方,所以點選連結時,圖形或表格本身將不可見[4]。可以透過使用包 hypcap [2] 來解決此問題,並使用
\usepackage[all]{hypcap}
|
確保在載入 hyperref 之後呼叫此包。
如果你使用 wrapfig 包[5](如“浮動、圖形和標題”章節的“將文字環繞圖形”部分中所述),或者其他類似的定義了自己的環境的包,你需要在這些環境中手動包含 \capstart,例如
\begin{wrapfigure}{R}{0.5\textwidth}
\capstart
\begin{center}
\includegraphics[width=0.48\textwidth]{filename}
\end{center}
\caption{\label{labelname}a figure}
\end{wrapfigure}
|
在使用 \listoffigures 和 hyperref 時,如果標題過長或標題過長,就會出現問題。這種情況發生在標題(或標題)的長度超過頁面寬度(根據你的設定,大約 7-9 個單詞)。為了解決這個問題,你需要在第一次宣告時使用選項 breaklinks
\usepackage[breaklinks]{hyperref}
|
這將導致 \listoffigures 中的連結正確換行。
當包含 hyperref 包時,latex 生成的某些輔助檔案的格式會發生變化。因此,當第一次使用 hyperref 排版文件時,如果這些檔案已經存在,則可能會遇到類似以下的錯誤。
! Argument of \Hy@setref@link has an extra }.
解決方法是刪除 latex 用於獲取正確引用而使用的所有檔案,然後重新排版。
請參閱 相關部分。
使用命令
\hyperref[some_label]{some text}
|
指向標籤時會出錯。點選時,使用者不會被髮送到目標標籤,而是會被髮送到第一幀。有一個簡單的解決方法;不要使用
\phantomsection\label{some_label}
|
為你的框架新增標籤,請使用
\hypertarget{some_label}{}
|
並用它作為參考
\hyperlink{some_label}{some text}
|
警告! 請注意,如果您在 \documentclass 宣告中啟用了“draft”選項,則超連結將不會顯示在目錄或其他任何地方!
透過在包含包之後立即使用 hyperref 包的以下初始化中的“final=true”選項,可以重新啟用超連結
\usepackage{hyperref}
\hypersetup{final=true}
|
可以在此處找到 hyperref 包的更多選項的良好來源 [6].
- ↑ CTAN 中的 Hyperref 包網頁
- ↑ "使用 hyperref、url 包的電子郵件連結". comp.text.tex 使用者組.
{{cite web}}: 未知引數|accessmonthday=被忽略 (幫助); 未知引數|accessyear=被忽略 (|access-date=建議) (幫助) - ↑ 其他可能的值在hyperref 手冊中定義
- ↑ http://www.ctan.org/tex-archive/macros/latex/contrib/hyperref/README
- ↑ CTAN 中的 Wrapfig 包網頁
- ↑ [1]Hyperref - 使用 LaTeX 的超連結頁面
