在我的文档中,我有这个宏(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}
结果,将鼠标悬停在图像上时显示工具提示: