将条目附加到现有的 \graphicspath

将条目附加到现有的 \graphicspath

我在文档(主文档)的开头有一个 \graphicspath 命令:

\graphicspath{{images/}{extras/images/}}

我有一些子文档,可以在其中插入图像(实际上是来自 Inkscape 的 SVG 文件):

\def\svgwidth{\linewidth}
\input{/another/path/images/ppn522-graphs.pdf_tex}

这些子文档可以插入到不同的主文档中。

但是他们需要一些有关图像的信息,所以我需要这样做:

\def\svgwidth{\linewidth}
\graphicspath{{/another/path/images/}}
\input{/another/path/images/ppn522-graphs.pdf_tex}

问题:这会覆盖我的第一个 \graphicspath 声明:插入 \graphicspath{{/another/path/images/}} 后,我的徽标图像(和 extras/images)不再可用(产生错误)

我的问题:如何将条目附加到 \graphicspath ?

或者是否存在包含 \graphicspath 值的变量以便我可以重新使用它?

    \graphicspath{\thegraphicspathvalue{/another/path/images/}}

编辑:我已经尝试过这个,但它不起作用:

\graphicspath{\typeout{\Ginput@path}{../images/}}

答案1

包含路径的变量是\Ginput@path,因此您可以定义

\makeatletter
\newcommand\appendtographicspath[1]{%
  \g@addto@macro\Ginput@path{#1}%
}
\makeatother

并且\appendtographicspath{{../images/}}应该这样做。请记住路径周围的括号;您可以添加多条路径。

此添加是全局的。您可能想要扩展“前置”宏;在本例中,使用etoolbox

\usepackage{etoolbox}
\makeatletter
\newcommand\appendtographicspath[1]{%
  \gappto\Ginput@path{#1}%
}
\newcommand\prependtographicspath[1]{%
  \gpreto\Ginput@path{#1}%
}
\makeatother

虽然添加\appto\preto内容是本地的,但我认为这并不好。

2022 年更新

是时候更新了。宏的\Ginput@path行为类似于expl3标记列表变量。

因此,我们可以采用expl3更灵活的方法(也是由评论提示的)。

\ExplSyntaxOn
\NewDocumentCommand{\appendtographicspath}{m}
 {
  \tl_if_exist:cF { Ginput@path } { \tl_new:c { Ginput@path } }
  \tl_gput_right:cn {Ginput@path} { #1 }
 }
\NewDocumentCommand{\prependtographicspath}{m}
 {
  \tl_if_exist:cF { Ginput@path } { \tl_new:c { Ginput@path } }
  \tl_gput_left:cn {Ginput@path} { #1 }
 }
\ExplSyntaxOff

就像是

\appendtographicspath{{a}{b}{c}}

将附加所有三个项目。

如果希望允许将要附加的项目指定为逗号分隔的列表,则执行

\documentclass{article}
\usepackage{graphicx}

\ExplSyntaxOn

\NewDocumentCommand{\appendtographicspath}{m}
 {
  \tl_if_exist:cF { Ginput@path } { \tl_new:c { Ginput@path } }
  \clist_map_function:nN { #1 } \steven_gpath_append:n
 }

\cs_new_protected:Nn \steven_gpath_append:n
 {
  \tl_gput_right:cn { Ginput@path } { {#1} }
 }

% for debugging

\NewDocumentCommand{\showgraphicspath}{}{\tl_show:c { Ginput@path }}

\ExplSyntaxOff

\graphicspath{{a}{b}{c}}

\appendtographicspath{{d},{e}}

\showgraphicspath

\appendtographicspath{f,g}

\showgraphicspath

我们将把牙套剥掉,\clist_map_inline:nN以便重新插入。

在工作结束时,正如所见证的\showgraphicspath,你会得到

\Ginput@path={a}{b}{c}{d}{e}{f}{g}

相关内容