我的问题我觉得应该比较容易解决,但我在网上找不到任何关于如何解决的参考资料。我的情况的基本前提如下:
我正在进行一个项目,其中有许多图像文件,它们基于偶尔会发生变化的数据。当这些数据发生变化时,我会运行一个 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 有一个新错误,导致我粘贴的任何图像渲染质量都很差,因此我暂时不会给您带来图像。