我有一个与这里讨论的问题类似的问题如果条件由循环变量控制。
总结一下我的情况:当循环遍历从 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}