宏中的标签处理

宏中的标签处理

我想创建一个环境来轻松列出一堆子图及其说明。但说明应该只出现在完整图的标题中,而不是子图的标题中。

为了解决这个问题,我设计了一个环境,使用命令将子图标题附加到宏中。但是,当我尝试引用结果标题中子图的标签(动态创建)时,它们都引用最后一个子图。我曾经将其\expandafter附加到我的收集宏中,所以我怀疑这可能是问题所在。


相应的 MWE:

\documentclass{article}

\usepackage{calc}
\usepackage{subcaption}
\usepackage[demo]{graphicx}

%
% ===================== %
% smallSubfigExplained  %
% ===================== %
\newlength\sseWidth
\def\sseExplanationOutput{}
\newcounter{sseTotalCounter}
\newcounter{sseCounter}[sseTotalCounter]

\newenvironment{smallSubfigExplained}{%
    \stepcounter{sseTotalCounter}
    \def\sseExplanationOutput{}
}{%
    \caption[cap]{\sseExplanationOutput}
}
\newcommand\sseItem[1]{%    
    \stepcounter{sseCounter}
    \def\lblname{sse:\thesseTotalCounter-\thesseCounter}
    \expandafter\def\expandafter\sseExplanationOutput\expandafter{%
        \sseExplanationOutput
        \textbf{\subref{\lblname}})
        #1
    }
    \begin{subfigure}[b]{0.4\textwidth}
        \centering
            \rule{2cm}{2cm}
            \caption{}
            \label{\lblname}
    \end{subfigure}     
}

\begin{document}
\begin{figure}
    \centering
        \begin{smallSubfigExplained}
            \sseItem{subfig expl 1}
            \sseItem{second subfig expl}
        \end{smallSubfigExplained}
\end{figure}
\end{document}

截屏:

截屏

答案1

\defon的使用\sseExplanationOutput是自引用的,它不适用于\def。通常,你会使用\edef,但在这种情况下,\subref{}不适用于\edef,因此你需要\protected@edef

\documentclass{article}

\usepackage{calc}
\usepackage{subcaption}
\usepackage[demo]{graphicx}

%
% ===================== %
% smallSubfigExplained  %
% ===================== %
\newlength\sseWidth
\def\sseExplanationOutput{}
\newcounter{sseTotalCounter}
\newcounter{sseCounter}[sseTotalCounter]

\newenvironment{smallSubfigExplained}{%
    \stepcounter{sseTotalCounter}
    \def\sseExplanationOutput{}
}{%
    \caption[cap]{\sseExplanationOutput}
}
\makeatletter
\newcommand\sseItem[1]{%    
    \stepcounter{sseCounter}
    \def\lblname{sse:\thesseTotalCounter-\thesseCounter}
    \protected@edef\sseExplanationOutput{%
        \sseExplanationOutput
        \textbf{\subref{\lblname}})
        #1
    }
    \begin{subfigure}[b]{0.4\textwidth}
        \centering
            \rule{2cm}{2cm}
            \caption{}
            \label{\lblname}
    \end{subfigure}     
}
\makeatother
\begin{document}
\begin{figure}
    \centering
        \begin{smallSubfigExplained}
            \sseItem{subfig expl 1}
            \sseItem{second subfig expl}
        \end{smallSubfigExplained}
\end{figure}
\end{document}

在此处输入图片描述

相关内容