LaTeX技巧 943:LaTeX 插圖時對文件擴展名的處理

這是一篇簡單的記錄,緣起與有人在 XeLaTeX 中插入 .png 格式的圖片,但提示 no boundingbox。這與我的認知不同:這一錯誤通常只在 LaTeX 方式編譯時才會出現,而且加上 bmpsize 宏包結合 xDVIPDFMx 驅動就能解決。但這次問題出現在 XeLaTeX 下,我感到很奇怪,也引起了我的興趣。

MWE

最小工作示例如下:

% compile with XeLaTeX
\documentclass{article}
\usepackage{graphicx}
\begin{document}
  \includegraphics{foo.bar.png}   % reports error (no boundingbox)
\end{document}

報錯如下:

! LaTeX Error: Cannot determine size of graphic in foo.bar.png (no BoundingBox)
.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...

l.5   \includegraphics{foo.bar.png}
                                      % reports error (no boundingbox)
?

分析

如前所述,這就很奇怪了。我第一反應是圖片本身有什么問題。但多方檢查都沒發現有什么問題。考慮到同樣的代碼在 pdfLaTeX 下編譯理應也能通過并順利輸出,故執行命令 pdflatex test.tex,并觀察現象。

! LaTeX Error: Unknown graphics extension: .bar.png.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...

l.5   \includegraphics{foo.bar.png}
                                      % reports error (no boundingbox)
?

出乎意料,本該順利通過的代碼,在 pdfLaTeX 下也報錯了。不過,這次報錯的問題和使用 XeLaTeX 時還不太一樣。pdfLaTeX 提示說不認識名為 .bar.png 的圖片擴展名。

這給了我新的提示。顯然 pdfLaTeX 在處理圖片時,以第一個 . 作為分割,之后的部分都是擴展名;而后根據圖片文件的擴展名去處理。推測 XeLaTeX 也會做類似的操作,只是細節上有所不同,XeLaTeX 沒有在遇見 .bar.png 這個擴展名的第一時間報錯,而是延遲到了計算邊界框尺寸時發現沒有匹配該擴展名(.bar.png)時才報錯。如果確實如此,那么在 graphicx.sty 當中應該有所體現。追溯到 graphicx.sty 依賴的 graphics.sty當中:

\def\[email protected]#1{%
  \begingroup
  \let\[email protected]\[email protected]
  \[email protected]{#1}%
  \ifx\[email protected]\relax
% ...

顯然,\[email protected] 是在解析圖片文件的文件名。這是一個定義在 LaTeX2e 中的底層命令,根據其文檔,它會將解析結果保存在 \[email protected], \[email protected], \[email protected] 三個宏當中。在 \[email protected] 的定義中,解析擴展名是通過利用 TeX 的宏定義式的技巧來實現的:

\def\[email protected]#1.#2

在調用 \[email protected] 時,會將遇到的第一個 . 之前的內容當做 #1 而把 . 之后的內容當做 #2。這個 #2 最后被保存在了 \[email protected] 當中,作為文件擴展名。

解決辦法

了解了問題的根源,解決起來就容易了。

最簡單的繞過辦法,是保持圖片文件的文件名當中只有一個句點,用于區分文件名及其擴展名。這樣 TeX 就不會被誤導了。例如,將 MWE 中的文件名從 foo.bar.png 改為 foo_bar.png,再嘗試于 LaTeX 當中插入。

如果不想修改文件名,那么可以利用 TeX 的分組,將真實的文件名包裹在一對分組花括號當中。也就是寫成形如這樣的代碼 {foo.bar}.png。這樣,在 \[email protected] 處理參數的過程中,由于 foo.bar 被放在一個分組當中,整個被當成是一個 token,因而不會被打散,也因而能解析到正確的擴展名 png。

選自:https://liam.page/2019/01/27/keep-single-dot-in-image-filename-for-LaTeX/ 

分享到:
未經允許不得轉載:LaTeX技巧 943:LaTeX 插圖時對文件擴展名的處理
已有 條意見

    最新文章

    加載中...
      本站提供專業LaTeX排版、咨詢、定制服務,請點擊下圖咨詢詳情


      全國首個精品的LaTeX視頻教程,大牛帶著你入門,讓LaTeX學習不再糾結,請點擊下圖咨詢詳情

      熱門評論

        聯系我們

        交流QQ群:91940767
        本站QQ號:343083553
        郵箱聯系[email protected]
        淘寶店鋪https://shop240512713.taobao.com/ 提供排版,模板定制,培訓,圖片處理,視頻教程等LaTeX服務。

        關注我們微信公眾號

        如果您投稿或者希望加入我們團隊,請發送您的簡歷到[email protected]
        刺激战场比赛ag