循环内的 If 子句

循环内的 If 子句

我有一个与这里讨论的问题类似的问题如果条件由循环变量控制

总结一下我的情况:当循环遍历从 1 到 24 的连续数字范围时,如果数字在这个列表中,我想做一些特殊的事情:9、10、12、14、...、18。

我第一次尝试是将一个\ifnum\value{\x} in {9,10,12,14,...,18}子句嵌套到\foreach \x in {1,...,24}... 中,但我突然发现令人担忧的是,不知道\ifnum\value{\x}只能跟在=>或 后面<

现在,如果我\ifnum\value{\x} = {9,10,12,14,...,18}按照下面的例子进行设置,当 时我只会得到(奇怪的)结果\x = {9,10,12,14,...,18}

欢迎大家发表评论!

例子:

\documentclass[letterpaper,11pt]{scrartcl}

\begin{document}
    \foreach \x in {1,...,24}
    {
      \subsection{Question \x}
       \begin{figure}[h]
           \centering
           \ifnum\value{\x} = {9,10,12,14,...,18} {
               \includegraphics[width=\textwidth]{figures/univariate/q\x_a.pdf}
               \includegraphics[width=\textwidth]{figures/univariate/q\x_b.pdf}
           }
           \else {
            \includegraphics[width=\textwidth]{figures/univariate/q\x.pdf}
           }
           \fi
           \vspace{-1cm}
          \captionsetup{labelformat=empty}
           \caption{}
        \end{figure}
        \clearpage
    }

\end{document}

答案1

我编写的一些代码可能会有所帮助:

\documentclass{article}
\usepackage{xparse}

\usepackage[a6paper]{geometry} % smaller pictures

\ExplSyntaxOn

%%% code for cycles (communication to GuiTmeeting 2016)
\NewDocumentCommand{\newforeach}{ m +m }
 {
  \tl_clear:N \l__newforeach_type_tl
  \keys_set:nn { newforeach }
   {
    start = 1, step = 1, end = 0, list=, #1
   }
  \__newforeach_exec:n { #2 }
 }

\tl_new:N \l__newforeach_type_tl
\cs_generate_variant:Nn \str_case:nnF { V }

\keys_define:nn { newforeach }
 {
  type .choice:,
  type .value_required:n = true,
  type/integers .code:n = \tl_set:Nn \l__newforeach_type_tl { integers },
  type/fp       .code:n = \tl_set:Nn \l__newforeach_type_tl { fp },
  type/alph     .code:n = \tl_set:Nn \l__newforeach_type_tl { alph },
  type/Alph     .code:n = \tl_set:Nn \l__newforeach_type_tl { Alph },
  list     .clist_set:N = \l_newforeach_list_clist,
  list*    .code:n = \clist_set:NV \l_newforeach_list_clist #1,

  start .tl_set:N = \l_newforeach_start_tl,
  step  .tl_set:N = \l_newforeach_step_tl,
  end   .tl_set:N = \l_newforeach_end_tl,
 }

\cs_new_protected:Nn \__newforeach_exec:n
 {
  \str_case:VnF \l__newforeach_type_tl
   {
    {integers}{\__newforeach_exec_integers:n { #1 }}
    {fp}      {\__newforeach_exec_fp:n       { #1 }}
    {alph}    {\__newforeach_exec_alph:n     { #1 }}
    {Alph}    {\__newforeach_exec_Alph:n     { #1 }}
   }
   {\__newforeach_exec_list:n { #1 }}
 }

\cs_new_protected:Nn \__newforeach_exec_integers:n
 {
  \int_step_inline:nnnn
   { \l_newforeach_start_tl }
   { \l_newforeach_step_tl }
   { \l_newforeach_end_tl }
   { #1 }
 }
\cs_new_protected:Nn \__newforeach_exec_fp:n
 {
  \fp_step_inline:nnnn
   { \l_newforeach_start_tl }
   { \l_newforeach_step_tl }
   { \l_newforeach_end_tl }
   { #1 }
 }
\cs_new_protected:Nn \__newforeach_exec_list:n
 {
  \clist_map_inline:Nn \l_newforeach_list_clist { #1 }
 }

%%% code for exceptions
\NewDocumentCommand{\ifinclistTF}{mmmm}
 {
  \clist_if_in:nnTF { #2 } { #1 } { #3 } { #4 }
 }

\ExplSyntaxOff

\begin{document}

\newforeach{type=integers,end=24}{%
  \subsection{Question #1}
  \begin{minipage}{\textwidth}
  \centering
  \ifinclistTF{#1}{9,10,12,14,16,18}
    {
     %\includegraphics[width=\textwidth]{figures/univariate/q\x.pdf}
     {\Huge q#1}%
    }
    {%
     %\includegraphics[width=\textwidth]{figures/univariate/q\x_a.pdf}
     %\includegraphics[width=\textwidth]{figures/univariate/q\x_b.pdf}
     {\Huge q#1\_a} {\Huge q#1\_b}%
    }
  \end{minipage}
  \clearpage
}

\end{document}

主要区别在于您不用\x在循环体中使用,而是使用#1\newforeach循环可以是不同类型的,这里integers使用。起点和步长默认为 1,因此只需设置终点即可。

对于例外情况,我定义了进一步的用户级别命令。

在代码中,我将\includegraphics声明改为仅使用名称,因为我没有您的图片。只需取消注释\includegraphics行并删除带有 的行即可\Huge

下图显示了第 7 至 12 页,其中显示了第 9、10 和 12 页的例外情况。

在此处输入图片描述

答案2

\documentclass[letterpaper,11pt]{scrartcl}
\usepackage{pgffor,graphicx}
%\usepackage{caption}
\begin{document}
    \foreach \x in {1,...,24}
    {
      \subsection{Question \x}
       \begin{figure}[h]
           \centering
           \xdef\IsInside{0}
           \foreach \y in {9,10,12,14,...,18}
           {\ifnum\y=\x
           \xdef\IsInside{1}
           \fi}
           \ifnum\IsInside=1
                \includegraphics[width=0.45\textwidth]{example-image-a.pdf}~
                \includegraphics[width=0.45\textwidth]{example-image-b.pdf}
            \else 
             \includegraphics[width=\textwidth]{example-image-duck.pdf}
           \fi
           \caption{}

        \end{figure}
        \clearpage
    }
\end{document}

相关内容