includegraphics 的后备图像文件

includegraphics 的后备图像文件

我的问题我觉得应该比较容易解决,但我在网上找不到任何关于如何解决的参考资料。我的情况的基本前提如下:

我正在进行一个项目,其中有许多图像文件,它们基于偶尔会发生变化的数据。当这些数据发生变化时,我会运行一个 Python 脚本,以各种分辨率重新生成数据,从最不详细的版本开始,这样我就可以快速了解新图形的外观,然后逐步提高分辨率。创建最终版本可能需要长达一小时的时间,我宁愿不必等待那么长时间才能更新代码中引用的图像。

因此,我想知道是否可以建立我的\includegraphics命令以允许一系列后备图像,这样当我重新生成图形时,我会删除旧版本并允许具有相同文件名的新版本在生成时显示,这样任何具有该名称的现有文件都是最新版本,而不会在排版过程中引发不存在的文件错误。

我在 TeX 式伪代码中想要实现的一个基本想法是

\documentclass[12pt, oneside]{article}
\usepackage{graphicx}

\begin{document}
...stuff...
\begin{center}
 \includegraphics{if file1.pdf exists: file1.pdf
                  elif file2.pdf exists: file2.pdf
                  elif file3.pdf exists: file3.pdf
                  else: file4.pdf}

\end{center}
...more stuff...
\end{document}

我目前正在使用 pdfLaTeX,因此如果可能的话,我更喜欢 raw-TeX 或 LaTex 答案,尽管如果需要的话我也可以使 XeTeX/LuaLaTex/ConTeXt/etc. 解决方案发挥作用。

答案1

我认为下面的命令基本上可以满足您的要求,但使用了不同的命令。如果您真的想这样做,您可以改用\RenewDocumentCommand \includegraphics ...\NewDocumentCommand \includegraphicslist ...但我不建议这样做。重新定义\includegraphics几乎肯定会产生不良副作用。更糟糕的是,它可能直到稍后才会引起这些副作用,到那时您就会忘记您重新定义了它。

\documentclass[12pt]{article}
% ateb: https://tex.stackexchange.com/a/713985/
\usepackage{graphicx}
\ExplSyntaxOn
\seq_new:N \l__graphicslist_filelist_seq
\tl_new:N \l__graphicslist_file_tl
\cs_new_protected:Nn \graphicslist_includegraphics:nn
{
  \includegraphics [ #1 ] { #2 }
}
\cs_generate_variant:Nn \graphicslist_includegraphics:nn { nV }
\cs_new_protected:Nn \graphicslist_includegraphicslist:nn
{
  \seq_set_from_clist:Nn \l__graphicslist_filelist_seq { #2 }
  \seq_get_left:NN \l__graphicslist_filelist_seq \l__graphicslist_file_tl
  \seq_map_inline:Nn \l__graphicslist_filelist_seq
  {
    \file_if_exist:nT { ##1 }
    {
      \seq_map_break:n {
        \tl_set:Nn \l__graphicslist_file_tl { ##1 }
      }
    }
  }
  \graphicslist_includegraphics:nV { #1 } \l__graphicslist_file_tl
}
\NewDocumentCommand \includegraphicslist { O {} m }
{
  \group_begin:
    \graphicslist_includegraphicslist:nn { #1 } { #2 }
  \group_end:
}
\ExplSyntaxOff
\begin{document}
\includegraphicslist[width=.3\textwidth]{example-image-a.pdf,example-image-b.pdf}
\includegraphicslist[scale=.5]{example-image-x.pdf,example-image-a.pdf,example-image-b.pdf}
\includegraphicslist[width=.2\textwidth,height=.5\textheight,keepaspectratio]{example-image-a.pdf,example-image-x.pdf}
\end{document}

\includegraphicslist[]{}就像\includegraphics[]{}除了第二个参数可以采用逗号分隔的文件名列表之外,并且无论是否这样做,文件扩展名都是强制性的。可以消除此要求,但可能不值得进行额外的工作。

如果给出了文件名列表,则应按优先级降序排列。如果第一个存在,则所有后面的名称都将被忽略;第二个也是如此,依此类推。

编译上述内容的结果是一行example-image-a不同大小的 s。鉴于结果完全无趣,并且 Okular/KDE 有一个新错误,导致我粘贴的任何图像渲染质量都很差,因此我暂时不会给您带来图像。

相关内容