我正在使用条件编译来测试编译一本大书的速度。这是我在\begin{figure}
环境中执行此操作的方式:
\ifforceprecompiled
\includegraphics{timeline.tex.pdf}
\else
\ifstandalonemode
\includetikz{timeline.tex}
\else
\includetikz{timeline.tikz}
\fi
\fi
这种方法的问题在于,如果图形是使用文件创建的timeline.tikz
,则编译后的图形是timeline.tikz.pdf
而不是timeline.tex.pdf
,因此在这种情况下我无法使用ifforceprecompiled
宏。我想改为这样做:
\ifforceprecompiled
\includegraphics{timeline.pdf}. % <- change here
\else
\ifstandalonemode
\includetikz{timeline.tex}
\else
\includetikz{timeline.tikz}
\fi
\fi
但为此我需要以某种方式仅获取文件的基本名称(不带扩展名)。我想知道是否可以使用宏来完成这样的事情。
更新
根据 David Carlisle 的建议,我在序言中目前写的内容如下:
\newcommand{\myinclude}[1]{
\ifforceprecompiled
\includegraphics{#1.pdf}
\else
\ifstandalonemode
\tikzsetnextfilename{#1}
\input{#1.tex}
\else
\tikzsetnextfilename{#1}
\input{#1.tikz}
\fi
\fi
}
因此,我只需将不带扩展名的文件名传递给宏,一切都会得到妥善处理。但是,需要注意不要传递扩展名,否则会出现错误。我认为仍然想办法获取文件的基本名称将使这个宏更加强大。
答案1
如果开关\ifstandalonemode
/\ifforceprecompiled
彼此独立,并且存在“forceprecompiled”
- 独立模式总是伴随着使用
timeline.tex.pdf
- 非独立模式总是伴随着使用
timeline.tikz.pdf
, 你可以-大卫·卡莱尔建议— 可能尝试这样的方法:
前言:
\ifstandalonemode
\ifforceprecompiled
\newcommand\myinclude[1]{\includegraphics{#1.tex.pdf}}% or #1.pdf
\else
\newcommand\myinclude[1]{\includetikz{#1.tex}}%
\fi
\else
\ifforceprecompiled
\newcommand\myinclude[1]{\includegraphics{#1.tikz.pdf}}% or #1.pdf
\else
\newcommand\myinclude[1]{\includetikz{#1.tikz}}%
\fi
\fi
...
文档环境:
...
\myinclude{timeline}%
...
答案2
您应该能够使用,\IfFileExists{<file>}{<true>}{<false>}
因为实际上只有两个选项。
在下面的模型中,我在项目/源文件夹中有两个“预编译”图像:
example-image-a.tex.pdf
example-image-b.tikz.pdf
这些是example-image
来自mwe
,仅作为例子。
使用\forceprecompiledtrue
,您将看到根据需要包含预编译输出(.tex.pdf
和.tikz.pdf
)之一,具体取决于可供包含的文件。您可能必须在其他路径中使用类似的条件。
\documentclass{article}
\usepackage{graphicx}
\NewDocumentCommand{\includefigure}{ O{} m }{%
\ifforceprecompiled
\IfFileExists{#2.tex.pdf}
{\includegraphics[#1]{#2.tex.pdf}}
{\includegraphics[#1]{#2.tikz.pdf}}%
\else
\ifstandalonemode
\includetikz{#2.tex}% May need to condition here as well
\else
\includetikz{#2.tikz}% May need to condition here as well
\fi
\fi
}
\newif\ifforceprecompiled
\newif\ifstandalonemode
\forceprecompiledtrue
\begin{document}
\begin{figure}
\centering
\includefigure[height=3em]{example-image-a}
\caption{Example image~A}
\bigskip
\includefigure[height=3em]{example-image-b}
\caption{Example image~B}
\end{figure}
\end{document}