\includegraphics 包含空格、点和下划线

\includegraphics 包含空格、点和下划线

我已经尝试了 100 亿条建议,例如使用\usepackage{grffile}、将文件名包装到{}和/或""(以任意组合)。但都不起作用!

所以,我有一个带有路径的文件plots/task-1/ABC123_/qa_pt:0.20-2.00/VtxZ (-10.00, 10.00)/charged; eta (-0.80, 0.80)/FB: 16; eta (-0.80, 0.80)/eff/eta_phi.pdf,我需要将其包含到beamer由 LuaLaTeX 编译的演示文稿中(如果它很重要)。

更改路径不是一个选择,我可以没有空格(但不能没有点和下划线),但最好保留它们,并且有多个具有相同名称但不同路径的文件需要使用。

最小非工作示例(找到要包含的任何 .pdf 文件并将其放在路径中):

\documentclass[aspectratio=1610,10pt]{beamer}

\begin{document}

\begin{frame}
    \includegraphics{plots/task-1/ABC123_/qa_pt:0.20-2.00/VtxZ (-10.00, 10.00)/charged; eta (-0.80, 0.80)/FB: 16; eta (-0.80, 0.80)/eff/eta_phi.pdf}
\end{frame}

\end{document}

错误:

! Missing $ inserted.
<inserted text> 
$
l.10 \end{frame}

? 

! Package luatex.def Error: File `plots/task-1/ABC123_/qa_pt:0.20-2.00/VtxZ (
-10.00, 10.00)/charged; eta (-0.80, 0.80)/FB: 16; eta (-0.80, 0.80)/eff/eta_phi
.pdf' not found: using draft setting.

See the luatex.def package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.10 \end{frame}

? 
! Missing $ inserted.
<inserted text> 
$
l.10 \end{frame}

?

答案1

这在 pdflatex 中有效,但在 luatex 的包含的 lua 部分中失败(这一定是见过的最疯狂的文件名:-)

\documentclass[aspectratio=1610,10pt]{beamer}

\begin{document}

\begin{frame}
    \includegraphics{"plots/task-1/ABC123_/qa_pt:0.20-2.00/VtxZ (-10.00, 10.00)/charged; eta (-0.80, 0.80)/FB: 16; eta (-0.80, 0.80)/eff/eta_phi".pdf}
\end{frame}

\end{document}

此版本适用于 lualatex 和 pdflatex

\documentclass[aspectratio=1610,10pt]{beamer}

\begin{document}

\begin{frame}
    \includegraphics{eta_phi.pdf}
\end{frame}

\end{document}

为了确保找到文件,请将 plots 目录添加到输入路径,例如此命令行有效:

 TEXINPUTS=./plots//: lualatex mainfile

因为(假设是 bash shell)这在本地设置 TEXINPUTS 来搜索下的所有目录plots


如果你真的因为“有趣”的目录路径中重复的文件名而陷入困境,那么这在 lualatex 中确实有效

\documentclass[aspectratio=1610,10pt]{beamer}

\makeatletter
\def\Gread@@pdftex#1{%
  \edef\Gin@attr@hash{%
    \ifx\Gin@pagebox\@empty
    \else
      :\Gin@pagebox
    \fi
    \ifx\Gin@page\@empty
    \else
      :P\Gin@page
    \fi
    \ifx\Gin@decode\@empty\else
      :D[\Gin@decode]%
    \fi
    \ifGin@interpolate
      :I%
    \fi
  }%
  \@ifundefined{#1 image\Gin@attr@hash}%
    {%
      \saveimageresource
        \ifnum0%
          \ifx\Gin@decode\@empty\else 1\fi
          \ifGin@interpolate 1\fi
          >0 %
          attr{%
            \ifx\Gin@decode\@empty\else/Decode[\Gin@decode]\fi
            \ifGin@interpolate/Interpolate true\fi
          }%
        \fi
        \ifx\Gin@page\@empty\else page \Gin@page\fi
        \Gin@pagebox
        {\expandafter\zz#1}%
      \setbox\@tempboxa=\hbox{\useimageresource\lastsavedimageresourceindex}%
      \def\Gin@llx{0}\let\Gin@lly\Gin@llx
      \Gin@defaultbp\Gin@urx{\wd\@tempboxa}%
      \Gin@defaultbp\Gin@ury{\ht\@tempboxa}%
      \expandafter\xdef\csname #1 image\Gin@attr@hash\endcsname
        {\useimageresource\the\lastsavedimageresourceindex}%
      \expandafter\xdef\csname #1 height\Gin@attr@hash\endcsname
        {\the\ht\@tempboxa}%
      \expandafter\xdef\csname #1 width\Gin@attr@hash\endcsname
        {\the\wd\@tempboxa}%
      \Gin@log{%
        <#1, %
        id=\the\lastsavedimageresourceindex, %
        \ifx\Gin@page\@empty\else page=\Gin@page , \fi
        \ifx\Gin@pagebox\@empty\else\ifx\Gin@pagebox\GPT@cropbox\else
          pagebox=\Gin@pagebox , \fi\fi
        \ifx\Gin@decode\@empty\else decode=[\Gin@decode], \fi
        \ifGin@interpolate interpolate=true, \fi
        \the\wd\@tempboxa\GPT@space x \the\ht\@tempboxa
        >%
      }%
    }{%
      \def\Gin@llx{0}\let\Gin@lly\Gin@llx
      \Gin@defaultbp\Gin@urx{\csname #1 width\Gin@attr@hash\endcsname}%
      \Gin@defaultbp\Gin@ury{\csname #1 height\Gin@attr@hash\endcsname}%
    }%
}

\def\zz"#1"{#1}
\begin{document}

\begin{frame}

    \includegraphics{"plots/task-1/ABC123_/qa_pt:0.20-2.00/VtxZ (-10.00, 10.00)/charged; eta (-0.80, 0.80)/FB: 16; eta (-0.80, 0.80)/eff/eta_phi".pdf}
%    \includegraphics{eta_phi.pdf}
\end{frame}

\end{document}

答案2

要包含该文件,请在您的可预定义文件中写入

\makeatletter
\def\Gin@getbase#1{%
  \edef\Gin@base{\filename@area\filename@base}%
  \edef\Gin@ext{#1}%
}
\makeatother

这应该是最后的手段。我强烈建议找到一种使用更合理的文件名的方法。

编辑:这样,整个文件看起来应该像这样

\documentclass[aspectratio=1610,10pt]{beamer}
\makeatletter
\def\Gin@getbase#1{%
  \edef\Gin@base{\filename@area\filename@base}%
  \edef\Gin@ext{#1}%
}
\makeatother

\begin{document}

\begin{frame}
  \includegraphics{plots/task-1/ABC123_/qa_pt:0.20-2.00/VtxZ (-10.00, 10.00)/charged; eta (-0.80, 0.80)/FB: 16; eta (-0.80, 0.80)/eff/eta_phi.pdf}
\end{frame}

\end{document}

相关内容