代码

代码

这个问题让我抓狂。我想根据某些条件更改 includegraphics 路径。这看起来很简单,对吧?

我已经阅读过这个问题的答案:使用宏将图像路径传递给 \includegraphics,但我无法解决我的问题。我了解到\includegraphics以下情况必须成立:

感谢 David Carlisle -> 错误陈述:据我了解,我的代码只需要一个级别的扩展,但仍然不起作用。

这是一个罕见的情况,我需要使用\DeclareExpandableDocumentCommandfor\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.jpgbw-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 一起工作,但通常这是错误的方法。

相关内容