在 while 循环内对齐子字幕

在 while 循环内对齐子字幕

我正在尝试显示具有相似名称的多幅图像,但无论我如何尝试,最后一行的对齐似乎都是错误的:

\documentclass[12pt]{article}
\usepackage{subcaption,graphicx}
\newcounter{i}

\begin{document}
\begin{figure}
    \centering
    \makeatletter
    \setcounter{i}{0}
    \@whilenum\value{i}<9\do {
        \begin{subfigure}{0.3\textwidth}
            \includegraphics[width=\linewidth]{test_\thei}
        \end{subfigure}%
        \stepcounter{i}
    }
    \makeatother
\end{figure}
\end{document}

图像错位

答案1

在结束括号后添加并保护其他结束线。顺便说一句,此应用程序\unskip不需要。subfigure

\documentclass[12pt]{article}
\usepackage{graphicx}
\newcounter{i}

\begin{document}
\begin{figure}
    \centering
    \makeatletter
    \setcounter{i}{0}%
    \@whilenum\value{i}<9\do {%
      \includegraphics[width=0.3\textwidth]{example-image-1x1}%
      \stepcounter{i} % <--- note the space before %
    }\unskip
    \makeatother
\end{figure}
\end{document}

在此处输入图片描述

将图像的文件名改回。

后面的空格\stepcounter{i}会在输出中产生一个空格,而您需要删除最后一个空格。如果单个空格不够,请执行

\stepcounter{i}\quad

或者

\stepcounter{i}\hspace{<whatever lenght you want>}% <--- the % is necessary

不同的实现:

\documentclass[12pt]{article}
\usepackage[draft]{graphicx}

\usepackage{showframe}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\integercaseTF}{mm+m+m}
 {
  \int_case:nnTF { #1 } { #2 } { #3 } { #4 }
 }
\NewDocumentCommand{\intloop}{O{1}+mO{1}+m}
 {
  \int_step_inline:nnnn { #1 } { #3 } { #2 } { #4 }
 }
\ExplSyntaxOff

\begin{document}

\begin{figure}[htp]
\centering
\setlength{\lineskip}{0.025\columnwidth}

\intloop{9}{%
  \includegraphics[width=0.3\columnwidth]{test-#1}%
  \integercaseTF{#1}{{3}{\\} {6}{\\} {9}{\\}}{}{\hfil}%
}

\end{figure}
\end{document}

\integercaseTF命令接受四个参数:第一个参数是一个整数表达式,这里是循环中的当前整数;第二个参数是一个案例列表,在本例中,我们说如果循环中的当前整数是 3、6 或 9,那么\\应该发出;第三个参数是在匹配的情况下要执行的附加代码;第四个参数是在不匹配的情况下要执行的附加代码,在本例中我们想要\hfil

循环中的当前整数可#1在代码 for 中使用\intloop,其语法为

\intloop[<optional start>]{<mandatory end>}[<optional step>]{<code>}

因此,例如,\intloop[0]{5}[2]{...}将针对整数值 0,2,4 执行...(因为我们要求上升到 5,从 0 开始,步骤 2)。

设置为\lineskip0.025\columnwidth为了使块中的连续图片之间的垂直空间与水平空间一样多。图片占据了 90% 的水平空间,我们希望将剩余空间分成四等份,因此 也应该\lineskip是文本宽度的 2.5%。

在此处输入图片描述

在此处输入图片描述

`showframe 只是为了更好地看到上下文中的空白。

答案2

或者,使用内循环一次插入 3 个子图,然后添加一个\par

\documentclass[12pt]{article}
\usepackage{subcaption,graphicx}
\newcounter{i}
\newcounter{j}

\begin{document}
\begin{figure}
    \centering
    \makeatletter
    \setcounter{i}{0}
    \@whilenum\value{i}<3\do {
        \setcounter{j}{0}
        \@whilenum\value{j}<3\do {%
            \begin{subfigure}{0.3\textwidth}
                \includegraphics[width=\linewidth]{example-image}
            \end{subfigure}%
            \stepcounter{j}
            \stepcounter{i}
        }
        \par
    }
    \makeatother
\end{figure}
\end{document}

在此处输入图片描述

相关内容