在 href 中插入文件的基本名称

在 href 中插入文件的基本名称

在我的文档中,我有这个宏(GraphicIf),仅当图像实际存在时才插入图像,否则返回到示例图像。

不过最近我想href在图片的基本名称中添加一个,这样它就可以在 PDF 查看器中弹出文件的名称。我尝试使用这个 例子 提取基本名称,但结合这两者似乎会触发某种无限递归:

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

\makeatletter
\DeclareRobustCommand{\filename}[1]{%
 \begingroup
  % \lstname seems to change hyphens into \textendash
  \def\textendash{-}%
  \filename@parse{#1}%
  \edef\filename@base{\detokenize\expandafter{\filename@base}}%
  \texttt{\filename@base.\filename@ext}%
 \endgroup
}
\makeatother

\newcommand{\GraphicIf}[2][]{%
\href{\filename{#2}}{%
  \IfFileExists{#2}{\includegraphics[#1]{#2}}{\includegraphics[#1]{example-image-a}}
}}


\begin{document}

\filename{path/to/file.txt}
\filename{path/to/file_2.txt}
\GraphicIf{Testing.png}

\end{document}

! TeX capacity exceeded, sorry [input stack size=5000].
<to be read again>
                   T
l.27 \GraphicIf{Testing.png}

在这种情况下是否有某种方法可以实际提取文件名?

答案1

\href宏需要一个简单的字符串作为 url 参数。相反,您提供一个宏来执行各种处理并插入\texttt

在这种情况下,最好在想要使用结果作为参数的命令之外调用处理宏,这样您提供的参数就尽可能干净。

在下面的代码中,使用\xdef(扩展的全局 def)将处理后的文件名存储到简单宏中\fullfilename,然后将其用作 的参数\href。应该对其进行扩展以获取处理时的值(因为未扩展的\filename@base\@filename@ext以后可能会改变值),并且它应该是全局的,以便可以在 之外访问它\filename

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

\makeatletter
\DeclareRobustCommand{\filename}[1]{%
 \begingroup
  % \lstname seems to change hyphens into \textendash
  \def\textendash{-}%
  \filename@parse{#1}%
  \edef\filename@base{\detokenize\expandafter{\filename@base}}%
  \xdef\fullfilename{\filename@base.\filename@ext}%
 \endgroup
}
\makeatother

\newcommand{\GraphicIf}[2][]{%
\filename{#2}%
\href{\fullfilename}{%
  \IfFileExists{#2}{\includegraphics[#1]{#2}}{\includegraphics[#1]{example-image-a}}
}}


\begin{document}

\GraphicIf{Testing.png}

\end{document}

结果,将鼠标悬停在图像上时显示工具提示:

在此处输入图片描述

相关内容