我正在努力解决将字符串转换为数字的简写宏问题。最后是我正在尝试执行的一个可行但不稳定的版本。目标是解析 make 这样的命令(或宏):
\fig{figure_name.png fig:figure_label
This is the figure caption with a reference \ref{fig:another_figure}.
}
对应于传统版本:
\begin{figure}
\includegraphicx[width=\columnwidth]{figure_name.png}
\caption{This is the figure caption with a reference \ref{fig:another_figure}.}
\label{fig:figure_label}
\end{figure}
或者更好的是,宏格式可以在开头有键值对,在结尾有标题。这是我的最终目标。像这样:
\fig{(figure_name.png, label=fig:figure_label, width=\columnwidth)
This is the figure caption with a reference \ref{fig:another_figure}.
}
我遇到的问题是,当引用发生变化或编译一次出现错误时,下面的代码会陷入永久循环。当我添加新标签时,我必须注释所有包含的行\ref{}
并编译几次才能获得正确的引用。然后取消注释所有\ref
s 并编译以获得正确的版本。
哪里出了问题或者应该怎么做?我希望有注释良好的代码。我很难理解这样的行:\tl_remove_all:Nn \l_tmpa_tl {-}
。lua 解决方案也很好。
\usepackage{xparse}
\NewDocumentCommand\fig{>{\SplitList{ }}m}
{%
\xdef\captionWords{}
\ProcessList{#1}{\myitem}%
\firstitemtrue
\seconditemfalse
\caption{\captionWords \label{\thisLabel}}
\end{figure}
}
\newif\iffirstitem
\firstitemtrue
\newif\ifseconditem
\seconditemtrue
\newcommand\myitem[1]{%
\iffirstitem
\begin{figure}[ht]
\includegraphics[width=\columnwidth]{figures/#1}\\
\firstitemfalse
\seconditemtrue
\else
\ifseconditem
\xdef\thisLabel{#1}
\seconditemfalse
\else
\xdef\captionWords{\captionWords\ #1}
\fi
\fi
}