这个问题让我抓狂。我想根据某些条件更改 includegraphics 路径。这看起来很简单,对吧?
我已经阅读过这个问题的答案:使用宏将图像路径传递给 \includegraphics,但我无法解决我的问题。我了解到\includegraphics
以下情况必须成立:
- 路径必须是可扩展的(需要
\edef
或不能受到保护因此没有 xparse 除非\DeclareExpandableDocumentCommand
相关?)https://tex.stackexchange.com/a/120972/13552 - includegraphics 仅支持一级扩展。https://tex.stackexchange.com/a/120975/13552
感谢 David Carlisle -> 错误陈述:据我了解,我的代码只需要一个级别的扩展,但仍然不起作用。
这是一个罕见的情况,我需要使用\DeclareExpandableDocumentCommand
for\qikpicpath
吗?
代码
前提条件是在 tex 文件上方的目录中有一个名为 test_pic.jpg 的 jpg 文件。我指出了有问题的代码。
\documentclass{article}
\usepackage{fontspec}
\newcommand{\qikrootdirectory}{../}
\usepackage{xparse}
\usepackage{xstring}
\usepackage{tikz}
\ExplSyntaxOn % https://tex.stackexchange.com/a/275552/13552
\tl_new:N \g_qik_pic_class_tl % allocate a (global) variable
\tl_gset:Nn \g_qik_class_tl { I } % initialize the value
\NewDocumentCommand{\qikpicclass}{} % define a user level command for printing the value
{
\tl_use:N \g_qik_class_tl
}
\NewDocumentCommand{\qiksetpicclass}{m} % define a user level command for changing the value
{
\tl_gset:Nn \g_qik_class_tl { #1 }
}
\NewDocumentCommand{\qikpicpath}{}
{
\tl_if_eq:VnTF \g_qik_class_tl { I }
{ \qikrootdirectory~test_pic.jpg } % true
{ \qikrootdirectory~test_pic.jpg } % false
}
\cs_generate_variant:Nn \tl_if_eq:nnTF { V }
\ExplSyntaxOff
\begin{document}
\qikpicpath % Visually inspect expanded text.
\includegraphics[width=\textwidth]{\qikrootdirectory test_pic.jpg}% Works
%\includegraphics[width=\textwidth]{\qikpicpath}% Expansion Problem
\tikz \node (pic) {\includegraphics[width=\textwidth]{../test_pic.jpg}};% Works
%\tikz \node (pic) {\includegraphics[width=\textwidth]{\qikpicpath}};% Expansion Problem Related to Above
\end{document}
答案1
这可以\DeclareExpandableDocumentCommand
是一个有用的案例,但使用不同的方法更简单。
假设您在两个不同的文件夹中有彩色和黑白版本的相同图像,例如./colorimages
和./bwimages
。您的目的是从一个文件夹或另一个文件夹加载图片,以便编译 PDF 以供查看或打印。
假设图像具有一致的名称,如color-image1.jpg
和bw-image1.jpg
,因此您想要执行
\mmincludegraphics[width=.5\textwidth]{image1}
这将加载正确的图像,彩色或黑白,只需在序言中设置一个开关即可。
\ExplSyntaxOn
\NewDocumentCommand{\mmincludegraphics}{O{}m}
{
\includegraphics[#1]{
\g_macmadness_folder_tl/ % the folder
\g_macmadness_prefix_tl % the prefix
#2
}
}
\NewDocumentCommand{\setimagefolder}{m}
{
\str_case:nn { #1 }
{
{color}
{
\tl_gset:Nn \g_macmadness_folder_tl { ./colorimages }
\tl_gset:Nn \g_macmadness_prefix_tl { color- }
}
{bw}
{
\tl_gset:Nn \g_macmadness_folder_tl { ./bwimages }
\tl_gset:Nn \g_macmadness_prefix_tl { bw- }
}
}
}
\tl_new:N \g_macmadness_folder_tl
\tl_new:N \g_macmadness_prefix_tl
\ExplSyntaxOff
现在你可以在序言中陈述
\setimagefolder{color}
或者
\setimagefolder{bw}
并在文档中调用,\mmincludegraphics
如前所述。
答案2
如果你添加
{\tracingmacros1
\setbox0\hbox{\qikpicpath}
}
然后 TeX 跟踪这个宏的扩展步骤:
\qikpicpath ->\tl_if_eq:VnTF \g_qik_class_tl {I}{\qikrootdirectory test_pic.jpg
}{\qikrootdirectory test_pic.jpg}
\tl_if_eq:VnTF ->\exp_args:NV \tl_if_eq:nnTF
\exp_args:NV #1#2->\exp_after:wN #1\exp_after:wN {\exp:w \__exp_eval_register:N
#2}
#1<-\tl_if_eq:nnTF
#2<-\g_qik_class_tl
\__exp_eval_register:N #1->\exp_after:wN \if_meaning:w \exp_not:N #1#1\if_meani
ng:w \scan_stop: #1\__exp_eval_error_msg:w \fi: \else: \exp_after:wN \use_i_ii:
nnn \fi: \exp_after:wN \exp_end: \tex_the:D #1
#1<-\g_qik_class_tl
\use_i_ii:nnn #1#2#3->#1#2
#1<-\exp_after:wN
#2<-\exp_end:
#3<-\tex_the:D
\g_qik_class_tl ->I
\tl_if_eq:nnTF #1#2->\group_begin: \tl_set:Nn \l__tl_internal_a_tl {#1}\tl_set:
Nn \l__tl_internal_b_tl {#2}\if_meaning:w \l__tl_internal_a_tl \l__tl_internal_
b_tl \group_end: \prg_return_true: \else: \group_end: \prg_return_false: \fi: \
exp_end:
#1<-I
#2<-I
\tl_set:Nn #1#2->\cs_set_nopar:Npx #1{\exp_not:n {#2}}
#1<-\l__tl_internal_a_tl
#2<-I
\tl_set:Nn #1#2->\cs_set_nopar:Npx #1{\exp_not:n {#2}}
#1<-\l__tl_internal_b_tl
#2<-I
\prg_return_true: ->\exp_after:wN \use_i:nn \exp:w
\use_i:nn #1#2->#1
#1<-\qikrootdirectory test_pic.jpg
#2<-\qikrootdirectory test_pic.jpg
\qikrootdirectory ->../
计算表明,在这种情况下->
需要十二次扩展才能实现。../
type
如果您使用和read
键告诉它它是一个 jpg 文件,它仍然可以与 includegraphics 一起工作,但通常这是错误的方法。