标签内带条件的宏

标签内带条件的宏

我希望标签由宏定义,其值取决于某些条件。目的是自动获取类型为fig:03fig:03+04或 的标签fig:03+04+05

\documentclass{book}
\usepackage{graphicx}
\usepackage{lipsum}
\usepackage{ifthen}

\def\imga{03}
\def\imgb{04}
\def\imgc{}

\newcommand{\multipiclabel}{%
\imga%
\ifthenelse{\equal{\imgb}{}}{}{+}\imgb%
\ifthenelse{\equal{\imgc}{}}{}{+}\imgc%
}

\begin{document}

\lipsum[1]

\begin{figure*}
  \centering
  \includegraphics[width=0.8\linewidth]{example-image-a}
  \caption{Caption / \protect\multipiclabel}
  \label{fig:\multipiclabel}% this gives error
%  \label{fig:\imga+\imgb+\imgc}% this works but may define label with unwanted trailing +
\end{figure*}

\lipsum[2]

\end{document}

但上述 MWE 无法编译。

有没有办法通过包含条件的宏来定义标签?

答案1

应该\multipiclabel使用可扩展的原始条件来定义:

\def\multipiclabel{\imga
   \ifx\imgb\empty\else +\imgb\fi \ifx\imgc\empty\else +\imgc\fi}

答案2

假设在//#的定义中没有使用,您可以这样做:\imga\imgb\imgc

\documentclass{book}
\usepackage{graphicx}
\usepackage{lipsum}

\def\imga{03}
\def\imgb{04}
\def\imgc{}

\begingroup
\catcode`\#=8
\csname @firstofone\endcsname{%
  \endgroup
  \newcommand*{\multipiclabel}{%
    \imga\if#\imgb#\else+\imgb\fi\if#\imgc#\else+\imgc\fi
  }%
}%

\begin{document}

\lipsum[1]

\begin{figure*}
  \centering
  \includegraphics[width=0.8\linewidth]{example-image-a}
  \caption{Caption / \protect\multipiclabel}
  \label{fig:\multipiclabel}%
\end{figure*}

\lipsum[2]

\end{document}

.aux 文件是:

\relax 
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Caption / \multipiclabel }}{1}{}\protected@file@percent }
\newlabel{fig:03+04}{{1}{1}}
\gdef \@abspage@last{1}

从 -entry 中可以看出\newlabel\label-command 的参数计算结果为fig:03+04


如果有 ε-TeX 扩展可用:

\newcommand*{\multipiclabel}{%
    \imga
    \ifcat$\detokenize\expandafter{\imgb}$\else+\imgb\fi
    \ifcat$\detokenize\expandafter{\imgc}$\else+\imgc\fi
}%

此定义可以在/ /#的定义中使用——如果您确实要使用它们,则需要在这些定义中将它们加倍。\imga\imgb\imgc


虽然我实际上\ifx更喜欢,但我决定用\if或来进行测试\ifcat,因为\ifx..\empty它依赖于\imgb/\imgc总是被定义为“短”宏,如\empty。我是一个悲观主义者:有一天,有人读了那些关于 LaTeX 的众多“介绍”之一,其中毫无理由地被告知永远不要使用,\def但总是使用 LaTeX 的\newcommand/\renewcommand可能不会使用 TeX\def而是使用 LaTeX \renewcommand*后面没有)来定义\imgb/\imgc具有这些是 -macros 的副作用\long。然后我们得到另一个模式问题“为什么它不起作用”......

相关内容