/foreach 循环中文件名处理不正确

/foreach 循环中文件名处理不正确

出于某种原因,当我尝试在循环中为 \includegraphics 指定文件名时(无论是使用 \foreach 还是使用 \clist),我都会收到文件未找到错误。错误显示文件的有效路径,如果我使用函数参数而不是尝试循环遍历列表,它就可以正常工作。使用循环和指定文件似乎存在一些问题。我如何让它生成可用的文件路径?

\documentclass{article}

\usepackage{graphicx}
\usepackage{pgffor}

\newcommand{\lmrf}[3]
{
    \begin{figure}
    \centering
    \foreach \f in {#1}
    {
         \includegraphics{./Figures/\f}
    }
    \caption{#2}
    \label{fig:#3}
    \end{figure}
}

\begin{document}

\lmrf{SURF1.png,SURF2.png}{(left) (right)}{rates}

\end{document}

这将返回错误“!LaTeX 错误:未找到文件 `./Figures/SURF1.png'”。./Figures/SURF1.png 是该路径中的一个文件。如果我摆脱循环,它就可以正常工作。

这有效:

\documentclass{article}

\usepackage{graphicx}

\newcommand{\lmrf}[3]
{
    \begin{figure}
    \centering
    \includegraphics{./Figures/#1}
    \caption{#2}
    \label{fig:#3}
    \end{figure}
}

\begin{document}

\lmrf{SURF1.png}{(left) (right)}{rates}

\end{document}

更新:似乎在解析文件名和循环时存在一些潜在问题。如果我不指定路径,它就可以工作。如果我不指定文件扩展名,它就可以工作。但是,如果指定了完整路径和包括扩展名的文件名,它就不会工作。

只需更改为:

\lmrf{SURF1,SURF2}{(left) (right) }{rates}

导致正确找到文件。

答案1

您主要的错误在于\foreach组的语法。应该是:

\foreach <var> in {<list>}
{<action>}

我使用了你之前的例子:

\documentclass{article}
\usepackage{amsmath}
\usepackage{pgffor}
\usepackage{float}
\usepackage{graphicx}
\usepackage{mwe}

\newcommand{\lmrf}[3]
{
 \begin{figure}[H]
 \centering
 \foreach \f/\r in {#1}
  {%%
  \includegraphics[width=0.45\columnwidth,keepaspectratio=true,angle=\r]{\f}%%{./Figures/\f};
  }%%
 \caption{#2}
 \label{fig:#3}
 \end{figure}
}

\begin{document}

\lmrf{example-image-a/30,example-image-b}{Caption}{Figure}

\end{document}

在此处输入图片描述

我使用了你的代码:

 \foreach \f/\r in {#1}
  {%%
  \includegraphics[width=0.45\columnwidth,keepaspectratio=true,angle=\r]{./Figures/\f};%%
  }%%

并成功调用它

\lmrf{restaurant/30,oak_tree/-10}{Caption}{Figure}

\lmrf{restaurant.png/30,oak_tree.png/-10}{Caption}{Figure}

我建议删除png后缀:

在此处输入图片描述

答案2

语法

\foreach \f in {<list>} <code>;

只适用于 TiZ 图片(甚至并非总是如此)。

通常正确的代码是

\foreach \f in {<list>} {<code>}

另一方面,我不确定这种代码混淆是否能给你带来多少好处。输入

\begin{figure}[htp]
\centering

\includegraphics{./Figures/SURF1}%
\includegraphics{./Figures/SURF2}

\caption{(left) (right)}
\label{fig:rates}
\end{figure}

似乎不那么繁重。如果您有多个这样的结构,那么使用缩写可能会很有用,但在这种情况下,该[H]选项很可能会成为一种阻碍,而不是帮助。

简化版本:

\documentclass{article}

\usepackage{pgffor}

\newcommand{\insertfigures}[1]{%
  \foreach \f in {#1}{\includegraphics{./Figures/\f}}%
}

\begin{document}

\begin{figure}[htp]
\centering
\insertfigures{SURF1,SURF2}

\caption{(left) (right)}\label{rates}
\end{figure}

\end{document}

这样可以保存\caption并可\label搜索。

使用键值语法的更灵活的实现。

\documentclass{article}
\usepackage{graphicx}
\usepackage{xparse}

\ExplSyntaxOn
\keys_define:nn { eric/lmrf }
 {
  pos     .tl_set:N = \l_eric_lmrf_pos_tl,
  pos     .initial:n = htp,
  caption .tl_set:N = \l_eric_lmrf_caption_tl,
  label   .tl_set:N = \l_eric_lmrf_label_tl,
  path    .tl_set:N = \l_eric_lmrf_path_tl,
  o       .tl_set:N = \l_eric_lmrf_option_tl,
  f       .code:n =
   {
    \seq_put_right:Nn \l_eric_lmrf_images_seq { #1 }
    \seq_put_right:NV \l_eric_lmrf_options_seq \l_eric_lmrf_option_tl
   },
 }
\seq_new:N \l_eric_lmrf_images_seq
\seq_new:N \l_eric_lmrf_options_seq

\NewDocumentCommand{\lmrf}{m}
 {
  \use:x { \exp_not:N \begin{figure}[\l_eric_lmrf_pos_tl] }
  \keys_set:nn { eric/lmrf } { #1 }
  \centering
  \int_step_inline:nn { \seq_count:N \l_eric_lmrf_images_seq }
   {
    \use:x
     {
      \exp_not:N \includegraphics
       [ \seq_item:Nn \l_eric_lmrf_options_seq { ##1 } ]
       { \l_eric_lmrf_path_tl \seq_item:Nn \l_eric_lmrf_images_seq { ##1 } }
     }
   }
  \caption{\tl_use:N \l_eric_lmrf_caption_tl}
  \label{\tl_use:N \l_eric_lmrf_label_tl}
  \end{figure}
 }
\NewDocumentCommand{\lmrfsetup}{m}
 {
  \keys_set:nn { eric/lmrf } { #1 }
 }
\ExplSyntaxOff

%\lmfrsetup{./Figures/}

\begin{document}

\lmrf{
  caption={(left) (right)},
  label=rates,
%  path=./Figures/
  o = {width=3cm},
  f = example-image,
  f = example-image-a
}

\lmrf{
  caption={(left) (center) (right)},
  label=foo,
%  path=./Figures/
  o = {width=3cm},
  f = example-image,
  f = example-image-a,
  o = {width=2cm},
  f = example-image-b
}

\end{document}

定义的键是pos htp figure的captionlabelpos、。path,and. The first two should be self-explanatory;(default value) is for the positioning argument to

使用o可以指定选项\includegraphics。除非用另一个o键取消命令,否则将为所有以下图像设置该选项,如第二个示例所示。

path用于指定图像的路径。您也可以在序言中使用 指定它\lmfrsetup,例如

\lmfrsetup{path=./Figures/}

如图所示。在这种情况下,您不需要在\lmfr命令中指定键。我注释掉了所有调用,只是因为我懒得创建目录结构。

在此处输入图片描述

相关内容