我在文档(主文档)的开头有一个 \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}