使用宏获取文件的基本名称

使用宏获取文件的基本名称

我正在使用条件编译来测试编译一本大书的速度。这是我在\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}

相关内容