处理 graphicx 文件名中的括号

处理 graphicx 文件名中的括号

为了管理包含许多文件的大型参考文档,我在页边空白处添加了这些文件的链接。分解为 MWE,我这样做:

\documentclass{article}
\usepackage{hyperref,marginnote,graphicx}

\newcommand{\inclfile}[1]{%
  \includegraphics{#1}%
  \def\filename{\detokenize{#1}}%
  \marginnote{%
      \rlap{\href{run:\filename}{\texttt{\filename}}}%
  }%
}

\begin{document}
  \inclfile{somefile.png}

  \inclfile{other_file.png}

  \inclfile{{third.file}.png}
\end{document}

结果符合预期(使用一些具有适当名称的虚拟图像):

在此处输入图片描述

对于名称中带有特殊字符(例如不太常见的下划线)的文件,必须进行去标记化。

现在,我们需要第三个文件的括号,这样我们就不会弄乱 的魔力 graphicx。但是,必须删除括号,因为链接不会像这样工作。

我认为这种用法stringstrings应该可以完成这项工作:

\def\filename{\convertchar{\convertchar{\detokenize{#1}}{\{}{}}{\}}{}}%

我转义了括号,因为未转义的括号肯定不起作用。现在,这导致pdflatex以 终止TeX capacity exceeded

我怎样才能从的参数中删除括号,inclimage以便我可以使用字符串作为的参数\includegraphics、常规文本和的 URL \href

答案1

最好的方法是首先在文件名中不要使用括号;该grffile包允许文件名中包含多个句点。

如果您无法做到这一点,您可以使用 LaTeX 中已有的功能来获取文件名:

\documentclass{article}
\usepackage{marginnote}
\usepackage[demo]{graphicx}
\usepackage{hyperref}

\makeatletter
\newcommand{\inclfile}[2][]{%
  \includegraphics[#1]{#2}%
  \filename@parse{#2}%
  \edef\filename{\detokenize\expandafter{\filename@base}.\detokenize\expandafter{\filename@ext}}%
  \marginnote{%
      \rlap{\href{run:\filename}{\texttt{\filename}}}%
  }%
}
\makeatother

\begin{document}
  \inclfile{somefile.png}

  \inclfile{other_file.png}

  \inclfile{{third.file}.png}
\end{document}

在此处输入图片描述

相关内容