为了管理包含许多文件的大型参考文档,我在页边空白处添加了这些文件的链接。分解为 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}